您的位置:首页 > 其它

ROS:创建和发布自己的Message

2016-07-02 17:36 246 查看
有时候我们需要定义自己的msg,而ROS wiki上ROS Tutorials的教程让新手不是很好理解。在wiki上有介绍创建msg,下一步介绍发布和订阅,然而创建的msg是Num,发布的却是std_msgs/String。对于小白而言看起来就比较吃力了。但是在ROS上对在C++/Python上然后使用也是有说明的,如MessagesDefiningCustomMessages

这篇博客就对如何创建自己的msg并且发布(C++)做一个详细的介绍。


创建自己的msg

Step1:首先进入自己的workspace。
1cd~/catkin_ws/src
Step2:创建一个包,取名为encode_talker,用来发布编码器数据信息。依赖rospy、roscpp、message_generation、message_runtime。1catkin_create_pkgencode_talkerrospyroscppmessage_generationmessa ge_runtime

Step3:进入encode_talker包,创建msg文件夹和自己的msg
123cdencode_talker/mkdirmsgtouchmsg/Encode.msg
Step4:然后编辑Encode.msg,定制自己的数据。这里加入左右轮速12floatLeft_velfloatRight_vel

Step5:如果按照上述过程来的话就可跳过该步骤。否则需要在package.xml加入依赖,确保有以下两句话:
12<build_depend>message_generation</build_depend><run_depend>message_runtime</run_depend>
Step6:修改 CMakeLists.txt文件。用find_packag中加入message_generation的依赖。有了step2这步也可以跳过。1find_package(catkinREQUIREDCOMPONENTSmessage_generation)

然后得添加msg文件
1add_message_files(FILESEncode.msg)
为了确保CMake知道在什么时候重新配置我们的project,确保添加了以下代码。1generate_messages()

这时的CMakeLists.txt是这样的:
1234567891011121314151617cmake_minimum_required(VERSION2.8.3)project(encode_talker)##Findcatkinandanycatkinpackagesfind_package(catkinREQUIREDCOMPONENTSmessage_generationmessage_runtimeroscpprospy)##Generatemessagesinthe'msg'folderadd_message_files(FILESEncode.msg)##Generateaddedmessagesandserviceswithanydependencieslisted    heregenerate_messages()#catkin_package(CATKIN_DEPENDSmessage_runtime)include_directories(${catkin_INCLUDE_DIRS})
Step7:编译并且测试ROS是否能够识别消息。123cd ~/catkin_wscatkin_makerosmsg show encode_talker/Encode

然后在终端上可以看到:
12float32 left_velfloat32 right_vel
如果忘记Encode所在包,可以运行1rosmsg show Encode

这时终端上会显示
123[encode_talker/Encode]:float32 left_velfloat32 right_vel

发布自己的msg

在创建自己的msg之后,接下来编写一个发布器把消息发布出去。Step8:首先创建一个发布的C++文件(当前目录在工作空间 ~/catkin_ws)1touch src/encode_talker/src/publisher.cpp

在文件中编写代码,如下:
123456789101112131415161718#include "ros/ros.h"#include "encode_talker/Encode.h"int main(int argc, char **argv){    ros::init(argc, argv, "encode_talker");    ros::NodeHandle n;    ros::Publisher encode_pub = n.advertise<encode_talker::Encode>("encode", 1);    ros::Rate loop_rate(10);    while(n.ok()){        encode_talker::Encode encode;        encode.left_vel = 0.111;        encode.right_vel = 0.222;        encode_pub.publish(encode);        ros::spinOnce();        loop_rate.sleep();    }    return 0;}
DefiningCustomMessages中可以知道怎么在C++中使用我们的msg,消息类型都被归属到与package相对应的域名空间下。在上面第2行以添加头文件的方式添加我们自己定义的msg:1#include "name_of_package/name_of_message.h"

在第7、10行使用了我们的msg,以下面的形式来表示:
1name_of_package::name_of_message
Step9:修改CMake文件,在文件底部添加以下代码,第三行代码是为可执行文件添加对生成的消息文件的依赖123add_executable(publisher src/publisher.cpp)target_link_libraries(publisher ${catkin_LIBRARIES})add_dependencies(publisher encode_talker_generate_messages_cpp)

Step10:编译并且运行publisher节点
1catkin_make
首先运行master1roscore

在一个新的终端下运行节点
1rosrun encode_talker publisher
再打开一个新的终端查看我们发布的消息,并且用rostopic echo查看数据12rostopic listrostopic echo /encode



最后附上代码: encode_talker.tar

参考:

CSDN BLOG:

http://blog.csdn.net/heyijia0327/article/details/41654963

ROS WIKI:

http://wiki.ros.org/cn/ROS/Tutorials/CreatingMsgAndSrv

http://wiki.ros.org/cn/ROS/Tutorials/WritingPublisherSubscriber%28c%2B%2B%29

http://wiki.ros.org/roscpp/Overview/Messages

http://wiki.ros.org/cn/ROS/Tutorials/DefiningCustomMessages
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: