跳到正文

Wiki

命令轉發與常用控制接口

約 4 分鐘閱讀

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

position、velocity、effort 是命令的物理含義;ForwardCommandController 主要負責把消息中的值交給指定接口。

1.示例 1:位置命令怎樣進入接口

保持 mini 運行:

ros2 topic pub --once /forward_position_controller/commands \
  std_msgs/msg/Float64MultiArray "{data: [0.3, -0.2]}"
ros2 topic echo /joint_states --once

1.1.對照源碼閲讀順序

on_configure 创建 ~/commands 订阅
  → 回调将消息写入 realtime buffer
command_interface_configuration 返回 joints/interface_name
on_activate 取得并整理接口
update 从 realtime buffer 取消息
  → 检查数组长度
  → 对各命令接口 set_value

它沒有在這裏比較目標與關節反饋併為所有設備實現位置 PID。MiniSystem 的緩慢響應來自硬件模擬,而不是 ForwardCommandController 計算了電機力矩。

2.示例 2:認識三種接口

命令接口 旋轉關節常用單位 下游通常要實現什麼
position rad 跟蹤位置,常由驅動器內部完成
velocity rad/s 跟蹤角速度,常由驅動器速度環完成
effort N·m 執行力矩或與設備協議映射

直線關節分別使用 m、m/s、N。電流不是通用意義上的 effort 數值,若協議傳電流,需要根據電機與傳動關係進行明確換算。

2.1.為什麼不能只把 interface_name 改成 velocity

MiniSystem 只導出 position 命令接口。控制器若申請 joint1/velocity,會找不到資源。要改為速度控制,必須同時修改 URDF 聲明、硬件導出、write 的語義,以及反饋更新算法。

下面是教學偽代碼,不是可直接替換的完整插件:

velocity_command = 控制器目标角速度
write:向驱动器发送角速度
read:从编码器读 position 和 velocity
模拟时可用 position += velocity * dt

3.示例 3:用現成底盤練習速度接口

在DiffBot與差速底盤控制中運行的 DiffBot 提供輪子 velocity 命令與 position/velocity 狀態。用那個完整實例學習速度模式,避免在當前雙關節工程中只改一個字符串。

3.1.數組長度為什麼重要

控制兩個關節就需要兩個目標。固定版本的 ForwardCommandController 在 update 中校驗長度,錯誤時返回 ERROR。故意發送錯誤長度可能觸發控制器錯誤處理,因此只在模擬工程中做,觀察後查看狀態並恢復或重啓實例。

4.本節總結

選接口是在約定命令語義,選控制器是在約定目標如何變成接口值,選硬件後端是在約定接口值如何作用於設備。

源碼:ros2_controllers/forward_command_controller/src/forward_controllers_base.cpp、ros2_controllers/position_controllers/src/joint_group_position_controller.cpp。位置組控制器複用了命令轉發機制,讀源碼時留意繼承與參數設置。


返回 Humble 總覽 · 上一篇:狀態廣播與機械人顯示 · 下一篇:Joint-Trajectory-Controller