ROS自带的消息类型非常丰富,在ROS Kinetic上使用命令rostopic list可以查看所有的消息类型。但是总有时候系统自带的消息类型无法满足工程的特殊需要,这时我们可以自定义消息类型。
我们要在板子上测试其图像处理能力,要使用一个image_buf的类型进行cache,iamge_buf是一个image的vector。这里,我们直接自己定义一个image类型,然后生成对应的消息类型,并根据这个image,再生成image_buf。
自定义第一个消息类型my_imgdata
1. 建立自定义消息类型package
cd ~/catkin_ws/src/
catkin_creat_pkg imgdata_msg
cd imgdata_msg/
mkdir msg
2. 输入消息格式到消息文件,这里图像数据格式参考:http://blog.csdn.net/redskydeng/article/details/49362155
echo "uint8[] data" >> msg/my_imgdata.msg
echo "string actor_time" >> msg/my_imgdata.msg
3. 在imgdata_msg的CMakeLists.txt文件中添加如下语句
find_package(catkin REQUIRED COMPONENTS message_generation roscpp std_msgs)
4. 取消 add_message_files 的相关注释,并添加为如下:
add_message_files(FILES my_imgdata.msg )
5. 取消generate_messages的相关注释,并添加修改为如下:
generate_messages(DEPENDENCIES std_msgs )
6. 在catkin_package中添加:CATKIN_DEPENDS message_runtime
7. 在imgdata_msg的.xml文件中添加://indigo用的是run_depend,为Kinetic用的是exec_depend
message_generation
message_runtime
8. cd ~/catkin_ws/ && catkin_make -DCATKIN_WHITELIST_PACKAGES="imgdata_msg"
9. source devel/setup.bash
10. 至此第一个自定义的消息定义完成,你可以用rosmsg(在indigo上是rostopic)查看完整的消息定义
rosmsg show imgdata_msg/my_imgdata
下面建立第二个消息类型Img_buf,该消息会使用之前我们自定义的消息类型my_imgdata
1. cd ~/catkin_ws/src/imgdata_msg/
2. 输入消息格式到消息文件
echo "std_msgs/Header header" >> msg/Img_buf.msg
echo "imgdata_msg/my_imgdata[] buf" >> msg/Img_buf.msg
3. 在建立第一个消息的基础上,在 add_message_files 添加如下红色部分:
add_message_files(FILES my_imgdata.msg
Img_buf.msg )
4. cd ~/catkin_ws/ && catkin_make -DCATKIN_WHITELIST_PACKAGES="imgdata_msg"
5 source devel/setup.bash
6 至此第一个自定义的消息定义完成,你可以用rosmsg show imgdata_msg/Img_buf 查看完整的消息定义
使用自定义的消息类型:
在使用该消息的工程中添加如下头文件即可,同时要把devel/include目录下的imgdata_msg整体复制到使用该消息的include目录下
#include
该头文件是系统在建立自定义消息类型时候自动生成的。
这次实践,自己定义了一个消息类型my_imgdata,里面包含一个数组(或者说是vector)和一个string,然后又针对my_imgdata封装了一个新的消息类型Img_buf,里面包含了一个my_imgdata的数组(或者说是vector)。虽然这次实践的内容看来可能没有实际意义,(定义一个消息类型,又定义一个该消息类型的vetor作为一个新的消息类型)但是我们的最终目标是根据别人提供的任何消息类型,进行二次封装(目的是为了实现缓存),往里面再添加一些其他的成员,如时间、长度等信息,然后就可以利用ros提供的序列化和反序列化,这样就可以不考虑别人提供的数据(这部分数据也有序列化和反序列化)。
这里给出我们这次写出来的测试程序:
#include
#include
#include
#include
#include
#include
参考:http://blog.csdn.net/u011906844/article/details/72156215