[跟我学ROS]10.生成ROS msg文件及srv文件

文章同步链接地址为:http://www.robotos.net/thread-23-1-1.html


描述:这篇教程涵盖了如何生成并编译msg和srv文件,及rosmsg,rossrv和roscp等命令工具的用法。

1. msg和srv介绍

•        msg:msg文件是简单的文本文件,用于描述ROS中消息(消息的各个参数项)。用于为不同的编程语言生成有关消息的源代码。

•        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,它包含ROS系统中常用的时间戳和坐标信息。一般在msg文件的第一行会指定为Header header。

下面为msg的例子,这个例子使用了Header,string字符串及两个其他类型的msgs。
  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是反馈的结果变量。

2. Using msg
2.1 Creating a msg

我们在前面课程中创建的功能包里定义一个新的msg。

$ cd ~/catkin_ws/src/beginner_tutorials
$ mkdir msg
$ echo "int64 num" > msg/Num.msg



在上面例子中,*.msg文件只是简单的包含一行(定义信息)。如果必要,可以如下所示添加多个元素来生成一个复杂的文件:
string first_name
string last_name
uint8 age
uint32 score

还有一点需要确认的是,msg文件需要转换为C++,Python和其他编程语言的源代码。

打开package.xml文件,确保文件中存在下面两行定义:
<build_depend>message_generation</build_depend>
<run_depend>message_runtime</run_depend>




注意,在编译时,需要依赖“message_generation”,而在运行时,只需要依赖“message_runtime”。

利用你喜欢的文本编辑器(前面课程学习的rosed是一个不错的选择)打开CMakeLists.txt文件。

在CMakeLists.txt文件中添加message_generation到功能包查找项,以便于(节点)调用它们生成消息。只需简单的添加message_generation到COMPONENTS列表中即可,如下所示:
# 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)

你也许注意到即使没有调用find_package中全部的依赖项,你的工程也可以正常编译。这是因为catkin集成了所有的工程,也许前期别的工程调用了find_package,而你的工程使用了同样的配置。但是如果单独编译时忘记添加,则将导致编译失败。

同样,需要确保运行时的依赖项添加进来:
catkin_package(
  ...
  CATKIN_DEPENDS message_runtime ...
  ...)

查找如下的代码区:
# add_message_files(
#   FILES
#   Message1.msg
#   Message2.msg
# )

去掉每行前面的注释符号“#”,并用你自己的.msg替换Message*.msg文件,替换后如下所示:
add_message_files(
  FILES
  Num.msg
)

通过手动添加.msg文件,确保了CMake在重新配置时知道这些新添加的.msg文件。

2.2 Using rosmsg

上面的介绍就可以产生一个msg文件了。借助于rosmsg show命令可以判断ROS是否能检测到它:

用法:
$ rosmsg show [message type]



示例:
$ rosmsg show beginner_tutorials/Num



得到执行结果:
•        int64 num

在前面的示例中,指令参数包含如下两个部分:
•        beginner_tutorials -- the package where the message is defined
•        Num -- The name of the msg Num.

如果你记不起msg文件存在于哪个功能包内,可以空缺功能包的名字:
$ rosmsg show Num




执行结果如下所示:
•        [beginner_tutorials/Num]:
•        int64 num

3. Using srv
3.1 Creating a srv

我们在刚刚创建的功能包中生成一个srv:
$ roscd beginner_tutorials
$mkdirsrv





我们从另一个功能包中复制出一个srv,不必亲自手动创建了。roscp是一个非常有用的命令行工具,用于从一个功能包拷贝文件到另一个功能包中。

用法:
$ roscp [package_name] [file_to_copy_path] [copy_path]



现在我们拷贝rospy_tutorials功能包的服务
$ roscp rospy_tutorials AddTwoInts.srv srv/AddTwoInts.srv



还有一步需要确认的是,我们必须确保srv文件可以为C++,Python或其他语言转换为源代码。

如果你在前面还没有添加message_generation到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)

(没错,message_generation同时为msg和srv工作)

同样你也需要为消息和服务改变package.xml文件,查看上面附加的依赖项。

去掉如下行前面的注释符“#”
# add_service_files(
#   FILES
#   Service1.srv
#   Service2.srv
# )

把Service*.srv文件替换为自己的服务文件,替换后如下所示:
add_service_files(
  FILES
  AddTwoInts.srv
)

3.2 Using rossrv

上面的介绍就可以产生一个srv文件了。借助于rossrv show命令可以判断ROS是否能检测到它。

用法:
$ rossrv show <service type>



示例:
$ 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

4. Common step for msg and srv

接下来在CMakeLists.txt中找到如下部分:
# generate_messages(
#   DEPENDENCIES
# #  std_msgs  # Or other packages containing msgs
# )

去掉注释并添加 .msg文件在生成消息时的所有依赖项(功能包),这里需要的是std_msg,添加后如下所示:
generate_messages(
  DEPENDENCIES
  std_msgs
)

既然我们创建了一些新的消息,我们需要用make命令重新编译这些功能包:
# In your catkin workspace
$ cd ../..
$ catkin_make
$ 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/内。
The full specification for the message format is available at the Message Description Language page.

5. Getting Help

我们已经看到不少ROS命令工具了,如果记住每一个命令的参数将是非常困难的,幸运的是,大部分ROS命令工具提供了帮助信息:

如下所示:
$ rosmsg -h



•        You should see a list of different rosmsg subcommands.
•        可以看到rosmsg中的各种二级命令(命令参数):
•        Commands:
•          rosmsg show Show message description
•          rosmsg users  Find files that use message
•          rosmsg md5  Display message md5sum
•          rosmsg package  List messages in a package
  rosmsg packages List packages that contain messages

也可以查看二级命令(命令参数)的帮助信息:


$ rosmsg show -h



•        This shows the arguments that are needed for rosmsg show:
•        下面显示了rosmsg show所需的参数信息:
•        Usage: rosmsg show [options] <message type>
•        
•        Options:
•          -h, --help  show this help message and exit
  -r, --raw   show raw message text, including comments

6. Review

我们列举出至今为止我们用到的命令工具:
•        rospack = ros+pack(age) : provides information related to ROS packages
•        rosstack = ros+stack : provides information related to ROS stacks
•        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
•        rosmake = ros+make : makes (compiles) a ROS package

7.Next Tutorial

现在我们创建了一个新的msg和srv,下面我们简单的编写一个发布者及订阅者(python及C++)。

英文文档位置: http://www.ros.org/wiki/ROS/Tutorials/CreatingMsgAndSrv

注:欢迎你转载本篇文章,时飞提醒你转载时请注明出处!


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值