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