当前位置: 首页 > article >正文

别再只用Service了!ROS1 Action通信保姆级教程:从导航进度条到任务取消,手把手教你实现带反馈的机器人任务

别再只用Service了ROS1 Action通信保姆级教程从导航进度条到任务取消手把手教你实现带反馈的机器人任务当你的机器人正在执行一个长达10分钟的导航任务时突然发现目标点设置错误这时候如果只能干等着任务完成或者强行重启节点是不是觉得特别不优雅这就是为什么你需要掌握ROS1 Action通信——它能让机器人任务像手机APP下载文件一样既能实时显示进度条又能随时点击取消。1. 为什么Action通信是机器人开发的必备技能在真实的机器人应用场景中Service通信的局限性会变得越来越明显。想象一下这些常见情况机器人正在执行30分钟的仓库巡检任务管理员需要中途暂停任务检查某个货架机械臂正在进行复杂轨迹规划操作员希望实时了解当前计算进度自动驾驶车辆长距离导航时乘客想临时更改目的地Action通信三大核心优势实时反馈机制服务端可以持续向客户端发送任务执行进度任务可取消性客户端可以在任何时候请求终止正在执行的任务状态机管理内置PREEMPTED、SUCCEEDED等状态规范任务生命周期对比Service通信的一锤子买卖模式Action显然更适合现代机器人系统的交互需求。下面这个对比表更能说明问题特性Service通信Action通信任务中断不支持支持取消指令进度反馈无多阶段反馈适用场景快速原子操作长时间任务状态管理简单成功/失败完整状态机2. 搭建Action通信开发环境2.1 创建Action专用功能包不同于常规ROS包Action通信需要额外依赖actionlibcatkin_create_pkg robot_navigation_action roscpp actionlib std_msgs关键目录结构应包含robot_navigation_action/ ├── action/ │ └── Navigation.action ├── src/ │ ├── navigation_server.cpp │ └── navigation_client.cpp └── CMakeLists.txt2.2 定义自定义Action消息在action/Navigation.action中定义导航任务的通信协议# 目标定义 geometry_msgs/PoseStamped target_pose float32 speed_limit --- # 结果定义 float32 total_distance duration execution_time --- # 反馈定义 float32 completion_percentage geometry_msgs/Pose current_pose string current_status这个定义包含目标目标位姿和速度限制结果总行驶距离和耗时反馈完成百分比、当前位置和状态描述3. 实现带反馈的导航服务端3.1 构建SimpleActionServer服务端核心代码框架#include actionlib/server/simple_action_server.h #include robot_navigation_action/NavigationAction.h typedef actionlib::SimpleActionServerrobot_navigation_action::NavigationAction NavServer; void executeNavigation(const robot_navigation_action::NavigationGoalConstPtr goal, NavServer* server) { // 初始化导航任务 ros::Rate loop_rate(10); bool navigation_success true; // 模拟导航过程 for(int progress0; progress100; progress5) { // 检查是否收到取消请求 if(server-isPreemptRequested()) { server-setPreempted(); ROS_WARN(导航任务被用户取消); return; } // 构建反馈消息 robot_navigation_action::NavigationFeedback feedback; feedback.completion_percentage progress; // 此处应填充真实的当前位置数据 server-publishFeedback(feedback); loop_rate.sleep(); } // 任务完成 if(navigation_success) { robot_navigation_action::NavigationResult result; result.total_distance 15.7; // 模拟数据 server-setSucceeded(result); } }3.2 关键功能点实现进度反馈机制feedback.completion_percentage calculate_progress(); feedback.current_pose get_current_pose(); feedback.current_status get_nav_status(); server-publishFeedback(feedback);任务取消响应if(server-isPreemptRequested()) { stop_robot_movement(); // 实际项目中应调用停止函数 server-setPreempted(); return; }4. 开发智能交互客户端4.1 客户端核心架构#include actionlib/client/simple_action_client.h typedef actionlib::SimpleActionClientrobot_navigation_action::NavigationAction NavClient; // 反馈回调 void feedbackCB(const robot_navigation_action::NavigationFeedbackConstPtr feedback) { ROS_INFO(进度: %.1f%%, 当前位置: (%.2f, %.2f), feedback-completion_percentage, feedback-current_pose.pose.position.x, feedback-current_pose.pose.position.y); } // 主函数片段 NavClient client(robot_navigation, true); client.waitForServer(); robot_navigation_action::NavigationGoal goal; goal.target_pose build_target_pose(2.5, 3.0); // 设置目标位置 goal.speed_limit 0.5; // 设置速度限制 client.sendGoal(goal, doneCB, activeCB, feedbackCB);4.2 实现任务取消功能添加取消按钮处理逻辑void cancelNavigation() { if(client.getState() actionlib::SimpleClientGoalState::ACTIVE) { client.cancelGoal(); ROS_INFO(已发送取消指令); } else { ROS_WARN(当前没有正在执行的任务); } }5. 实战构建完整的导航任务系统5.1 系统集成测试流程启动ROS核心roscore启动导航服务端rosrun robot_navigation_action navigation_server启动客户端并发送目标rosrun robot_navigation_action navigation_client _x:3.0 _y:2.5测试取消功能新终端rostopic pub /navigation_cancel std_msgs/Empty {}5.2 常见问题排查指南问题现象可能原因解决方案客户端无法连接服务端节点名称不匹配检查action名称是否一致收不到反馈反馈频率过低增加publishFeedback调用频率取消请求无响应服务端未检查preempt添加isPreemptRequested检查客户端卡在waitForServer服务端未启动确认服务端正常运行6. 高级应用技巧6.1 多任务队列管理对于需要顺序执行多个导航点的情况可以实现任务队列std::queuegeometry_msgs::Pose nav_points; void sendNextGoal() { if(!nav_points.empty()) { auto next nav_points.front(); nav_points.pop(); robot_navigation_action::NavigationGoal goal; goal.target_pose next; client.sendGoal(goal, boost::bind(doneCBWithQueue, _1, _2)); } }6.2 结合RViz可视化反馈在反馈回调中添加可视化标记发布void feedbackCB(const robot_navigation_action::NavigationFeedbackConstPtr fb) { visualization_msgs::Marker marker; marker.header.frame_id map; marker.pose fb-current_pose.pose; marker_pub.publish(marker); }7. 性能优化与最佳实践反馈频率控制对于高频控制如机械臂建议50-100Hz反馈对于导航任务10-20Hz足够使用rosparam动态配置反馈频率param namefeedback_rate value15.0 /网络带宽优化只反馈必要数据对大尺寸消息如图像使用压缩或缩略图考虑使用共用内存减少拷贝开销错误处理增强try { // 导航核心逻辑 } catch (const std::exception e) { server-setAborted(result, e.what()); }

相关文章:

别再只用Service了!ROS1 Action通信保姆级教程:从导航进度条到任务取消,手把手教你实现带反馈的机器人任务

别再只用Service了!ROS1 Action通信保姆级教程:从导航进度条到任务取消,手把手教你实现带反馈的机器人任务当你的机器人正在执行一个长达10分钟的导航任务时,突然发现目标点设置错误,这时候如果只能干等着任务完成或者…...

告别虚拟机卡顿:在Windows 11的WSL2里搞定Lichee Nano交叉编译环境

告别虚拟机卡顿:在Windows 11的WSL2里搞定Lichee Nano交叉编译环境 对于嵌入式开发者来说,配置开发环境往往是个令人头疼的问题。传统虚拟机方案虽然能提供完整的Linux体验,但资源占用高、启动慢、与宿主系统交互不便等问题一直困扰着开发者。…...

用Python和MNE库玩转BCI Competition IV 2a脑电数据集:从数据加载到可视化全流程

用Python和MNE库玩转BCI Competition IV 2a脑电数据集:从数据加载到可视化全流程当你第一次接触脑电信号处理时,面对原始数据文件可能会感到无从下手。BCI Competition IV 2a数据集作为脑机接口领域的经典基准数据,包含了9名受试者四种运动想…...

AI大模型应用开发全攻略:从入门到精通,掌握LLM、RAG、Agent核心技能!“

本文全面介绍了AI大模型应用开发的核心技术和实践。从大模型API交互基础,到关键参数Messages和Tools的作用,深入解析了RAG、ReAct、Agent等应用范式。文章还探讨了Fine-tuning微调和Prompt提示词工程的重要性,强调工程实践与业务需求相结合。…...

ParaView时间戳设置全攻略:从基础标注到自定义格式(5.8.0实测)

ParaView时间戳设置全攻略:从基础标注到自定义格式(5.8.0实测) 在科学可视化领域,时间戳不仅是数据演变的见证者,更是研究成果呈现的专业语言。ParaView作为开源可视化工具链的标杆,其时间标注功能在学术论…...

AI智能体到底强在哪?为什么大家开始从“养龙虾”转向“养马”

那么AI智能体的核心能力是什么? 1、理解需求 它能分析你的真实意图,而不是只看表面的文字,比如让它整理这个月的消费情况,它明白之后,会读取账单,做分类统计,生成总结,最后输出图表。…...

别再乱用npm install了!手把手教你用npx only-allow为项目指定包管理器(支持pnpm/yarn/npm)

用only-allow统一团队包管理器:从配置到CI的全流程指南 你是否曾经在拉取一个新项目后,面对npm install、yarn还是pnpm i的抉择感到困惑?或者更糟的是,团队成员混用不同包管理器导致node_modules结构不一致,引发各种诡…...

智能检索新范式,让AIAgent自主决策,提升RAG效率100%!

市面上的 RAG 系统,不管叫什么名字,本质上只有两种做法: 第一种,一次性检索。把用户的 query 向量化,从语料库里捞出 Top-K 个文档片段,拼成一个大 prompt 塞给模型。GraphRAG、HippoRAG、LightRAG 都属于…...

诚信标签工厂端解决方案 适配俄标 CRPT 体系一体化技术方案

俄罗斯诚实标签依托 CRPT 体系执行强制管控,各类出口货品必须完成 Data Matrix 编码采集、格式转换、多层包装数据绑定,数据合规后方可通关流通。美妆食品、日化建材、玩具五金等品类包装形态差异较大,人工采集方式普遍存在识别精度不足、批量…...

告别网盘客户端!用Alist+RaiDrive把百度云盘变成电脑本地文件夹(保姆级图文教程)

用AlistRaiDrive实现网盘本地化管理的终极方案 你是否厌倦了电脑上安装多个网盘客户端,不仅占用系统资源,操作还繁琐割裂?每次上传下载文件都要在不同客户端间切换,效率低下。现在,通过Alist和RaiDrive的组合&#xf…...

Tftpd32/Tftpd64不止是TFTP!手把手教你玩转它的DHCP和Syslog服务器功能

Tftpd32/Tftpd64:解锁DHCP与Syslog服务的隐藏潜力当大多数人提起Tftpd32/Tftpd64时,第一反应往往是它作为TFTP服务器的功能。这款轻量级工具确实在文件传输领域表现出色,但它的能力远不止于此。今天,我们将深入探索这款软件中两个…...

别再手动点菜单了!用这招让Cadence Virtuoso Schematic效率翻倍(附Net高亮快捷键配置)

电路设计效率革命:Cadence Virtuoso Schematic高阶快捷键配置指南 在集成电路设计的浩瀚宇宙中,Cadence Virtuoso如同设计师手中的光刻机,每一次精准操作都直接影响最终芯片的性能与可靠性。然而,当面对数百个晶体管组成的复杂模…...

浅聊26上半年软考架构师

2026年上半年架构师考试已然落幕,大家都考的如何?架构师共有三门考试,上午综合知识(75道选择题)案例分析,时间为8.30-12.30;下午论文,时间为14.30-16.30。下面说说我整体的备考过程。…...

DeepSeek系统设计辅助:如何在48小时内完成可审计、可回滚、可压测的AI服务架构图?

更多请点击: https://intelliparadigm.com 第一章:DeepSeek系统设计辅助 DeepSeek系统设计辅助模块面向架构师与后端工程师,提供模型能力调用、接口契约生成、异步任务编排等核心支撑能力。该模块不替代人工设计决策,而是通过结构…...

Lampiao 靶场

Lampiao 靶场完整渗透解析一、靶场环境信息攻击机(Kali)IP:192.168.146.128靶机 IP:192.168.146.129目标:获取靶机 root 权限与 flag二、步骤 1:信息收集(端口与服务扫描)nmap -p- -…...

2026年HR招聘偏好白皮书:这5项附加技能出现频率暴涨

2026 年的招聘市场,正在从“看你会什么岗位技能”,转向“看你能不能把岗位做得更智能”。HR筛简历时,越来越关注候选人的AI应用能力、数据化思维和业务落地能力。人社部近年发布的新职业中,已经出现生成式人工智能系统应用员、人工…...

30岁裸辞后,我用两个月拿下AI应用认证,现在OFFER选择困难症犯了

30岁裸辞那天,我最怕的不是没收入,而是突然发现:过去积累的经验,正在被AI重新定价。以前会写方案、做表格、跟项目,算是职场硬通货;到了2026年,招聘JD里开始频繁出现AI工具应用、智能工作流、Pr…...

Python开发者首次使用Taotoken接入大模型API的完整步骤指南

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 Python开发者首次使用Taotoken接入大模型API的完整步骤指南 对于Python开发者而言,接入大模型API进行应用开发已成为一…...

Visual Paradigm 17.0 团队协作新功能实测:手把手教你用项目模板和文件夹管理提效

Visual Paradigm 17.0 团队协作实战指南:从模板配置到文件夹管理的高效工作流在敏捷开发团队中,项目启动速度和资产管理的规范性往往直接影响整体效率。Visual Paradigm 17.0针对这一痛点推出的团队协作增强功能,特别是服务器端项目模板和文件…...

Blender渲染通道完全指南:如何像电影后期一样,分离出深度、阴影与反射图

Blender渲染通道完全指南:影视级后期制作的深度解析在数字内容创作领域,Blender已经从一个简单的3D建模工具成长为能够处理复杂视觉特效的全流程解决方案。对于追求影视级质量的中高级用户而言,掌握渲染通道技术是提升作品专业度的关键一步。…...

亚马逊卖家公开信息数据提取:反爬攻防战与 Python 批量采集实战

摘要: 批量获取亚马逊(Amazon)第三方卖家的商业名称、信用代码和注册地址等信息,对于跨境 B2B 拓客和供应链分析具有重要意义。然而,亚马逊的 Cloudflare 盾和 Robot 验证码构成了极高的反爬门槛。本文将深度解析亚马逊…...

HFSS仿真结果怎么看?以T型波导为例,读懂S参数与电场动态图

HFSS仿真结果深度解析:从S参数到电场动态图的实战指南当你第一次在HFSS中完成T型波导仿真后,面对满屏的曲线和彩色云图,是否感到既兴奋又困惑?那些起伏的S参数曲线究竟告诉你什么信息?电场图中跳跃的颜色又代表怎样的物…...

从入门到上岗,Java+AI 复合型人才养成攻略

当下编程行业格局正在悄然改变,纯 Java 后端岗位内卷日趋严重,薪资增长逐步放缓;纯粹的 AI 算法岗门槛居高不下,对学历、数理功底要求严苛,普通开发者很难入局。 而Java+AI 复合型开发顺势成为行业刚需岗位,既依托成熟的 Java 体系承接业务开发,又能融入人工智能技术实…...

用STM32CubeMX和HAL库快速上手WS2812B:告别手动计算延时,一键生成驱动框架

基于STM32CubeMX的WS2812B智能灯光控制:从零构建现代化驱动方案在智能硬件和物联网设备快速发展的今天,WS2812B可编程LED灯带因其丰富的色彩表现和简单的单线控制方式,成为创客和工程师们最喜爱的显示组件之一。然而,传统的寄存器…...

硬件答辩问题总结

一、电源纹波是什么,为什么LDO的小,DCDC的大1.电源纹波电源纹波 是指直流电源输出电压上叠加的 交流波动成分,表现为电压在理想直流值附近上下波动。2.LDO 纹波小原理LDO 内部是一个 调整管(可变电阻) 串联在输入和输出…...

Yokogawa AAI835-H50/K4A00模拟输入/输出模块

Yokogawa AAI835-H50/K4A00 模拟输入/输出模块产品特点:通道配置:共8个通道,含4路模拟输入和4路模拟输出。信号类型:所有通道均支持4-20mA标准电流信号。HART通信:支持HART协议,可与智能现场设备双向数字通…...

告别拍脑袋规划!用ArcGIS做绿道选线:如何科学量化坡度、水域、道路成本并加权计算

科学规划绿道的ArcGIS高阶技法:从成本栅格构建到最优路径生成绿道规划从来不是简单的"两点之间直线最短",而是需要综合考虑地形、生态、人文等多维因素的复杂决策过程。传统规划中常见的"拍脑袋"决策方式,往往导致建成后…...

Hirschmann RS20-0800M4M4SDAE工业以太网交换机

Hirschmann RS20-0800M4M4SDAE 工业以太网交换机产品特点:端口配置:共8个端口,含6个RJ45电口和2个ST光纤接口。端口速率:所有端口均为100Mbps快速以太网。光纤类型:2个光纤端口为多模、ST接头。管理类型:二…...

高性能Windows流媒体服务器部署:5大核心技术与3种实战架构深度解析

高性能Windows流媒体服务器部署:5大核心技术与3种实战架构深度解析 【免费下载链接】srs-windows 项目地址: https://gitcode.com/gh_mirrors/sr/srs-windows 在Windows平台上构建专业级流媒体服务系统,需要综合考虑协议兼容性、性能优化和部署架…...

C语言双端队列完整实现:一行代码吃透头尾操作,算法效率拉满

一、为什么C语言实现双端队列,是数据结构的必学天花板?在C语言数据结构里,队列、栈都是基础中的基础,但真正能把灵活度、效率、内存管理三者揉到一起的,还得是双端队列(deque)。普通队列只能一头…...