自定义消息
前言
在Ros中,如果没有现成的消息类型来描述要去传递的消息时,我们会自定义消息。
我们会新建一个Package来去自定义消息,通常这个Package写任何的业务逻辑,只是用来声明自定义的消息类型,可以只定义一种消息类型,也可以定义多种消息类型,根据业务需求来定。
所以,首先我们单独的创建一个package,我们取名为demo_srvs
,一定要要添加roscpp
,rospy
,rosmsg
的依赖。
这个包名取名也是有讲究的,业务名_srvs
。
自定义消息流程
1 . 创建srv目录,移除不需要的目录
在pakage目录下新建srv
目录,删除掉include
和src
目录
2. 新建.srv
文件
创建的这个NumOption.srv
文件就是自定义消息文件,需要去描述消息的格式。
我们可以编辑代码如下
float64 a
float64 b
string option
---
float64 result
这个.srv
文件以---
分隔为两部分,上面一部分包含a
,b
,option
,下面一部分包含一个result
.
在这里,上面部分是request
的数据,下面部分是response
的数据。
此案例中,我们要去做的就是,发送request,例如,a=3
,b=3
,option=*
,那么server端接收到数据后,做a option b
的操作,即3 * 3
,结果放到response中。
这个srv
文件遵循一定规范的,每一行表示一种数据。前面是类型,后面是名称。和msg的规范一致,更多类型参考附录
3. 配置package.xml文件
在package.xml种添加如下配置:
Tip
message_generation
是消息生成工具,在打包编译时会用到
message_runtime
运行时消息处理工具
4. 配置CMakeLists.txt
在find_package
添加message_generation
,结果如下:
find_package(catkin REQUIRED COMPONENTS
roscpp
rosmsg
rospy
message_generation
)
添加add_message_file
,结果如下:
add_service_files(
FILES
NumOption.srv
)
Tip
这里的NumOption.srv
要和你创建的srv文件名称一致,且必须时在srv目录下,否则编译会出现问题
添加generation_msg
,结果如下:
generate_messages(
DEPENDENCIES
std_msgs
)
Tip
这个配置的作用是添加生成消息的依赖,默认的时候要添加std_msgs
修改catkin_package
,结果如下:
catkin_package(
# INCLUDE_DIRS include
# LIBRARIES demo_msg
# CATKIN_DEPENDS roscpp rosmsg rospy
# DEPENDS system_lib
CATKIN_DEPENDS message_runtime
)
Tip
为catkin编译提供了依赖message_runtime
检验自定义消息
1. 编译项目
来到工作空间目录下,运行编译
catkin_make
2. 查看生成的头文件
c++的头文件
来到devel
的include
目录下,如果生成了头文件说明,自定义消息创建成功。
python的py文件
来到devel
的lib/python2.7/dist-package
目录下,查看是否生成和package名称相同的目录,以及目录内是否生成对应的py
文件。
3. 通过rossrv工具校验
rossrv show demo_srvs/NumOption
查看运行结果,运行结果和自己定义的相一致,说明成功。
----------------------------------------------------------------------------
使用自定义消息
C++使用自定义消息
1. 自定义消息依赖的添加
在开发过程种,自定义消息是以一个package存在的,其他package需要用到这个自定义消息的package,是需要添加依赖的。
来到package.xml
中,添加如下:
<build_depend>demo_srvs</build_depend>
<build_export_depend>demo_srvs</build_export_depend>
<exec_depend>demo_srvs</exec_depend>
来到CMakeLists.txt
文件中,找到find_package
,添加demo_msgs
自定义消息依赖,添加结果如下:
find_package(catkin REQUIRED COMPONENTS
roscpp
rosmsg
rospy
demo_srvs
)
2. 引入依赖
#include "demo_srvs/NumOption.h"
3. 构建消息
Tip
消息依赖加入后,具体类型是demo_srvs::NumOption
Python使用自定义消息
导入模块
from demo_srvs.srv import NumOption
Tip
python导入自定义消息模块,遵循一定的规范,from 模块名.srv import 具体的消息