ROS Actionlib:设计与执行长时任务的指南

需积分: 31 3 下载量 92 浏览量 更新于2024-09-10 1 收藏 479KB PDF 举报
ROS (Robot Operating System) 是一个广泛用于机器人系统开发的开源框架,它提供了丰富的软件架构和服务,使得创建和管理复杂机器人行为变得更加容易。其中,ROS Actionlib 是一个关键组件,用于设计和实现可以在 ROS 环境中执行长时间任务的服务,这些任务可能需要持续监控、反馈以及在执行过程中能够被取消。 Actionlib 是为了处理那些不适合用简单服务(Service)完成的、需要更复杂控制流程的任务而设计的。在 ROS 中,服务(Service)通常用于执行即时操作,如获取或设置数据,它们是单次请求响应的形式。然而,当涉及到持续操作、状态跟踪和可能的中断时,如机器人的自主导航或者执行一项长期任务,动作(Action)就显得更为合适。 Actionlib 包含了两个主要的组成部分:action server 和 action client。action server 是负责执行任务的节点,它接受客户端的请求并开始执行任务,这个过程可以被预emption(中断)来停止正在进行的任务。另一方面,action client 负责与服务器交互,发送请求并接收结果,同时还可以在任务执行过程中提供实时反馈。 编写 Actionlib 的过程涉及以下几个步骤: 1. **定义 Action**: 首先,你需要定义一个 Action 类型,它包含了任务的起始状态、执行过程中的状态变化以及最终的结果。这通常通过 `.action` 文件格式定义,例如 `.action` XML 或者 YAML。 2. **创建 Action Server**: 你需要编写服务器端代码,实现具体的 Action 类型,并处理客户端请求。这包括初始化、执行任务、处理状态更新以及处理可能的中断请求。 3. **编写 Action Client**: 客户端代码用于向服务器发送请求,跟踪任务进度,并在需要时发送中断信号。这通常涉及到创建客户端对象并与服务器建立连接。 4. **执行和监控**: 当客户端调用 Action,服务器启动执行任务,期间客户端可以定期查询任务状态并获取反馈。如果需要,客户端可以中断任务。 5. **错误处理和恢复**: Actionlib 提供了一套机制来处理执行过程中的错误和异常情况,确保任务的可靠性和稳定性。 6. **示例和参考资料**: 参考文档和源代码可以从 Iocchi 教授的网站 [http://www.dis.uniroma1.it/~iocchi/Teaching/rp/PNPROS/](http://www.dis.uniroma1.it/%7Eiocchi/Teaching/rp/PNPROS/) 找到,这里可能会提供详细的教程、代码示例以及进一步的信息。 通过 Actionlib,ROS 环境能够支持复杂的任务规划和执行,这对于构建具备自主性、灵活性和可扩展性的机器人系统至关重要。理解并熟练运用 Actionlib 是任何想要在机器人领域进行高级开发的工程师必备的技能。

ubuntu16.04ros编译时报错home/bobac3/ros_workspace/src/multipoint_navigation/src/multipoint_nav.cpp:20:17: warning: non-static data member initializers only available with -std=c++11 or -std=gnu++11 int cycle = 1; //巡航次数 ^ /home/bobac3/ros_workspace/src/multipoint_navigation/src/multipoint_nav.cpp: In member function ‘void Multipoint_Nav::move()’: /home/bobac3/ros_workspace/src/multipoint_navigation/src/multipoint_nav.cpp:90:26: error: ‘goal’ does not name a type for(auto goal:pose) //遍历导航点列表 ^ In file included from /opt/ros/kinetic/include/ros/ros.h:40:0, from /opt/ros/kinetic/include/actionlib/client/simple_action_client.h:45, from /home/bobac3/ros_workspace/src/multipoint_navigation/src/multipoint_nav.cpp:1: /opt/ros/kinetic/include/ros/console.h:373:3: error: expected ‘;’ before ‘do’ do \ ^ /opt/ros/kinetic/include/ros/console.h:561:35: note: in expansion of macro ‘ROS_LOG_COND’ #define ROS_LOG(level, name, ...) ROS_LOG_COND(true, level, name, __VA_ARGS__) ^ /opt/ros/kinetic/include/rosconsole/macros_generated.h:110:23: note: in expansion of macro ‘ROS_LOG’ #define ROS_INFO(...) ROS_LOG(::ros::console::levels::Info, ROSCONSOLE_DEFAULT_ ^ /home/bobac3/ros_workspace/src/multipoint_navigation/src/multipoint_nav.cpp:152:17: note: in expansion of macro ‘ROS_INFO’ ROS_INFO("------------------loop ( %d ) termination!----------- ^ /opt/ros/kinetic/include/ros/console.h:373:3: error: expected primary-expression before ‘do’ do \ ^ /opt/ros/kinetic/include/ros/console.h:561:35: note: in expansion of macro ‘ROS_LOG_COND’ #define ROS_LOG(level, name, ...) ROS_LOG_COND(true, level, name, __VA_ARGS__) ^ /opt/ros/kinetic/include/rosconsole/macros_generated.h:110:23: note: in expansion of macro ‘ROS_LOG’ #define ROS_INFO(...) ROS_LOG(::ros::console::levels::Info, ROSCONSOLE_DEFAULT_

2023-06-10 上传