【ROS2笔记三】构建ROS2功能包

3.构建ROS2功能包

文章目录

  • 3.构建ROS2功能包
    • 3.1ROS2中包的组成部分
    • 3.2创建ROS2功能包并编写节点
      • 3.2.1使用CMake创建功能包
      • 3.2.2编写cpp节点代码
    • 3.3编译运行节点
    • 3.4使用面向对象的方式编写ROS2节点
    • 3.5使用RCLPY编写节点
    • Reference

3.1ROS2中包的组成部分

ROS2可以使用CMake或者Python来创建工作包,使用cpp进行开发推荐使用CMake,使用python进行开发推荐使用Python来创建包。

ROS2 PythonCMake各自有自己的最低要求内容:

CMake:

  • CMakeLists.txt描述如何在包中构建代码的文件
  • include/<package_name>包含包的公共标头的目录
  • package.xml包含有关包的元信息的文件
  • src包含包的源代码的目录

Python:

  • package.xml包含有关包的元信息的文件
  • resource/<package_name>包的标记文件
  • setup.cfg当包有可执行文件时是必需的,因此可以找到它们ros2 run
  • setup.py包含如何安装软件包的说明
  • <package_name>- 与您的包同名的目录,ROS 2 工具使用它来查找您的包,包含__init__.py

3.2创建ROS2功能包并编写节点

在创建ROS2功能包之前,确保你已经位于工作空间当中,这里我的工作空间命名为colcon_test02_ws

cd colcon_test02_ws/src

创建功能包,推荐使用ament_cmake(cpp)或ament_python(python)作为编译类型,并且添加rclcpp依赖。

3.2.1使用CMake创建功能包

1.创建一个包,在ROS2中创建新包的命令语法是:

ros2 pkg create <package_name> --build-type ament_cmake --license Apache-2.0 --dependencies rclcpp
  • pkg create 是创建包的意思
  • --build-type 用来指定该包的编译类型,一共有三个可选项ament_pythonament_cmakecmake
  • --license 用于制定证书,一般设置为Apache-2.0,如果不指定的话会弹出一个警告但是没有别的影响
  • --dependencies 指的是这个功能包的依赖,这里使用的依赖是rclcpp

这里使用以下语句构建了一个包

ros2 pkg create example_cpp --build-type ament_cmake --dependencies rclcpp --license Apache-2.0

构建完毕后,包内的目录为:

.
├── CMakeLists.txt
├── include
│   └── example_cpp
├── LICENSE
├── package.xml
└── src3 directories, 3 files

2.编译新创建的包,在ROS2中的编译命令为:

colcon build

但是这条命令会编译整个工作空间,非常耗时,如果我们只想编译构建特定的功能包可以使用:

colcon build --packages-select <my_package>

这里使用了以下的命令来构建上面创建的功能包

colcon build --packages-select example_cpp

构建完毕后,结果如下:

Starting >>> example_cpp
Finished <<< example_cpp [1.46s]                  Summary: 1 package finished [1.72s]

3.2.2编写cpp节点代码

1.首先编写脚本代码,我们在example_cpp/src下创建一个脚本文件node01.cpp,编写下列代码

#include "rclcpp/rclcpp.hpp"int main(int argc, char **argv){// 初始化rclcpprclcpp::init(argc, argv);// 产生一个节点,并命名为node01auto node = std::make_shared<rclcpp::Node>("node01");// 打印消息RCLCPP_INFO(node->get_logger(), "node01 has already launched");rclcpp::spin(node);// 停止运行rclcpp::shutdown();return 0;
}

2.然后配置CMakeLists.txt

将其添加为可执行文件,在CMakeLists.txt最后一行(ament_package()之前)加入

add_executable(node01 src/node01.cpp)
ament_target_dependencies(node01 rclcpp)

并且使用install指令将其安装到install目录中,在上面两行代码的后面加入

install(TARGETSnode01DESTINATION lib/${PROJECT_NAME}
)

修改完毕的CMakeLists.txt文件看起来像

cmake_minimum_required(VERSION 3.8)
project(example_cpp)if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")add_compile_options(-Wall -Wextra -Wpedantic)
endif()# find dependencies
find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)if(BUILD_TESTING)find_package(ament_lint_auto REQUIRED)# the following line skips the linter which checks for copyrights# comment the line when a copyright and license is added to all source filesset(ament_cmake_copyright_FOUND TRUE)# the following line skips cpplint (only works in a git repo)# comment the line when this package is in a git repo and when# a copyright and license is added to all source filesset(ament_cmake_cpplint_FOUND TRUE)ament_lint_auto_find_test_dependencies()
endif()add_executable(node01 src/node01.cpp)
ament_target_dependencies(node01 rclcpp)
install(TARGETSnode01DESTINATION lib/${PROJECT_NAME}
)
ament_package()

3.3编译运行节点

进入到工作空间

cd <your_workspace>

然后编译指定的功能包

colcon build --packages-select example_cpp

然后source一下,运行节点

source install/setup.bash
ros2 run example_cpp node01

结果如下:

Image

3.4使用面向对象的方式编写ROS2节点

在之前的功能包example_cpp中,我们使用面向对象编成的方式来重构代码,新建一个node02.cpp脚本文件,然后输入以下的代码

#include "rclcpp/rclcpp.hpp"
#include <string>// 构建一个类节点Node02,该节点继承自rclcpp::Node
class Node02: public rclcpp::Node
{
public:// 构造函数,传入的参数为节点的名字Node02(std::string name) : Node(name)       // 调用了基类的构造函数rclcpp::Node{RCLCPP_INFO(this->get_logger(), "node02 has already launched");}
private:};int main(int argc, char **argv){rclcpp::init(argc, argv);auto node = std::make_shared<Node02>("node02");rclcpp::spin(node);rclcpp::shutdown();return 0;
}

然后添加配置文件

add_executable(node02 src/node02.cpp)
ament_target_dependencies(node02 rclcpp)
install(TARGETSnode02DESTINATION lib/${PROJECT_NAME}
)

然后运行

cd <your_workspace>
colcon build
source ./install/setup.bash
ros2 run example_cpp node02

结果如下:

Image

3.5使用RCLPY编写节点

整个流程省略了,可以参考d2lros2和编写一个简单的服务和客户端Python。

Reference

d2lros2
ROS2 Tutorial

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/304929.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux从入门到精通 --- 3.用户、权限

文章目录 第三章&#xff1a;3.1 root用户3.1.1 su3.1.2 exit3.1.3 sudo 3.2 用户和用户组3.2.1 用户组管理创建用户组删除用户组 3.2.2 用户管理创建用户删除用户查看用户所属组修改用户所属组 3.2.3 getent一&#xff1a;二&#xff1a; 3.3 查看权限控制信息3.3.1 认知权限信…

计算机网络——WEB服务器编程实验

实验目的 1. 处理一个 http 请求 2. 接收并解析 http 请求 3. 从服务器文件系统中获得被请求的文件 4. 创建一个包括被请求的文件的 http 响应信息 5. 直接发送该信息到客户端 具体内容 一、C 程序来实现 web 服务器功能。 二、用 HTML 语言编写两个 HTML文件&#xff0c;并…

Access2019实现按关键字搜索查找所需要的数据的功能

问题&#xff1a;随着数据库中数据条目的不断增加&#xff0c;如何直观简单的根据某些字段中的关键词&#xff0c;查找到对应的数据条目就成为了必须&#xff0c;这里通过创建具有查询输入框的窗体&#xff0c;实现Access数据库内的搜索功能&#xff01;&#xff01; 零、实施…

【C语言】函数递归编程题

目录 题目一&#xff1a; 题目二&#xff1a; 题目三&#xff1a; 题目四&#xff1a; 总结 题目一&#xff1a; 题目&#xff1a;接受一个整型值&#xff08;无符号&#xff09;&#xff0c;按照顺序打印它的每一位。&#xff08;递归完成&#xff09; 列如&#xff1a; …

Harmony鸿蒙南向驱动开发-GPIO接口使用

功能简介 GPIO&#xff08;General-purpose input/output&#xff09;即通用型输入输出。通常&#xff0c;GPIO控制器通过分组的方式管理所有GPIO管脚&#xff0c;每组GPIO有一个或多个寄存器与之关联&#xff0c;通过读写寄存器完成对GPIO管脚的操作。 GPIO接口定义了操作GP…

Day80:服务攻防-中间件安全HW2023-WPS分析WeblogicJettyJenkinsCVE

目录 中间件-Jetty-CVE&信息泄漏 CVE-2021-34429(信息泄露) CVE-2021-28169(信息泄露) 中间件-Jenkins-CVE&RCE执行 cve_2017_1000353 CVE-2018-1000861 cve_2019_1003000 中间件-Weblogic-CVE&反序列化&RCE 应用金山WPS-HW2023-RCE&复现&上线…

windows ffmpeg7 通过rtsp拉取h265裸流

点击下边那个链接会转到github 下载完成后&#xff0c;添加include、lib到工程。 添加头文件&#xff1a; extern "C" { #include "libavcodec/avcodec.h" #include "libavformat/avformat.h" #include "libavformat/avio.h" #inclu…

Acrobat Pro DC 2021---PDF编辑与管理,打造高效PDF工作流程 含Mac+win

Acrobat Pro DC 2021包括全面的PDF编辑、OCR识别、多种输出格式转换以及强大的文件安全性保护。用户可轻松编辑、合并、转换PDF文件&#xff0c;同时支持将扫描文档转换为可编辑的PDF。可将PDF转换为Word、Excel、PowerPoint等格式&#xff0c;提高工作效率。 Mac电脑&#xf…

使用Docker部署开源项目FreeGPT35来免费调用ChatGPT3.5 API

Vercel部署FreeGPT35有严重限制&#xff0c;玩玩就好&#xff0c;真用还是得docker。 限制原因: Vercel的流式响应并不是一开始写流&#xff0c;客户端就能立刻收到响应流&#xff0c;而是先写到一个缓冲区&#xff0c;当流关闭才一股脑的流式响应回来(不是实时流) 因此导致: …

wireshark数据流分析学习日记day3-从 Pcap 导出对象

从 HTTP 流量导出文件 过滤http请求 发现get请求上传了两个文件 保存即可 也可以保存网页 点击保存 改文件名为html结尾以便于访问 请谨慎使用此方法。如果从 pcap 中提取恶意 HTML 代码并在 Web 浏览器中查看它&#xff0c;则 HTML 可能会调用恶意域&#xff0c;这就是为什么…

android-自定义TextView在文字内容末尾添加图片icon、可以添加间距

样式示意图 自定义属性 style.xml <declare-styleable name"IconLabelTextView"><attr name"iconSrc" format"reference"/><attr name"iconPaddingStart" format"dimension"/><attr name"iconPad…

【YOLOv8】Yolov5和Yolov8网络结构的分析与对比

目录 一 YOLOv5 二 YOLOv8 yolo通常采用backbone-neck-head的网络结构。 Backbone 主要负责从输入图像中提取高层次的语义特征,常包含多个卷积层和池化层&#xff0c;构建了一个深层次的特征提取器。Neck通常用来进一步整合与调整backbone提取的特征&#xff0c;有利于将不同…

odoo10 创建第一个应用

当odoo10环境创建好之后&#xff0c;需要设置一个用户 我这里设置的叫做odoo_user&#xff0c;并给他设置全部的权限&#xff0c;用于创建数据库。 当我们在odoo的web主页创建一个数据库&#xff0c;我这里叫做my_odoo&#xff0c;然后我们创建一个名为myapp的模块 python .…

Linux云计算之Linux基础3——Linux系统基础part-2

1、终端、shell、文件理论 1、终端 终端(terminal)&#xff1a;人和系统交互的必要设备&#xff0c;人机交互最后一个界面&#xff08;包含独立的输入输出设备&#xff09; 物理终端(console)&#xff1a;直接接入本机器的键盘设备和显示器虚拟终端(tty)&#xff1a;通过软件…

知了汇智鸿蒙系列讲座进校园,赋能产业数字化升级,助力创新人才培养

随着信创国产化战略的深入推进&#xff0c;以及万物互联时代的加速到来&#xff0c;信息技术产业正迎来前所未有的发展机遇。在这一背景下&#xff0c;成都知了汇智科技有限公司作为产教融合领域的先行者&#xff0c;积极响应国家号召&#xff0c;通过举办鸿蒙系列讲座进校园活…

对OceanBase中的配置项与系统变量,合法性检查实践

在“OceanBase 配置项&系统变量实现及应用详解”的系列文章中&#xff0c;我们已经对配置项和系统变量的源码进行了解析。当涉及到新增配置项或系统变量时&#xff0c;通常会为其指定一个明确的取值范围或定义一个专门的合法性检查函数。本文将详细阐述在不同情境下&#x…

【TB作品】MSP430单片机读取大气压强传感器BMP180

文章目录 实物main所有代码 实物 main #include <msp430.h> #include "stdio.h" #include "OLED.h"#include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h>// P2.2 oled scl // P2.3 oled sda// p…

【vue/uniapp】使用 smooth-signature 实现 h5 的横屏电子签名

通过github链接进行下载&#xff0c;然后代码参考如下&#xff0c;功能包含了清空、判断签名内容是否为空、生成png/jpg图片等。 签名效果&#xff1a; 预览效果&#xff1a; 下载 smooth-signature 链接&#xff1a;https://github.com/linjc/smooth-signature 代码参考&a…

数据结构OJ题——栈和队列

1. 用栈实现队列&#xff08;OJ链接&#xff09; 题目描述&#xff1a;请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作&#xff08;push、pop、peek、empty&#xff09; void push(int x) 将元素 x 推到队列的末尾 int pop() 从队列的开头移除并返回…

SpringBoot快速入门笔记(5)

文章目录 一、elemetnUI1、main.js2、App.vue3、fontAwesome 一、elemetnUI 开源前端框架&#xff0c;安装 npm i element-ui -S 建议查看官方文档 Element组件&#xff0c;这里是Vue2搭配elementUI&#xff0c;如果是vue3就搭配elementPlus&#xff0c;这里初学就以Vue2为例子…