自定义消息流程

在 ROS 中,如果没有现成的消息类型来描述要传递的数据,就需要自定义消息。

通常会新建一个独立的 package 来定义消息类型。这个 package 一般不写业务逻辑,只负责声明自定义消息,可以定义一种或多种消息类型,根据业务需求决定。

所以,首先单独创建一个 package,取名为 demo_msgs。消息定义包的核心依赖是 message_generationmessage_runtime;如果消息字段使用了其他包里的类型,再额外添加对应依赖。rosmsg 是查看消息的命令行工具,不需要写进包依赖。

1
2
cd ~/catkin_ws/src
catkin_create_pkg demo_msgs message_generation

1 . 创建msg目录

在 package 目录下新建 msg 目录:

1
mkdir -p demo_msgs/msg

2. 新建msg文件

创建的 Student.msg 文件就是自定义消息文件,用来描述消息格式。

我们可以编辑代码如下

1
2
string name
int64 age

这个自定义消息包含两个字段:name 的类型是 stringage 的类型是 int64

.msg 文件遵循固定格式,每一行表示一个字段,前面是类型,后面是名称。

ROS 不只提供 int64string 两种基本类型,还有 boolint32float64timeduration 等类型。也可以引用其他包中的消息类型,例如 std_msgs/Header

3. 配置package.xml文件

package.xml 中添加如下配置:

1
2
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>

4. 配置CMakeLists.txt

find_package 配置:

find_package 中添加 message_generation

1
2
3
find_package(catkin REQUIRED COMPONENTS
message_generation
)

add_message_files 配置:

1
2
3
4
add_message_files(
FILES
Student.msg
)

这里的 Student.msg 要和创建的 msg 文件名称一致,且必须在 msg 目录下,否则编译会出现问题。

generate_messages 配置:

1
generate_messages()

如果你的消息字段引用了其他包的消息类型,例如 std_msgs/Header header,则需要在 find_packagegenerate_messages(DEPENDENCIES ...) 中添加 std_msgs

catkin_package 配置:

1
2
3
catkin_package(
CATKIN_DEPENDS message_runtime
)

这里声明运行时依赖 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
2
import rospy
from demo_msgs.msg import Student