0. 引言
本节讲述ROS消息和服务,以及rosmsg、rossrv和roscp工具。
0.1 消息(msg)和服务(srv)介绍
- 消息(msg):msg文件是一个描述ROS中所使用消息类型的简单文本。它们会被catkin_make用来生成不同语言的源代码。
服务(srv):一个srv文件描述一项服务。它包含请求和响应两部分(使用—分隔)。
msg文件实际上就是每行声明一个数据类型和变量名。可以使用以下类型:int8,int16,int32,int64
- float32,float64
- string
- time,duration
- other msg file
- 定长数组array[x],可变长度数组arra[]
- 特殊类型Header(包含时间戳回绕坐标信息)
1. 使用msg
1.1 创建一个msg
首先切换到包目录下:
$ roscd beginner_tutorials //切换到包中
$ mkdir msg //在包下创建msg文件夹
$ rosed beginner_tutorials Num.msg //创建一个Num.msg文件
在.msg文件中添加消息变量:
string first_name
string last_name
uint8 age
uint32 score
以下的操作确保了msg文件可以被转换成C++、python或其他语言的源代码:
1.1.1 修改package.xml
确保package.xml中包含以下两句。
<build_depend>message_generation</build_depend>
<run_depend>message_runtime</run_depend>
意思是编译依赖message_generation包,而运行时依赖message_runtime包。
1.1.2 修改CMakeList.txt
1.1.2.1 添加编译依赖:
在 CMakeLists.txt文件中,利用find_packag函数,增加对message_generation的依赖,这样就可以生成消息了。 你可以直接在COMPONENTS的列表里增加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)
1.1.2.2 添加运行依赖:
catkin_package(
...
CATKIN_DEPENDS message_runtime ...
...)
1.1.2.3 添加.msg文件
这里添加.msg文件,使得在msg文件夹中生产消息。
//修改
# add_message_files(
# FILES
# Message1.msg
# Message2.msg
# )
//为
add_message_files(
FILES
Num.msg
)
1.1.2.4 添加消息、服务生成指令
generate_messages()
1.1.3 小结
由于对cmake的使用不熟,目前对以上操作的理解是:
- find_package用于查找catkin宏和库,如果添加了COMPENTS 列表(例如我们添加的generate_messages),catkin还会寻找其他的依赖。
- 在add_message_files中添加我们需要编译的msg文件。通过查看CMkaeList文件,还可以看到add_service_files和add_action_files,这些都是用来添加我们自己的消息、服务和动作文件的。
- generate_message()用来处理以上添加的3中文件。根据在此列出的任何依赖来生产消息、服务和动作。
1.2 使用rosmsg
可以使用rosmsg show命令来检查ROS是否能够识别我们添加的消息(只要在package下包含了smg文件夹并在其中存放了.msg文件就可以识别)。
$ rosmsg show [message type]
可以直接输入消息名,或者输入消息所在的包和消息名例如:
$ rosmsg show beginner_tutorials/Num
//或
$ rosmsg show Num
2. 使用srv
2.1 创建一个srv
类似msg的创建,需要在一个包中创建一个srv目录用于存放.srv文件。
这里我们不手动编写了,而是使用roscd工具从一个包中复制到另一个包中(roscd实现了将文件从一个package复制到另一个package中的功能):
$ roscp [package_name] [file_to_copy_path] [copy_path]
我们使用以下命令从从rospy_tutorials包中copy AddTwoInts.srv文件到当前的srv文件夹中:
$ roscp rospy_tutorials AddTwoInts.srv srv/AddTwoInts.srv
以下的操作确保了msg文件可以被转换成C++、python或其他语言的源代码:
2.1.1 添加对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都起作用。
2.1.2 添加.srv文件
# add_service_files(
# FILES
# Service1.srv
# Service2.srv
# )
//改成
add_service_files(
FILES
AddTwoInts.srv
)
以上就是创建一个服务需要的步骤,请注意,因为之前已经创建了消息,所以一些相同的操作就不需要再次重复了。
2.2 使用rossrv
可以通过rossrv show命令来检查ROS是否能够识别我们添加的服务(只要在pacakge下的srv目录中存在.srv文件就可以)。
$ rossrv show <service type>
可以仅仅指定服务名,或指定package和服务名,来查看服务参数。
如果仅仅指定服务名,那么拥有相同服务的包都会被列出。
3. msg和srv都需要的步骤
由于增加了消息和服务,现在我们可以编译了package了。
在workspace中使用catkin_make编译。
$ catkin_make
现在所有msg路径下的.msg文件都将转换成ROS所支持语言的源代码。生成的C++头文件放置在~/catkin_ws/devel/include/beginner_tutorials/。其他语言有所不同。
4. 获得帮助
有时候很难记住所有的ROS工具的参数,这是可以使用-h选项来获得帮助信息。
5. REVIEWS
- 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 (现在是catkin_make)