机器人操作系统(ROS)教程14:ROS的msg和srv-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 9195|回复: 1

机器人操作系统(ROS)教程14:ROS的msg和srv

[复制链接]
发表于 2015-3-1 17:31 | 显示全部楼层 |阅读模式
本帖最后由 对折之内 于 2015-3-1 17:31 编辑

msg是一个描述ROS中消息的域的简单的文本文件,它用来为消息产生不同语言的源代码。

srv文件描述一个服务,它由两部分组成:请求和服务。

     msg文件被存储在一个包的msg目录下,srv文件被存储在srv目录下。msg是简单的文本文件,它的每一行由一个域的类型和域的名字组成。你可以使用的域的类型有:

  • int8, int16, int32, int64 (plus uint*)  
  • float32, float64  
  • string  
  • time, duration  
  • other msg files  
  • variable-length array[] and fixed-length array[C]   

ROS中还有一个特殊的类型Header,header包括了一个时间戳和一个经常在ROS中使用的坐标框架信息。你经常会看到在msg文件的第一行代码是:

Header header

下面是一个使用了Header的msg的例子:

  • Header header  
  • string child_frame_id  
  • geometry_msgs/PoseWithCovariance pose  
  • geometry_msgs/TwistWithCovariance twist  

srv文件和msg文件是一样的,除了它们包括两部分:请求和响应,这两部分通过'---'分隔。下面是一个srv文件的例子:

  • int64 A  
  • int64 B  
  • ---  
  • int64 Sum  

在上面的例子中A和B是请求,sum是响应。


打开我们之前所建立的包:


cd ~/catkin_ws/src/beginner_tutorials  


在里面创建一个msg目录:


mkdir msg  


新建一个msg文件,并写入数据:

  • echo "int64 num" > msg/Num.msg  

这是一个最简单的例子,msg文件只包括一行,当然也可以在文件中写入更多的数据。

接下来,打开package.xml:

gedit package.xml

在里面添加下面两行:

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

之后保存退出。再打开CMakeLists.txt:

添加message_generation到如下代码片,添加后结果如下:

  • # Do not just add this line to your CMakeLists.txt, modify the existing line  
  • find_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs message_generation)  

添加CATKIN_DEPENDS message_runtime,如下:

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

找到下面的代码片:

  • # add_message_files(  
  • #   FILES  
  • #   Message1.msg  
  • #   Message2.msg  
  • # )  


将它修改为:
  • add_message_files(  
  •   FILES  
  •   Num.msg  
  • )  

确保文件中有如下代码:
  • generate_messages()  

我们可以使用rosmsg show命令来查看,消息的详细类型,rosmsg show的使用方法如下:
rosmsg show [message type]


查看Num消息类型如下:
rosmsg show Num


你将会看到:
  • [beginner_tutorials/Num]:  
  • int64 num  

下面介绍如何使用srv,打开一个终端,在里面输入:
roscd beginner_tutorials  

在包内创建srv文件夹:

mkdir srv  

除了可以手工创建一个srv包以外,我们还可以从其他的包中复制,这时候roscp是一个非常有用的命令,它的使用方法如下:
roscp [package_name] [file_to_copy_path] [copy_path]  

我们从rospy_tutorials这个包中复制,命令如下:
roscp rospy_tutorials AddTwoInts.srv srv/AddTwoInts.srv  

接下来就是配置CMakeLists.txt文件,打开CMakeLists.txt:
gedit CMakeLists.txt  

在里面添加message_generation,我们之前已经添加过了,如下:
  • # Do not just add this line to your CMakeLists.txt, modify the existing line  
  • find_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs <span style="color:#FFFF00">message_generation</span>)  
找到下面的代码片段:
  • # add_service_files(  
  • #   FILES  
  • #   Service1.srv  
  • #   Service2.srv  
  • # )  

将其修改为:
  • add_service_files(  
  •   FILES  
  •   AddTwoInts.srv  
  • )  
保存退出。

     使用rossrv show可以查看我们刚刚建立的服务类型,它的使用方法和rosmsg show相似,用法如下:

rossrv show <service type>
例如:
rossrv show beginner_tutorials/AddTwoInts
你将会看到返回的结果如下:
  • int64 a  
  • int64 b  
  • ---  
  • int64 sum  
我们在开头的时候说过,msg可以用来为消息产生不同语言的源代码。接下来我们看一下如何将上述的文件生成为ros支持的语言代码,首先打开CMakeLists.txt:
gedit CMakeLists.txt
找到下面这部分代码:
  • # generate_messages(  
  • #   DEPENDENCIES  
  • # #  std_msgs  # Or other packages containing msgs  
  • # )  
将起修改为如下:
  • generate_messages(  
  •   DEPENDENCIES  
  •   std_msgs  
  • )  
将我们之前的generate_messages()去掉,保存退出。

     现在重新构建一下这个包:

执行:
cd ../..  
和:
catkin_make
所有在msg目录下的.msg文件都会产生ros所支持的语言的源文件。C++消息的头文件产生在:
    ~/catkin_ws/devel/include/beginner_tutorials/
python的脚本产生在:
       ~/catkin_ws/devel/lib/python2.7/dist-packages/beginner_tutorials/msg  
lisp文件产生在:
        ~/catkin_ws/devel/share/common-lisp/ros/beginner_tutorials/msg/  


如果产生文件保存的目录不一样,可自己寻找一下。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-12-1 04:06 , Processed in 0.090671 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表