service 和 topic 都是ROS中数据交流的方法,区别在于:
1. topic 发送之后,并不要求有人能接收,或者说,并不确定谁来接收;
2. 接收topic之后,处理的结果并不会返回给 发送者。
但是对于 service 来说,client 是数据的发送者/客户/请求者, server 是接收端/服务者,提供某些操作,两者是一对一的,而且,server处理结果会返回给 client。
自定义 service 主要分为两个步骤:
1. 定义request 和 response 数据的类型: 类似 自定义消息类型
2. 定义回调函数: 类似 subscriber 中的回调函数
而且,使用service 也类似于 topic 。
当完成上面两部之后,一个server 已经完成了。那如何调用这个服务呢?
两种办法:1) 命令行。 rosservice call /server_name
2) 类似 publisher , 定义一个 client
可以参考:
下面总结下小问题:
1. 自己要写好 mydata.srv 文件,并且放置在 srv 文件夹下, cmake时候自动可以找到。
2. mydata.srv 文件中,变量类型要注意 int要写成 int64 等等,否则编译失败
3. mydata.srv 的文件名字 就是我们定义的消息类型名字
4. cmake编译生成自定义消息类型时,会自动生成一个mydata.h文件,在devel/include文件下。我们在使用 自定义消息类型的文件中, 一定要包含这个头文件 include "package_name/mydata.h"
问题:
1. cmakelist中不添加如下代码也可以编译通过
add_dependencies(my_node ${catkin_EXPORTED_TARGETS} ${PROJECT_NAME}_generate_messages_cpp)