2025年9月5日 星期五

URDF 內的 LiDAR 表示及 Gazebo 驅動模擬

 

1. URDF 內的 LiDAR 是怎麼表示的

  • 在 URDF/Xacro 中,LiDAR 本體會是一個 link(例如 lidar_link),通常是個小圓柱體(僅供視覺化)。

  • 接著用一個 joint(通常是 fixed)把 lidar_link 固定到 base_link 或車體上。

  • 在 LiDAR link 裡,用 <gazebo> 標籤附加 Gazebo 插件,這樣模擬才會真的產生雷射掃描資料。


2. libgazebo_ros_ray_sensor.so 插件

這是 gazebo_ros 套件提供的 Ray Sensor Plugin。它會把 Gazebo 模擬的 Ray sensor(光線投射)封裝成 ROS 2 的 Topic。

主要功能:

  • 在 Gazebo 中模擬雷射掃描器(LiDAR)。

  • 透過 ROS 2 topic 輸出 sensor_msgs/msg/LaserScansensor_msgs/msg/PointCloud2

  • 可設定角度範圍、解析度、更新頻率、噪聲模型。


3. URDF / Xacro 實際範例

<!-- LiDAR 本體 link --> <link name="lidar_link"> <visual> <geometry> <cylinder length="0.05" radius="0.03"/> </geometry> <material> <color rgba="0 1 0 1"/> </material> </visual> </link> <!-- 固定在 base_link 上 --> <joint name="lidar_joint" type="fixed"> <parent link="base_link"/> <child link="lidar_link"/> <origin xyz="0.0 0.0 0.1" rpy="0 0 0"/> </joint> <!-- Gazebo 插件 --> <gazebo reference="lidar_link"> <sensor type="ray" name="lidar_sensor"> <pose>0 0 0 0 0 0</pose> <visualize>true</visualize> <update_rate>10</update_rate> <ray> <scan> <horizontal> <samples>360</samples> <resolution>1</resolution> <min_angle>-3.14159</min_angle> <max_angle>3.14159</max_angle> </horizontal> </scan> <range> <min>0.12</min> <max>12.0</max> <resolution>0.01</resolution> </range> <noise> <type>gaussian</type> <mean>0.0</mean> <stddev>0.01</stddev> </noise> </ray> <!-- 插件: ROS 2 雷射轉換 --> <plugin name="gazebo_ros_ray_sensor" filename="libgazebo_ros_ray_sensor.so"> <ros> <namespace>/</namespace> <remapping>scan:=/scan</remapping> </ros> <output_type>sensor_msgs/LaserScan</output_type> <frame_name>lidar_link</frame_name> </plugin> </sensor> </gazebo>

4. 關鍵說明

  • <sensor type="ray">:告訴 Gazebo 這是一個 Ray Sensor(雷射)。

  • <ray><scan>…</scan></ray>:定義雷射的掃描角度與分辨率(360 點、360°)。

  • <plugin filename="libgazebo_ros_ray_sensor.so">:把 Gazebo 的 Ray Sensor 綁定到 ROS 2。

  • <output_type>:決定輸出的資料型別(LaserScan / PointCloud2)。

  • <remapping>:改 ROS topic 名稱(這裡輸出到 /scan)。

  • <frame_name>:指定發送 TF 的 frame id(通常是 lidar_link)。


  • 常見主題名稱/scan(2D LaserScan)或 /points / /points_raw(PointCloud2)。實際名稱取決於你在 URDF/Gazebo 插件裡的 <remapping> 設定。

  • 如何確認

    ros2 topic list | grep -E 'scan|point' ros2 topic info /scan # 或 ros2 interface show sensor_msgs/msg/LaserScan
  • RViz2 顯示 LaserScan

    1. rviz2 → Fixed Frame 設 odom(或 base_link)。

    2. Add → By display type → LaserScan

    3. Topic 選剛剛找到的 …/scan;Frame 會用 frame_id(常是 lidar_link)。

    4. 若看不到:在 LaserScan display 裡把 Size (m) 調到 0.02~0.05、確認時間同步(/clock)與 TF 完整。

  • RViz2 顯示 PointCloud2(若輸出點雲):

    1. Add → PointCloud2

    2. Topic 選 /points(或你的點雲 topic)。

    3. Style 選 Points,Size 0.02~0.05。

小檢查:你現在 plugin 輸出的是 sensor_msgs/LaserScan 還是 sensor_msgs/PointCloud2?(告訴我型別,我幫你把 RViz 的設定精準化。)

沒有留言:

張貼留言