ROS:创建和发布自己的Message

论坛 期权论坛 编程之家     
选择匿名的用户   2021-5-31 21:36   158   0

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

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

创建自己的msg

Step1:首先进入自己的workspace。

 
1
cd ~/ catkin_ws / src

Step2:创建一个包,取名为encode_talker,用来发布编码器数据信息。依赖rospy、roscpp、message_generation、message_runtime。

 
1
catkin_create_pkg encode_talker rospy roscpp message_generation messa
ge_runtime

Step3:进入encode_talker包,创建msg文件夹和自己的msg

 
1
2
3
cd encode_talker /
mkdir msg
touch msg / Encode. msg

Step4:然后编辑Encode.msg,定制自己的数据。这里加入左右轮速


  
1
2
float Left_vel
float Right_vel

Step5:如果按照上述过程来的话就可跳过该步骤。否则需要在package.xml加入依赖,确保有以下两句话:


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

Step6:修改 CMakeLists.txt文件。

用find_packag中加入message_generation的依赖。有了step2这步也可以跳过。


  
1
find_package ( catkin REQUIRED COMPONENTS message_generation )

然后得添加msg文件

 
1
add_message_files ( FILES Encode. msg )

为了确保CMake知道在什么时候重新配置我们的project,确保添加了以下代码。

 
1
generate_messages ( )

这时的CMakeLists.txt是这样的:

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
cmake_minimum_required ( VERSION 2.8.3 )
project ( encode_talker )
##Findcatkinandanycatkinpackages
find_package ( catkin REQUIRED COMPONENTS
message_generation
message_runtime
roscpp
rospy
)
##Generatemessagesinthe'msg'folder
add_message_files ( FILES Encode. msg )
##Generateaddedmessagesandserviceswithanydependencieslisted
here
generate_messages()
#catkin_package(CATKIN_DEPENDSmessage_runtime)
include_directories (
$ { catkin_INCLUDE_DIRS }
)

Step7:编译并且测试ROS是否能够识别消息。

 
1
2
3
cd ~/ catkin_ws
catkin_make
rosmsg show encode_talker / Encode

然后在终端上可以看到:

 
1
2
float32 left_vel
float32 right_vel

如果忘记Encode所在包,可以运行

 
1
rosmsg show Encode

这时终端上会显示

 
1
2
3
[ encode_talker / Encode ]:
float32 left_vel
float32 right_vel


发布自己的msg

在创建自己的msg之后,接下来编写一个发布器把消息发布出去。

Step8:首先创建一个发布的C++文件(当前目录在工作空间 ~/catkin_ws)

 
1
touch src / encode_talker / src / publisher. cpp

在文件中编写代码,如下:


  
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#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,以下面的形式来表示:


  
1
name_of_package :: name_of_message

Step9:修改CMake文件,在文件底部添加以下代码,第三行代码是为可执行文件添加对生成的消息文件的依赖

 
1
2
3
add_executable ( publisher src / publisher. cpp )
target_link_libraries ( publisher $ { catkin_LIBRARIES })
add_dependencies ( publisher encode_talker_generate_messages_cpp )

Step10编译并且运行publisher节点

 
1
catkin_make

首先运行master

 
1
roscore

在一个新的终端下运行节点

 
1
rosrun encode_talker publisher

再打开一个新的终端查看我们发布的消息,并且用rostopic echo查看数据

 
1
2
rostopic list
rostopic 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


分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP