我來說明如何將 STL 或 COLLADA(.dae) 格式的 3D 模型應用於 URDF/SDF 並在 Gazebo 中載入:
URDF 中使用 3D 模型
- 基本結構示例
xml<robot name="my_robot"> <link name="base_link"> <visual> <geometry> <mesh filename="package://my_robot_description/meshes/base.dae" scale="1 1 1"/> </geometry> </visual> <collision> <geometry> <mesh filename="package://my_robot_description/meshes/base_collision.stl"/> </geometry> </collision> </link> </robot>
- 文件組織結構
my_robot_package/ ├── urdf/ │ └── robot.urdf ├── meshes/ │ ├── visual/ │ │ ├── part1.dae │ │ └── part2.dae │ └── collision/ │ ├── part1.stl │ └── part2.stl └── package.xml
實施步驟
- 準備模型文件
- 對於視覺模型(visual):
- 優先使用 COLLADA (.dae),保留材質和紋理
- 確保模型尺寸正確
- 注意坐標系方向
- 對於碰撞模型(collision):
- 使用簡化的 STL 文件
- 移除不必要的細節
- 減少面數以提高性能
- URDF 配置
xml<!-- 視覺模型配置 --> <visual> <origin xyz="0 0 0" rpy="0 0 0"/> <geometry> <mesh filename="package://my_robot/meshes/visual/part.dae" scale="0.001 0.001 0.001"/> </geometry> <material name="blue"> <color rgba="0 0 1 1"/> </material> </visual> <!-- 碰撞模型配置 --> <collision> <origin xyz="0 0 0" rpy="0 0 0"/> <geometry> <mesh filename="package://my_robot/meshes/collision/part.stl"/> </geometry> </collision>
- 常見參數說明
filename
: 模型文件路徑scale
: 縮放比例(如果模型單位不是米)origin
: 位置和方向偏移rpy
: 滾動、俯仰、偏航角度
- 載入到 Gazebo
bash# 啟動 Gazebo 並載入模型 roslaunch gazebo_ros empty_world.launch # 載入 URDF 模型 rosrun gazebo_ros spawn_model -urdf -param robot_description -model my_robot
常見問題解決
- 模型不可見
- 檢查文件路徑是否正確
- 確認 scale 參數設置
- 檢查坐標系方向
- 碰撞檢測問題
- 簡化碰撞模型
- 確保碰撞幾何體完全包圍視覺模型
- 檢查collision標籤設置
- 性能優化
- 減少模型面數
- 使用適當的碰撞幾何體
- 合理設置物理參數
最佳實踐
- 分離視覺和碰撞模型
- 視覺模型可以較為詳細
- 碰撞模型盡量簡單
- 文件命名規範
- 使用有意義的名稱
- 區分視覺和碰撞模型
- 保持一致的命名方式
- 版本控制
- 為模型文件使用版本控制
- 記錄模型修改歷史
- 備份重要模型文件
沒有留言:
張貼留言