跳到正文

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 總覽 · 上一篇:硬件與控制器生命週期 · 下一篇:狀態廣播與機械人顯示