ROS进阶功能—action通信机制

目录

  • 一、总述
  • 二、action
  • 三、action的工作机制
  • 四、action的简单案例
  • 五、总结

一、总述

ROS中常用的通信机制是话题(Topic)和服务(Service),但是在很多场景下,这两种通信机制往往满足不了所有需求。比如机械臂控制,如果用话题发布运动目标,由于话题是单向通信,则需要另外订阅一个话题来获得机器人运动过程中的状态反馈。如果用服务发布运动目标,虽然可以获得一次反馈信息,但是对于控制来说数据太少,而且当反馈迟迟没有收到时,就只能等待,做不了其他事情。那么有没有一种更加合适的通信机制来满足类似这样场景的需求呢?即action。

二、action

ROS中包含一个名为actionlib的功能包,用于实现action的通信机制。action是一种类似于Service的问答通信机制,不同之处在于action带有连续反馈,可以不断反馈任务进度,也可以在任务过程中中止运行。

三、action的工作机制

action也采用客户端/服务器(Client/Server)的工作模式。
client和server之间通过actionlib定义的“action protocol”进行通讯。这种通讯协议是基于ROS的消息机制实现的,为用户提供了client和server的接口。

Client向Server端发布任务目标以及在必要的时候取消任务,Server会向Client发布当前状态、实时反馈和任务执行的最终结果。
1)goal:任务目标。
2)cancel:请求取消任务。
3)status:通知client当前的状态。
4)feedback:周期反馈任务运行的监控数据。
5)result:向client发送任务的执行结果,这个topic只会发布一次。

四、action的简单案例

这个案例简单地实现了一个洗盘子的action通信功能。客户端发送洗盘子的目标,服务器端返回洗盘子的结果,并随时反馈洗盘子的进度。共用到action消息中的:goal、feedback和result.
首先是需要新建一个action文件夹,在其下定义一个action文件。
action文件中的内容如下:

# 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

之后要在CMakeLists.txt 文件中加入以下编译规则:

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

并在package.xml 文件中加入以下依赖项:

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

然后就可以对文件进行编译,编译成功后会产生以下.msg 文件,这些都是action中需要用到的消息类型,由此可见action确实是根据topic实现的。

DoDishesAction.msg
DoDishesActionGoal.msg
DoDishesActionResult.msg
DoDishesActionFeedback.msg
DoDishesGoal.msg
DoDishesResult.msg
DoDishesFeedback.msg

编写客户端client:

#include <actionlib/client/simple_action_client.h>
#include "action_tutorials/DoDishesAction.h"
typedef actionlib::SimpleActionClient<action_tutorials::DoDishesAction> Client;
// 当action完成后会调用次回调函数一次
void doneCb(const actionlib::SimpleClientGoalState& state,const action_tutorials::DoDishesResultConstPtr& result)
{ROS_INFO("Yay! The dishes are now clean");ros::shutdown();
}
// 当action激活后会调用次回调函数一次
void activeCb()
{ROS_INFO("Goal just went active");
}
// 收到feedback后调用的回调函数
void feedbackCb(const action_tutorials::DoDishesFeedbackConstPtr& feedback)
{ROS_INFO(" percent_complete : %f ", feedback->percent_complete);
}
int main(int argc, char** argv)
{ros::init(argc, argv, "do_dishes_client");// 定义一个客户端Client client("do_dishes", true);// 等待服务器端ROS_INFO("Waiting for action server to start.");client.waitForServer();ROS_INFO("Action server started, sending goal.");// 创建一个action的goalaction_tutorials::DoDishesGoal goal;goal.dishwasher_id = 1;// 发送action的goal给服务器端,并且设置回调函数client.sendGoal(goal,  &doneCb, &activeCb, &feedbackCb);ros::spin();return 0;
}

然后编写服务器端:

#include <ros/ros.h>
#include <actionlib/server/simple_action_server.h>
#include "action_tutorials/DoDishesAction.h"typedef actionlib::SimpleActionServer<action_tutorials::DoDishesAction> Server;// 收到action的goal后调用的回调函数
void execute(const action_tutorials::DoDishesGoalConstPtr& goal, Server* as)
{ros::Rate r(1);action_tutorials::DoDishesFeedback feedback;ROS_INFO("Dishwasher %d is working.", goal->dishwasher_id);// 假设洗盘子的进度,并且按照1hz的频率发布进度feedbackfor(int i=1; i<=10; i++){feedback.percent_complete = i * 10;as->publishFeedback(feedback);r.sleep();}// 当action完成后,向客户端返回结果ROS_INFO("Dishwasher %d finish working.", goal->dishwasher_id);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;
}

运行之后,客户端:

服务器端:

五、总结

action通信机制是实现智能机器人的很重要的部分,其中的概念其实并不是很困难,但它也仅仅只是一个工具,要实现智能机器人还是得需要一些更高级任务管理机制,比如状态机和行为树。

ROS进阶功能—action通信机制相关推荐

  1. ROS自主导航学习———ROS通信机制

    前言 前面ROS很多都忘记了 ,现在来重新回顾一下内容 ROS 中的基本通信机制主要有如下三种实现策略: 话题通信(发布订阅模式) 服务通信(请求响应模式) 参数服务器(参数共享模式) Action通 ...

  2. ROS入门跟着我就够了(二)上 ROS通信机制

    由于这一章东西比较多,我分了上下两篇,下部分可以在< ROS 入门跟着我就够了>专辑中查看 ROS 中的基本通信机制主要有如下三种实现策略: 话题通信(发布订阅模式)服务通信(请求响应模式 ...

  3. Chapter2 ROS通信机制----基础篇(Ⅰ)vs配置及通信基础

    目录 一.复习及launch 1.1 深入理解配置信息(非常重要) 1.2 launch文件演示 二.ROS通信机制-----基础 2.1 本节导论 2.2 话题通信 2.2.1 话题通信概述 2.2 ...

  4. ROS通信机制一---话题通信

    文章目录 总述 1. 话题通信模型 2. 话题通信基本实现示例 2.1 发布者 2.1.1 创建发布者topic_pub.cpp文件 2.1.2 修改CMakeLists.txt文件 2.1.3 编译 ...

  5. 【ROS理论与实践-赵虚左老师】Chap2 ROS通信机制

    第二章 ROS通信机制 通信是ROS中的核心 Core 机器人是一种高度复杂的系统性实现,在机器人上可能集成各种传感器(雷达.摄像头.GPS-)以及运动控制实现,为了解耦合,在ROS中每一个功能点都是 ...

  6. 理解同步和异步通信:以ROS的3中典型通信机制为例

    文章目录 一.ROS中的几种通信机制 二.不同通信机制的特点 2.1 话题消息通信 2.2 服务消息通信 2.3 动作消息通信 3. 同步和异步 一.ROS中的几种通信机制 在ROS中,不同的进程可以 ...

  7. ROS 通信机制(已整理)

    文章目录 节点与节点管理器 ROS通信机制 1. 话题通信 1.1 基本话题通信 1.1.1 C++实现 发布方 demo01_pub.cpp 订阅方 demo01_sub.cpp 1.1.2 Pyt ...

  8. 6th ROS通信机制概述

    ROS通信是ROS的核心之一. 一.基本概念 节点(Node) 一个节点就表示一个进程 多节点.端到端.分布式通信机制 消息(Message) 节点之间通过订阅和发布传递的数据 可以使用ROS提供的消 ...

  9. ROS通信机制——发布/订阅者模型

    目录 发布/订阅者模型 (一)发布者 (二)订阅者 (三)综合 参考资料 ROS (Robot Operating System),即机器人操作系统,是为了加快机器人的开发效率,提高机器人软件代码的复 ...

  10. 谈谈ROS的通信机制

    本文首先简单的介绍ROS是什么和核心概念,然后主要介绍ROS的通信机制. 1.ROS是什么 ROS(机器人操作系统,Robot Operating System),是专为机器人软件开发所设计出来的一套 ...

最新文章

  1. 基于时间片轮转程序分析进程调度
  2. java 可重入读写锁 ReentrantReadWriteLock 详解
  3. python波士顿房价是什么数据,Python数据分析 | 波士顿房价回归分析
  4. 05-03 docker 常用命令
  5. create symbolic array
  6. [悟] 因上努力,果上随缘(转)
  7. linux下的串口工具minicom、ckermit
  8. 软件测试的基本理论与方法
  9. AH3050_12V升18V2A 同步升压芯片
  10. Android 贝塞尔曲线的魅力
  11. word中实现奇数页和偶数页页眉不同,奇数页使用本章编号和标题,偶数页使用其他统一文字
  12. 免费抠图神器!五秒在线搞定抠图
  13. 百度地图有了这么有趣的功能
  14. 批处理——提取SRT文字中的文字
  15. android11.0 Launcher3 高端定制之抽屉列表固定APP显示位置
  16. c1科目三灯光全语言播报,科目三模拟灯光语音播报(完整版)
  17. Hudson集成工具
  18. 学 Java 网络爬虫,需要哪些基础知识?
  19. 第一种蠕虫病毒诞生 | 历史上的今天
  20. Lottie简介(翻译)

热门文章

  1. 爬虫和网易云音乐API的一次尝试
  2. 肝移植笔记1:论文阅读-对率回归预测移植物失功概率
  3. 单片机 DAC0832数模转换实验
  4. 【SDOI2015】星际战争 网络流
  5. 比Gmail更强悍:超大3GB免费邮箱申请!
  6. c语言绝对值函数作用,C语言中有没有求绝对值的函数啊?谢谢!
  7. android app启动动画效果,Android 启动页优化及过渡动画
  8. win2012部署asp网站相关
  9. 工业镜头和民用镜头的特点和区别
  10. 解决报错:SSL certificate problem: certificate has expired