# MoveIt轨迹关节顺序按字母排序且无法通过配置修改

> 原文链接：https://robotics.hellobike.com/pitfalls/2024-06-08-robotics-se-95667
> 频道：pitfalls | 更新日期：2024-06-08 | 标签：auto, stackexchange, moveit
> 核心摘要：MoveIt强制按字母序发布JointTrajectory关节，需在驱动节点内根据joint_names字段动态映射重排数据。

# MoveIt轨迹关节顺序按字母排序且无法通过配置修改

::: v-pre
> 本文由 AI 根据公开内容整理，可能有误，请以原文为准：[Joint Order in MoveIt Trajectory](https://robotics.stackexchange.com/questions/95667/joint-order-in-moveit-trajectory)（Robotics Stack Exchange #95667）

**状态**：有绕过办法

## 问题

在ROS Kinetic下使用MoveIt规划轨迹时，发布的FollowJointTrajectory消息中关节顺序被强制按字母排序（如elbow, shoulder, waist），与controllers.yaml中定义的顺序不一致。尝试设置controller_joint_names参数无效，导致自定义机器人驱动因关节索引错位无法正确执行轨迹。

## 环境

Ubuntu 16.04, ROS Kinetic, MoveIt, 自定义机器人驱动节点, FollowJointTrajectory接口

## 解决办法

1. 确认MoveIt不支持自定义JointTrajectory关节发布顺序，controller_joint_names参数仅适用于industrial_robot_client包，对MoveIt无效。
2. 修改自定义机器人驱动节点逻辑，使其不再依赖固定的关节数组索引位置。
3. 在驱动接收到JointTrajectory消息时，读取消息头部的joint_names字段获取当前实际关节顺序。
4. 遍历JointTrajectoryPoint中的positions/velocities/effort数组，根据joint_names建立从消息顺序到硬件期望顺序的索引映射表。
5. 依据映射表重组数据后再下发至底层硬件控制器，确保关节值与物理轴对应正确。

原问题作者：swiz23；采纳答案作者：gvdhoorn-rse。原内容依 CC BY-SA 4.0 授权，本页摘要同样依 CC BY-SA 4.0 授权。
:::

## 原始参考来源 (Sources)

- [Robotics Stack Exchange #95667：Joint Order in MoveIt Trajectory](https://robotics.stackexchange.com/questions/95667/joint-order-in-moveit-trajectory)