ROS学习(五)ROS消息传递——自定义消息

前言

尽管ROS中提供了全面的基本数据类型消息,但在很多场合,我们希望根据自己的需要定义数据类型,一个典型的例子是can总线数据帧的传递,数据包中包括id号,数据长度以及数据部分,我们希望每个部分都有一个变量名称来表示,通常我们在这种场合会使用一个结构体封装数据,在ROS中,可以用自定义msg完成用户数据封装的功能。

参考示例

以can数据帧的封装为例,来学习一下自定义msg的使用方法。

1.定义用户数据
这一步比较简单,在程序包文件夹下新建一个msg文件夹,在文件夹下新建一个can_data.msg文件,并在文件中写入以下内容

1
2
3
4
std_msgs/Header header
int16 id
int16 len
int32[4] data

这样就定义好了一个自定义消息,msg文件的名称就是消息的类型。

2.添加编译支持
为了让自定义的数据类型能够使用,需要将它编译成ROS中的消息。在使用std_msgs时,我们知道,要使用某个数据类型的消息,需要包含对应的头文件。因此需要将.msg文件编译生成.h文件,并在使用自定义消息的场合包含改头文件。我们需要做以下几处更改。
package.xml
package.xml需要添加编译依赖项和运行依赖项

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

CmakeList.txt
find_package()中添加message_generation

1
2
3
4
5
6
find_package(catkin REQUIRED COMPONENTS
message_generation
roscpp
rospy
std_msgs
)

add_message_files()中添加can_data.msg

1
2
3
4
add_message_files(
FILES
can_data.msg
)

generate_messages()去掉注释
catkin_package()添加message_runtime

1
2
3
4
5
catkin_package(
...
CATKIN_DEPENDS ... message_runtime
...
)

在程序中要使用can_data数据类型时,要包含头文件#include “custom_msgs_demo/can_data.h”,头文件是ROS编译自动生成的,这样,就能在程序中定义和使用can_data类型对象

1
2
3
4
5
6
7
8
9
10
custom_msgs_demo::can_data output;
output.header.seq = count;
output.header.stamp = ros::Time::now();
output.header.frame_id = "can_data";
output.id = 0x101;
output.len = 2;
output.data[0] = 10;
output.data[1] = 20;
output.data[2] = 30;
output.data[3] = 40;

参考代码

完整工程参考
https://github.com/wenglihong/wlh_ros_demo/tree/master/msg_demo/custom_msgs_demo