ROS通信架构(四)
ROS的通信方式有以下四种:
Topic 主题
Service 服务
Parameter Service 参数服务器
Actionlib 动作库
Actionlib
actionlib是ROS中的一个库,也是请求响应机制的通信方式(类似service),主要弥补了service通信的一个不足:若执行长时间任务时,利用service通信机制,Client会长时间接收不到reply,通信受阻。actionlib比较适合较长时间的通信过程,actionlib通信过程随时查看过程进度,也可以终止请求。
通信原理
Client-Server模式,也是一个双向的通信模式,在ROS Action Protocol通过消息进行数据的交流通信。client和server为用户提供一个简单的API来请求目标(在客户端)或通过函数调用和回调来执行目标(在服务器端)。
工作模式:
交流通信:
通信双方在ROS Action Protocal下进行交流通信是通过接口来实现的
客户端向服务器发送目标指令(goal)和取消动作指令(cancel),服务器给客户端发送实时状态信息、结果信息、反馈信息等(service无法做到)
Actionlib进行请求响应,action包括目标goal,反馈feedback,结果result。
目标:
给机器人明确的移动目标信息,包括参数的设定,方向、角度、速度等。
反馈:
动作进行过程中实时的信息反馈给Client,动作完成的状态等,令Client能做出相应的修正命令。
结果:
动作完成后,Action server 把本次运动的结果数据发送给Client,使Client得到本次动作的全部信息,比如运动的时长,最终的姿势等。
Action文件格式
Action文件后缀为.action
#define the goal
uint 32 a
---
#define the result
uint32 b
---
#define the feedback
flat32 c
CMakeLists.txt
...
find_package(...
genmsg
actionlib
actionlib_msgs
)
...
add_action_files(
DIRESTORY action FILES te.action
)
generate_messages(
DEPENDENCIES actionlib_msgs
)
...
package.xml
<build_depend>actionlib</build_depend>
<build_depend>actionlib_msgs</build_depend>
<run_depend>actionlib</run_depend>
<run_depend>actionlib_msgs</run_depend>
常见action类型
AddTwoInts.action
#文件位置:自定义action文件
#表示将两个整数求和
int64 a
int64 b
---
int64 sum
---
AutoDocking.action
#文件位置:自定义action文件
#gosl
---
#result
string text
---
#feedback
string state
string text
GetMap.action
#文件位置:nav_msgs/GetMap.action
#获取地图信息,响应部分为空
---
nav_msgs/OccupancyGrid map
---
#无返回部分
MoveBase.action
#文件位置:geometry_msgs/MoveBase.action
geometry_msgs/POseStamped target_pose
---
---
geometry_msgs/PoseStamped base_position