ROS actionlib学习(一)

  actionlib是ROS中一个很重要的功能包集合,尽管在ROS中已经提供了srevice机制来满足请求—响应式的使用场景,但是假如某个请求执行时间很长,在此期间用户想查看执行的进度或者取消这个请求的话,service机制就不能满足了,但是actionlib可满足用户这种需求。例如,控制机器人运动到地图中某一目标位置,这个过程可能复杂而漫长,执行过程中还可能强制中断或反馈信息,这时actionlib就能大展伸手了。

actionlib使用client-server工作模式,ActionClient 和ActionServer通过"ROS Action Protocol"进行通信,"ROS Action Protocol"以ROS消息方式进行传输。此外ActionClient 和ActionServer给用户提供了一些简单的接口,用户使用这些接口可以完成goal请求(client-side)和goal执行(server-side)。

  ActionClient 和ActionServer之间使用action protocol通信,action protocol就是预定义的一组ROS message,这些message被放到ROS topic上在 ActionClient 和ActionServer之间进行传实现二者的沟通。

  ROS Messages:

  • goal - Used to send new goals to servers. 代表一个任务,可以被ActionClient发送到ActionServer。比如在MoveBase中,它的类型是PoseStamped,包含了机器人运动目标位置的信息。
  • cancel - Used to send cancel requests to servers
  • status - Used to notify clients on the current state of every goal in the system
  • feedback - Used to send clients periodic auxiliary information for a goal. 服务端定期告知Client当前Goal执行过程中的情况。在Move Base案例中,它表示机器人当前姿态。
  • result - Used to send clients one-time auxiliary information upon completion of a goal

  ROS系统在action文件(文件名后缀为.action)中定义了上述goal、result、feedback等消息。The .action file has the goal definition, followed by the result definition, followed by the feedback definition, with each section separated by 3 hyphens (---).

  下面是一个示意的例子,在./action/DoDishes.action文件中对洗碗这一任务进行定义:goal为使用某一洗碗机洗碗,result为总共洗好的碗数目,feedback为洗碗进度。

# 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

  下面在catkin_ws/src目录下创建一个测试package:

catkin_create_pkg actionlib_test roscpp std_msgs actionlib actionlib_msgs message_generation rospy

  在package的CMakeLists.txt文件中加入下面这几行:

#find_package(catkin REQUIRED genmsg actionlib_msgs actionlib)
add_action_files(DIRECTORY action FILES DoDishes.action)
generate_messages(DEPENDENCIES actionlib_msgs)

  注意如果使用catkin_create_pkg创建包时没有添加actionlib相关的依赖项,要将上面CMakeLists中第一行的注释去掉,另外还要在package.xml文件中加入下面几行。因为我们在创建包时就添加好了相关依赖,所以这一步骤可以省略。

<build_depend>actionlib</build_depend>
<build_depend>actionlib_msgs</build_depend>
<run_depend>actionlib</run_depend>
<run_depend>actionlib_msgs</run_depend>

  使用catkin_make编译即可查看生成的消息文件,这些消息之后将会用于ActionClient 和 ActionServer间的通信。

  另外可以看到,在devel/include/actionlib_test/中生成了相关的头文件:

C++ SimpleActionClient

  client示例代码client.cpp如下,它会等待Server连接,发送Goal,获取状态。SimpleActionClient完整的API可以参考C++ SimpleActionClient

#include <actionlib_test/DoDishesAction.h>
#include <actionlib/client/simple_action_client.h>

typedef actionlib::SimpleActionClient<actionlib_test::DoDishesAction> Client;

int main(int argc, char** argv)
{
  ros::init(argc, argv, "do_dishes_client");

  Client client("do_dishes", true); // true -> don‘t need ros::spin()
  client.waitForServer(); // Waits for the ActionServer to connect to this client
  actionlib_test::DoDishesGoal goal;
  // Fill in goal here
  client.sendGoal(goal); // Sends a goal to the ActionServer
  client.waitForResult(ros::Duration(5.0)); // Blocks until this goal finishes
  if (client.getState() == actionlib::SimpleClientGoalState::SUCCEEDED)
    printf("Yay! The dishes are now clean\n");
  printf("Current State: %s\n", client.getState().toString().c_str());
  return 0;
}

C++ SimpleActionServer

  服务端代码server.cpp如下,SimpleActionServert完整的API可以参考 C++ SimpleActionServer

#include <actionlib_test/DoDishesAction.h>
#include <actionlib/server/simple_action_server.h>

typedef actionlib::SimpleActionServer<actionlib_test::DoDishesAction> Server;

void execute(const actionlib_test::DoDishesGoalConstPtr& goal, Server* as)
{
  // Do lots of awesome groundbreaking robot stuff here
  as->setSucceeded();
}

int main(int argc, char** argv)
{
  ros::init(argc, argv, "do_dishes_server");
  ros::NodeHandle n;
  Server server(n, "do_dishes", boost::bind(&execute, _1, &server), false);
  server.start();
  ros::spin();
  return 0;
}

  在CMakeLists文件中加入下面这几行:

add_executable(client   src/client.cpp)
add_executable(server   src/server.cpp)
target_link_libraries( client ${catkin_LIBRARIES})
target_link_libraries( server ${catkin_LIBRARIES})

  使用catkin_make进行编译完成后输入指令rosrun actionlib_test server 运行server,通过rostopic list查看系统中的话题如下:

  使用rqt_graph命令可以查看节点和消息的关系,可以看出server端会接收goal和cancel消息,并发出status、result、feedback消息:

  接着输入指令rosrun actionlib_test client 运行client,结果如下图所示:

Python SimpleActionClient

  除了C++也可以使用Python实现同样的功能,client.py如下(API可以参考Python SimpleActionClient):

#! /usr/bin/env python

import roslib
roslib.load_manifest(‘actionlib_test‘)
import rospy
import actionlib

from actionlib_test.msg import DoDishesAction, DoDishesGoal

if __name__ == ‘__main__‘:
    rospy.init_node(‘do_dishes_client‘)
    client = actionlib.SimpleActionClient(‘do_dishes‘, DoDishesAction)
    client.wait_for_server()

    goal = DoDishesGoal()
    # Fill in the goal here
    client.send_goal(goal)
    client.wait_for_result(rospy.Duration.from_sec(5.0))

Python SimpleActionServer

  server.py程序如下(API可参考Python SimpleActionServer):

#! /usr/bin/env python

import roslib
roslib.load_manifest(‘actionlib_test‘)
import rospy
import actionlib

from actionlib_test.msg import DoDishesAction

class DoDishesServer:
  def __init__(self):
    self.server = actionlib.SimpleActionServer(‘do_dishes‘, DoDishesAction, self.execute, False)
    self.server.start()

  def execute(self, goal):
    # Do lots of awesome groundbreaking robot stuff here
    self.server.set_succeeded()

if __name__ == ‘__main__‘:
  rospy.init_node(‘do_dishes_server‘)
  server = DoDishesServer()
  rospy.spin()

  注意在运行程序前先用chmod +x命令给Python文件添加可执行权限:

  运行client.py和server.py,注意client.py运行就会返回:

参考:

actionlib

actionlib-Tutorials

actionlib-Detailed Description

actionlib的身世之谜

ROS基础--Actionlib应用篇

ROS知识(15)----Actionlib的使用(一)

原文地址:https://www.cnblogs.com/21207-iHome/p/8297099.html

时间: 2024-07-30 04:16:16

ROS actionlib学习(一)的相关文章

ROS actionlib学习(二)

在ROS actionlib学习(一)中的例子展示了actionlib最基本的用法,下面我们看一个稍微实际一点的例子,用actionlib计算斐波那契数列,并发布反馈(feedback)和结果(result).斐波那契数列指的是这样一个数列: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368........ 这个数列从第3项开始,每一项都等于

ROS actionlib学习(三)

下面这个例子将展示用actionlib来计算随机变量的均值和标准差.首先在action文件中定义goal.result和feedback的数据类型,其中goal为样本容量,result为均值和标准差,feedback为样本编号.当前样本数据.均值和标准差. #goal definition int32 samples --- #result definition float32 mean float32 std_dev --- #feedback int32 sample float32 dat

ROS 进阶学习笔记(16):ROS导航1:关于Costmap_2d Package (代价地图包)

=== 关于Costmap_2d Package === wiki page: http://wiki.ros.org/costmap_2d === 我遇到的问题是 obstacle layer的刷新频率太低 === costmap_2d包下的所有类文档:http://docs.ros.org/hydro/api/costmap_2d/html/annotated.html 其中,值得注意滴是 costmap_2d::ObservationBuffer 这个类,这个类会被 costmap_2d:

ROS map_server 学习

1.map_server map_server使得地图的数据变成 ros 的service 可以被调用.其中以两种方式存储.一个是yaml文件,他存储了数据的元数据.一个是image file   他编码了地图的占据性情况.其中 image file 中白色像素是空的,黑色像素是被占据的.色彩或者灰色的是被接受的. 图像像素被占据的概率是这么计算的:occ = (255 - color_avg) / 255.0 2.yaml 文件 image: testmap.png 地图图像的路径 resol

机器人ROS系统学习随笔-&gt;1《ROS基础》

工作空间是一个存放工程开发相关文件的文件夹.所有文件放到一个文件系统下,ROS开发所有工程,称为工作空间. 1.创建工作空间 workspace工作空间: 文件夹: src:代码空间(所有工程包源码) build:编译空间(编译产生的中间文件) devel:开发空间(较常用,编译完成后所生成的可执行文件) install:安装空间(与devel作用基本相同在ros2中合成了一个文件夹) 工作空间结构: 创建工作空间: 编译工作空间: 编译后无措,基于c_make开发的封装ros用.不会编译源码,

ROS大型工程学习(三) ROS常用命令行

1.rosbag 对ros包进行操作的命令. (1)录制包: rosbag record -a //录制数据包,所有topic都录制 rosbag record /topic_name1 /topic_name2 /topic_name3 //只录制需要的topic rosbag record -O filename.bag /topic_name1 //录制并命名数据包名称 如果在 launch 文件中使用 rosbag record 命令,如下: <node pkg="rosbag&q

机器人ROS系统学习随笔-&gt;8《ROS机器人系统设之ROS2.0》

为什么要有ROS2-ROS1是什么 ROS1的局限 ROS1的困境 ROS2的曙光 ROS2的版本进化 ROS2是什么 ROS2的目标 ROS2的架构 DDS是什么 ROS1的通信模型 ROS2的通信模型 ROS2的质量服务原则QoS ROS2的编译系统 如何安装ROS2 最新的ros2安装:https://index.ros.org/doc/ros2/Installation/#installationguide.根据指示安装,推荐Debian安装.支持官网同步更新. 可以在ros2官网上找.

机器人ROS系统学习随笔-&gt;2《ROS机器人系统设计Gazeb模型建立》

什么是机器人 机器人的组成: 控制系统 系统实现 外部传感器 系统构建--摄像头的实现 参数的设置: kinet链接 lunch文件: 激光雷达的连接 注意想要显示在rviz中要在命令行输入: 1 roslaunch rplidar_ros view_rplider.launch 系统架构完整示例 URDF机器人建模 <link>标签 <joint>标签 <roboot>标签 功能包创建 launch文件配置 在做自己模型的时候基本是只需要修改第一行. 机器人创建一 机

机器人ROS系统学习随笔-&gt;3《ROS机器人系统设计URDF模型优化》

XACRO模型文件 数学计算(原来URDF不支持) 宏定义机制 文件包含 模型显示 方法一:在模型根目录下操作 1 rosrun xacro xacro.py mbot.xcaro>mbot.urdf 原文地址:https://www.cnblogs.com/vcan123/p/12231428.html