2025年7月3日 星期四

ROS2 四輪車的 URDF/Xacro 檔案中定義 ros2_control 標籤

 舉例說明如何在四輪車的 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
<?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>

範例解釋:

  1. xmlns:ros2_control="http://ros.org/schema/ros2_control/1.0": 這是必要的 XML 命名空間聲明,它告訴解析器 <ros2_control> 標籤的定義來自何處。

  2. <ros2_control name="FourWheelDriveController" type="system">:

    • 這是 ros2_control 框架的主入口點。

    • name: 為這個控制硬體介面定義一個名稱 (例如 FourWheelDriveController)。

    • type: 指明這個控制器是哪種類型。常見的有:

      • system: 這是一個完整的機器人系統,包含多個關節和感測器。

      • actuator: 單個執行器。

      • sensor: 單個感測器。

  3. <hardware>:

    • 這個區塊定義了與實際物理硬體溝通的硬體介面插件 (hardware interface plugin)

    • <plugin>diff_drive_arduino/ArduinoSystem</plugin>: 這是一個範例。您需要根據您實際使用的硬體驅動器或模擬器來指定這裡的插件。

      • 模擬中,通常會使用像 gazebo_ros2_control/GazeboSystem 這樣的插件。

      • 真實硬體中,這會是您自己為您的馬達驅動板或控制板編寫的 C++ 或 Python 插件,例如 my_custom_robot_hardware/MyRobotSystem。這個插件負責實際的 I/O 操作,將抽象的指令轉換為電氣訊號。

  4. <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 屬性完全一致。

  5. <command_interface name="velocity">:

    • 這定義了該關節接受哪種類型的指令 (command)。對於車輪,velocity(速度)是最常見的指令,因為您通常會告訴車輪以多快的速度旋轉。

    • name="velocity": 指定這是一個速度指令介面。ros2_control 支援多種標準介面,例如 positionvelocityeffort

    • <param name="min">-10</param><param name="max">10</param>: 定義了該指令的最小值和最大值,通常是角速度(弧度/秒)或力矩/力。

  6. <state_interface name="velocity"/><state_interface name="position"/>:

    • 這定義了該關節提供哪種類型的狀態 (state) 讀數。

    • name="velocity": 指明這個介面提供當前輪子的角速度。

    • name="position": 指明這個介面提供當前輪子的累積角度位置(例如從編碼器讀取)。

    • 重要: ros2_control 會從硬體介面讀取這些狀態,並讓控制器和 joint_state_broadcaster(將關節狀態發布到 ROS Topic)使用它們。

  7. <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 您要啟用哪些控制器,以及它們如何配置。

YAML
# 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 的基礎架構,您可以根據您的具體需求和硬體特性進一步擴展和調整。

沒有留言:

張貼留言