Skip to content

Wiki

Joint-Trajectory-Controller

About 3 min read

Existing English translations were reused. 15 current source blocks remain in Simplified Chinese, without triggering paid translation.

轨迹是时间轴上的关节目标,不只是一次位置数组赋值。

1.示例 1:加载并切换控制器

保持自己的双关节实例运行,另一终端 source 学习工作区:

source /opt/ros/jazzy/setup.bash
source ~/ros2_control_jazzy_ws/install/setup.bash
ros2 run controller_manager spawner trajectory_controller --inactive \
  --param-file $(ros2 pkg prefix jazzy_control_hardware)/share/jazzy_control_hardware/config/controllers.yaml
ros2 control switch_controllers --deactivate forward_position_controller \
  --activate trajectory_controller --strict
ros2 control list_controllers

spawner 使用 --inactive 完成加载与配置;switch 在同一个请求里释放旧接口并激活新控制器。不要让两个普通控制器争用同一 position 命令接口。

2.示例 2:Action 发送目标

ros2 action send_goal /trajectory_controller/follow_joint_trajectory \
  control_msgs/action/FollowJointTrajectory \
  "{trajectory: {joint_names: [joint1, joint2], points: [
    {positions: [0.2, 0.1], time_from_start: {sec: 3}}
  ]}}" --feedback

2.1.成功时的示例输出

error_code: 0
Goal finished with status: SUCCEEDED

成功表示符合配置中的轨迹和目标容差,不表示设备没有误差。教学硬件有跟随延迟,因此配置了允许误差与额外到达时间。

3.示例 3:Topic 发送两段轨迹

ros2 topic pub --once /trajectory_controller/joint_trajectory \
  trajectory_msgs/msg/JointTrajectory \
  "{joint_names: [joint1, joint2], points: [
    {positions: [0.3, -0.2], time_from_start: {sec: 2}},
    {positions: [0.0, 0.0], time_from_start: {sec: 5}}
  ]}"

time_from_start 是相对整条轨迹起点,第二点表示开始后 5 秒,不是再等 5 秒。时间应递增,数组顺序与 joint_names 一致。

Action 提供接受、反馈和结果;Topic 发布成功不能证明执行完成。指定绝对 header 时间时,要确保发送端与控制器使用相同时间域;仿真中尤其要检查 use_sim_time。

4.参数与恢复

command_interfaces 决定输出类型,state_interfaces 决定所需反馈,constraints 定义轨迹误差与目标误差。换成 velocity 或 effort 时,还要核对对应的接口组合要求。

ros2 control switch_controllers --deactivate trajectory_controller \
  --activate forward_position_controller --strict

源码:ros2_controllers/joint_trajectory_controller/src/joint_trajectory_controller.cpp。沿目标回调、轨迹缓冲、采样和容差判断阅读。


返回 Jazzy 总览 · 上一篇:命令转发与控制模式 · 下一篇:Harmonic机械臂物理仿真