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

来源:互联网 发布:python 下划线用法 编辑:程序博客网 时间:2024/06/05 04:09

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

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

std_msgs/Header headerint16 id int16 len int32[4] data

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

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

<build_depend>message_generation</build_depend><run_depend>message_runtime</run_depend>

CmakeList.txt
find_package()中添加message_generation

find_package(catkin REQUIRED COMPONENTS  message_generation  roscpp  rospy  std_msgs)

add_message_files()中添加can_data.msg

 add_message_files(   FILES   can_data.msg )

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

catkin_package(  ...  CATKIN_DEPENDS ... message_runtime  ...)

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

    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

0 1
原创粉丝点击