这是ROS2 官方标准轨迹消息servo_moveit2、ros2_control、MoveIt全部通用。一、完整消息类型Ccpp运行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::vectorstd::string joint_names;必须和你的 URDF 完全一致例如你的plaintextJM0, JM1-2, JM4-3, JM4, JM5, YB3. 轨迹点序列必须cpp运行std::vectortrajectory_msgs::msg::JointTrajectoryPoint points;每个点包含cpp运行// 位置 (rad) std::vectordouble positions; // 速度 (rad/s) std::vectordouble velocities; // 加速度 (rad/s²) std::vectordouble accelerations; // 从轨迹开始到该点的时间 builtin_interfaces::msg::Duration time_from_start;三、一条真实可发送的轨迹消息例子你能直接用yamlheader: 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 点5s3. 单位positionsrad弧度velocitiesrad/saccelerationsrad/s²4. 可以只发 positions速度 / 加速度可以为空控制器会自动插值。五、你代码里的SharedPtr是什么cpp运行const trajectory_msgs::msg::JointTrajectory::SharedPtr msg等于cpp运行std::shared_ptrconst trajectory_msgs::msg::JointTrajectory msg意思这是智能指针指向一条轨迹消息常用于回调函数参数例如cpp运行void topicCallback(const trajectory_msgs::msg::JointTrajectory::SharedPtr msg) { // 收到了一条轨迹 }六、我用一句话总结JointTrajectory 一组关节名称 一组带时间的点位机械臂会按点、按时平滑运动
trajectory_msgs::msg::JointTrajectory 消息完整结构详解
这是ROS2 官方标准轨迹消息servo_moveit2、ros2_control、MoveIt全部通用。一、完整消息类型Ccpp运行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::vectorstd::string joint_names;必须和你的 URDF 完全一致例如你的plaintextJM0, JM1-2, JM4-3, JM4, JM5, YB3. 轨迹点序列必须cpp运行std::vectortrajectory_msgs::msg::JointTrajectoryPoint points;每个点包含cpp运行// 位置 (rad) std::vectordouble positions; // 速度 (rad/s) std::vectordouble velocities; // 加速度 (rad/s²) std::vectordouble accelerations; // 从轨迹开始到该点的时间 builtin_interfaces::msg::Duration time_from_start;三、一条真实可发送的轨迹消息例子你能直接用yamlheader: 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 点5s3. 单位positionsrad弧度velocitiesrad/saccelerationsrad/s²4. 可以只发 positions速度 / 加速度可以为空控制器会自动插值。五、你代码里的SharedPtr是什么cpp运行const trajectory_msgs::msg::JointTrajectory::SharedPtr msg等于cpp运行std::shared_ptrconst trajectory_msgs::msg::JointTrajectory msg意思这是智能指针指向一条轨迹消息常用于回调函数参数例如cpp运行void topicCallback(const trajectory_msgs::msg::JointTrajectory::SharedPtr msg) { // 收到了一条轨迹 }六、我用一句话总结JointTrajectory 一组关节名称 一组带时间的点位机械臂会按点、按时平滑运动