加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

ROS知识点之 ActionLib

(2017-01-24 20:46:26)
标签:

actionlib

ros

分类: 机器人-ROS
作者: 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端)。
http://s13/mw690/001Ld2gwzy78faElYcY6c&690ActionLib" TITLE="ROS知识点之 ActionLib" />

1.2:具体传输:
http://s16/mw690/001Ld2gwzy78faZpd9B0f&690ActionLib" TITLE="ROS知识点之 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\n");
    printf("Current State is: %s \n", 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中处理。



0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有