ROS2探索总结(十三)—— 话题与服务接口定义

  • 内容
  • 评论
  • 相关

~欢迎关注~
微信公众号:古月居(guyue_home)
新浪微博:古月春旭
知乎专栏:古月居
原文链接:ROS 2中的话题与服务接口定义

 

ROS是一个分布式的机器人软件框架,涉及多节点之间的数据通信,绝大部分是基于话题或者服务完成的。

话题和服务在节点之间打通了一条隧道,其中来往的车辆就是需要传输的数据。每个数据长什么样,使用什么样的数据结构,可以使用ROS中已有的定义,也可以根据需求使用语言无关的接口自己定义,在编译过程时,再基于接口定义生成多种语言的代码。

这是ROS中非常重要、非常基础的功能,为ROS的松耦合提供了基础,在ROS2中依然保留了这项接口定义的功能。本篇我们就来看看ROS2中关于接口定义的方法。

一、话题接口定义

ROS2中的话题接口称为消息,描述文件以.msg结尾,放置在功能包的msg文件夹下,包含字段(fields)和常量(constants)两部分。

1. 字段

字段使用以下方式定义,包含类型和名称,使用空格分开:

fieldtype1 fieldname1 fieldtype2 fieldname2 fieldtype3 fieldname3

如:

  1. int32 my_int
  2. string my_string

这里的字段类型可以使用ROS中的标准数据结构定义:

Image

也可以使用功能包中已有的消息定义,如: “geometry_msgs/PoseStamped”等。

还可以定义数组,包括数组的长度和范围:

variable-length array[] fixed-length array[C], bounded-length array[<=C]

如:

  1. int32[] unbounded_integer_array
  2. int32[5] five_integers_array
  3. int32[<=5] up_to_five_integers_array
  4. string string_of_unbounded_size
  5. string<=10 up_to_ten_characters_string
  6. string[<=5] up_to_five_unbounded_strings
  7. string<=10[] unbounded_array_of_string_up_to_ten_characters each
  8. string<=10[<=5] up_to_five_strings_up_to_ten_characters_each

另外,使用以下结构,每个字段还可以设置一个默认值:

fieldtype fieldname fielddefaultvalue

如:

  1. uint8 x 42
  2. int16 y -2000
  3. string full_name "John Doe"
  4. int32[] samples [-200, -100, 0, 100, 200]

2. 常量

常量类似程序中的宏定义,和上边的默认值有点像,只是不允许修改。

constanttype CONSTANTNAME=constantvalue

如:

  1. int32 X=123
  2. int32 Y=-123
  3. string FOO="foo"
  4. string EXAMPLE='bar'

* 这里需要注意,字段的名称必须是大写字母组成。

二、服务接口定义

服务接口的描述文件以.srv结尾,放置在功能包中的srv文件夹里。

服务描述文件中包含请求和应答两个部分的消息定义,中间使用“---”分开:

string str --- string str

可以调用已有的消息接口定义,如:

  1. #request constants
  2. int8 FOO=1
  3. int8 BAR=2#request fields
  4. int8 foobar
  5. another_pkg/AnotherMessage msg
  6. ---
  7. #response constants
  8. uint32 SECRET=123456#response fields
  9. another_pkg/YetAnotherMessage val
  10. CustomMessageDefinedInThisPackage value
  11. uint32 an_integer

* 这里需要注意,服务接口中可以调用消息接口,但是不能嵌套调用服务接口!

三、话题接口配置示例

这里创建一个描述通信录事项的消息定义,在功能包中创建msg文件,并在其中创建Contact.msg文件内容:

  1. bool FEMALE=true
  2. bool MALE=false
  3. string first_name
  4. string last_name
  5. bool gender
  6. uint8 age
  7. string address

为了将以上定义编译成不同编程语言对应的文件,还需要配置package.xml和CMakeLists.txt。

1. package.xml

在package.xml文件中添加以下内容:

  1. <buildtool_depend>rosidl_default_generators</buildtool_depend>
  2. <exec_depend>rosidl_default_runtime</exec_depend>
  3. <member_of_group>rosidl_interface_packages</member_of_group>

2.CMakeLists.txt

在CMakeLists.txt文件中添加以下内容:

  1. find_package(rosidl_default_generators REQUIRED)
  2.  
  3. set(msg_files
  4. "msg/Contact.msg"
  5. )
  6.  
  7. rosidl_generate_interfaces(${PROJECT_NAME}
  8. ${msg_files}
  9. )
  10.  
  11. ament_export_dependencies(rosidl_default_runtime)

 

四、服务接口配置示例

srv文件类似,在srv文件夹下创建AddTwoFloats.srv文件,内容如下:

  1. float64 a
  2. float64 b
  3. ---
  4. float64 sum

CMakeLists.txt文件中添加:

  1. set(srv_files
  2.    "srv/AddTwoFloats.srv")
  3.  
  4. rosidl_generate_interfaces(${PROJECT_NAME}
  5.    ${msg_files}
  6.    ${srv_files}
  7. )

 

五、编译生成代码文件

最后,就可以编译功能包了,定义的接口会生成对应的程序文件,自动放置在install文件夹中,例如以上接口示例生成的头文件如下:

Screenshot from 2019-01-20 23-55-05

Screenshot from 2019-01-20 23-56-01

Screenshot from 2019-01-20 23-56-20

有了这些程序文件,后续我们就可以在程序中调用啦!

 

更多内容欢迎关注:

微信公众号:古月居 (guyue_home)

新浪微博:古月春旭

知乎专栏:古月居


原创文章,转载请注明: 转载自古月居

本文链接地址: ROS2探索总结(十三)—— 话题与服务接口定义

微信 OR 支付宝 扫描二维码
为本文作者 打个赏
pay_weixinpay_weixin

评论

12条评论
  1. Gravatar 头像

    mr.guo 回复

    使用catkin_make编译工程莫名其妙的不显示进度了,我以为是工程配置问题,又重新创建工作空间依旧无法编译。请问是啥原因,这种情况编译出来的工程有问题,不能用 😥
    mm@mm:~/catkin_ws$ catkin_make
    Base path: /home/mm/catkin_ws
    Source space: /home/mm/catkin_ws/src
    Build space: /home/mm/catkin_ws/build
    Devel space: /home/mm/catkin_ws/devel
    Install space: /home/mm/catkin_ws/install
    ####
    #### Running command: "make cmake_check_build_system" in "/home/mm/catkin_ws/build"
    ####
    ####
    #### Running command: "make -j4 -l4" in "/home/mm/catkin_ws/build"
    ####

    • 古月

      古月 回复

      @mr.guo 确定是有C++程序并且配置好编译规则了么

      • Gravatar 头像

        mr.guo 回复

        @古月 这个好象是使用roboware 造成的,自从下载了roboware 工程结构都发生了变化,有尝试过创建新的工程,但是解决不了。 所有重新卸载了ros 又安装了一遍 为此我特意保留了原先打问题工程,在新装的ros环境下也是不能用,但是重新创建的工程环境,可以正常编译。
        感觉主要问题是roboware好像改了ros系统的配置,和工作空间的配置,具体也不能定位,重装ros系统可以解决

  2. Gravatar 头像

    Cxl 回复

    古月老师你好,我目前在做一款自主双足人形机器人,使用RK系列的板子,我想将机器人运动状态用3D模型在板子上显示,有什么好的工具或方案么?感谢

  3. Gravatar 头像

    林夕 回复

    博主你好,请问CamakeList.txt和package.xml文件添加的内容具体要包括什么呀?深蓝学院ros基础课第2讲作业1,launch文件和turtle_control写好了,CamakeList.txt和package.xml文件需要添加什么呀?

    • 古月

      古月 回复

      @林夕 课程视频中有详细的添加过程,也可以参考ROS wiki教程

  4. Gravatar 头像

    deng 回复

    您好,请问在ros2去掉master的结构下如何实现多台电脑的局域网内通信呢?

    • 古月

      古月 回复

      @deng 我还没测试过,有可能在同一个局域网即可,或者配置一下ROS_IP

      • Gravatar 头像

        liushuo 回复

        @古月 老师您好,我在运行sudo apt-get install ros-melodic-gmapping后出现:
        E: Unable to locate package ros-melodic-gmapping
        请问老师怎么办,网上没有发现很好的解决办法

        • Gravatar 头像

          l 回复

          @liushuo 朋友,你这个的问题解决了吗?

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据