ros2 action相关

ops/2024/10/20 4:09:35/

ros2_action_0">ros2 action相关

总体代码参考:
一定要先看这里的示例,后续是对这个示例的说明补充
重点关注execute中,思考action的客户端与服务端联动过程中需要的是,任务执行的一些状态信息交互,就能明补execute为什么这样写了

代码讲解

void execute(const std::shared_ptr<GoalHandleFibonacci> goal_handle)
{// 日志:开始执行目标RCLCPP_INFO(this->get_logger(), "Executing goal");// 设置循环频率为 1Hz(每秒执行一次)rclcpp::Rate loop_rate(1);// 获取目标参数(目标中的 Fibonacci 序列长度)const auto goal = goal_handle->get_goal();// 创建用于发送反馈的对象auto feedback = std::make_shared<Fibonacci::Feedback>();// 获取部分序列引用,初始时只包含两个数字 0 和 1auto & sequence = feedback->partial_sequence;sequence.push_back(0);sequence.push_back(1);// 创建结果对象,用于在目标完成时返回整个序列auto result = std::make_shared<Fibonacci::Result>();// 循环从 1 开始生成 Fibonacci 数列,直到达到目标数列长度或 ROS 停止for (int i = 1; (i < goal->order) && rclcpp::ok(); ++i) {// 检查是否有取消请求if (goal_handle->is_canceling()) {// 如果取消请求存在,将当前已生成的部分序列返回,并标记为取消result->sequence = sequence;goal_handle->canceled(result);RCLCPP_INFO(this->get_logger(), "Goal canceled");return;  // 退出函数,停止执行}// 按照 Fibonacci 规则更新序列:每个数字是前两个数字的和sequence.push_back(sequence[i] + sequence[i - 1]);// 发布当前的反馈,更新部分已生成的 Fibonacci 序列goal_handle->publish_feedback(feedback);RCLCPP_INFO(this->get_logger(), "Publish feedback");// 按照 1Hz 的频率暂停,以保持循环节奏loop_rate.sleep();}// 如果目标完成并且没有被取消,且 ROS 正常运行if (rclcpp::ok()) {// 将生成的完整序列设置为结果result->sequence = sequence;// 标记目标完成,返回结果goal_handle->succeed(result);RCLCPP_INFO(this->get_logger(), "Goal succeeded");}
}

代码讲解:

  1. 初始化:goal_handle->get_goal() 获取传入的目标,它包含 Fibonacci 数列的目标长度(即需要生成多少个数字)。
    初始化反馈的部分序列 sequence,最初包含 Fibonacci 数列的前两个元素 0 和 1。
  2. 反馈循环:通过 for 循环,逐步生成 Fibonacci 数列的后续数字。每次计算后,调用 publish_feedback(feedback) 发布当前生成的部分序列作为反馈。
    循环每次睡眠 1 秒(通过 rclcpp::Rate(1) 控制),以模拟逐步计算的过程。
  3. 取消处理:在每次循环开始时,检查是否有取消请求 (goal_handle->is_canceling())。
    如果接收到取消请求,服务器将返回已经计算的部分数列,调用 goal_handle->canceled(result) 标记该目标被取消,并退出执行函数。
  4. 目标完成:循环结束后,检查 ROS 是否在正常运行(rclcpp::ok()),如果是,意味着计算成功完成。
    将最终计算的完整 Fibonacci 序列返回,并调用 goal_handle->succeed(result) 标记目标成功完成。

自带接口说明

get_goal()succeed(result)publish_feedback(feedback) 这些都是 ROS 2 动作接口提供的函数,用于处理动作服务器与客户端之间的通信,尤其是在动作(action)的目标执行、反馈、取消、以及结果返回方面。

我将详细解释这些接口,并讲解哪些是 Fibonacci 动作定义中的变量。

1. 动作接口函数

这些函数是 ROS 2 动作库中的标准接口,用于处理动作请求和响应:

  • get_goal():
    这个函数用于获取客户端发送给动作服务器的目标(goal)。目标通常包含需要服务器执行的动作的参数。在你的例子中,目标就是 Fibonacci 数列的长度(order),即客户端要求生成的数列长度。

  • succeed(result):
    这个函数用于通知动作服务器,目标执行已成功完成,并返回最终的结果。result 包含的是动作完成后的最终数据。在 Fibonacci 的例子中,result->sequence 是生成的完整 Fibonacci 序列。

  • publish_feedback(feedback):
    这个函数用于发送反馈信息给客户端。在执行长时间任务时,服务器可以定期通过反馈将当前的状态或中间结果发送给客户端。在这个例子中,feedback->partial_sequence 是已经计算出的 Fibonacci 序列的部分数据。

这些接口函数是动作库的一部分,适用于任何 ROS 2 动作,不仅限于 Fibonacci 示例。

2. Fibonacci 动作中的定义变量

在 ROS 2 动作中,消息定义文件通常包含 三个部分goal(目标)、feedback(反馈)、result(结果)。在 Fibonacci 动作中,它们可能被定义如下:

action"># Fibonacci.action# Goal definition (目标)
int32 order  # 要生成的 Fibonacci 数列的长度---
# Result definition (结果)
int32[] sequence  # 完整的 Fibonacci 数列---
# Feedback definition (反馈)
int32[] partial_sequence  # 部分生成的 Fibonacci 数列

具体来说:

  1. Goal 部分:

    • int32 order: 这是客户端传递给服务器的目标数据,表示要生成的 Fibonacci 数列长度。在代码中,使用 goal_handle->get_goal()->order 获取这个值。
  2. Result 部分:

    • int32[] sequence: 最终的 Fibonacci 数列,服务器在成功完成目标后返回给客户端。它在代码中通过 result->sequence 进行访问,并在目标完成时通过 goal_handle->succeed(result) 返回。
  3. Feedback 部分:

    • int32[] partial_sequence: 当前生成的部分 Fibonacci 数列,服务器在执行过程中不断更新并通过 goal_handle->publish_feedback(feedback) 发送反馈给客户端。在代码中,它通过 feedback->partial_sequence 来访问和更新。

总结

  • get_goal(): 从 Goal 获取动作的目标(如 Fibonacci 数列长度)。
  • succeed(result): 当动作成功完成时返回 Result(如完整的 Fibonacci 序列)。
  • publish_feedback(feedback): 在执行过程中发送 Feedback(如部分生成的 Fibonacci 序列)。

Fibonacci 动作中的变量是 GoalorderResultsequenceFeedbackpartial_sequence,这些都在代码中分别用于获取目标、生成反馈和返回结果。


http://www.ppmy.cn/ops/124915.html

相关文章

02.07.链表相交 最简方法之一

面试题 02.07. 链表相交 已解答 简单 相关标签 相关企业 提示 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保证 整个链…

【工具】音视频翻译工具基于Whisper+ChatGPT

OpenAI推出的开源语音识别工具Whisper&#xff0c;以其卓越的语音识别能力&#xff0c;在音频和视频文件处理领域大放异彩。与此同时&#xff0c;ChatGPT也在翻译领域崭露头角&#xff0c;其强大的翻译能力备受赞誉。因此&#xff0c;一些字幕制作团队敏锐地捕捉到了这两者的结…

2-laravel-路由配置

文章目录 定义控制器设计控制器设置路由启动服务 基本路由视图路由建立视图路由建立视图文件 控制器视图路由创建视图二级目录控制器 定义控制器 打开laravel 工程 建立一个 Demo 名字的控制器去集成 模板控制器 安装两个插件 设计控制器 <?phpnamespace App\Http\…

【Python Django + Vue】酒店在线预订系统:用技术说话!

&#x1f393; 作者&#xff1a;计算机毕设小月哥 | 软件开发专家 &#x1f5a5;️ 简介&#xff1a;8年计算机软件程序开发经验。精通Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等技术栈。 &#x1f6e0;️ 专业服务 &#x1f6e0;️ 需求定制化开发源码提…

SeleniumBase在无头模式下绕过验证码的完整指南

概述 在现代Web爬虫技术中&#xff0c;SeleniumBase 是一款强大的自动化测试工具&#xff0c;能够模拟用户行为&#xff0c;进行高效的数据采集。然而&#xff0c;验证码&#xff08;CAPTCHA&#xff09;常常成为爬虫项目中的一个难题&#xff0c;尤其是在无头模式&#xff08…

ssh -T git@github.com 出现异常

上传代码到github 私有仓库 步骤 1. 生成 SSH Key&#xff08;如果没有&#xff09; 打开终端并运行&#xff1a; bash 复制 ssh-keygen -t ed25519 -C "your_emailexample.com"按提示保存密钥文件和设置密码短语&#xff08;可选&#xff09;。默认位置是 ~/.…

IDEA使用Alibaba Cloud Toolkit插件自动化部署jar包

一、下载插件 二、添加服务器主机 三、填写自己服务器配置 四、添加配置 五、配置说明 六、选择maven打包模块 七、maven打包后的jar包位置配一下 八、点击运行发现成功

第十四章 RabbitMQ延迟消息之延迟队列

目录 一、引言 二、死信队列 三、核心代码实现 四、运行效果 五、总结 一、引言 什么是延迟消息&#xff1f; 发送者发送消息时指定一个时间&#xff0c;消费者不会立刻收到消息&#xff0c;而是在指定时间后收到消息。 什么是延迟任务&#xff1f; 设置在一定时间之后才…