welcom ! Handel home

2025年2月5日 星期三

(兩輪小車範例)加入馬達控制 (gazebo_ros_control) 能接受PWM 控制轉速

要在 Gazebo 中讓輪子能夠接受 PWM 信號控制轉速

我們可以透過 gazebo_ros_control 來實現這個功能。這需要幾個關鍵步驟:


✅ 主要步驟

  1. 安裝 gazebo_ros_control 插件(如果尚未安裝)。
  2. 修改 myrobot.xacro,加入 gazebo_ros_control 插件
  3. 設定 transmission,將輪子連接至 ROS 控制系統
  4. 編寫 ros2_control.yaml,配置 PWM 轉速控制
  5. 啟動 ros2_control 並發布 PWM 訊號

📌 1️⃣ 確保 gazebo_ros_control 已安裝

ROS 2 環境中,通常 gazebo_ros_control 已經包含在 Gazebo 套件內,但可以手動安裝:

sudo apt install ros-${ROS_DISTRO}-gazebo-ros2-control

替換 ${ROS_DISTRO} 為你的 ROS 版本(如 humble)。


📌 2️⃣ 在 myrobot.xacro 加入 gazebo_ros_control

我們需要 在 Xacro 文件內加入馬達控制插件

<gazebo> <plugin name="gazebo_ros_control" filename="libgazebo_ros_control.so"/> </gazebo>

這一行程式碼讓 Gazebo 能夠透過 ros2_control 控制關節運動。


📌 3️⃣ 定義 transmission (將馬達與關節連接)

在 Xacro 文件內,找到 left_wheel_hingeright_wheel_hinge<joint>,然後為每個輪子加入 transmission

<transmission name="left_wheel_trans"> <type>transmission_interface/SimpleTransmission</type> <joint name="left_wheel_hinge"> <hardwareInterface>hardware_interface/PositionJointInterface</hardwareInterface> </joint> <actuator name="left_motor"> <mechanicalReduction>1.0</mechanicalReduction> </actuator> </transmission> <transmission name="right_wheel_trans"> <type>transmission_interface/SimpleTransmission</type> <joint name="right_wheel_hinge"> <hardwareInterface>hardware_interface/PositionJointInterface</hardwareInterface> </joint> <actuator name="right_motor"> <mechanicalReduction>1.0</mechanicalReduction> </actuator> </transmission>

📌 這段程式碼的作用

  • transmission_interface/SimpleTransmission → 讓 ros2_control 知道這是一個簡單的傳動裝置。
  • hardware_interface/PositionJointInterface控制關節的位置(可以改成速度控制)。
  • mechanicalReduction=1.0馬達與輪子是 1:1 轉動比

🔧 這裡的 PositionJointInterface 可以改成 VelocityJointInterface,如果要用速度控制(PWM 模擬)!


📌 4️⃣ 建立 ros2_control.yaml (設定 PWM 轉速控制)

我們需要一個 ros2_control.yaml 文件來定義 PWM 速度控制: 📂 路徑建議放在 config/ros2_control.yaml

controller_manager: ros__parameters: update_rate: 100 # 控制更新頻率 (Hz) joint_state_broadcaster: type: joint_state_broadcaster/JointStateBroadcaster diff_drive_controller: type: diff_drive_controller/DiffDriveController diff_drive_controller: ros__parameters: left_wheel_names: ["left_wheel_hinge"] right_wheel_names: ["right_wheel_hinge"] publish_rate: 50 base_frame_id: "chassis" wheel_separation: 0.3 # 左右輪距離 wheel_radius: 0.1 # 輪子半徑 use_stamped_vel: false # 允許 PWM 訊號輸入 open_loop: false velocity_command_interface: "velocity" # 限制最大轉速 linear: x: has_velocity_limits: true max_velocity: 1.0 # 最大速度 1 m/s has_acceleration_limits: true max_acceleration: 1.5 angular: z: has_velocity_limits: true max_velocity: 2.0 # 最大旋轉速度 2 rad/s has_acceleration_limits: true max_acceleration: 2.5

📌 這段程式碼的作用

  • joint_state_broadcaster → 讓 ROS 讀取輪子狀態。
  • diff_drive_controller → 使用 差動驅動 (DiffDrive) 控制
  • velocity_command_interface: "velocity" → 允許 cmd_vel 控制輪子的轉速(PWM)。
  • 限制最大速度 (max_velocity),避免過快或不穩定。

📌 5️⃣ 啟動 ros2_control 並發布 PWM 訊號

✅ 啟動 Gazebo

ros2 launch gazebo_ros gazebo.launch.py

✅ 啟動 ros2_control 控制器

ros2 control load_controller --set-state start joint_state_broadcaster ros2 control load_controller --set-state start diff_drive_controller

✅ 發布 cmd_vel 來模擬 PWM 訊號

在 PWM 控制中,我們通常改變 輸入電壓 來影響馬達速度。在 ROS 2,我們可以用 cmd_vel 來達到類似的效果:

ros2 topic pub /cmd_vel geometry_msgs/msg/Twist "{linear: {x: 0.5}, angular: {z: 0.0}}"
  • x: 0.5 → 給輪子一個 0.5m/s 的速度(模擬 PWM)。
  • z: 0.0 → 不轉彎,直線前進。

🔍 總結

步驟動作
1️⃣ 安裝 gazebo_ros_control確保 Gazebo 支援 ROS 控制
2️⃣ 在 myrobot.xacro 加入插件libgazebo_ros_control.so
3️⃣ 加入 transmissionros2_control 知道如何控制輪子
4️⃣ 建立 ros2_control.yaml設定 PWM 速度控制
5️⃣ 啟動 Gazebo & ros2_control測試 cmd_vel 控制輪子轉速

🚀 你還需要什麼進一步的調整?

  1. 你希望 PWM 訊號來自真實馬達控制板(如 Arduino 或 STM32)嗎?
  2. 需要加入 PID 控制 來平滑加速與減速嗎?
  3. 需要測試 模擬與真實機器人同步控制(Gazebo + 硬體)嗎?

沒有留言: