官方wiki:http://wiki.ros.org/actionlib

1、说明

ROS中的action也是节点通信的一种方式,其和service-client的不同点在于,service-client是一问一答模式,而action则多了一个反馈机制,即服务端不间断给客户端反馈

api参考:https://docs.ros.org/en/api/actionlib/html/classactionlib_1_1SimpleActionClient.html

2、代码示例

跳过创建工作区和功能包步骤

2.1、定义数据结构

action定义的数据结构分成三个部分,中间用 --- 隔开,按照顺序如下:

2.1.1、goal

为了使action完成任务,引入一个目标概念,由客户端发送到服务端

2.1.4、result

结果由服务端发送给客户端,在完成 goal 之后,发送的任务结果

2.1.3、feedback

反馈为服务端发送到客户端,高度客户端,当前任务的进展

TestData.action

#请求的数据,一般由客户端发送给服务端
uint32 id
---
#请求结果,一般由服务端发送给客户端
uint32 total
---
#反馈的消息内容,一般由服务端不间断发送到客户端
float32 percent

.action 文件默认保存在 action 目录下

对于该文件,会生成7个消息类型,以便客户端和服务端通信,这些类型由 genaction.py 生成:

  1. TestDataAction.msg
  2. TestDataActionGoal.msg
  3. TestDataActionResult.msg
  4. TestDataActionFeedback.msg
  5. TestDataGoal.msg
  6. TestDataResult.msg
  7. TestDataFeedback.msg

2.2、服务端

#include <ros/ros.h>
#include <test_action/TestDataAction.h>
#include <actionlib/server/simple_action_server.h> typedef actionlib::SimpleActionServer<test_action::TestDataAction> Server; void execute(const test_action::TestDataGoalConstPtr& goal, Server* server)
{
ros::Rate rate(1);
test_action::TestDataFeedback feedback; ROS_INFO("Dishwasher %d is working.", goal->id); for(int index = 1; index <= 10; index++)
{
feedback.percent = index * 10;
server->publishFeedback(feedback);
rate.sleep();
} ROS_INFO("Dishwasher %d finish working.", goal->id);
server->setSucceeded();
} int main(int argc, char** argv)
{
ros::init(argc, argv, "test_action_service");
ros::NodeHandle handle;
//构建一个action服务,第二个参数是服务的名称,客户端需要根据这个唯一的名称进行连接
//最后一个参数表示是否构建完成之后就开始运行,一般应该设置为false,并在构建完成之后使用start()方法开始
Server server(handle, "do_action",
boost::bind(&execute, _1, &server), false);
server.start();
ros::spin();
return 0;
}

2.3、客户端

#include <ros/ros.h>
#include <test_action/TestDataAction.h>
#include <actionlib/client/simple_action_client.h> typedef actionlib::SimpleActionClient<test_action::TestDataAction> Client; //完成调用回调
void doneCb(const actionlib::SimpleClientGoalState& state,
const test_action::TestDataResultConstPtr& result)
{
ROS_INFO("The dishes are now clean");
ros::shutdown();
} void activeCb()
{
ROS_INFO("goal just went active");
} //反馈
void feedbackCb(const test_action::TestDataFeedbackConstPtr& feedback)
{
ROS_INFO("percent: %f", feedback->percent);
} int main(int args, char** argv)
{
ros::init(args, argv, "test_action_client");
Client client("do_action", true);
ROS_INFO("waiting for action server to start");
client.waitForServer();
ROS_INFO("action server started, sending goal"); test_action::TestDataGoal goal;
goal.id = 9;//填入goal
//客户端发送目标,后三个是各个阶段的回调,分别在完成时、通信刚激活时和反馈过程中
client.sendGoal(goal, &doneCb, &activeCb, &feedbackCb);
ros::spin(); return 0;
}

2.4、构建配置

CMakeLists.txt需要添加以下包依赖

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

其中,genmsgactionlib_msgs 是构建 .action 文件的时候需要的依赖,actionlib 是编译的时候需要的依赖

packages.xml 配置

<buildtool_depend>catkin</buildtool_depend>
<buildtool_depend>genmsg</buildtool_depend>
<build_export_depend>actionlib_msgs</build_export_depend>
<build_depend>actionlib</build_depend>
<build_depend>actionlib_msgs</build_depend>
<exec_depend>actionlib</exec_depend>
<exec_depend>actionlib_msgs</exec_depend>

2.5、结果

服务端:

[ INFO] [1621921903.942496821]: Dishwasher 9 is working.
[ INFO] [1621921913.942535907]: Dishwasher 9 finish working.

客户端:

[ INFO] [1621921903.728245862]: waiting for action server to start
[ INFO] [1621921903.941538934]: action server started, sending goal
[ INFO] [1621921903.942692392]: goal just went active
[ INFO] [1621921903.943088999]: percent: 10.000000
[ INFO] [1621921904.942911217]: percent: 20.000000
[ INFO] [1621921905.942921653]: percent: 30.000000
[ INFO] [1621921906.942895095]: percent: 40.000000
[ INFO] [1621921907.942843906]: percent: 50.000000
[ INFO] [1621921908.942901935]: percent: 60.000000
[ INFO] [1621921909.942896131]: percent: 70.000000
[ INFO] [1621921910.942844776]: percent: 80.000000
[ INFO] [1621921911.942889215]: percent: 90.000000
[ INFO] [1621921912.942941318]: percent: 100.000000
[ INFO] [1621921913.943146759]: The dishes are now clean

ROS节点通信(三)action的更多相关文章

  1. ROS学习笔记三(理解ROS节点)

    要求已经在Linux系统中安装一个学习用的ros软件包例子: sudo apt-get install ros-indigo-ros-tutorials ROS图形概念概述 nodes:节点,一个节点 ...

  2. ROS学习笔记三:编写第一个ROS节点程序

    在编写第一个ROS节点程序之前需要创建工作空间(workspace)和功能包(package).   1 创建工作空间(workspace) 创建一个catkin_ws: #注意:如果使用sudo一次 ...

  3. ROS学习(六)—— 理解ROS节点

    一.准备工作 下载一个轻量级的模拟器 sudo apt-get install ros-kinetic-ros-tutorials 二.图概念的理解 1.Nodes:一个节点就是一个可执行文件,用来与 ...

  4. ROS话题通信C++(附launch启动方式)

    ROS话题通信C++(附launch启动方式) 创建工作空间 mkdir -p topic_ws/src cd topic_ws catkin_make 设置环境变量 source ./devel/s ...

  5. SPARK如何使用AKKA实现进程、节点通信

    SPARK如何使用AKKA实现进程.节点通信 <深入理解Spark:核心思想与源码分析>一书前言的内容请看链接<深入理解SPARK:核心思想与源码分析>一书正式出版上市 < ...

  6. ROS串口通信

    身处机器人行业,不想一直只做低端的单片机控制,老是待在舒适区,所以一直都想学一下ROS系统,但看了几个月资料后,感觉还是云里雾里,似懂非懂,感念似乎都很清楚,但要实际去做,却又感觉无从下手. 于是想先 ...

  7. (五)ROS节点

    一. 理解ROS 节点: ROS的节点: 可以说是一个可运行的程序.当然这个程序可不简单.因为它可以接受来自ROS网络上其他可运行程序的输出信息,也可以发送信息给ROS网络,被其他 ROS 可运行程序 ...

  8. ROS节点理解--5

    理解 ROS节点(原创博文,转载请标明出处--周学伟http://www.cnblogs.com/zxouxuewei/) Description: 本教程主要介绍 ROS 图(graph)概念 并讨 ...

  9. ROS Learning-007 beginner_Tutorials ROS节点

    ROS Indigo beginner_Tutorials-06 ROS节点 我使用的虚拟机软件:VMware Workstation 11 使用的Ubuntu系统:Ubuntu 14.04.4 LT ...

  10. CAN总线多节点通信异常分析及解决

    一.CAN物理层特征 CAN收发器的作用是负责逻辑电平和信号电平之间的转换.即从CAN控制芯片输出逻辑电平到CAN收发器,然后经过CAN收发器内部转换将逻辑电平转换为差分信号输出到CAN总线上,CAN ...

随机推荐

  1. 【JAVA基础】报错解决

    报错解决 Failed to configure a DataSource: 'url' attribute is not specified and no embedd https://change ...

  2. 封装http并挂载到全局

    https://www.bilibili.com/video/BV1BJ411W7pX?p=32 具体使用:https://blog.csdn.net/weixin_44763569/article/ ...

  3. SIP没有摘机消息可以通话吗

    概述 SIP流程中,A路没有收到摘机的200 OK响应消息可以通话吗? 客户反馈的问题千奇百怪,公共互联网的问题同样百转千回,让你欲罢不能,头秃方休. 客户报故障,问题描述是这样的,我用号码A打给号码 ...

  4. React技巧之设置input值

    原文链接:https://bobbyhadz.com/blog/react-set-input-value-on-button-click 作者:Borislav Hadzhiev 正文从这开始~ 总 ...

  5. 基于python开发的口罩供需平台

    基于python开发的口罩供需平台 预览地址:https://i.mypython.me 开发语言:python/django 意见反馈:net936艾特163.com

  6. Keep English Level-01

    state -- 声称,宣称,国家,政府 state-owned -- 国有的 He stated that "hell will break loose,politically and m ...

  7. Python Code_05位运算

    coding:utf-8 author : 写bug的盼盼 development time : 2021/8/28 7:16 print(4&8)#非1即0 print(4|2)#同0即0, ...

  8. 百度网盘(百度云)SVIP超级会员共享账号每日更新(2023.12.20)

    一.百度网盘SVIP超级会员共享账号 可能很多人不懂这个共享账号是什么意思,小编在这里给大家做一下解答. 我们多知道百度网盘很大的用处就是类似U盘,不同的人把文件上传到百度网盘,别人可以直接下载,避免 ...

  9. [转帖]SQL Server 性能调优

      性能调优2:CPU   关系型数据库严重依赖底层的硬件资源,CPU是服务器的大脑,当CPU开销很高时,内存和硬盘系统都会产生不必需要的压力.CPU的性能问题,直观来看,就是任务管理器中看到的CPU ...

  10. Grafana针对内存监控值的学习与使用

    Grafana针对内存监控值的学习与使用 背景 因为学习内存相关的知识, 可以通过pgcacher/sar -r 等命令监控系统信息. 但是现在发现. 不太直观, 所以想着使用别的方式来进行处理. 然 ...