welcom ! Handel home

2025年3月19日 星期三

Gazebo IMU 仿真插件說明及測試

 

Gazebo IMU 仿真插件說明

Gazebo 提供 IMU(慣性測量單元, Inertial Measurement Unit) 模擬插件,該插件可用來模擬機器人的 加速度計(Accelerometer)、陀螺儀(Gyroscope)磁力計(Magnetometer),並生成虛擬感測數據。


1. IMU 插件名稱

Gazebo 內建的 IMU 插件為:

xml
<plugin name="imu_plugin" filename="libgazebo_ros_imu.so"/>
  • libgazebo_ros_imu.soROS 版 IMU 插件,適用於 ROS + Gazebo 環境。
  • 若使用純 Gazebo,可用 libgazebo_imu_sensor.so

2. IMU 插件 XML 配置

IMU 插件通常在 .world.sdf(SDFormat)機器人模型文件中配置,如:

xml
<sensor name="imu_sensor" type="imu"> <always_on>1</always_on> <update_rate>100</update_rate> <!-- 更新頻率 100 Hz --> <imu> <topic>/imu/data</topic> <!-- 發布 IMU 數據的 ROS Topic --> <orientation>true</orientation> <!-- 是否啟用方向數據 --> <angular_velocity>true</angular_velocity> <!-- 是否啟用角速度數據 --> <linear_acceleration>true</linear_acceleration> <!-- 是否啟用線性加速度數據 --> </imu> <plugin name="imu_plugin" filename="libgazebo_ros_imu.so"> <robotNamespace>/my_robot</robotNamespace> <frameName>imu_link</frameName> <topicName>imu/data</topicName> <gaussianNoise>0.01</gaussianNoise> <!-- 設定噪聲 --> <updateRate>100.0</updateRate> <!-- 更新頻率 100 Hz --> </plugin> </sensor>

3. IMU 插件參數

參數說明典型值
<update_rate>IMU 數據的更新頻率 (Hz)50, 100
<always_on>是否一直啟動1 (啟動)
<topicName>ROS 訂閱的話題名稱/imu/data
<robotNamespace>設定機器人命名空間/my_robot
<frameName>IMU 的連接框架名稱imu_link
<gaussianNoise>加速度與角速度測量噪聲0.01

4. ROS 中的 IMU 訂閱

Gazebo 與 ROS 配合時,IMU 數據會透過 ROS topic 發布,例如:

bash
rostopic echo /imu/data

你將會看到輸出:

plaintext
header: seq: 10 stamp: secs: 1629456789 nsecs: 123456789 frame_id: "imu_link" orientation: x: 0.01 y: 0.02 z: -0.01 w: 1.00 angular_velocity: x: 0.001 y: -0.002 z: 0.005 linear_acceleration: x: 0.02 y: 9.81 z: 0.01

5. IMU 插件的應用

(1) 自主導航

  • IMU 可用於機器人 姿態估算,例如 SLAM(同步定位與地圖構建)
  • IMU 數據可搭配 AMCL(自適應蒙地卡羅定位) 進行導航。

(2) 無人機 (Drone) 飛行

  • Gazebo IMU 模擬飛行器的 角速度與加速度,並傳遞給 PX4 或 ArduPilot。

(3) AGV(自動導引車)控制

  • AGV 車輛可使用 IMU 進行 轉向與定位補償

6. 測試 IMU 插件

(1) 啟動 Gazebo 模擬

bash
roslaunch gazebo_ros empty_world.launch

(2) 加載 IMU 插件

使用 rosrunroslaunch 來載入機器人模型:

bash
roslaunch my_robot_description spawn_robot.launch

(3) 訂閱 IMU 數據

bash
rostopic echo /imu/data

如果看到 加速度、角速度、方向數據,代表 IMU 插件已經成功運行!


7. 進階:調整 IMU 噪聲

如果要模擬真實世界的 IMU 誤差,可以增加噪聲:

xml
<plugin name="imu_plugin" filename="libgazebo_ros_imu.so"> <gaussianNoise>0.05</gaussianNoise> <!-- 增加隨機誤差 --> <biasMean>0.002</biasMean> <!-- 設定 Bias 偏移誤差 --> <biasStdDev>0.001</biasStdDev> <!-- Bias 標準差 --> </plugin>

這樣可以模擬 廉價 IMU 模組的漂移,適用於無人機、機器人導航測試。


結論

  1. Gazebo 提供 IMU 插件,可模擬加速度計、陀螺儀和磁力計。
  2. IMU 數據可透過 ROS topic /imu/data 獲取
  3. IMU 可用於導航、無人機、AGV 等應用
  4. 可調整 IMU 噪聲參數,提高模擬真實性。


IMU(慣性測量單元,Inertial Measurement Unit)在 Gazebo 或真實硬體中通常提供以下數據:


1. IMU 提供的主要數據

IMU 感測器通常提供三種類型的數據:

(1) 角速度 (Angular Velocity)

測量設備的旋轉速率(rad/s)

  • 來自 陀螺儀 (Gyroscope)
  • 3 軸數據:angular_velocity.x, angular_velocity.y, angular_velocity.z
  • 單位:弧度/秒 (rad/s)

示例數據:

plaintext
angular_velocity: x: 0.001 y: -0.002 z: 0.005

這表示:

  • x 軸:0.001 rad/s(輕微旋轉)
  • y 軸:-0.002 rad/s(輕微向負方向旋轉)
  • z 軸:0.005 rad/s(繞 z 軸旋轉較快)

(2) 線性加速度 (Linear Acceleration)

測量設備的加速度(m/s²),通常包含重力加速度

  • 來自 加速度計 (Accelerometer)
  • 3 軸數據:linear_acceleration.x, linear_acceleration.y, linear_acceleration.z
  • 單位:米/秒² (m/s²)
  • 在靜止時,通常 z 軸會有 9.81 m/s² 的重力加速度

示例數據:

plaintext
linear_acceleration: x: 0.02 y: 9.81 z: 0.01

這表示:

  • x 軸:0.02 m/s²(水平方向幾乎沒有加速度)
  • y 軸:9.81 m/s²(可能是因為 IMU 側向放置)
  • z 軸:0.01 m/s²(接近靜止)

(3) 姿態 (Orientation)

測量設備的旋轉角度(四元數表達)

  • 來自 陀螺儀 + 加速度計 + 磁力計(若有)
  • 表示 IMU 在 3D 空間中的旋轉姿態
  • 透過 四元數 (Quaternion) 表示
    • orientation.x, orientation.y, orientation.z, orientation.w
  • 可轉換為 Euler 角(Roll, Pitch, Yaw)

示例數據:

plaintext
orientation: x: 0.01 y: 0.02 z: -0.01 w: 1.00

這表示:

  • 四元數 (x, y, z, w) 可以轉換成 Roll/Pitch/Yaw 角度,用來計算設備的方向。

四元數轉換成 Roll/Pitch/Yaw

python
import tf.transformations as tf quaternion = (0.01, 0.02, -0.01, 1.00) # (x, y, z, w) roll, pitch, yaw = tf.euler_from_quaternion(quaternion) print(f"Roll: {roll}, Pitch: {pitch}, Yaw: {yaw}")

2. IMU 額外可能提供的數據

如果 IMU 包含磁力計 (Magnetometer),則還會提供:

(4) 磁場數據 (Magnetic Field)

測量地磁場方向

  • 來自 磁力計
  • 3 軸數據:magnetic_field.x, magnetic_field.y, magnetic_field.z
  • 單位:Tesla (T) 或 Gauss
  • 可用於 航向估計 (Yaw angle estimation)

示例數據:

plaintext
magnetic_field: x: 0.00001 y: 0.00002 z: 0.00003

這表示:

  • x 軸方向的磁場約 0.00001 T
  • y 軸方向的磁場約 0.00002 T
  • z 軸方向的磁場約 0.00003 T

3. IMU 數據在 Gazebo 中的表現

當 IMU 插件在 Gazebo 運行時,可以透過 ROS 訂閱 /imu/data topic 來獲取:

bash
rostopic echo /imu/data

ROS 訊息格式 (sensor_msgs/Imu)

plaintext
header: seq: 10 stamp: secs: 1629456789 nsecs: 123456789 frame_id: "imu_link" orientation: x: 0.01 y: 0.02 z: -0.01 w: 1.00 angular_velocity: x: 0.001 y: -0.002 z: 0.005 linear_acceleration: x: 0.02 y: 9.81 z: 0.01

這些數據可以用於:

  • 機器人導航 (SLAM / AMCL)
  • 姿態估算 (Drone、AGV)
  • 車輛平衡控制 (Two-Wheel Robot)

4. IMU 數據摘要

類型來源參數單位主要應用
角速度陀螺儀angular_velocity.x/y/zrad/s旋轉速率
加速度加速度計linear_acceleration.x/y/zm/s²機器人運動、航姿控制
姿態陀螺儀 + 加速度計 + 磁力計orientation.x/y/z/w (四元數)無單位方向估算 (Yaw/Pitch/Roll)
磁場 (可選)磁力計magnetic_field.x/y/zTesla (T)磁場感測、航向估計

5. 進一步應用

  • 自動導航
    • 結合 IMU + 里程計 (Odometry) + LiDAR 進行定位
  • 無人機姿態控制
    • 使用 IMU + GPS + Barometer 進行飛行控制
  • VR / AR
    • 透過 IMU 估算人體姿態
  • 自平衡機器人
    • IMU 幫助調整機器人平衡

結論

  1. IMU 主要提供
    • 角速度 (angular_velocity)
    • 加速度 (linear_acceleration)
    • 方向 (orientation,四元數)
  2. 磁力計可選,提供地磁場數據。
  3. IMU 在 Gazebo + ROS 環境中,數據可透過 /imu/data topic 獲取
  4. IMU 數據廣泛應用於導航、自主機器人、無人機、VR/AR

沒有留言: