Wiki
ros2_control整體工作過程
約 3 分鐘閱讀
本文由簡體中文內容確定性轉換,並受版本化術語表保護。
先理解“目標、反饋、循環”,再記住管理器和插件的類名。
1.示例 1:普通程序中的控制週期
1.1.程序目標
模擬位置設備:讀取上一次命令作用後的狀態,更新本輪命令,再交給設備。保存為 /tmp/jazzy_cycle.cpp:
#include <chrono>
#include <cmath>
#include <iostream>
#include <thread>
int main()
{
double feedback = 0.0;
double applied = 0.0;
const double target = 0.5;
auto next = std::chrono::steady_clock::now();
for (int cycle = 0; cycle < 100; ++cycle) {
feedback += (1.0 - std::exp(-0.01 / 0.2)) * (applied - feedback); // read
const double command = target; // update
applied = command; // write
if (cycle % 20 == 0) {
std::cout << cycle << " feedback=" << feedback << " command=" << command << '\n';
}
next += std::chrono::milliseconds(10);
std::this_thread::sleep_until(next);
}
}
g++ -std=c++17 /tmp/jazzy_cycle.cpp -o /tmp/jazzy_cycle
/tmp/jazzy_cycle
1.2.運行輸出與執行順序
第一輪反饋仍為零,之後逐漸靠近 0.5。read 在本輪 write 之前,因此它不能讀到尚未發生的設備響應。這裏的一階公式只表示教學模型,不含真實電機與碰撞。
2.把程序對應到框架
| 概念 | 對應職責 |
|---|---|
| ControllerManager | 管理控制器和調度 |
| ResourceManager | 管理硬件組件、接口和資源借用 |
| 硬件插件 read/write | 將設備數據與框架接口連接 |
| 控制器 update | 由目標與反饋計算接口命令 |
| URDF | 聲明模型、硬件後端與接口 |
| YAML、launch、spawner | 提供配置並啓動這些組件 |
3.示例 2:收到消息後發生什麼
ROS 订阅回调收到目标
→ 保存最新完整目标
控制循环 read 获取反馈
→ update 读取目标并设置命令接口
→ write 下发目标
下一轮 read 获取新的反馈
消息回調和控制循環是不同執行路徑。消息頻率不等於 update_rate,回調也不應該直接承擔整個設備控制循環。
3.1.本節需要注意的點
position 命令表示目標位置,state 表示反饋;真實設備可能延遲、跟蹤失敗或限幅。把命令直接當成反饋,會失去檢查設備行為的依據。
旋轉關節的位置和速度通常為 rad、rad/s;直線關節為 m、m/s。傳輸協議中的編碼器數值、rpm 和電流要在設備適配層明確換算。
源碼入口:ros2_control/controller_manager/src/ros2_control_node.cpp。找到控制線程和 Executor,觀察 read、update、write 與 spin 各自運行在哪裏。
返回 Jazzy 總覽 · 上一篇:環境準備與源碼地圖 · 下一篇:運行第一個RRBot實例