ROS通信架构(三)
ROS的通信方式有以下四种:
Topic 主题
Service 服务
Parameter Service 参数服务器
Actionlib 动作库
Service
topic是单向异步通信方式,当一些节点只是临时而非周期性的需要某些数据,topic会消耗大量内部资源,效率低。此时就需要请求-查询式通信的service(服务)。
service通信是双向的,接收消息同时有反馈。Service包括请求方(Client),应答方/服务提供方(server)。Client发送一个request,server处理,反馈一个reply,/Service类似于Server提供的一个服务接口,一般用string类型来定义service名称(类似于topic)。
service是同步通信方式,Client发布request后会原地等待reply,直到server处理完请求并反馈reply,Client接受到reply才会继续执行,是一种阻塞状态的通信,请求-应答通信模型只有请求时才执行服务,没有频繁的消息传递。
名称 | Topic | Service |
---|---|---|
通信方式 | 异步通信 | 同步通信 |
实现原理 | TCP/IP | TCP/IP |
通信模型 | Publish-Subscribe | Request-Reply |
映射关系 | Publish-Subscribe(多对多) | Request-Subscribe(多对一) |
特点 | 接受者收到数据会回调(Callback) | 远程过程调用(RPC)服务器端的服务(一个进程里调用另一个进程的函数) |
应用场景 | 连续、高频的数据发布 | 偶尔使用的功能/具体的任务 |
举例 | 激光雷达、里程计发布数据 | 开关传感器、拍照、逆解计算 |
操作命令
rosservice 命令 | 作用 |
---|---|
rosservice list | 显示服务列表 |
rosservice info | 打印服务信息 |
rosservice type | 打印服务类型 |
rosservice uri | 打印服务ROSRPC uri |
rosservice find | 按服务类型查找服务 |
rosservice call | 使用所提供的args调用服务 |
rosservice args | 打印服务参数 |
srv
srv文件用于描述service的数据类型,service的数据格式定义在.srv中,类似msg文件,声明了一个服务,包括请求(request)和响应(reply)。
例如
package/srv/A.srv
bool start
---
my_pkg/Human_pose[] pose
my_pkg/msg/Himan_pose.msg
std_msgs/Header header
string uuid
int32 number_of_joints
my_pkg/JointPose[] joint_data
my_pkg/msg/JointPose.msg
string joint_name
geometry_msgs/Pose pose
floar32 confidence
srv文件格式固定,—前是request数据,—后是reply的数据。srv可以嵌套msg(如上例),但是
msg不能嵌套srv。
操作命令
rossrv 命令 | 作用 |
---|---|
rossrv show | 显示服务描述 |
rossrv list | 列出所有服务 |
rossrv md5 | 显示服务md5sum |
rossrv package | 列出包中的服务 |
rossrv packages | 列出包含服务的包 |
添加依赖
定义完msg、srv文件后,需要在CMakeLists.txt 和 package.xml 中添加依赖。
package.xml
...
<build_depend>message_generation</build_depend>
<run_depend>message_runtime</run)depend>
...
CMakeLists.txt
find_package(...message_generation)
catkin_package(
...
CATKIN_DEPENDS message_runtime
...
)
add_message_file(
FILES
自定义msg文件
)
add_service_file(
FILES
自定义msg文件
)
...
generate_message(DEPENDENCIES std_msgs)
Parameter Server
parameter server:参数服务器,储存参数的地方,用于配置参数,全局共享参数。参数服务器使用互联网传输,在节点管理器中运行,实现整个通信过程。参数服务器维护着一个数据字典,字典里存储着各种参数和配置。
参数服务器的维护方式有三种:
命令行维护
launch文件内读写
node源码
命令行维护
rosparam 命令 | 作用 |
---|---|
rosparam set param_key param_value | 设置参数 |
rosparam get param_value | 显示参数 |
rosparam load file_name | 从文件加载参数 |
rosparam dump file_name | 保存参数到文件 |
rosparam delete | 删除参数 |
rosparam list | 列出参数名称 |
load和dump文件为YAML格式:
name:'Zhangsan'
age:20
gender:'M'
score{Chinese:80,Math:90}
score_history:[85,82,88,90]
名称+:+值
key : value
launch文件内读写
<rosparam>操作一个.YAMLw=文件
<param>一般只设置一个参数
常见的srv类型
srv类型相当于两个message通道,一个发送,一个接收
AddTwoInts.srv
#求和,---前是输入量,后是返回量
#文件位置:自定义srv文件
int32 a
int32 b
---
int32 sum
Empty.srv
#文件位置:std_srvs/Empty.srv
#代表一个空的srv类型
---
GetMap.srv
#文件位置:nav_msgs/GetMap.srv
#获取地图,注意请求部分为空
---
nav_msgs/OccupancyGrid.map
GetPlan.srv
#文件位置:nav_msgs/GetPlan.srv
#得到一条从当前位置到目标点的路径
geometry_msgs/PoseStamped start #起始点
geometry_msgs/POseStamped goal #目标点
float32 tolerance #到达目标点的x,y方向的容错距离
---
nav_msgs/Path plan
SetBool.srv
#文件位置:std_msgs/SetBool.srv
bool data #启动或者关闭硬件
---
bool success # 标示硬件是否成功运行
string message # 运行信息
SetCameraInfo.srv
#文件位置:sensor_msgs/SetCameraInfo.srv
#通过给定的CameraInfo相机信息,来对相机进行标定
sensor_msgs/CameraInfo camera_info
---
bool success #如果调用成功,则返回true
string status_message #给出调用成功的细节
SetMap.srv
#文件位置:nav_msgs/SetMap.srv
#以初始位置为基准,设定新的地图
nav_msgs/OccupancyGrid map
geometry_msgs/PoseWithCovarianceStamped initial_pose
---
bool success
TalkerListener.srv
#文件位置:自定义srv文件
---
bool success # 标示srv是否成功运行
string message # 信息,如错误信息等
Trigger.srv
# 文件位置:std_srvs/Trigger.srv
---
bool success # 标示srv是否成功运行
string message # 信息,如错误信息等