Wiki
多接口與硬件類型
本文由簡體中文內容確定性轉換,並受版本化術語表保護。
一個關節可以聲明多種接口,但“接口存在”與“允許同時使用”是兩回事。
1.示例 1:運行官方多接口 RRBot
先停止其它實例,再進入已 source demos 的終端:
ros2 launch ros2_control_demo_example_3 rrbot_system_multi_interface.launch.py gui:=false
另一個 source 同一工作區的終端:
ros2 control list_controllers
ros2 control list_hardware_interfaces
該實例由環境準備與源碼地圖的構建命令包含。模式切換實驗應以所用提交中的 YAML 和下述源碼為依據,逐項檢查接口占用、切換結果與硬件模式。
1.1.先看配置,再選控制器
打開官方包的 config/rrbot_multi_interface_forward_controllers.yaml,記錄實際控制器名稱、joints 和 interface_name。不要憑其它版本截圖中的名稱執行切換。
2.為什麼需要 prepare 與 perform 兩階段
控制器提出接口切换请求
→ prepare_command_mode_switch 检查是否允许这种组合
→ 框架协调资源和控制器状态
→ perform_command_mode_switch 执行已批准的硬件模式切换
prepare_command_mode_switch(start_interfaces, stop_interfaces) 接收完整接口名列表,先檢查硬件是否支持請求。perform_command_mode_switch() 位於執行切換的路徑中,應快速完成,避免在這裏做長時間通信握手。
框架能協調接口占用,設備是否支持位置與速度同時控制仍由硬件能力決定。不能只因為兩個接口名字不同,就認定同時寫入一定合理。
3.示例 2:選擇 System、Actuator 或 Sensor
| 類型 | 典型組織方式 | 官方實例線索 |
|---|---|---|
| System | 一條通信鏈路管理多個關節和傳感器 | example_1、example_4 |
| Actuator | 執行器具有獨立通信與生命週期 | example_6 |
| Sensor | 只向上提供狀態,不接收執行命令 | example_5 的外部傳感器 |
選擇取決於設備通信邊界和管理需求,不是“機械人整體一定 System、電機一定 Actuator”。同一條總線上的多個電機可以由一個 System 統一管理。
4.示例 3:閲讀一個模式檢查函數
在源碼閲讀目錄定位:
cd ~/ros2_control_demos_ws/src/ros2_control_demos
rg -n 'prepare_command_mode_switch|perform_command_mode_switch' example_3/hardware
閲讀時回答四個問題:允許啓動哪些接口?停止哪些接口?是否要求同組關節一致?遇到不屬於自己的接口時怎樣處理?
4.1.本節最重要的邊界
硬件生命週期負責組件是否配置和可運行;控制模式切換負責運行時採用哪種命令語義。這兩個維度不能相互替代。
源碼:ros2_control_demos/example_3/hardware/rrbot_system_multi_interface.cpp、ros2_control/hardware_interface/include/hardware_interface/system_interface.hpp。
返回 Humble 總覽 · 上一篇:差速底盤物理仿真 · 下一篇:從零編寫控制器