3. 话题
3.1. 发布与订阅
- 容易理解的是,话题是节点与节点之前通信的一种方式,(服务是节点之间通信的另一种方式)
- 话题与服务的区别是:
节点只管投递,数据可能会丢失;
服务会有request和response,相当于RPC调用。
话题用.msg文件定义数据,服务用.srv文件定义数据 - 代码示例:
1、pos_subscriber和velocity_publisher是订阅和发布ros系统已有的一个话题;利用advertise()
创建发布者对象。
2、person_pubsher和person_subscriber是自定义了一个话题来进行测试。利用subscribe()
创建订阅者对象。
3.2. 自定义话题消息
- 创建Xxx.msg文件,和编程语言无关,建议放到src同级目录,统一叫msg的文件夹中,首字母大写
- 在package.xml中添加创建message的功能包依赖
<build_export_depend>message_generation</build_export_depend>
<exec_depend>message_runtime</exec_depend>
- CMakeList.txt中添加编译选项(针对创建message的依赖包)
find_package(... message_generation)
add_message_files(FILES Xxx.msg)
generate_messages(DEPENDENCIES std_msgs)
catkin_package(...message_runtime)
- 编译,生成消息对应的.h文件
4. 服务
4.1. 客户端与服务
- 客户端:参考test_service包中turtle_spawn.cpp,其中会向服务/spawn发送请求数据,并显示应答信息。利用
serviceClient()
创建通信对象。
也可以参考test_param包中param_config.cpp,直接调用call()
接口。 - 服务端:参考test_service包中的turtle_command_srv.cpp,其中自定义服务对象,接收一个系统定义格式的数据,收到数据后进行处理。利用
advertiseService()
创建服务对象。使用时可以通过rosservice
指令查看当前的服务信息,rosservice call
来传递消息给服务.
4.2. 自定义服务数据
- 创建Xxx.srv文件,文件中
---
分割线表示上面是请求request的数据格式,下面是response响应的数据格式。 - 在package.xml中添加创建message的功能包依赖(同上)
- CMakeList.txt中添加编译选项(针对创建srv的依赖包)(同上),改为add_service_files
- 编译,生成消息对应的.h文件
5. 参数服务Parameter Server (全局字典)
使用命令rosparam操作变量,参考上面。ROS用的是YAML格式文件。
参考test_param包。