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

MoveIt Servo 如何通过 FollowJointTrajectoryControllerHandle Action Server 通信

一、通信架构图textMoveIt Servo (moveit_servo node) ↓ MoveItSimpleControllerManager (插件管理器) ↓ FollowJointTrajectoryControllerHandle (您看到的这个类) ↓ [内部创建 Action Client] ↓ ROS 2 Action Client (自动生成) ↓ [通过 ROS 2 Action 协议] ↓ 您的 Action Server (myrobot_driver) ↓ 真实硬件二、关键通信机制1.Action Client 的创建FollowJointTrajectoryControllerHandle在初始化时会创建 Action Clientcpp// 构造函数中未显示但存在 FollowJointTrajectoryControllerHandle::FollowJointTrajectoryControllerHandle( rclcpp::Node::SharedPtr node, const std::string name, const std::string action_namespace) { // 创建 Action Client连接到您的 Server controller_action_client_ rclcpp_action::create_client control_msgs::action::FollowJointTrajectory( node, action_namespace // 例如: arm_controller/follow_joint_trajectory ); }2.发送轨迹的核心代码cppbool FollowJointTrajectoryControllerHandle::sendTrajectory( const moveit_msgs::msg::RobotTrajectory trajectory) { // 1. 检查连接状态 if (!isConnected()) { RCLCPP_ERROR(Action client not connected to action server); return false; } // 2. 构建 Goal control_msgs::action::FollowJointTrajectory::Goal goal goal_template_; goal.trajectory trajectory.joint_trajectory; // 填充轨迹数据 goal.multi_dof_trajectory trajectory.multi_dof_joint_trajectory; // 3. 设置回调函数接收 Server 的响应 send_goal_options.goal_response_callback [this](goal_handle) { if (!goal_handle) RCLCPP_WARN(Goal request rejected); // Server 拒绝 else RCLCPP_INFO(Goal request accepted!); // Server 接受 }; // 4. 异步发送 Goal 到您的 Action Server auto current_goal_future controller_action_client_-async_send_goal( goal, send_goal_options); // 5. 等待 Server 响应 current_goal_ current_goal_future.get(); return true; }三、完整的通信流程步骤1初始化阶段cpp// MoveIt 启动时加载配置 // controllers.yaml 内容 // arm_controller: // action_ns: arm_controller/follow_joint_trajectory ← 您的 Server 名称 // type: FollowJointTrajectory // FollowJointTrajectoryControllerHandle 创建 Action Client // 连接到您的 Server: /arm_controller/follow_joint_trajectory步骤2Servo 运行时cpp// MoveIt Servo 持续运行当需要发送轨迹时 // 1. Servo 调用 getControllerHandle(arm_controller) // 2. 获得 FollowJointTrajectoryControllerHandle 实例 // 3. 调用 sendTrajectory() 方法 // 4. 该方法通过 Action Client 发送到您的 Server步骤3您的 Server 接收并处理cpp// 您的 Action Server 代码 class FollowJointTrajectoryAction : public rclcpp::Node { // 这个回调会被触发 void execute(const std::shared_ptrGoalHandle goal_handle) { auto goal goal_handle-get_goal(); auto points goal-trajectory.points; // 接收轨迹点 // 执行轨迹... for (const auto point : points) { send_to_motors(point.positions); // 发送给电机 } // 返回成功结果 auto result std::make_sharedFollowJointTrajectory::Result(); result-error_code FollowJointTrajectory::Result::SUCCESSFUL; goal_handle-succeed(result); } };四、数据流转详解MoveIt Servo → Action Clientcpp// MoveIt Servo 生成的轨迹 moveit_msgs::msg::RobotTrajectory trajectory; trajectory.joint_trajectory.joint_names {joint1, joint2, ...}; trajectory.joint_trajectory.points[0].positions {0.1, 0.2, 0.3, ...}; // ↓ sendTrajectory() 转换 control_msgs::action::FollowJointTrajectory::Goal goal; goal.trajectory trajectory.joint_trajectory; // 直接赋值 // ↓ Action Client 序列化并发送 controller_action_client_-async_send_goal(goal, ...);Action Client → 您的 Servercpp// ROS 2 中间件传输 // Topic: /arm_controller/follow_joint_trajectory/_action/send_goal // 您的 Server 接收 void handle_goal(const Goal::SharedPtr goal) { // goal-trajectory.points 包含所有轨迹点 }五、连接验证方法1.检查 Action Client 连接状态cpp// 在您的代码中添加调试信息 bool isConnected() { if (!controller_action_client_-wait_for_action_server(std::chrono::seconds(1))) { RCLCPP_ERROR(LOGGER, Cannot connect to your Action Server!); return false; } return true; }2.监控通信bash# 查看所有 Action ros2 action list # 应该看到 # /arm_controller/follow_joint_trajectory ← 您的 Server # 监控 Action 消息 ros2 topic echo /arm_controller/follow_joint_trajectory/_action/status六、您的 Server 需要满足的要求必须实现的接口cppclass YourActionServer { // 1. 必须提供正确的 Action 名称 action_server_ create_serverFollowJointTrajectory( this, arm_controller/follow_joint_trajectory, // ← 必须匹配配置 ... ); // 2. 必须正确处理关节名称 bool handle_goal(goal) { // 检查关节名称是否匹配 if (goal-trajectory.joint_names ! expected_joints) { return REJECT; // 返回 INVALID_JOINTS 错误码 } return ACCEPT; } // 3. 必须正确执行轨迹所有点不只是最后一个 void execute(goal_handle) { for (const auto point : goal-trajectory.points) { // 执行每个点 move_to_position(point.positions); // 等待到达 sleep(point.time_from_start); } result-error_code SUCCESSFUL; goal_handle-succeed(result); } };七、通信时序图textMoveIt Servo FollowJointTrajectoryControllerHandle Your Action Server | | | |--sendTrajectory()------| | | |--async_send_goal()----------------| | | | | |--goal_response_callback-----------| |--return true-----------| | | | | | | | (执行轨迹) | | | | |--result (succeed/abort)-----------| | | | | |--controllerDoneCallback()---------| | | |八、关键点总结组件作用关键代码FollowJointTrajectoryControllerHandleMoveIt 侧的客户端async_send_goal(goal)controller_action_client_ROS 2 Action Client连接到您的 ServersendTrajectory()发送轨迹的接口被 MoveIt Servo 调用controllerDoneCallback()接收执行结果处理 Server 返回的结果九、完整的工作示例cpp// 1. 您的 Server 启动 ros2 run myrobot_driver myrobot_driver_node // 2. MoveIt Servo 启动自动创建 Action Client ros2 launch moveit_servo servo.launch.py // 3. 当用户在 RViz 中拖动末端执行器时 // - MoveIt Servo 计算轨迹 // - 调用 sendTrajectory() // - Action Client 发送到您的 Server // - 您的 Server 执行并返回结果 // - controllerDoneCallback() 记录结果结论FollowJointTrajectoryControllerHandle是 MoveIt 与您的 Action Server 之间的直接通信桥梁。它通过 ROS 2 Action 协议自动将 MoveIt 规划的轨迹发送到您的 Server无需您修改任何 MoveIt 代码。只要您的 Server 实现了标准的FollowJointTrajectoryAction 接口并且 Action 名称匹配通信就会自动建立。

相关文章:

MoveIt Servo 如何通过 FollowJointTrajectoryControllerHandle Action Server 通信

一、通信架构图textMoveIt Servo (moveit_servo node)↓ MoveItSimpleControllerManager (插件管理器)↓ FollowJointTrajectoryControllerHandle (您看到的这个类)↓ [内部创建 Action Client]↓ ROS 2 Action Client (自动生成)↓ [通过 ROS 2 Action 协议]↓ 您的 Action Se…...

大模型应用开发实战(4)——智能体经典范式

🤵‍♂️ 个人主页:小李同学_LSH的主页 ✍🏻 作者简介:LLM学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…...

别让一颗小电阻毁了你的时钟!手把手教你搞定有源晶振的匹配电阻(附LVDS/CMOS选型表)

有源晶振匹配电阻实战指南:从信号异常到稳定时钟的完整解决方案 时钟信号如同电子系统的心跳,而有源晶振则是这颗心脏的核心。在实际项目中,一颗不起眼的匹配电阻往往成为决定系统稳定性的关键因素。我曾亲眼见证过因匹配电阻设计不当导致整批…...

重载 AGV 控制怎么做?这篇 2025 论文把“载荷转移”讲透了

最新 AGV 控制论文解析:20 吨重载 AGV 怎么把“轨迹跟踪”和“车身稳定”一起管起来? 摘要 这次分析一篇 AGV 控制 方向的最新论文,而且和前面讲过的 Pure Pursuit 改进、外部视觉导航、托盘装卸 都不重复。本文选取的是 2025 年发表的论文 《…...

无线充电效率低?掌握“加五”规则,让充电速度快起来!

无线充电:便捷背后的效率难题在不知不觉中降低无线充电器的效率是很容易的。使用合适的工具和充电设备,能确保设备快速且安全地充电。投资一个至少 20W 的壁式适配器是个不错的开端。如今,无线充电(如今常常因 MagSafe 兼容性得到…...

全文降AI的好处有哪些?推荐3款支持全文处理的降AI工具

全文降AI的好处有哪些?推荐3款支持全文处理的降AI工具 2026年的毕业季,AI检测已经不是"可能查"而是"一定查"。从知网到维普,从万方到大雅,几乎所有主流检测平台都上线了AIGC检测功能。面对这种局面&#xff0…...

【AIAgent可靠性黄金法则】:SITS2026权威发布的5大不可妥协要素(20年架构师亲验)

第一章:SITS2026总结:构建可靠AIAgent的关键要素 2026奇点智能技术大会(https://ml-summit.org) 构建可靠AI Agent并非仅依赖更大参数量或更强推理能力,而需在系统性工程层面筑牢四大支柱:可验证的决策逻辑、受控的工具调用边界、…...

从零部署Orbbec Gemini2:ROS2 Humble环境下的驱动配置与多话题数据解析

1. 环境准备与驱动安装 最近在做一个机器人项目,需要用到Orbbec Gemini2(原DaBai DCL)深度相机。折腾了两天才把ROS2驱动搞定,这里把完整过程记录下来,希望能帮到同样在配置这款相机的朋友。 1.1 系统要求检查 首先确认…...

OWL ADVENTURE新手教程:像玩游戏一样轻松玩转图像识别AI

OWL ADVENTURE新手教程:像玩游戏一样轻松玩转图像识别AI 1. 认识你的像素小伙伴 第一次打开OWL ADVENTURE,你会被它独特的像素风格界面吸引。这不是普通的AI工具,而是一个充满活力的数字小镇,而你的向导是一只可爱的猫头鹰。 这…...

基于LSTM神经网络的锂电池SOH估算模型(NASA数据集)【MATLAB】

基于LSTM神经网络的锂电池SOH估算模型(NASA数据集) 在新能源与储能技术飞速发展的今天,锂离子电池的健康状态(State of Health, SOH)监测成为了电池管理系统(BMS)中至关重要的一环。准确估算SOH…...

全文降AI率保姆级攻略:用嘎嘎降AI从60%降到5%

全文降AI率保姆级攻略:用嘎嘎降AI从60%降到5% 论文交上去,导师发回来一句"AI率62%,重新改"。这种场景在2026年的毕业季里太常见了。 AI率60%是什么概念?意味着你论文里超过一半的内容被检测系统判定为AI生成。不管你是真…...

乡镇灯具店适合用哪种中岛柜?答案来了!

在乡镇经营灯具店,中岛柜的选择至关重要。它不仅是展示灯具的载体,更是提升店铺形象、吸引顾客的关键元素。那么,乡镇灯具店适合用哪种中岛柜呢?接下来,我们就为大家详细介绍。乡镇灯具店中岛柜的需求特点适配乡镇市场…...

逆向实战:药监局瑞数6vmp算法解析与突破

1. 瑞数6vmp算法初探 第一次接触药监局网站的瑞数6vmp防护时,我整个人都是懵的。打开开发者工具,熟悉的debugger断点就像机关枪一样疯狂弹出,控制台还时不时跳出"禁止输出"的警告。这种体验就像试图拆解一个会咬人的俄罗斯套娃&…...

AIAgent对抗鲁棒性提升87%的关键突破:融合输入重构、特征净化与决策置信度校准的三级熔断机制

第一章:AIAgent架构中的对抗样本防御 2026奇点智能技术大会(https://ml-summit.org) 在多层协同的AIAgent系统中,对抗样本不再仅威胁单个模型组件,而是可能通过意图解析、工具调用、记忆检索等环节逐级放大偏差,最终导致决策链路…...

实验拓扑作业

LSW3 配置为二层 Trunk,透传所有 VLAN LSW1/LSW2 配置 VLANIF 接口,分别创建两组 VRRP 实现主备 三台交换机配置 MSTP,将 VLAN10、VLAN20 映射到不同实例,指定不同根桥 配置静态 / 动态路由,实现网关到 AR1 的外网连通…...

搜索效果提升300%的多模态实战方案(工业级部署白皮书首次公开)

第一章:多模态大模型在搜索中的应用 2026奇点智能技术大会(https://ml-summit.org) 传统搜索引擎依赖文本匹配与关键词统计,难以理解用户查询背后的语义意图及跨模态关联。多模态大模型(Multimodal Large Language Models, MLLMs&#xff0…...

ai coding到底选什么模型?claude,gpt,glm,gemin,KIMI K2.5,MiniMax-M2.7底怎么选,最全总结

国内 Vibe Coding 主流模型实测总结新人在逛l站里总结的ai coding使用ide以及模型情况,还请各位佬纠正把关目前国内做 vibe coding 最常用的就这几个模型:Claude、GPT、GLM、Gemini。Claude:代码能力确实最强,但国内基本用不了。中转基本都掺…...

2026年中高考将至!揭秘好用的提分技巧,这家权威机构不容错过!

2026年中高考的脚步越来越近,对于广大考生和家长来说,如何有效提分成为了最为关注的话题。在众多提升成绩的途径中,选对学习方法和辅助工具至关重要。今天,就为大家揭秘一些实用的提分技巧,同时为大家推荐一家权威机构…...

GraphMind:用“搭积木”的思路做的概念绘图神器

分享一个特别有意思的脑洞,最新打磨出的 SKILL——文本AI绘图引擎(graph_mind)。说起这个idea,得把时间拨回2018年的夏天。当时我在中科院自动化所跟着余老师实习,我们构造过一个“位置信息生成图片”的算法。时过境迁…...

Qt6.8编译路径问题解析:解决QMainWindow文件缺失的三种方案

1. 遇到Qt6.8编译错误时的第一反应 当你满怀期待地打开Qt Creator准备编译项目,突然蹦出一个红色错误提示:"...\Qt6.8.2\6.8.2\msvc2022_64\include\QtWidgets\QMainWindow does not exist",这时候的心情就像煮熟的鸭子飞走了。别担…...

KV260 视觉 AI 套件实战--从零部署到网络互联(Ubuntu+SSH)

1. KV260视觉AI套件开箱初体验 第一次拿到KV260视觉AI套件时,给我的感觉就像收到了一台迷你工作站。这个巴掌大的开发板搭载了Xilinx的Zynq UltraScale MPSoC芯片,集成了四核ARM Cortex-A53处理器和可编程逻辑单元,专为边缘AI视觉应用设计。套…...

光影的艺术:从入门到电影级宣传片的布光与器材全解析

在视频制作的领域里,画面质感往往决定了观众对内容的留存率。而决定画面质感的两个核心支柱,便是“光”与“器”。无论是企业宣传片、品牌形象片,还是大型会议记录,不同的预算级别对应着截然不同的布光逻辑与器材选择。本文将深入…...

D3KeyHelper终极指南:5分钟掌握暗黑3技能自动化神器

D3KeyHelper终极指南:5分钟掌握暗黑3技能自动化神器 【免费下载链接】D3keyHelper D3KeyHelper是一个有图形界面,可自定义配置的暗黑3鼠标宏工具。 项目地址: https://gitcode.com/gh_mirrors/d3/D3keyHelper 想要彻底解放双手,让暗黑…...

网页游戏市场每日分析|二级市场传奇页游平台排名|602游戏平台

2026年网页游戏市场概况当前,中国网页游戏市场(含H5/微端)已进入存量收缩、垂直深耕、头部集中的终局阶段。市场规模:2026年,页游实际市场规模预计在320亿至350亿元之间,占整体游戏市场不足8%。核心品类&am…...

FT232H连接Vivado出现问题2026

1.安装FT232H: (71 封私信) 玩转 Xilinx 下载器(二)—— 用 FT232H 开发板自制下载器 - 知乎; 2.安装后设备管理器自动识别为:FDTI 公司的 “USB Serial Converter”; 如果FT232H连接Vivado出现问题,就是…...

AI 到底会不会取代人类?从四大行业落地真相看程序员的“危”与“机”

前言:恐慌与狂欢并存的时代“AI 将取代 50% 的工作”、“程序员是第一批被淘汰的”……每隔一段时间,这样的标题就会刷屏。但作为一名深耕技术一线的开发者,我想说:AI 不是在简单地“抢饭碗”,而是在重构整个“厨房”。…...

多智能体五大协调模式入门到精通(非常详细),看这篇就够了!

多智能体 在之前的文章中,我们探讨了多智能体系统(Multi-agent System)何时能带来价值,以及何时单个智能体反而是更好的选择。这篇文章面向的是已经做出决定、现在需要选择协调模式的团队。 我们见过不少团队,选模式…...

基于西门子HyperLynx与Flotherm联合进行PCB焦耳热仿真的技术解析与实战指南

🎓作者简介:科技自媒体优质创作者 🌐个人主页:莱歌数字-CSDN博客 💌公众号:莱歌数字(B站同名) 📱个人微信:yanshanYH 211、985硕士,从业16年 从…...

解决PyTorch与TorchVision版本冲突:从依赖管理到环境隔离的实战指南

1. 为什么PyTorch和TorchVision总是打架? 每次看到"ERROR: Cannot install torch>1.8.0 and torchvision0.9.2cu102 because these package versions have conflicting dependencies"这种报错,我都想砸键盘。这就像买了个新手机&#xff0c…...

私有云部署与运维全流程实战:从架构设计到精细化运维落地

随着数字化转型深入推进,数据安全、业务可控与成本优化成为企业与技术团队关注的核心,私有云凭借数据本地化、资源可定制、长期成本可控等优势,逐步成为中小团队、技术爱好者乃至企业级场景的重要选择。本文基于系统化课程学习与真实环境实操…...