要在 Gazebo 中讓輪子能夠接受 PWM 信號控制轉速,
我們可以透過 gazebo_ros_control
來實現這個功能。這需要幾個關鍵步驟:
✅ 主要步驟
- 安裝
gazebo_ros_control
插件(如果尚未安裝)。 - 修改
myrobot.xacro
,加入gazebo_ros_control
插件。 - 設定
transmission
,將輪子連接至 ROS 控制系統。 - 編寫
ros2_control.yaml
,配置 PWM 轉速控制。 - 啟動
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_hinge
和 right_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️⃣ 加入 transmission | 讓 ros2_control 知道如何控制輪子 |
4️⃣ 建立 ros2_control.yaml | 設定 PWM 速度控制 |
5️⃣ 啟動 Gazebo & ros2_control | 測試 cmd_vel 控制輪子轉速 |
🚀 你還需要什麼進一步的調整?
- 你希望 PWM 訊號來自真實馬達控制板(如 Arduino 或 STM32)嗎?
- 需要加入 PID 控制 來平滑加速與減速嗎?
- 需要測試 模擬與真實機器人同步控制(Gazebo + 硬體)嗎?
沒有留言:
張貼留言