Wiki
綜合工程與系統排錯
約 4 分鐘閱讀
本文由簡體中文內容確定性轉換,並受版本化術語表保護。
本節把已有檔案、執行方式和排錯順序整理在一起。執行環境發生變化時,用這張地圖逐段確認。
1.最終工程結構
~/ros2_control_humble_ws/
├── src/
│ ├── learn_control_hardware/
│ │ ├── package.xml
│ │ ├── CMakeLists.txt
│ │ ├── hardware_plugins.xml
│ │ ├── include/learn_control_hardware/mini_system.hpp
│ │ ├── src/mini_system.cpp
│ │ ├── src/serial_system.cpp
│ │ ├── config/controllers.yaml
│ │ ├── config/diff_controllers.yaml
│ │ ├── launch/mini.launch.py
│ │ ├── launch/sim.launch.py
│ │ └── urdf/
│ │ ├── mini.urdf
│ │ ├── mini_gz.urdf.xacro
│ │ ├── diff_gz.urdf.xacro
│ │ └── mini_serial.urdf
│ └── learn_position_controller/
│ ├── package.xml
│ ├── CMakeLists.txt
│ ├── controller_plugins.xml
│ └── src/hold_controller.cpp
├── tools/virtual_mcu.py
├── build/ colcon 生成
├── install/ colcon 生成
└── log/ colcon 生成
前面的章節逐步建立這些檔案,不需要一開始就建立全部內容。虛擬序列埠與模擬下位機完成後,硬體包的 CMakeLists 和外掛 XML 使用包含序列埠外掛的最終版本。
2.示例 1:從乾淨終端執行
source /opt/ros/humble/setup.bash
cd ~/ros2_control_humble_ws
colcon build --symlink-install --packages-select learn_control_hardware learn_position_controller
source install/setup.bash
ros2 pkg prefix learn_control_hardware
ros2 pkg prefix learn_position_controller
確認兩個路徑都來自預期的學習工作區。若指向舊工作區,先解決 source 順序,再排查 C++ 邏輯。
3.選擇一個執行後端
一次只選擇一個:
| 後端 | 入口 | 附加條件 |
|---|---|---|
| 自編模擬硬體 | mini.launch.py 預設模型 | 從零編寫模擬硬體外掛完成 |
| Fortress 機械臂 | sim.launch.py 預設模型 | 機械臂物理模擬完成 |
| Fortress 底盤 | sim.launch.py 指定 diff 模型與控制器 | 差速底盤物理模擬完成 |
| 虛擬序列埠雙關節 | mini.launch.py 指定 mini_serial | socat 和模擬下位機先執行 |
| 真實硬體 | 裝置專用模型與外掛 | 按單執行器實物接入完成裝置適配 |
4.示例 2:按順序收集執行證據
ros2 node list
ros2 control list_hardware_components
ros2 control list_hardware_interfaces
ros2 control list_controllers
ros2 topic info /joint_states -v
ros2 topic echo /joint_states --once
4.1.怎樣解釋這些證據
節點存在只表示程序或節點已出現;硬體 active 表示狀態機通過;介面 claimed 表示命令資源已被借出;控制器 active 表示允許週期執行;反饋變化才說明資料鏈路產生了可觀察結果。真實裝置還要核對實際運動。
5.排錯表
| 現象 | 優先檢查 | 修復後怎樣驗證 |
|---|---|---|
| 找不到包 | 構建結果、source 和安裝路徑 | ros2 pkg prefix |
| 找不到外掛 | 匯出宏、XML、CMake 註冊、庫依賴 | 管理器成功載入硬體 |
| spawner 一直等待 | 管理器是否已收到有效模型 | list_controllers 服務可用 |
| 控制器配置失敗 | 引數層級、關節名、介面組合 | inactive 狀態 |
| 啟用報資源衝突 | 已 claimed 的命令介面 | 原子切換後只剩一個寫入者 |
| 發命令無反應 | Topic、型別、長度、時間戳、active 狀態 | 目標與反饋一起觀察 |
| RViz 不動 | JointState、TF、Fixed Frame、QoS | TF 與模型一致 |
| Gazebo 生成失敗 | 慣量、模型轉換、外掛檔名 | 模型實際存在且管理器啟動 |
| 模擬時間不走 | world 是否暫停、/clock 橋 | /clock 連續增加 |
| 輪子動但車不走 | 接觸、摩擦、軸向、離地 | 世界位姿與里程計對照 |
| 序列埠狀態過期 | 資料幀、執行緒錯誤、下位機是否執行 | 新有效反饋恢復且顯式重啟 |
6.示例 3:儲存一次實驗記錄
記錄以下內容:使用哪個模型與原始碼版本,當前引數,傳送的完整目標,控制器與硬體狀態,反饋取樣,是否出現錯誤,以及停止後的狀態。
對照總覽中的學習驗收表,記錄當前實驗的實際結果。示例輸出用於幫助理解;實驗記錄應使用自己執行得到的狀態、反饋和日誌。
7.學完後應當能夠做到
解釋命令如何進入硬體介面;從頭建立並執行硬體外掛與控制器;區分 RViz 顯示、程式模擬、物理模擬和實物;沿原始碼定位介面與生命週期問題;為具體裝置設計反饋、超時與停機流程。
真實硬體接入的最後一步取決於實際裝置協議與驗證。模擬和虛擬序列埠通過,不應替代這一部分記錄。
返回 Humble 總覽 · 上一篇:完整機器人與進階例項