ROS学习之七:创建ROS消息和服务

话题与服务

ROS节点间可通过话题和服务进行通信,其中话题在“ROS学习之四:ROS话题与消息”中介绍,服务在“ROS学习之五:ROS服务和参数”中介绍,对于话题,节点可以在其上发布消息,亦可订阅话题以接收消息,而服务则是节点发送请求、获得响应

msg与srv

  • msg(消息):msg文件是用于描述ROS消息字段的文本文件,用于为不同编程语言编写的消息生成源代码,存放在软件包的msg目录下,msg文件每行均有一个字段类型和字段名称,可使用的类型包括:
    • int8, int16, int32, int64 (以及 uint*)
    • float32, float64
    • string
    • time, duration
    • 其他msg文件
    • variable-length array[] 和 fixed-length array[C]
    • Header(含有时间戳和ROS中广泛使用的左坐标帧信息)

msg文件示例:

  Header header
  string child_frame_id
  geometry_msgs/PoseWithCovariance pose
  geometry_msgs/TwistWithCovariance twist
  • srv(服务):一个srv文件描述一个服务,由请求(request)和响应(response)两部分组成,存放在软件包的srv目录下,srv文件与msg文件类似,不同之处在于srv文件包含两请求和响应两个部分,并用“---”隔开

srv文件示例:

int64 A
int64 B
---
int64 Sum

msg

在创建msg之前,需要在软件包中新建一个名为msg的文件夹用以存储msg文件:

roscd package
mkdir msg
echo "int64 num" > msg/Num.msg

上述命令首先切换到软件包目录下,并创建msg目录,并将内容“int64 num”写入到名为Num.msg的文件中

此外,为了使msg文件能被转换为C++、Python和其他语言的源代码,还需要在package.xml中添加如下两行内容:

  <build_depend>message_generation</build_depend>
  <exec_depend>message_runtime</exec_depend>

其中message_generation用于构建时,而message_runtime用于运行时

在CMakeList.txt文件中,为find_package调用添加message_generation依赖项

find_package(catkin REQUIRED COMPONENTS
   roscpp
   rospy
   std_msgs
   message_generation
)

如图:

其中mseeage_generation一行为新添加内容

添加消息运行时依赖关系

catkin_package(
  ...
  CATKIN_DEPENDS message_runtime
  ...)

如图:

并找到代码块:

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

去掉注释,将Message1.msg改为自定义的msg文件名称,去掉多余的Message2.msg:

add_message_files(
  FILES
  Num.msg
)

如图:

再去掉如下代码块的注释:

# generate_messages(
#   DEPENDENCIES
#   std_msgs
# )

使之成为:

generate_messages(
  DEPENDENCIES
  std_msgs
)

如图:

以上即为创建msg的所有步骤,可通过rosmsg show命令查看msg能否被ROS识别:

rosmsg show package/Num

或将包名省略:

rosmsg show Num

则会显示自定义消息Num的类型——int64 num

srv

在创建msg时所用的软件包中继续创建服务:

roscd package
mkdir srv

此处通过复制现有定义而非手动方式创建srv,从rospy_tutorials包中复制一个服务,使用roscp命令:

roscp [package_name] [file_to_copy_path] [copy_path]
roscp rospy_tutorials AddTwoInts.srv srv/AddTwoInts.srv

同样,为了使srv文件能被转换为C++、Python和其他语言的源代码,还需要确认package.xml文件是否已经包含:

  <build_depend>message_generation</build_depend>
  <exec_depend>message_runtime</exec_depend>

(由于在上文创建msg时已经添加,此处无需再添加)

此外,与msg类似,还需要在CMakeList.txt文件中添加message_generation,但由于message_generation对msg与srv均通用,因此无需再添加,如图:

同样的,在创建msg时,已添加消息运行时依赖关系,故不必再次添加:

catkin_package(
  ...
  CATKIN_DEPENDS message_runtime
  ...)

然后去掉以下段落注释:

# add_service_files(
#   FILES
#   Service1.srv
#   Service2.srv
# )

并修改为:

add_service_messages(
  FILES
  AddTwoInts.srv
)

如图:

同样是在创建msg过程中去掉了代码段:

# generate_messages(
#   DEPENDENCIES
#   std_msgs
# )

的注释,也不必再次进行

完成后使用rossrv show命令查看添加的srv是否被ROS识别:

rossrv show package/AddTwoInts

从而得到:

int64 a
int64 b
---
int64 sum

也可在不指定包名的情况下,通过命令:

rossrv show AddTwoInts

进行查找,则package包及rospy_tutorials包中的同名服务均会被找到

在完成msg及srv的创建后,需要重新catkin_make软件包,从而使得包中msg路径下的任何.msg文件及srv包中的任何.srv文件都生成所有支持语言的代码,且生成的C++的头文件在包中的devel/include/package目录下

基础命令

rosmsg show [message type] 查看消息类型
roscp [package_name] [file_to_copy_path] [copy_path] 将文件从一个包复制到另一个包
rossrv show <service type> 查看服务类型
posted @ 2021-05-11 14:33  溪嘉嘉  阅读(453)  评论(0编辑  收藏  举报