描述:这篇教程涵盖了如何生成并编译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”。
利用你喜欢的文本编辑器(前面课程学习的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++)。
2015职称计算机考试书PowerPoint2007中 .. 定价:¥45 优惠价:¥42 更多书籍 | |
2015年全国职称计算机考试教材(2007模 .. 定价:¥225 优惠价:¥213 更多书籍 |