ROS教程三——创建ROS msg和srv

1、msg和srv简介

     msg:msg文件是描述ROS消息字段的简单文本文件。作为不同编程语言的源代码生成相对应的信息。

     srv:srv文件描述的是一项服务。由两部分组成:请求和响应。

     msg文件存储在包的msg目录中,srv文件存储在srv目录中。

msgs只是简单的文本文件,每行有一个字段类型和字段名称。您可以使用的字段类型是:

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
  string child_frame_id
  geometry_msgs/PoseWithCovariance pose
  geometry_msgs/TwistWithCovariance twist

srv文件就像msg文件一样,srv还包含两部分:请求和响应。这两部分用'---'线分开,请求在上,响应在下。以下是srv文件的示例:

int64 A
int64 B
---
int64 Sum

   A和B是请求,Sum是响应。

2、 使用msg

   2.1 创建一个消息

  在创建的包中定义一个新的msg。

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

上面的Num.msg文件只包含1行。当然,可以通过添加多个元素来创建更复杂的文件,每行一个,如下所示:

string first_name
string last_name
uint8 age
uint32 score

两个步骤,需要确保将msg文件转换为C ++,Python和其他语言的源代码:

1、打开package.xml,确保这两行都在其中

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

注意:在构建时,需要“message_generation”,而在运行时,只需要“message_runtime”。

2、打开CMakeList.txt将message_generation依赖项添加到find_package中,以便生成消息。可以通过简单地将message_generation添加到COMPONENTS列表来实现,例如:

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

有时候没有使用find_package调用依赖项,项目也能正常构建;这跟catkin有关,它将所有项目合并为一个,所以如果之前有个项目使用了find_package,也就意味着在没有使用find_package,调用之前配置,但是当有隔离构建时,项目将不能被构建。

同时确保在消息运行时是有依赖项的:

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

找到以下工作快:

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

通过删除#符号取消注释,然后使用Num.msg替换Message * .msg,使其如下所示:

add_message_files(
  FILES
  Num.msg
)

手动添加.msg文件,CMake在添加其他.msg文件后会重新配置项目。

现在

generate_messages(
  DEPENDENCIES
  std_msgs
)

必须确保调用generate_messages()函数。

# generate_messages(
#   DEPENDENCIES
#   std_msgs
# )


generate_messages(
  DEPENDENCIES
  std_msgs
)

 3、 使用 rosmsg

ROS可以使用rosmsg show命令查看消息。

$ rosmsg show [message type]
#example
$ rosmsg show beginner_tutorials/Num

     int64 num
       

在以上示例中,消息类型由两部分组成:

  • 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

在包中创建一个srv:

$ roscd beginner_tutorials
$ mkdir srv

不用手动创建一个新的srv定义,而是从已存在的包复制现有的定义。使用roscp命令行工具,用于将文件从一个包复制到另一个包。


#Usage:
$ 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>

 注意,在构建时,需要“message_generation”,而在运行时,需要“message_runtime”。

上一步中为消息执行了此操作,否则请添加message_generation依赖项以在CMakeLists.txt中生成消息:(message_generation适用于msg和srv。

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

此外,需要对package.xml进行与消息相同的更改,因此所需的其他依赖项。

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


add_service_files(
  FILES
  AddTwoInts.srv
)

   4.2 使用rossrv

ROS可以使用rossrv show命令查看srv。


#Usage
$ rossrv show <service type>

#Example
$ rossrv show beginner_tutorials/AddTwoInts

     int64 a
     int64 b
     ---
     int64 sum

与rosmsg类似,可以在不指定包名的情况下找到这样的服务文件:

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

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

这里显示了两个服务。第一个是刚刚在beginner_tutorials包中创建的,第二个是rospy_tutorials包中预存的。

  5、msg和srv的常用步骤 

更改CMakeLists.txt:

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

取消注释并添加需要的依赖包*.msg文件(在本例中为std_msgs),如下所示:

generate_messages(
  DEPENDENCIES
  std_msgs
)

现在已经发了一些新消息,需要再次制作我们的包:

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

msg目录中的任何.msg文件都将生成用于所有支持语言的代码。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 /中。

同样,srv目录中的任何.srv文件都将以受支持的语言生成代码。对于C ++,这将在与邮件头文件相同的目录中生成头文件。对于Python和Lisp,'msg'文件夹旁边会有一个'srv'文件夹。

如果要构建使用新消息的C ++节点,则还需要在节点和消息之间声明依赖关系,请查阅catkin msg/srv build documentation文档。

  6、获取帮助 

      到目前为止已经看过很多ROS工具了。跟踪每个命令所需的参数可能很困难。大多数ROS工具都提供了自己的帮助。

$ 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)
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值