舉例說明如何在四輪車的 URDF/Xacro 檔案中定義 ros2_control
標籤,特別是針對四個車輪的關節。
在 ROS 2 中,ros2_control
標籤用於描述機器人的硬體介面(hardware interfaces)以及它們如何與您的控制系統互動。對於四輪車來說,通常會控制每個輪子的轉速(速度介面)或位置(位置介面),並監測它們的狀態。
四輪車 ros2_control
標籤範例
這個範例假設您有一個名為 my_robot.urdf.xacro
的 Xacro 檔案,並且您想控制四個輪子(左前、右前、左後、右後)。
首先,確保您的 Xacro 檔案頂部有必要的 XML 命名空間聲明,尤其是 xmlns:ros2_control="http://ros.org/schema/ros2_control/1.0"
:
<?xml version="1.0"?>
<robot name="four_wheel_robot" xmlns:xacro="http://www.ros.org/wiki/xacro"
xmlns:gazebo="http://gazebosim.org/schema/gazebo/1.0"
xmlns:ros2_control="http://ros.org/schema/ros2_control/1.0">
<joint name="left_front_wheel_joint" type="continuous">
<parent link="base_link"/>
<child link="left_front_wheel_link"/>
<origin xyz="0.1 0.1 0" rpy="0 0 0"/>
<axis xyz="0 1 0"/>
</joint>
<link name="left_front_wheel_link">
</link>
---
<ros2_control name="FourWheelDriveController" type="system">
<hardware>
<plugin>diff_drive_arduino/ArduinoSystem</plugin>
</hardware>
<joint name="left_front_wheel_joint">
<command_interface name="velocity">
<param name="min">-10</param>
<param name="max">10</param>
</command_interface>
<state_interface name="velocity"/>
<state_interface name="position"/>
</joint>
<joint name="right_front_wheel_joint">
<command_interface name="velocity">
<param name="min">-10</param>
<param name="max">10</param>
</command_interface>
<state_interface name="velocity"/>
<state_interface name="position"/>
</joint>
<joint name="left_rear_wheel_joint">
<command_interface name="velocity">
<param name="min">-10</param>
<param name="max">10</param>
</command_interface>
<state_interface name="velocity"/>
<state_interface name="position"/>
</joint>
<joint name="right_rear_wheel_joint">
<command_interface name="velocity">
<param name="min">-10</param>
<param name="max">10</param>
</command_interface>
<state_interface name="velocity"/>
<state_interface name="position"/>
</joint>
</ros2_control>
---
<gazebo>
<plugin filename="libgazebo_ros2_control.so" name="gazebo_ros2_control">
<parameters>$(find four_wheel_robot)/config/my_controllers.yaml</parameters>
</plugin>
</gazebo>
</robot>
範例解釋:
xmlns:ros2_control="http://ros.org/schema/ros2_control/1.0"
: 這是必要的 XML 命名空間聲明,它告訴解析器<ros2_control>
標籤的定義來自何處。<ros2_control name="FourWheelDriveController" type="system">
:這是
ros2_control
框架的主入口點。name
: 為這個控制硬體介面定義一個名稱 (例如FourWheelDriveController
)。type
: 指明這個控制器是哪種類型。常見的有:system
: 這是一個完整的機器人系統,包含多個關節和感測器。actuator
: 單個執行器。sensor
: 單個感測器。
<hardware>
:這個區塊定義了與實際物理硬體溝通的硬體介面插件 (hardware interface plugin)。
<plugin>diff_drive_arduino/ArduinoSystem</plugin>
: 這是一個範例。您需要根據您實際使用的硬體驅動器或模擬器來指定這裡的插件。在模擬中,通常會使用像
gazebo_ros2_control/GazeboSystem
這樣的插件。在真實硬體中,這會是您自己為您的馬達驅動板或控制板編寫的 C++ 或 Python 插件,例如
my_custom_robot_hardware/MyRobotSystem
。這個插件負責實際的 I/O 操作,將抽象的指令轉換為電氣訊號。
<joint name="[joint_name]">
:對於您的四輪車,您會為每個輪子的關節(
left_front_wheel_joint
,right_front_wheel_joint
,left_rear_wheel_joint
,right_rear_wheel_joint
)定義一個<joint>
區塊。name
: 這裡的名稱必須與您在 URDF 其他部分定義的<joint>
標籤的name
屬性完全一致。
<command_interface name="velocity">
:這定義了該關節接受哪種類型的指令 (command)。對於車輪,
velocity
(速度)是最常見的指令,因為您通常會告訴車輪以多快的速度旋轉。name="velocity"
: 指定這是一個速度指令介面。ros2_control
支援多種標準介面,例如position
、velocity
、effort
。<param name="min">-10</param>
和<param name="max">10</param>
: 定義了該指令的最小值和最大值,通常是角速度(弧度/秒)或力矩/力。
<state_interface name="velocity"/>
和<state_interface name="position"/>
:這定義了該關節提供哪種類型的狀態 (state) 讀數。
name="velocity"
: 指明這個介面提供當前輪子的角速度。name="position"
: 指明這個介面提供當前輪子的累積角度位置(例如從編碼器讀取)。重要:
ros2_control
會從硬體介面讀取這些狀態,並讓控制器和joint_state_broadcaster
(將關節狀態發布到 ROS Topic)使用它們。
<gazebo>
插件整合:plugin filename="libgazebo_ros2_control.so" name="gazebo_ros2_control"
: 這是將ros2_control
與 Gazebo 模擬器連接起來的標準 Gazebo 插件。它允許ros2_control
的硬體介面在 Gazebo 模擬中運行,而不是依賴實際硬體。<parameters>$(find four_wheel_robot)/config/my_controllers.yaml</parameters>
: 這指示gazebo_ros2_control
插件去載入一個 YAML 設定檔,該檔案定義了要使用的控制器及其參數。您需要創建這個my_controllers.yaml
檔案。
my_controllers.yaml
檔案範例 (放在 config
目錄下)
這個 YAML 檔案會告訴 controller_manager
您要啟用哪些控制器,以及它們如何配置。
# my_controllers.yaml
controller_manager:
ros__parameters:
update_rate: 100 # 控制器管理器更新頻率 (Hz)
# 關節狀態發布器:負責將來自硬體介面的關節狀態發布為 ROS Topic
joint_state_broadcaster:
type: joint_state_broadcaster/JointStateBroadcaster
# 差速驅動控制器:用於控制兩輪驅動的機器人 (四輪差速驅動通常也用這個)
diff_drive_controller:
type: diff_drive_controller/DiffDriveController # 或者您可以自定義控制器
ros__parameters:
left_wheel_names: ["left_front_wheel_joint", "left_rear_wheel_joint"]
right_wheel_names: ["right_front_wheel_joint", "right_rear_wheel_joint"]
# 機器人輪子半徑和輪距
wheel_radius: 0.033 # 替換為您的輪子半徑
wheel_separation: 0.17 # 替換為您的輪距 (左右輪中心距離)
# 速度 PID 參數 (可選,如果控制器支持)
# publish_cmd_vel: true
# publish_wheel_tf: true
# left_wheel_velocity_filter: 0.1
# right_wheel_velocity_filter: 0.1
# linear:
# x:
# has_velocity_limits: true
# max_velocity: 0.5
# min_velocity: -0.5
# has_acceleration_limits: true
# max_acceleration: 1.0
# min_acceleration: -1.0
# angular:
# z:
# has_velocity_limits: true
# max_velocity: 1.0
# min_velocity: -1.0
# has_acceleration_limits: true
# max_acceleration: 2.0
# min_acceleration: -2.0
總結
這個 Xacro 範例中的 ros2_control
標籤定義了四輪車的四個輪子關節將如何通過 velocity
指令介面和 velocity
/position
狀態介面與 ros2_control
框架互動。同時,gazebo
插件部分則確保在 Gazebo 模擬中,ros2_control
能夠載入控制器並控制這些關節。
這是為四輪車設置 ros2_control
的基礎架構,您可以根據您的具體需求和硬體特性進一步擴展和調整。
沒有留言:
張貼留言