跳到正文

Wiki

read-update-write控制週期

約 3 分鐘閱讀

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

read、update、write 的名字容易記,難點是呼叫執行緒、實際週期和時鐘來源。

1.示例 1:沿 main() 閱讀兩個執行路徑

開啟 ros2_control_node.cpp:

创建 Executor 和 ControllerManager
  → 创建控制线程
      → 计算时间与测得周期
      → read → update → write
      → 安排下一轮
  → Executor spin,处理消息与服务回调

訂閱回撥儲存目標,update 在控制執行緒取快照。服務請求也不應直接把正在 update 的物件隨意銷燬。

2.示例 2:逐輪推演

N 轮 read:读当前反馈
回调接收新目标
N 轮 update:若取得新快照,就计算新命令
N 轮 write:交给设备
N+1 轮 read:取得新的设备反馈

若訊息在 update 之後到達,就可能下一輪才被使用。不要承諾所有訊息都在一個固定週期內生效。

3.示例 3:比較命令頻率與反饋頻率

ros2 topic hz /joint_states

另一個終端以較低頻率傳送:

ros2 topic pub --rate 2 /forward_position_controller/commands \
  std_msgs/msg/Float64MultiArray "{data: [0.2, -0.1]}"

反饋可比命令到達更頻繁。topic hz 測量的是接收端話題頻率,不是即時執行緒的精確排程。

3.1.time、period 與 update_rate

update_rate 是目標頻率。period 是實際測得的時間間隔,演算法應使用它積分或計算步長。time 屬於呼叫所採用的時鐘,不能把 ROS 時間、單調時間和牆上時間混在一起相減。

模擬使用 /clock:暫停世界時,模擬時間可能不前進。通訊失聯期限適合用單調時間檢查,不能讓暫停模擬掩蓋真實裝置已經失聯。

4.Gazebo 的呼叫入口

Harmonic 外掛在模擬更新過程中排程框架,不應再額外啟動同一機器人的獨立 ros2_control_node。兩種執行後端共享介面契約,排程入口不同。

原始碼:ros2_control/controller_manager/src/ros2_control_node.cpp、gz_ros2_control/gz_ros2_control/src/gz_ros2_control_plugin.cpp。


返回 Jazzy 總覽 · 上一篇:硬體與控制器生命週期 · 下一篇:狀態廣播與機器人顯示