1 service
Service是ROS的同步通信方式,Node间可以通过request-reply方式通信。
将NodeB写成service以后,不需要的时候NodeB不运行,当有节点请求时才会执行。注意,同步的意思是,NodeA发送请求后,该节点会被阻塞,直到NodeB返回请求才会执行。和topic不一样。两者区别:
1.1 src
service通信的数据格式定义在*.srv文件中,类比上一节中的msg,两者作用差不多。
1.2 src的写法
srv文件必须放在srv目录下!
bool start_detect
---
my_pkg/HumanPose[] pose_data
中间必须用“—”隔开,上面是请求服务的格式,下面是返回应答所遵守的格式。上问下答,一问一答。
HumanPose[]为自定义数据是定义在msg下的文件,注意HumanPose[]一定是msg格式的,不可能是srv,msg作为自定义数据类型。ros
1.3 一些命令
## 列出当前所有活跃的service
$ rosservic list
## 显示某个service的属性
$ rosservice info service_name
## 调用某个service
$ rosservice call service_name args #arg为希望传入的参数
## 列出所有的srv
$ rossrv list
## 显示某个srv内容
$ rossrv info srv_name
2 Parameter Serve
参数服务器,存储各种参数的字典,可用命令行,launch文件和node(API)读写。
用命令行设置参数的方法:
## 列出当前所有参数
$ rosparam list
## 显示某个参数的值
$ rosparam get param_key
## 设置某个参数
$ rosparam set param_key param_value
## 保存参数到文件
$ rosparam dump file_name
## 从文件中读取参数
$ rosparam load file_name
以上的文件为YAML格式如下所示
name:'Zhangsan'
age:20
gender:'M'
score{Chinese:80,Math:90}
score_history:[85,82,88,90]
3 Action
类似service,带有进度反馈的通信方式,通常在长时间、可抢占的任务使用。
Action对应的文件为.action。
# Define the goal
uint32 dishwasher_id # Specify which dishwasher we want to use
---
# Define the result
uint32 total_dishes_cleaned
---
# Define a feedback message
float32 percent_complete
goal相当于request,result一次,返回运行完的参数,feedback一直都有。