trajectory_msgs::msg::JointTrajectory 消息完整结构详解

📅 2026/7/10 13:53:41 👁️ 阅读次数 📝 编程学习
trajectory_msgs::msg::JointTrajectory 消息完整结构详解

这是ROS2 官方标准轨迹消息servo_moveit2ros2_controlMoveIt全部通用。


一、完整消息类型(C++)

cpp

运行

trajectory_msgs::msg::JointTrajectory

你代码里写的:

cpp

运行

const trajectory_msgs::msg::JointTrajectory::SharedPtr msg

意思是:指向一条关节轨迹消息的共享指针


二、消息内部全部字段(超级详细)

1. 消息头(必须)

cpp

运行

std_msgs::msg::Header header;
  • header.stamp:时间戳
  • header.frame_id:一般填base_link或空

2. 关节名称列表(必须!)

cpp

运行

std::vector<std::string> joint_names;

必须和你的 URDF 完全一致例如你的:

plaintext

JM0, JM1-2, JM4-3, JM4, JM5, YB

3. 轨迹点序列(必须)

cpp

运行

std::vector<trajectory_msgs::msg::JointTrajectoryPoint> points;

每个点包含:

cpp

运行

// 位置 (rad) std::vector<double> positions; // 速度 (rad/s) std::vector<double> velocities; // 加速度 (rad/s²) std::vector<double> accelerations; // 从轨迹开始到该点的时间 builtin_interfaces::msg::Duration time_from_start;

三、一条真实可发送的轨迹消息例子(你能直接用)

yaml

header: stamp: sec: 1740000000 nanosec: 0 frame_id: "base_link" joint_names: - JM0 - JM1-2 - JM4-3 - JM4 - JM5 - YB points: - positions: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0] velocities: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0] accelerations: [] time_from_start: {sec: 0, nanosec: 0} - positions: [0.1, 0.2, 0.0, 0.0, 0.15, 0.0] velocities: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0] accelerations: [] time_from_start: {sec: 3, nanosec: 0}

四、最重要规则(必须遵守)

1.joint_names 的数量 = 每个 point 中 positions 的数量

比如 6 个关节 → 每个点必须给6 个位置

2.时间必须递增

  • 第 1 点:0s
  • 第 2 点:2s
  • 第 3 点:5s

3. 单位

  • positions:rad(弧度)
  • velocities:rad/s
  • accelerations:rad/s²

4. 可以只发 positions

速度 / 加速度可以为空,控制器会自动插值。


五、你代码里的SharedPtr是什么?

cpp

运行

const trajectory_msgs::msg::JointTrajectory::SharedPtr msg

等于:

cpp

运行

std::shared_ptr<const trajectory_msgs::msg::JointTrajectory> msg

意思:

  • 这是智能指针
  • 指向一条轨迹消息
  • 常用于回调函数参数

例如:

cpp

运行

void topicCallback(const trajectory_msgs::msg::JointTrajectory::SharedPtr msg) { // 收到了一条轨迹 }

六、我用一句话总结

JointTrajectory = 一组关节名称 + 一组带时间的点位

机械臂会按点、按时平滑运动