ROS总结——ROS消息和ROS服务
来源:互联网 发布:重庆市网络作家协会 编辑:程序博客网 时间:2024/04/27 21:15
创建ROS消息和ROS服务
本博客是对http://wiki.ros.org/上ROS教程的学习总结,欢迎大家交流学习。本节详细讲解了如何创建并编译ROS消息和服务,以及rosmsg、rossrv和roscp命令行工具的使用。
1.消息(msg)和服务(srv)介绍
- 消息(msg): msg文件就是一个描述ROS中所使用消息类型的简单文本。它们会被用来生成不同语言的源代码。
- 服务(srv): 一个srv文件描述一项服务。它包含两个部分:请求和响应。
msg文件存放在package的msg目录下,srv文件则存放在srv目录下。msg文件实际上就是每行声明一个数据类型和变量名。可以使用的数据类型如下:
- int8, int16, int32, int64 (plus uint*)
- float32, float64
- string
- time, duration
- other msg files
- variable-length array[] and fixed-length array[C]
在ROS中有一个特殊的数据类型:Header,它含有时间戳和坐标系信息。在msg文件的第一行经常可以看到Header header的声明。
下面是一个msg文件的样例,它使用了Header,string,和其他另外两个消息类型:
Header headerstring child_frame_idgeometry_msgs/PoseWithCovariance posegeometry_msgs/TwistWithCovariance twist
srv文件分为请求和响应两部分,由’—’分隔。下面是srv的一个样例:
int64 Aint64 B---int64 Sum
2. 使用 msg
2.1下面,将在之前创建的package里定义新的消息
$ cd ~/catkin_ws/src/beginner_tutorials$ mkdir msg$ echo "int64 num" > msg/Num.msg
上面是最简单的例子——在.msg文件中只有一行数据。当然,可以仿造上面的形式多增加几行以得到更为复杂的消息:
string first_namestring last_nameuint8 ageuint32 score
接下来,还有关键的一步:要确保msg文件被转换成为C++,Python和其他语言的源代码。查看package.xml, 确保它包含一下两条语句:
<build_depend>message_generation</build_depend> <run_depend>message_runtime</run_depend>
如果没有,添加进去。 注意,在构建的时候,只需要”message_generation”。然而,在运行的时候,只需要”message_runtime”。
在编辑器中打开CMakeLists.txt文件,在 CMakeLists.txt文件中,利用find_packag函数,增加对message_generation的依赖,这样就可以生成消息了。 可以直接在COMPONENTS的列表里增加message_generation,就像这样:
# Do not just add this line to your CMakeLists.txt, modify the existing linefind_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs message_generation)
有时候,即使没有调用find_package,也可以编译通过。这是因为catkin把你所有的package都整合在一起,因此,如果有其他的package调用了find_package,此时package的依赖就会是同样的配置。但是,在单独编译时,忘记调用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知道在什么时候重新配置自己的project。 确保添加了如下代码:
generate_messages()
现在,可以生成自己的消息源代码了。
2.2 使用 rosmsg
以上就是创建消息的所有步骤。下面通过rosmsg show命令,检查ROS是否能够识消息,基本用法:
rosmsg show [message type]
eg:
$ rosmsg show beginner_tutorials/Numint64 num
在上边的样例中,消息类型包含两部分:
- beginner_tutorials – 消息所在的package
- Num – 消息名Num.
如果忘记了消息所在的package,你也可以省略掉package名。输入:
$ rosmsg show Num[beginner_tutorials/Num]:int64 num
3. 使用 srv
3.1 创建一个srv
在刚刚那个package中创建一个服务:
$ roscd beginner_tutorials$ mkdir srv
这次不再手动创建服务,而是从其他的package中复制一个服务。 roscp是一个很实用的命令行工具,它实现了将文件从一个package复制到另外一个package的功能,基本用法:
roscp [package_name] [file_to_copy_path] [copy_path]
现在可以从rospy_tutorials package中复制一个服务文件了:
$ roscp rospy_tutorials AddTwoInts.srv srv/AddTwoInts.srv
还有很关键的一步:要确保srv文件被转换成C++,Python和其他语言的源代码。
现在认为,已经如前边所介绍的,在CMakeLists.txt文件中增加了对message_generation的依赖:
# Do not just add this line to your CMakeLists.txt, modify the existing linefind_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs message_generation)
(message_generation 对msg和srv都起作用)
同样,跟msg文件类似,也需要在package.xml文件中做一些修改。查看上边的说明,增加额外的依赖项。
删掉#,去除对下边语句的注释:
# add_service_files(# FILES# Service1.srv# Service2.srv# )
用自己的srv文件名替换掉那些Service*.srv文件:
add_service_files( FILES AddTwoInts.srv)
现在,生成了自己的服务源代码了。
3.2 使用 rossrv
以上就是创建一个服务所需的所有步骤。下面通过rosmsg show命令,检查ROS是否能够识该服务,基本用法:
rossrv show <service type>
eg:
$ rossrv show beginner_tutorials/AddTwoIntsint64 aint64 b---int64 sum
跟rosmsg类似, 也可以不指定具体的package名来查找服务文件:
$ rossrv show AddTwoInts[beginner_tutorials/AddTwoInts]:int64 aint64 b---int64 sum[rospy_tutorials/AddTwoInts]:int64 aint64 b---int64 sum
4. msg和srv都需要的步骤
接下来,在CMakeLists.txt中找到如下部分:
# generate_messages(# DEPENDENCIES# # std_msgs # Or other packages containing msgs# )
去掉注释并附加上所有你消息文件所依赖的那些含有.msg文件的package(这个例子是依赖std_msgs,不要添加roscpp,rospy),结果如下:
generate_messages( DEPENDENCIES std_msgs)
由于增加了新的消息,所以我们需要重新编译我们的package:
# In your catkin workspace$ cd ../..$ catkin_make$ cd -
所有在msg路径下的.msg文件都将转换为ROS所支持语言的源代码。生成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/ 路径下。
5.获得帮助
已经接触到不少的ROS工具了。有时候很难记住他们所需要的参数。还好大多数ROS工具都提供了帮助。
输入:
$ rosmsg -hCommands: 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 -hUsage: rosmsg show [options] <message type>Options: -h, --help show this help message and exit -r, --raw show raw message text, including comments
- ROS总结——ROS消息和ROS服务
- ROS总结——ROS消息发布和订阅
- ROS总结——ROS服务和参数
- 创建ROS消息和ROS服务
- 创建ROS消息和ROS服务
- ROS入门_1.13 创建ROS消息和ROS服务
- ROS教程(十):创建ROS消息和ROS服务
- ROS笔记:(7)创建ROS消息和ROS服务
- ROS总结——ROS服务器和客户端
- 创建ROS消息和ROS服务(九)
- 【ROS总结】 ROS接口——Odometry
- ROS总结——ROS节点
- ROS总结——ROS话题
- ROS 服务 消息传递
- ROS Learning-012 beginner_Tutorials (编程) 创建自定义的ROS消息和ROS服务
- ROS学习第四弹 (ROS编辑器及配置/ROS msg/srv 消息和服务)
- ROS7—理解ROS服务和参数
- ROS总结—— rqt_console 和 roslaunch
- Use Multipath TCP to create backup connections for iOS
- MySQL zip 版本安装总结(win10 x64)
- java I/O学习之二:转换流
- Django-表单API
- 解除2003中IIS对上传文件大小的限制
- ROS总结——ROS消息和ROS服务
- lnmp的php编译参数
- Android permission,uses-permission,permission-group,permission-tree,uses-permission-sdk-23的区别
- Java学习提要——浅述'Thread类'和'Runnable接口'的区别
- 使用Benchmark.js和jsPerf分析代码性能
- subplot 真正含义
- java 动态绑定 以及 内部实现机制
- 可变参数的使用(法二)
- 效率篇-“私人订制”Openstack管理后台