【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
└── src

3 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){
    // 初始化rclcpp
    rclcpp::init(argc, argv);
    // 产生一个节点,并命名为node01
    auto 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(TARGETS
  node01
  DESTINATION 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 files
  set(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 files
  set(ament_cmake_cpplint_FOUND TRUE)
  ament_lint_auto_find_test_dependencies()
endif()

add_executable(node01 src/node01.cpp)
ament_target_dependencies(node01 rclcpp)
install(TARGETS
  node01
  DESTINATION 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(TARGETS
  node02
  DESTINATION 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

用于显著提高检索速度和降低成本的二进制和标量嵌入量化

我们引入了嵌入量化的概念&#xff0c;并展示了它们对检索速度、内存使用、磁盘空间和成本的影响。我们将讨论理论上和实践中如何对嵌入进行量化&#xff0c;然后介绍一个 演示&#xff0c;展示了 4100 万维基百科文本的真实检索场景。 演示地址https://hf.co/spaces/sentence-…

C语言——贪吃蛇小游戏

目录 前言 一、贪吃蛇游戏 1.1 游戏背景 1.2 游戏功能 1.3 技术要点 二、Win32 API 2.1 控制台程序 2.2 控制台屏幕上的坐标COORD 2.3 GetStdHandle 2.4 GetConsoleCursorInfo 2.4 CONSOLE_CURSOR_INFO 2.5 SetConsoleCursorInfo 2.6 SetConsoleCursorPosition …

第十届蓝桥杯省赛真题(C/C++大学B组)

试题 A: 组队 答案&#xff1a;490 试题 B: 年号字串 #include <bits/stdc.h> using namespace std;int main() {//26进制数 int n;cin>>n;string s "111";for(int i s.length() - 1;i >0;i--){s[i] A - 1 n % 26;n / 26;}cout<<s<<…

交换机与路由器缓冲区:寻找完美大小

*本文系SDNLAB编译自瞻博网络技术专家兼高级工程总监Sharada Yeluri领英 在路由器和交换机中&#xff0c;缓冲区至关重要&#xff0c;可以防止网络拥塞期间的数据丢失。缓冲区到底要多大&#xff1f;这个问题在学术界和工业界一直备受争议。本文探讨了高端路由器中数据包缓冲的…

Matlab 实时读取串口并绘图

Matlab 实时读取串口并绘图 Vofa Vofa 是一个很好的跨平台上位机软件&#xff0c;但是它无法保存数据&#xff0c;而且作者也并没有要继续更新的意思&#xff0c;保存数据功能应该是遥遥无期了。因此本文使用 Matlab 实时读取串口数据&#xff0c;并使用 plot 函数绘制。 vo…

性能分析-nginx(tomcat、nginx【配置】、负载均衡)

tomcat 像kyj项目请求直接对接 tomcat&#xff0c;tomcat的连接池就会直接影响“并发用户数” 如果这种情况下做性能测试的时候&#xff0c;并发用户数不能满足要求&#xff0c;可以适当加大线程池的配置。 如&#xff1a;项目性能测试发现项目所在机器&#xff0c;资源利用率…

hexo接入github Discussions评论系统

评论存储仓 可以是你的博客项目的(github)仓库&#xff0c;也可以单独新建一个评论存储仓库。 我的博客项目在gitee上&#xff0c;就以新建存储仓为例&#xff1a; 使用Discussions评论系统必须开通Discussions模块&#xff01; 安装giscus插件 https://github.com/apps/…

书客、月影、欧普护眼大路灯哪款好?三款落地灯真实对比测评

作为在照明电器领域资深的评测员&#xff0c;我对市面上各种新颖的照明家电有着深入的探索和研究。大路灯能够提供舒适健康的照明光线&#xff0c;目前正受到许多用眼人群的广泛欢迎。&#xff0c;当然随着大路灯的普及&#xff0c;市场中也充斥着一些低劣的大路灯产品&#xf…

中国平安金融壹账通交付管理中心总经理崔羽先生受邀为第十三届中国PMO大会演讲嘉宾

全国PMO专业人士年度盛会 中国平安金融壹账通交付管理中心总经理崔羽先生受邀为PMO评论主办的2024第十三届中国PMO大会演讲嘉宾&#xff0c;演讲议题为“项目管理成与败&#xff0c;人才是第一要素”。大会将于5月25-26日在北京举办&#xff0c;敬请关注&#xff01; 议题简要…

消息队列之-----------------zookeeper机制

目录 一、ZooKeeper是什么 二、ZooKeeper的工作机制 三、ZooKeeper特点 四、ZooKeeper数据结构 五、ZooKeeper应用场景 5.1统一命名服务 5.2统一配置管理 5.3统一集群管理 5.4服务器动态上下线 5.5软负载均衡 六、ZooKeeper的选举机制 6.1第一次启动选举机制 6.2非…

Java中的TCP通信

TCP通信 TCP通信Socket客户端ServerSocket服务端 例子&#xff1a;一发一收例子&#xff1a;多发多收异常捕获 例子&#xff1a;服务器与多个客户端同时通信多客户端通信架构服务端代码ServerReaderThread 服务端读数据线程 TCP通信 特点&#xff1a;面向连接、可靠通信 通信双…

[C++][算法基础]树的重心(树图DFS)

给定一颗树&#xff0c;树中包含 n 个结点&#xff08;编号 1∼n&#xff09;和 n−1 条无向边。 请你找到树的重心&#xff0c;并输出将重心删除后&#xff0c;剩余各个连通块中点数的最大值。 重心定义&#xff1a;重心是指树中的一个结点&#xff0c;如果将这个点删除后&a…

为什么越来越多的网工运维转行网络安全?

最近越来越多的网工运维小伙伴都在吐槽&#xff1a;干网工、运维多年&#xff0c;薪资还是5.6K&#xff0c;技术也遇瓶颈上不去&#xff0c;考虑转岗或者转行。其中大部分的网工运维小伙伴们纷纷瞄准了高薪高前景的网络安全工程师岗位 网络安全是怎样的岗位&#xff1f; 人才…

星抖短剧养猪,闲鱼出售金币,日收益50-200+,零成本副业项目

自3月31日推出以来&#xff0c;“星斗短剧”平台迅速获得了众多团队的关注和推崇&#xff0c;用户数量持续增长。 目前&#xff0c;已有超过26万的用户群体活跃在平台上。用户数量的庞大直接映射了市场的广阔和需求的多样性&#xff0c;为我们提供了赚取收益的良机。 公 众号…

自然语言处理、大语言模型相关名词整理

自然语言处理相关名词整理 零样本学习&#xff08;zero-shot learning&#xff09;词嵌入&#xff08;Embedding&#xff09;为什么 Embedding 搜索比基于词频搜索效果好&#xff1f; Word2VecTransformer检索增强生成&#xff08;RAG&#xff09;幻觉采样温度Top-kTop-p奖励模…

HarmonyOS实战开发-WebSocket的使用。

介绍 本示例展示了WebSocket的使用&#xff0c;包括客户端与服务端的连接和断开以及客户端数据的接收和发送。 WebSocket连接&#xff1a;使用WebSocket建立服务器与客户端的双向连接&#xff0c;需要先通过createWebSocket方法创建WebSocket对象&#xff0c;然后通过connect…

node express 请求参数接收方式汇总

express 安装使用 express官网 express 是node.js 中写后端服务比较流行的框架。 安装express npm install -g express安装 express-generator 相当于vue的cli 用来快速生成express项目 npx express-generator生成项目mynode -e是使用ejs模版 express -e mynodeexpress生成器生…

TouchGFX 控件附加 ClickListener 功能的方法介绍

1. 引言 TouchGFX 是专用于 STM32 的图形界面设计软件&#xff0c;可用来低成本开发优秀的图形界面&#xff0c;TouchGFX 现已变的越来越流行。为了帮助客户更加深入地理解和使用 TouchGFX &#xff0c;本文介绍了 TouchGFX Designer 中的 Mixin 功能&#xff0c;从基础示例 B…

Docker核心特征

Docker的基本概念 Dockerfile&#xff1a;制作进行的文件&#xff0c;可以理解为制作镜像的一个清单。 镜像&#xff1a;用来创建容器的安装包&#xff0c;可以理解为给电脑安装操作系统的系统镜像。 容器&#xff1a;通过镜像来创建的一套运行环境&#xff0c;一个容器里可…

每日一题 — 将 x 减到 0 的最小操作数

思路&#xff1a; 题目要求是让我们从数组的最左端和最右端进行操作&#xff0c;这样的话解题的难度大大提升&#xff0c;我们可以用 正难则反 的思想&#xff1a; 题目中要求是减去数组中的数刚好等于X&#xff0c;我们可以转换成 数组中某一段的和等于 数组的总长减去X(sum -…