跳到正文

Wiki

Joint-Trajectory-Controller

約 4 分鐘閱讀

本文由簡體中文內容確定性轉換,並受版本化術語表保護。

軌跡控制器在時間軸上執行目標點。本節沿用自己的雙關節工程,不再建立另一套模型。

1.示例 1:切換到軌跡控制器

保持 mini.launch.py 執行。YAML 中已經登記 trajectory_controller:

ros2 control load_controller trajectory_controller --set-state inactive
ros2 control switch_controllers \
  --deactivate forward_position_controller \
  --activate trajectory_controller --strict
ros2 control list_controllers
ros2 action list -t

1.1.執行順序

load 建立並配置例項,處於 inactive;switch 在一次切換請求中釋放舊控制器介面,再讓新控制器取得介面。不要讓兩個控制器同時爭用 joint1/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
error_string: Goal successfully reached!
Goal finished with status: SUCCEEDED

MiniSystem 的一階響應會滯後,配置中允許一定軌跡誤差和額外到達時間。目標成功表示符合當前配置的成功條件,不表示真實裝置沒有誤差。

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}}
  ]}"

3.1.時間引數說明

time_from_start 相對於整條軌跡起點,而不是相對於上一個點。上例第二段到達時間是開始後 5 秒,第二段時長約為 3 秒。點的時間應嚴格遞增。

header.stamp 為零時使用控制器當前接收與執行邏輯安排起點;指定絕對時間時必須保證時間域一致。在模擬中尤其不要混用牆上時間和模擬時間。

3.2.Topic 與 Action 的區別

Action 提供目標接受、執行反饋與最終結果,適合需要監控任務是否完成的場景。Topic 可以直接替換軌跡,但釋出成功並不是動作執行成功。

3.3.關鍵配置說明

  • joints:關節及陣列順序。
  • command_interfaces:本例為 position。
  • state_interfaces:本例讀取 position、velocity。
  • trajectory tolerance:執行中允許的跟蹤誤差。
  • goal tolerance:結束時允許的誤差。
  • goal_time:允許額外達到目標的時間。

不同命令介面要求不同反饋組合,不能把本例 position 配置原樣用於 effort 控制。

4.恢復命令轉發器

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

原始碼:ros2_controllers/joint_trajectory_controller/src/joint_trajectory_controller.cpp、control_msgs/control_msgs/action/FollowJointTrajectory.action。沿目標回撥、軌跡緩衝、取樣與容差檢查閱讀;不要把整段 update 當成只有一次陣列賦值。


返回 Humble 總覽 · 上一篇:命令轉發與常用控制介面 · 下一篇:機械臂物理模擬