Ros2 学习七:Action(动作)- Goal(目标) 结果(result)反馈(feedback)
目录1 action工作原理2 创建客户端3 创建服务端4 运行参考文档https://zhuanlan.zhihu.com/p/1913364862865740535action文件格式#目标 Goal float32 aim --- #结果 Result bool result --- #响应 Feedback float32 current1 action工作原理actionaction是之前msg和srv的组合至少2个server请求响应和1个topic发布订阅。AI说和还有一个隐藏的topic。其中步骤1和2构成一个请求响应用于确定是否提供服务。步骤2和步骤5构成一个请求响应用于反馈最终结果。步骤4构成一个topic用于实时反馈结果feedback。​1 客户端向Goal Service服务端发送请求2 Goal Service服务端反馈目标接受状态接收或拒绝3 客户端向Result Service服务端发送请求4 动作服务器开始计算并通过Feedback Topic反馈中间结果5 最终结果计算完毕后Result Service服务端反馈结果给Result Service客户端 由以上的交互流程​2 创建客户端共三个主要回调import rclpy from rclpy.action import ActionClient from rclpy.node import Node from pkg_interfaces.action import MyAction class ActionClientNode(Node): def __init__(self): super().__init__(action_client) # 实例化动作客户端不再通过函数创建 self._action_client ActionClient(self, MyAction, MyAction) def send_goal(self, aim): # 等待动作服务器就绪 while not self._action_client.wait_for_server(timeout_sec 1.0): self.get_logger().info(service not ready) # 构建目标消息 goal_msg MyAction.Goal() goal_msg.aim aim # 异步发送目标,请求对端是否提供服务 self._send_goal_future self._action_client.send_goal_async( goal_msg, # 对应 topic 的订阅回调 feedback_callbackself.feedback_callback) # feedback回调对应话题 # 绑定目标响应回调函数确认服务器是否接受目标 self._send_goal_future.add_done_callback(self.goal_response_callback) # 回调1 请求确定是否提供提供服务当确定提供服务后请求最终结果 def goal_response_callback(self, future): goal_handle future.result() if not goal_handle.accepted: self.get_logger().info(Goal rejected :() return self.get_logger().info(Goal accepted :)) # 目标被接受后异步请求最终结果 self._get_result_future goal_handle.get_result_async() # 绑定最终结果的回调 self._get_result_future.add_done_callback(self.get_result_callback) # 回调2 最终结果的回调 def get_result_callback(self, future): # 任务完成获取并打印最终结果 result future.result().result self.get_logger().info(fFinal Result: {result.result}) # 回调3 实时反馈的回调 def feedback_callback(self, feedback_msg): # 接收到服务器发来的实时反馈 feedback feedback_msg.feedback self.get_logger().info(fReceived feedback: {feedback.current}) sshi def main(): # 1 初始化环境 rclpy.init() # 2 创建节点 action_client_node ActionClientNode() # 2.1 发送信息 action_client_node.send_goal(10.0) # 3 消息循环 rclpy.spin(action_client_node) # 4 释放资源 action_client_node.destroy_node() rclpy.shutdown() if __name__ __main__: main()3 创建服务端import rclpy from rclpy.node import Node from rclpy.action import ActionServer from rclpy.action.server import ServerGoalHandle, GoalResponse from pkg_interfaces.action import MyAction class ActionServerNode(Node): def __init__(self): super().__init__(action_server) # 实例化动作服务器绑定动作类型、动作名称和执行回调函数 self._action_server ActionServer( self, MyAction, MyAction, self.execute_callback,# 执行回调用于反馈实时执行结果 feedback。当执行完成后反馈执行result消息 goal_callbackself.goal_callback)# 用于确定是否提供服务的回调如果不设置则默认回调提供服务 # 步骤1 是否提供服务回调 def goal_callback(self,goal_request): if goal_request.aim 0: self.get_logger().info(GoalResponse.REJECT) return GoalResponse.REJECT else: self.get_logger().info(GoalResponse.ACCEPT) return GoalResponse.ACCEPT # 步骤2 执行状态回调 def execute_callback(self, goal_handle: ServerGoalHandle): self.get_logger().info(Executing goal...) # 1. 初始化反馈消息 feedback_msg MyAction.Feedback() # 2. 获取客户端传来的目标值 aim goal_handle.request.aim # 3. 执行长时间运行的任务并发布反馈结果 for i in range(0, int(aim)): # 计算下一个数 feedback_msg.current float(i) # 发布实时反馈 goal_handle.publish_feedback(feedback_msg) self.get_logger().info(fFeedback: {feedback_msg.current}) # 模拟耗时操作实际工程中应使用定时器或异步等待 import time time.sleep(1) # 4. 任务完成设置成功状态 goal_handle.succeed() # 5. 返回result结果 result MyAction.Result() result.result True self.get_logger().info(Goal succeeded!) return result def main(): # 1 初始化资源 rclpy.init() # 2 创建节点 action_server_node ActionServerNode() action_server_node.get_logger().info(server started) # 3 消息循环 rclpy.spin(action_server_node) # 4 释放资源 action_server_node.destroy_node() rclpy.shutdown() if __name__ __main__: main()4 运行在setup.py中添加入口节点action_client_node pkg_name1.action_client_node:main, action_server_node pkg_name1.action_server_node:main,运行结果

相关新闻

MySQL binlog管理:安全删除与生产环境实践

MySQL binlog管理:安全删除与生产环境实践

1. MySQL binlog日志文件管理基础 1.1 binlog的核心作用与工作机制 MySQL的二进制日志(binary log)是数据库系统中至关重要的组件,它忠实记录所有修改数据的SQL语句(DDL和DML),以二进制的形式存储在磁盘上…

2026/8/8 12:12:09 阅读更多 →
SpringBoot SSE流式响应实战:告别等待,实现实时进度推送

SpringBoot SSE流式响应实战:告别等待,实现实时进度推送

1. 项目缘起:从“等待”到“流淌”的体验升级 最近在做一个后台管理系统的功能,需求是用户在前端点击一个“数据导出”按钮,后端需要处理一个比较耗时的任务,比如生成一份包含几十万条记录的报告。传统的做法是,前端发…

2026/8/8 12:14:03 阅读更多 →
CAD高程点批量展点插件|免CASS一键导入坐标|支持编码高程点|绿色免安装使用

CAD高程点批量展点插件|免CASS一键导入坐标|支持编码高程点|绿色免安装使用

温馨提示:文末有联系方式 一、高效CAD展点新方案:告别CASS依赖 传统测绘工作中,展绘高程点往往必须依赖CASS软件。 本插件打破限制——无需安装CASS,仅在AutoCAD中加载即可实现专业级高程点展绘,操作逻辑与CASS一致&am…

2026/8/8 13:09:38 阅读更多 →

最新新闻

OnnxStream终极指南:如何在低内存设备上部署大型AI模型

OnnxStream终极指南:如何在低内存设备上部署大型AI模型

OnnxStream终极指南:如何在低内存设备上部署大型AI模型 【免费下载链接】OnnxStream Lightweight inference library for ONNX files, written in C. It can run Stable Diffusion XL 1.0 on a RPI Zero 2 (or in 298MB of RAM) but also Mistral 7B on desktops an…

2026/8/8 21:04:41 阅读更多 →
如何高效准备字节跳动面试:基于117道题目的完整题库指南

如何高效准备字节跳动面试:基于117道题目的完整题库指南

如何高效准备字节跳动面试:基于117道题目的完整题库指南 【免费下载链接】LeetCode-Questions-CompanyWise Contains Company Wise Questions sorted based on Frequency and all time 项目地址: https://gitcode.com/GitHub_Trending/le/LeetCode-Questions-Comp…

2026/8/8 21:04:41 阅读更多 →
Django-photologue与Amazon S3集成:云端图片存储解决方案

Django-photologue与Amazon S3集成:云端图片存储解决方案

Django-photologue与Amazon S3集成:云端图片存储解决方案 【免费下载链接】django-photologue A customizable plug-in photo gallery management application for the Django web framework. 项目地址: https://gitcode.com/gh_mirrors/dja/django-photologue …

2026/8/8 21:04:41 阅读更多 →
静态vs动态词向量深度对比:gh_mirrors/tex/text_matching项目双方案实现与效果评测

静态vs动态词向量深度对比:gh_mirrors/tex/text_matching项目双方案实现与效果评测

静态vs动态词向量深度对比:gh_mirrors/tex/text_matching项目双方案实现与效果评测 【免费下载链接】text_matching 常用文本匹配模型tf版本,数据集为QA_corpus,持续更新中 项目地址: https://gitcode.com/gh_mirrors/tex/text_matching …

2026/8/8 21:04:41 阅读更多 →
Cap开源录屏工具完整指南:3步快速上手与专业录制方案

Cap开源录屏工具完整指南:3步快速上手与专业录制方案

Cap开源录屏工具完整指南:3步快速上手与专业录制方案 【免费下载链接】Cap Open source Loom alternative. Beautiful, shareable screen recordings. 项目地址: https://gitcode.com/GitHub_Trending/cap1/Cap Cap是一款开源的屏幕录制工具,作为…

2026/8/8 21:04:41 阅读更多 →
如何彻底移除Windows AI功能:5步完整指南保护隐私与提升性能

如何彻底移除Windows AI功能:5步完整指南保护隐私与提升性能

如何彻底移除Windows AI功能:5步完整指南保护隐私与提升性能 【免费下载链接】RemoveWindowsAI Force Remove Copilot, Recall and More in Windows 11 项目地址: https://gitcode.com/GitHub_Trending/re/RemoveWindowsAI 你是否注意到Windows系统变得越来越…

2026/8/8 21:03:40 阅读更多 →

日新闻

AI多智能体时代来临,读懂MCP与A2A架构,抢占企业数字化新风口

AI多智能体时代来临,读懂MCP与A2A架构,抢占企业数字化新风口

当下AI应用飞速普及,无数企业下场搭建智能体系统,可落地阶段难题接踵而至:上下文无限堆积频繁爆栈、AI工具调用准确率低下、Token成本居高不下、企业数据权限混乱暗藏安全隐患……很多团队卡在架构搭建环节,空有前沿技术概念&…

2026/8/8 0:00:07 阅读更多 →
PHP二维码生成终极指南:用chillerlan/php-qrcode打造专业级二维码

PHP二维码生成终极指南:用chillerlan/php-qrcode打造专业级二维码

PHP二维码生成终极指南:用chillerlan/php-qrcode打造专业级二维码 【免费下载链接】php-qrcode A PHP QR Code generator and reader with a user-friendly API. 项目地址: https://gitcode.com/gh_mirrors/ph/php-qrcode 在当今数字时代,二维码已…

2026/8/8 0:00:08 阅读更多 →
UniApp微信小程序隐私保护组件开发:从原理到实战

UniApp微信小程序隐私保护组件开发:从原理到实战

1. 项目缘起:为什么我们需要一个隐私保护通用组件?最近在维护一个基于uniapp开发的微信小程序矩阵时,我遇到了一个非常棘手的问题。随着平台对用户隐私保护的要求越来越严格,几乎每一个新版本发布,或者在某些特定机型&…

2026/8/8 0:00:08 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/8 17:02:43 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/8 8:58:26 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/7 23:24:08 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/8 17:02:44 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/7 23:54:54 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/8 17:02:44 阅读更多 →