跳到正文

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實例