把/arm_controller/joint_trajectory是怎么一步步流到你这份 C++ 代码,再发给 Action Server的全过程讲透。
你现在的文件是:moveit_simple_controller_manager/follow_joint_trajectory_controller_handle.cpp
它的身份:MoveGroup 用来发指令给机器人控制器的 “快递员”
🔥 终极流程(一步不漏,完全对应你的代码)
plaintext
1. MoveIt2 Servo 发布 /arm_controller/joint_trajectory ↓ 2. MoveGroup 接收这个轨迹 ↓ 3. MoveGroup 把它包装成 RobotTrajectory ↓ 4. 进入 **你这份 C++ 代码** 的 sendTrajectory() 函数 ↓ 5. 代码把轨迹塞进 FollowJointTrajectory 的 Action Goal ↓ 6. 代码通过 **Action Client** 发送 /arm_controller/follow_joint_trajectory ↓ 7. 到达 **Action Server**(arm_controller) ↓ 8. 机器人运动📌 第 1 步:Servo 发布话题
plaintext
/arm_controller/joint_trajectory类型:trajectory_msgs/msg/JointTrajectory
📌 第 2–4 步:进入你这份代码的核心函数
MoveGroup 调用你这份代码里的:
cpp
运行
bool FollowJointTrajectoryControllerHandle::sendTrajectory( const moveit_msgs::msg::RobotTrajectory& trajectory )这一行就是关键:
cpp
运行
goal.trajectory = trajectory.joint_trajectory;意思:
把 /arm_controller/joint_trajectory 直接塞进 Action 的 goal 里
📌 第 5 步:构建 Action 指令
你代码里做的事:
cpp
运行
control_msgs::action::FollowJointTrajectory::Goal goal; goal.trajectory = trajectory.joint_trajectory; // <-- 这里!goal.trajectory就是你要发的/arm_controller/joint_trajectory
📌 第 6 步:Action Client 发送
你代码里这一行:
cpp
运行
auto current_goal_future = controller_action_client_->async_send_goal(goal, send_goal_options);它发送到:
plaintext
/arm_controller/follow_joint_trajectory这是Action,不是普通话题。
📌 第 7 步:到达 Action Server
接收者是:
plaintext
arm_controller (ros2_control)它是Action Server,负责真正执行电机运动。
✨ 最核心的一句话总结(你一定要记住)
plaintext
/arm_controller/joint_trajectory ↓(直接塞进) FollowJointTrajectory.action 的 goal.trajectory ↓(通过你这份代码发送) Action Client → Action Server (arm_controller)你这份代码的唯一作用:把轨迹话题转成 Action 发给控制器。
🔍 我直接在你的代码里标出关键路径
cpp
运行
bool FollowJointTrajectoryControllerHandle::sendTrajectory( const moveit_msgs::msg::RobotTrajectory& trajectory) { // ... // 👇 👇 👇 核心行 👇 👇 👇 goal.trajectory = trajectory.joint_trajectory; // <-- 这里就是你的 joint_trajectory // ... // 发送 Action controller_action_client_->async_send_goal(goal, send_goal_options); }🚀 最终流向图(最简洁版)
plaintext
MoveIt2 Servo → 发布 /arm_controller/joint_trajectory ↓ MoveGroup → 调用你的代码:sendTrajectory() ↓ 你的代码 → goal.trajectory = 接收的轨迹 → 通过 Action Client 发送 ↓ Action Server: /arm_controller/follow_joint_trajectory ↓ 机器人运动