考试首页 | 考试用书 | 培训课程 | 模拟考场 | 考试论坛  
  当前位置:Linux认证 > 综合辅导 > 文章内容
  

Linux教程:机器人操作系统ROS学习教程

来源:robotos.net [ 2016年2月14日 ] 【

描述:这篇教程涵盖了如何生成并编译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文件,确保文件中存在下面两行定义:

message_generation
message_runtime

注意,在编译时,需要依赖“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]

示例:

[html] view plaincopyprint?$ rosmsg show beginner_tutorials/Num 

$ 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

示例:

$ rossrv show beginner_tutorials/AddTwoInts

将看到如下执行结果:
•        int64 a
•        int64 b
•        ---
•        int64 sum

与rosmsg类似,如下所示可以不指定功能包的名字来查找服务文件:

$ rossrv show AddTwoInts

[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]
•       
•        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++)。

首页 1 2 3 4 5 6 7 8 9 10 尾页
本文纠错】【告诉好友】【打印此文】【返回顶部
将考试网添加到收藏夹 | 每次上网自动访问考试网 | 复制本页地址,传给QQ/MSN上的好友 | 申请链接 | 意见留言 TOP
关于本站  网站声明  广告服务  联系方式  站内导航  考试论坛
Copyright © 2007-2013 中华考试网(Examw.com) All Rights Reserved