作者: Sam (甄峰) sam_code@hotmail.com
打开package.xml:
CMakefile.txt:
## Add actions
add_action_files(DIRECTORY action FILES Fibonacci.action )
## Generate messages
generate_messages(DEPENDENCIES std_msgs actionlib_msgs)
$catkin_make clean
Sam在ROS学习中,遇到知识点actionLib, 觉得特别有用。学习记录之。
0. 基础知识:
actionlib是ROS一个功能包集(actionlib
stack).
http://www.ros.org/browse/details.php?distro=kinetic&name=actionlib
http://wiki.ros.org/actionlib
在ROS系统中,向某个Node发送请求,并获取响应。可以通过ROS
Srevice机制来满足。但如果执行某个请求的时间很长,(如要求机器人从A点移动到B点)在此期间,用户想要查看执行的进度或者干脆取消这个请求。Service机制就没法满足了,但是actionlib可以满足用户这种需求。
ActionLib栈提供工具,使用户可以创建一些Servers,这些Server用来执行较长时间的任务,并且任务可以被制止。同时ActionLib还提供了一些Client接口,用来给Server发请求。
1.ActionLib工作机制:
1.1:ActionCLlient和ActionServer通过"ROS
Action Protocol"沟通。
ROS Action Protocol是ROS
消息方式传递。ActionClient和ActionServer提供一些简单的API,让用户可以发送Goals请求(Client端)以及执行Goals(在Server端)。
1.2:具体传输:
2:Action Specification:Goal,
Feedback, Result.
为了能够让Action Client和Action Server通讯,定义了几个概念。Goal,
Feedback和Result.
Goal:
代表一个任务。可以被ActionClient发送到ActionServer。比如在MoveBase案例中,它的类型是PoseStamped.包含了机器人应该去的信息。
在激光扫描云台控制案例中,Goal包含扫描的参数,min angle, max angle,speed等。
FeedBack:Server告知Client当前Goal执行过程中的情况。在Move
Base案例中,它表示机器人当前姿态。在激光扫描云台控制案例中,
它表明剩余扫描时间。
Result:执行结果。在MoveBase中,结果和机器人pose. 激光扫描云台控制案例中,
给出请求的点云结果。
.action file:
Action 规格的定义,就放在Package内 action目录内的 .action文件中。文件内定义了Goal,
FeedBack, Result等规格。
例如:
# 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
3.实践:
3.1:
创建Package:
在catkin_ws/src目录下:
catkin_create_pkg actionlib_test roscpp
std_msgs actionlib actionlib_msgs
message_generation
此时,可以看到已经创建了actionlib_test Package。
3.2:建立自己的action Specification:
在Package目录内,创建action目录。并在其中建立Fibonacci.action文件:
#goal definition
int32 order
---
#result definition
int32[] sequence
---
#feedback definition
int32[] sequence
打开package.xml:
actionlib actionlib_msgs
roscpp
rospy
这是因为在catkin_create
时,指定了依赖这些Package。
添加内容如下:
message_generation
CMakefile.txt:
## Add actions
add_action_files(DIRECTORY action FILES Fibonacci.action )
## Generate messages
generate_messages(DEPENDENCIES std_msgs actionlib_msgs)
$catkin_make clean
$catkin_make
可以看到,在devel/include/actionlib_test/中,创建了头文件。文件中定义了各Specification。
![](http://simg.sinajs.cn/blog7style/images/special/1265.gif)