新浪博客

ROS知识点之 ActionLib

2017-01-24 20:46阅读:
作者: Sam (甄峰) sam_code@hotmail.com
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端)。
ROS知识点之 <wbr>ActionLib


1.2:具体传输:
ROS知识点之 <wbr>ActionLib
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_sam 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:

可以看到,build_depend项目中包含:

actionlib actionlib_msgs
roscpp rospy
这是因为在catkin_create 时,指定了依赖这些Package。

添加内容如下run_depend:

message_generation
CMakefile.txt:
## Add actions
add_action_files(DIRECTORY action FILES Fibonacci.action )
#说明在目录action内,action文件为:Fibonacci.action
## Generate messages
generate_messages(DEPENDENCIES std_msgs actionlib_msgs)
$catkin_make clean
$catkin_make
可以看到,在devel/include/actionlib_test/中,创建了头文件。文件中定义了各Specification
3.3: client(C++):
#include actionlib_test_sam/FibonacciAction.h
#include actionlib/client/simple_action_client.h
#include
typedef actionlib::SimpleActionClient < actionlib_test_sam::FibonacciAction > Client;
int main(int argc, char** argv)
{
ros::init(argc, argv, 'actionlib_test_client');
Client client('fib_client', true);

ROS_INFO('Waiting for action server to start.');
client.waitForServer();

actionlib_test_sam::FibonacciGoal goal;

client.sendGoal(goal);
client.waitForResult(ros::Duration(5.0));

if(client.getState() == actionlib::SimpleClientGoalState::SUCCEEDED)
printf('SamInfo: Get State');
printf('Current State is: %s ', client.getState().toString().c_str());

return 0;


}
头文件actionlib_test_sam/FibonacciAction.h,就是通过action文件,编译时自动建立的。
actionlib_test_sam::FibonacciAction中,声明了Goal, Result等信息。


代码很简单,就是等待Server连接,发送Goal,得到状态等等。




这里就遇到一个问题: Action文件产生的头文件要先于Client(C++). 就像之前Message要先于C++代码产生一样。这就要在CMakefile.txt中处理。






我的更多文章

下载客户端阅读体验更佳

APP专享