【ROS2】通信部署概述(以话题(Topic)通信为例)
写在前面
很多内容参考了赵虚左老师的ROS2教程
概念说明
工作空间:相当于一个项目,比如一台机械臂,或者一个机器人
功能包:相当于一个项目中的一台设备,如电机、雷达、相机等
大概构建流程
以话题通信机制为例
- 创建工作空间与功能包
- 创建一个ROS2工作空间(如
~/ros2_ws
),并在src
目录下创建功能包(例如demo_nodes_cpp
):ros2 pkg create your_topic_name --build-type ament_cmake --dependencies rclcpp std_msgs base_interfaces_demo
- 创建一个ROS2工作空间(如
指令解析:
该命令的作用是创建一个名为your_topic_name
的 ROS2 功能包,具体行为如下:
- 创建功能包框架
- 生成一个名为your_topic_name
的文件夹,包含 ROS2 功能包的标准结构:
your_topic_name/├── CMakeLists.txt # CMake 构建配置├── package.xml # 包的元数据(名称、依赖、版本等)├── include/ # 头文件目录(可选)└── src/ # 源代码目录(用户需手动添加代码)
- 指定构建系统 (
--build-type ament_cmake
)
- 使用ament_cmake
作为构建工具,表明这是一个 C++ 项目。
- 自动生成适配 ROS2 的CMakeLists.txt
文件,包含 ROS2 的构建规则(如查找依赖、安装节点等)。- 声明依赖 (
--dependencies ...
)
自动在package.xml
中添加以下依赖项:
-rclcpp
: ROS2 的 C++ 客户端库,用于编写节点。
-std_msgs
: ROS2 标准消息类型(如Int32
,String
等)。
-base_interfaces_demo
: 用户自定义的接口包(假设是自定义的.msg
/.srv
文件)。
- 如果不需要自定义接口,在使用指令时,不要添加base_interfaces_demo,否则会产生依赖错误(或者手动在cmakelist中删除find_package(base_interfaces_demo REQUIRED))- 自动配置
package.xml
- 填充包的元信息(名称、描述、许可证等,部分字段需用户手动补充)。
- 在<depend>...</depend>
标签中写入指定的依赖项。- 生成适配 ROS2 的
CMakeLists.txt
- 自动包含find_package()
指令,用于查找依赖的 ROS2 包(如rclcpp
)。
- 提供模板供用户添加自己的可执行文件和库。
这一步一定一定要注意路径,功能包要放在xxx_ws/src目录下,否则在最后运行时会找不到节点或功能包
-
编写发布者节点A
-
编写订阅者节点B
-
配置构建系统
-
修改
CMakeLists.txt
,添加可执行文件和依赖项,具体实现看这篇博客 -
在
package.xml
中添加依赖,该文件的配置相对简单,关注标签即可,例如:
<depend>rclcpp</depend><depend>std_msgs</depend>```
-
5. 编译与运行
- 编译功能包:
colcon build --packages-select demo_nodes_cpp source install/setup.bash
- 启动两个终端分别运行节点A和节点B:
# 终端1运行发布者节点A ros2 run demo_nodes_cpp publisher_node# 终端2运行订阅者节点B ros2 run demo_nodes_cpp subscriber_node
- 节点B将输出接收到的消息(如
Received: Hello from Node A
)。
关键点说明
- 话题通信:节点A通过
create_publisher
发布消息到指定话题(如message_topic
),节点B通过create_subscription
订阅同一话题并处理数据。 - 消息类型:示例使用标准消息类型
std_msgs::msg::String
,可根据需求自定义消息结构。 - 节点命名:节点A和B需具有唯一名称(如
node_a
和node_b
),避免冲突。