[ROS-Beginner]10.创建一个ROS msg和srv

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[ROS-Beginner]10.创建一个ROS msg和srv相关的知识,希望对你有一定的参考价值。

1. msg和srv的介绍

  (1)msg: msg文件是简单的文本文件,用来描述ROS message的领域,它用来生成针对不同语言的source代码。存储在package中的msg目录中。每行都是field type 及 field name。

      可以使用的field type有:

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

  另外还有一种奇特的类型:Header,它包含了时间戳timestamp和ROS中常用的coordinate frame。

  msg文件例子:

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

 

  (2)srv: srv文件描述一个service,由两部分组成:request和response。存储在srv目录中。与msg文件不同的是,它包含了request和response两部分,两部分被---划分开。

   srv文件例子:

int64 A
int64 B
---
int64 Sum

 

2. 使用msg

  (1)在我们之前创建的package中定义一个新的msg:

$ roscd beginner_tutorials
$ mkdir msg
$ echo "int64 num" > msg/Num.msg

    例子里的.msg文件只有一行,可以增加元素,一行一个,如:

string first_name
string last_name
uint8 age
uint32 score

  (2)确保.msg被转成了给c++,python或者其他语言的source code:打开package.xml文件,确保有以下两行,且没有被标注掉:

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

   (3) 打开CMakeLists.txt,增加message_generation dependency,注意不要直接粘贴下面的代码,对照进行修改。

find_package(catkin REQUIRED COMPONENTS
   roscpp
   rospy
   std_msgs
   message_generation
)

   (4)注意:有时不用find_package关联dependencies也可以build成功,这是因为catkin会把所有的projects结合到一起。但是不要忘记去call find_package,不然独立使用容易出错。

   (5)此外,确保输出 message runtime dependency

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

   (6)找到以下一块代码,取消标注。

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

      (7)用自己的.msg取代Message*.msg里的stand,如同:

add_message_files(
  FILES
  Num.msg
)

      (8)通过手动添加.msg文件,确保CMake知道,当它需要重新配置这个项目,在你添加了其他的.msg文件之后。

   (9)现在我们确认generate_messages()函数被呼叫,取消以下标注。

# generate_messages(
#   DEPENDENCIES
#   std_msgs
# )

3. 使用rosmsg

用法:

$ rosmsg show [message type]

举例:

$ rosmsg show beginner_tutorials/Num

可以得到:

int64 num

在之前的例子里,message类型有两部分组成:

  • beginner_tutorials -- the package where the message is defined

  • Num -- The name of the msg Num.

如果忘记了msg在哪个package里,可以输入:

$ rosmsg show Num

将会得到:

[beginner_tutorials/Num]:
int64 num

4. 使用srv

4.1 创建srv

使用之前创建的package来创建一个srv:

$ roscd beginner_tutorials
$ mkdir srv

我们用roscp来从别的package里复制一个已有的srv,而不是创建一个新的srv,用法:

$ roscp [package_name] [file_to_copy_path] [copy_path]

比如,从rospy_tutorials package复制一个service

$ roscp rospy_tutorials AddTwoInts.srv srv/AddTwoInts.srv

我们还有一步,就是确保srv被转成了C++,Python或者其他语言的source code。

除非之前做过,打开package.xml,确保有以下两行:

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

和之前一样,在build time, 我们需要message_generation, 但在 runtime, 我们只需要message_runtime。

除非之前做过了,我们要增加message_generation dependency到CMakeLists.txt中生成message

# 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
)

取消下列标注:

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

为了service文件,替换placeholder Service*.srv

add_service_files(
  FILES
  AddTwoInts.srv
)

 

4.2使用rossrv

用法:

$ rossrv show <service type>

比如:

$ rossrv show beginner_tutorials/AddTwoInts

将看到:

int64 a
int64 b
---
int64 sum

和rosmsg类似,可以发现service文件,而不用确定package名字:

$ rossrv show AddTwoInts
[beginner_tutorials/AddTwoInts]:
int64 a
int64 b
---
int64 sum

[rospy_tutorials/AddTwoInts]:
int64 a
int64 b
---
int64 sum

这里有两个services,第一个是之前beginner_tutorials package,第二个是预先就有的rospy_tutorials package。

5. msg和srv的一般步骤

除非之前做了,改CMakeLists.txt:

# generate_messages(
#   DEPENDENCIES
# #  std_msgs  # Or other packages containing msgs
# )

取消标注,增加包含需要用的.msg的package。

generate_messages(
  DEPENDENCIES
  std_msgs
)

现在我们已经make了一些message,这些是我们需要的来再一次make我们的package:

# In your catkin workspace
$ roscd beginner_tutorials
$ cd ../..
$ catkin_make install
$ cd -

任何在msg中的.msg文件将生成代码来给所有支持的语言使用。C++ 的message头文件生成在~/catkin_ws/devel/include/beginner_tutorials/,lisp文件出现在~/catkin_ws/devel/share/common-lisp/ros/beginner_tutorials/msg/里。

相似地,任何srv文件夹中的.srv将生成支持语言的代码。对C++,会生成message头文件在同样的文件夹中。

如果在build 使用新message的 C++ Node,需要声明node和message之间的dependency。

6. 获取帮助

我们已经学了很多ROS的tools,很难记住每个命令需要什么语句,但是大部分ROS tools提供了帮助。

比如:

$ rosmsg -h

可以得到:

Commands:
  rosmsg show     Show message description
  rosmsg list     List all messages
  rosmsg md5      Display message md5sum
  rosmsg package  List messages in a package
  rosmsg packages List packages that contain messages

也可以寻求子命令的帮助:

$ rosmsg show -h

可以得到:

Usage: rosmsg show [options] <message type>

Options:
  -h, --help  show this help message and exit
  -r, --raw   show raw message text, including comments

7. 复习

  • rospack = ros+pack(age) : provides information related to ROS packages
  • roscd = ros+cd : changes directory to a ROS package or stack

  • rosls = ros+ls : lists files in a ROS package

  • roscp = ros+cp : copies files from/to a ROS package

  • rosmsg = ros+msg : provides information related to ROS message definitions
  • rossrv = ros+srv : provides information related to ROS service definitions
  • catkin_make : makes (compiles) a ROS package
    • rosmake = ros+make : makes (compiles) a ROS package (if you‘re not using a catkin workspace)

以上是关于[ROS-Beginner]10.创建一个ROS msg和srv的主要内容,如果未能解决你的问题,请参考以下文章

[ROS-Beginner]8.使用 rqt_console 和 roslaunch

ROS官网初级教程学习总结(10-16)

ROS官网初级教程学习总结(10-16)

创建一个移动标记。机器人操作系统(ROS)

《动手学ROS2》10.5 配置Fishbot进行建图

创建发布者 ROS2 中的分配器