ROS基本框架2——在ROS开发中创建并使用自定义消息(C++版本)
code review!
参考笔记
1.ROS基本框架1——编写简单的发布者和订阅者(C++和Python版本)
2.ROS基本框架2——在ROS开发中创建并使用自定义消息(C++版本)
文章目录
- ROS基本框架2——在ROS开发中创建并使用自定义消息(C++版本)
-
- 1. 一个简单的完整流程
-
- 1.1 创建工作空间和功能包
- 1.2 定义自定义消息
- 1.3 修改 CMakeLists.txt
- 1.4 修改 package.xml
- 1.5 生成代码
- 1.6 使用自定义消息
-
- 1.6.1 发布节点(publisher.cpp)
- 1.6.2 订阅节点(subscriber.cpp)
- 1.7 编译代码
- 1.8 运行节点
- 1.9 运行结果
- 1.10 总结
- 2. 独立开发自定义消息功能包
-
- 2.1 实现目标
- 2.2 创建消息定义功能包
- 2.3 修改 CMakeLists.txt
- 2.4 修改 package.xml
- 2.5 编译消息定义功能包
- 2.6 修改发布节点功能包
-
- 2.6.1 修改 package.xml
- 2.6.2 修改 CMakeLists.txt
- 2.6.3 使用自定义消息
- 2.7 修改订阅节点功能包
-
- 2.7.1 修改 package.xml
- 2.7.2 修改 CMakeLists.txt
- 2.7.3 使用自定义消息
- 2.8 编译和运行
-
- 2.8.1 分别编译功能包
- 2.8.2 运行功能包
- 2.9 总结
- 3. 发布和订阅节点在同一个功能包中
-
- 3.1 创建消息定义功能包
- 3.2 修改 `my_package`
-
- 3.2.1 修改 package.xml
- 3.2.2 修改 CMakeLists.txt
- 3.3 编写发布和订阅节点
- 3.4 编译和运行
-
- 3.4.1 编译功能包
- 3.4.2 运行功能包
- 3.5 总结
1. 一个简单的完整流程
在 ROS(Robot Operating System)中,自定义消息类型(msg
)是指用户根据需求创建的消息,用于节点之间的数据通信。以下是一个完整的流程,展示如何在 ROS C++ 开发中创建并使用自定义消息。
1.1 创建工作空间和功能包
# 创建工作空间
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws
# 初始化工作空间
catkin_make
# 创建功能包
cd src
catkin_create_pkg my_package std_msgs roscpp
1.2 定义自定义消息
在功能包 my_package
中创建 msg
文件夹,并定义消息类型。
cd ~/catkin_ws/src/my_package
mkdir msg
创建自定义消息文件 MyMessage.msg
:
# 文件路径: my_package/msg/MyMessage.msg
int32 id
string name
float32 value
1.3 修改 CMakeLists.txt
编辑 my_package
的 CMakeLists.txt
文件,添加自定义消息的支持。
# 添加消息生成依赖
find_package(catkin REQUIRED COMPONENTS
std_msgs
roscpp
message_generation
)
# 添加消息文件
add_message_files(
FILES
MyMessage.msg
)
# 生成消息
generate_messages(
DEPENDENCIES
std_msgs
)
# 包含生成的消息头文件
catkin_package(
CATKIN_DEPENDS message_runtime roscpp std_msgs
)
1.4 修改 package.xml
确保在 package.xml
中添加了对 message_generation
和 message_runtime
的依赖。
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
1.5 生成代码
在工作空间根目录下编译生成代码。
cd ~/catkin_ws
catkin_make
1.6 使用自定义消息
1.6.1 发布节点(publisher.cpp)
#include "ros/ros.h"
#include "my_package/MyMessage.h"
int main(int argc, char** argv) {
ros::init(argc, argv, "my_publisher");
ros::NodeHandle nh;
ros::Publisher pub = nh.advertise<my_package