ROS自定义Msg消息
自定义消息流程
在 ROS 中,如果没有现成的消息类型来描述要传递的数据,就需要自定义消息。
通常会新建一个独立的 package 来定义消息类型。这个 package 一般不写业务逻辑,只负责声明自定义消息,可以定义一种或多种消息类型,根据业务需求决定。
所以,首先单独创建一个 package,取名为 demo_msgs。消息定义包的核心依赖是 message_generation 和 message_runtime;如果消息字段使用了其他包里的类型,再额外添加对应依赖。rosmsg 是查看消息的命令行工具,不需要写进包依赖。
1 | cd ~/catkin_ws/src |
1 . 创建msg目录
在 package 目录下新建 msg 目录:
1 | mkdir -p demo_msgs/msg |
2. 新建msg文件
创建的 Student.msg 文件就是自定义消息文件,用来描述消息格式。
我们可以编辑代码如下
1 | string name |
这个自定义消息包含两个字段:name 的类型是 string,age 的类型是 int64。
.msg 文件遵循固定格式,每一行表示一个字段,前面是类型,后面是名称。
ROS 不只提供 int64 和 string 两种基本类型,还有 bool、int32、float64、time、duration 等类型。也可以引用其他包中的消息类型,例如 std_msgs/Header。
3. 配置package.xml文件
在 package.xml 中添加如下配置:
1 | <build_depend>message_generation</build_depend> |
4. 配置CMakeLists.txt
find_package 配置:
在 find_package 中添加 message_generation:
1 | find_package(catkin REQUIRED COMPONENTS |
add_message_files 配置:
1 | add_message_files( |
这里的
Student.msg要和创建的 msg 文件名称一致,且必须在msg目录下,否则编译会出现问题。
generate_messages 配置:
1 | generate_messages() |
如果你的消息字段引用了其他包的消息类型,例如
std_msgs/Header header,则需要在find_package和generate_messages(DEPENDENCIES ...)中添加std_msgs。
catkin_package 配置:
1 | catkin_package( |
这里声明运行时依赖
message_runtime,供其他包使用生成后的消息。
检验自定义消息
1. 编译项目
来到工作空间目录下,运行编译
1 | catkin_make |
2. 查看生成的消息文件
C++ 的头文件会生成在 devel/include/demo_msgs/ 目录下。
Python 绑定会生成在 devel/lib/python3/dist-packages/demo_msgs/msg/ 目录下;如果使用 ROS Melodic 或更早版本,路径可能是 python2.7/dist-packages。
3. 通过rosmsg工具校验
1 | rosmsg show demo_msgs/Student |
常见问题
1. 如果出现msg找不到的情况
清除编译信息并重新编译,
2. python导入方式
1 | import rospy |







