首先, msg, 消息可以理解成一个类, 或者结构体, 用于在C++跟Python之间传递数据用, 里面就是数据结构类似:
- int8, int16, int32, int64 (plus uint*)
- float32, float64
- string
- time, duration
- other msg files
- variable-length array[] and fixed-length array[C]
整数, 浮点数, 字符串, 时间, 时间间隔, 其他的msg文件类型, 固定长度数组跟非固定长度数据, 等等, 其实跟一个java bean的概念很像吧.
例子:
Header header
string child_frame_id
geometry_msgs/PoseWithCovariance pose
geometry_msgs/TwistWithCovariance twist
这个msg里面包含了, Header, 其他msg类型, string, geometry_msgs/PosewithCovariance, 字面理解就是姿势类.
srv, 服务类似msg, 只是用---符号分隔开发送跟回应, 比如:
int64 A
int64 B
---
int64 Sum
就是request是A, B, response是Sum
概念介绍完毕, 接下来实战一下, 首先创建msg, 其实就是写一个文件在package的/msg/文件夹.
$ roscd beginner_tutorials $ mkdir msg $ echo "int64 num" > msg/Num.msg
接着, 修改package.xml文件, 让编译跟运行的时候, 认识msg文件:
<build_depend>message_generation</build_depend> <run_depend>message_runtime</run_depend>
然后修改CMakeLists.text, 加入msg的支持, 在已有的定义段落内添加即可:
find_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs message_generation )
catkin_package(
...
CATKIN_DEPENDS message_runtime ...
...)
add_message_files( FILES Num.msg )
generate_messages(
DEPENDENCIES
std_msgs
)
上面的很多内容已经存在, 只需要去掉注释部分即可.
如果以后, 你想查看某个package的msg数据类型, 用这个命令:
$ rosmsg show beginner_tutorials/Num
如果你连包名都记不住, 直接rosmsg show Num也可以.
接下来是srv, 再说一次, srv跟msg一个概念, 是个类, 只是分为request跟response而已.
先建一个srv文件夹:
$ roscd beginner_tutorials $ mkdir srv
这里, 可以用roscp命令, 从别的package里面copy一个srv文件过来
$ roscp rospy_tutorials AddTwoInts.srv srv/AddTwoInts.srv
一样, 检查一下package.xml, 下面的有没有被注释, 有的话, 取消掉.
<build_depend>message_generation</build_depend> <run_depend>message_runtime</run_depend>
CMakeLists.c里面同样:
# 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 )
srv跟msg本质上一样, 所以这里也一样.
add_service_files( FILES AddTwoInts.srv )
service文件也要增加进去.
同样, 如果要查看service, 可以用类似查看msg的命令:
$ rossrv show beginner_tutorials/AddTwoInts
然后, 无论msg,还是srv, 都要再改下面:
generate_messages( DEPENDENCIES std_msgs )
然后启动安装:
$ roscd beginner_tutorials $ cd ../.. $ catkin_make install
然后你会发现, 在devel/include/beginner_tutorials目录下面,msg被干成了.h文件,可能是被序列化了吧...
OK, msg跟srv就建好了.