
1. Gazebo 是什么
Gazebo 是开源机器人三维仿真平台,用来构建虚拟世界、机器人模型、传感器、物理环境和控制接口。它常用于无人机、移动机器人、机械臂、自动驾驶小车、船舶、室内导航、视觉算法和多机协同测试。
需要注意:现在官方文档中的 Gazebo 通常指新一代 Gazebo,也曾叫 Ignition Gazebo;旧版本叫 Gazebo Classic。PX4 官方说明中,新 Gazebo 是 Ubuntu 22.04 及以后主要支持的版本。
Gazebo 能做的事:
| 能力 | 说明 |
|---|---|
| 三维场景 | 平地、墙体、仓库、草地、水域、移动平台、风场等 |
| 机器人模型 | 使用 SDF/URDF 描述机体、连杆、关节、质量、惯量、碰撞体 |
| 物理仿真 | 重力、碰撞、摩擦、关节约束、升力阻力插件、风、接触 |
| 传感器仿真 | 相机、深度相机、激光雷达、IMU、GPS、测距仪 |
| 控制接口 | 与 PX4、ArduPilot、ROS 2、MAVLink、ros_gz_bridge 配合 |
| 自动化测试 | SITL、HITL、多机、回归测试、算法验证 |
2. Gazebo 的基本使用流程
#mermaid-svg-6q6UJjslQQsQnVOb{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-6q6UJjslQQsQnVOb .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-6q6UJjslQQsQnVOb .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-6q6UJjslQQsQnVOb .error-icon{fill:#552222;}#mermaid-svg-6q6UJjslQQsQnVOb .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-6q6UJjslQQsQnVOb .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-6q6UJjslQQsQnVOb .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-6q6UJjslQQsQnVOb .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-6q6UJjslQQsQnVOb .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-6q6UJjslQQsQnVOb .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-6q6UJjslQQsQnVOb .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-6q6UJjslQQsQnVOb .marker{fill:#333333;stroke:#333333;}#mermaid-svg-6q6UJjslQQsQnVOb .marker.cross{stroke:#333333;}#mermaid-svg-6q6UJjslQQsQnVOb svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-6q6UJjslQQsQnVOb p{margin:0;}#mermaid-svg-6q6UJjslQQsQnVOb .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-6q6UJjslQQsQnVOb .cluster-label text{fill:#333;}#mermaid-svg-6q6UJjslQQsQnVOb .cluster-label span{color:#333;}#mermaid-svg-6q6UJjslQQsQnVOb .cluster-label span p{background-color:transparent;}#mermaid-svg-6q6UJjslQQsQnVOb .label text,#mermaid-svg-6q6UJjslQQsQnVOb span{fill:#333;color:#333;}#mermaid-svg-6q6UJjslQQsQnVOb .node rect,#mermaid-svg-6q6UJjslQQsQnVOb .node circle,#mermaid-svg-6q6UJjslQQsQnVOb .node ellipse,#mermaid-svg-6q6UJjslQQsQnVOb .node polygon,#mermaid-svg-6q6UJjslQQsQnVOb .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-6q6UJjslQQsQnVOb .rough-node .label text,#mermaid-svg-6q6UJjslQQsQnVOb .node .label text,#mermaid-svg-6q6UJjslQQsQnVOb .image-shape .label,#mermaid-svg-6q6UJjslQQsQnVOb .icon-shape .label{text-anchor:middle;}#mermaid-svg-6q6UJjslQQsQnVOb .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-6q6UJjslQQsQnVOb .rough-node .label,#mermaid-svg-6q6UJjslQQsQnVOb .node .label,#mermaid-svg-6q6UJjslQQsQnVOb .image-shape .label,#mermaid-svg-6q6UJjslQQsQnVOb .icon-shape .label{text-align:center;}#mermaid-svg-6q6UJjslQQsQnVOb .node.clickable{cursor:pointer;}#mermaid-svg-6q6UJjslQQsQnVOb .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-6q6UJjslQQsQnVOb .arrowheadPath{fill:#333333;}#mermaid-svg-6q6UJjslQQsQnVOb .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-6q6UJjslQQsQnVOb .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-6q6UJjslQQsQnVOb .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-6q6UJjslQQsQnVOb .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-6q6UJjslQQsQnVOb .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-6q6UJjslQQsQnVOb .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-6q6UJjslQQsQnVOb .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-6q6UJjslQQsQnVOb .cluster text{fill:#333;}#mermaid-svg-6q6UJjslQQsQnVOb .cluster span{color:#333;}#mermaid-svg-6q6UJjslQQsQnVOb div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-6q6UJjslQQsQnVOb .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-6q6UJjslQQsQnVOb rect.text{fill:none;stroke-width:0;}#mermaid-svg-6q6UJjslQQsQnVOb .icon-shape,#mermaid-svg-6q6UJjslQQsQnVOb .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-6q6UJjslQQsQnVOb .icon-shape p,#mermaid-svg-6q6UJjslQQsQnVOb .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-6q6UJjslQQsQnVOb .icon-shape .label rect,#mermaid-svg-6q6UJjslQQsQnVOb .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-6q6UJjslQQsQnVOb .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-6q6UJjslQQsQnVOb .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-6q6UJjslQQsQnVOb :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 安装 Gazebo/PX4/ROS
选择 world 场景
加载 SDF/URDF 模型
启动物理引擎和传感器
PX4 SITL 或 ROS 控制
QGroundControl/RViz/日志分析
2.1 PX4 中启动 Gazebo
在 PX4-Autopilot 根目录中运行:
bash
make px4_sitl gz_x500
常见 PX4 Gazebo 目标:
| 目标 | 命令 | 用途 |
|---|---|---|
| X500 四旋翼 | make px4_sitl gz_x500 |
基础多旋翼飞行 |
| X500 深度相机 | make px4_sitl gz_x500_depth |
避障、点云、视觉 |
| X500 视觉里程计 | make px4_sitl gz_x500_vision |
VIO、定位 |
| X500 下视单目相机 | make px4_sitl gz_x500_mono_cam_down |
精准降落、ArUco |
| X500 2D 激光雷达 | make px4_sitl gz_x500_lidar_2d |
碰撞预防 |
| 固定翼 | make px4_sitl gz_rc_cessna |
固定翼飞控测试 |
| VTOL | make px4_sitl gz_standard_vtol |
垂起固定翼 |
| Rover | make px4_sitl gz_rover_ackermann |
地面车 |
2.2 改变仿真速度
PX4 Gazebo 支持 lockstep,同步 PX4 与 Gazebo 时间。可以加快或放慢仿真:
bash
PX4_SIM_SPEED_FACTOR=2 make px4_sitl gz_x500
PX4_SIM_SPEED_FACTOR=0.5 make px4_sitl gz_x500
2.3 选择世界
PX4 支持默认世界、Aruco、Baylands、Rover、Walls、Windy、Moving Platform 等。示例:
bash
PX4_GZ_WORLD=windy make px4_sitl gz_x500
PX4_GZ_MODEL_POSE=0,0,2.2 PX4_GZ_WORLD=moving_platform make px4_sitl gz_standard_vtol
3. PX4 的模型是怎么设计实现的
PX4 Gazebo 模型通常由这些部分组成:
#mermaid-svg-1aypGvQwAV6gCzml{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-1aypGvQwAV6gCzml .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-1aypGvQwAV6gCzml .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-1aypGvQwAV6gCzml .error-icon{fill:#552222;}#mermaid-svg-1aypGvQwAV6gCzml .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-1aypGvQwAV6gCzml .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-1aypGvQwAV6gCzml .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-1aypGvQwAV6gCzml .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-1aypGvQwAV6gCzml .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-1aypGvQwAV6gCzml .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-1aypGvQwAV6gCzml .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-1aypGvQwAV6gCzml .marker{fill:#333333;stroke:#333333;}#mermaid-svg-1aypGvQwAV6gCzml .marker.cross{stroke:#333333;}#mermaid-svg-1aypGvQwAV6gCzml svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-1aypGvQwAV6gCzml p{margin:0;}#mermaid-svg-1aypGvQwAV6gCzml .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-1aypGvQwAV6gCzml .cluster-label text{fill:#333;}#mermaid-svg-1aypGvQwAV6gCzml .cluster-label span{color:#333;}#mermaid-svg-1aypGvQwAV6gCzml .cluster-label span p{background-color:transparent;}#mermaid-svg-1aypGvQwAV6gCzml .label text,#mermaid-svg-1aypGvQwAV6gCzml span{fill:#333;color:#333;}#mermaid-svg-1aypGvQwAV6gCzml .node rect,#mermaid-svg-1aypGvQwAV6gCzml .node circle,#mermaid-svg-1aypGvQwAV6gCzml .node ellipse,#mermaid-svg-1aypGvQwAV6gCzml .node polygon,#mermaid-svg-1aypGvQwAV6gCzml .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-1aypGvQwAV6gCzml .rough-node .label text,#mermaid-svg-1aypGvQwAV6gCzml .node .label text,#mermaid-svg-1aypGvQwAV6gCzml .image-shape .label,#mermaid-svg-1aypGvQwAV6gCzml .icon-shape .label{text-anchor:middle;}#mermaid-svg-1aypGvQwAV6gCzml .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-1aypGvQwAV6gCzml .rough-node .label,#mermaid-svg-1aypGvQwAV6gCzml .node .label,#mermaid-svg-1aypGvQwAV6gCzml .image-shape .label,#mermaid-svg-1aypGvQwAV6gCzml .icon-shape .label{text-align:center;}#mermaid-svg-1aypGvQwAV6gCzml .node.clickable{cursor:pointer;}#mermaid-svg-1aypGvQwAV6gCzml .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-1aypGvQwAV6gCzml .arrowheadPath{fill:#333333;}#mermaid-svg-1aypGvQwAV6gCzml .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-1aypGvQwAV6gCzml .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-1aypGvQwAV6gCzml .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-1aypGvQwAV6gCzml .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-1aypGvQwAV6gCzml .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-1aypGvQwAV6gCzml .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-1aypGvQwAV6gCzml .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-1aypGvQwAV6gCzml .cluster text{fill:#333;}#mermaid-svg-1aypGvQwAV6gCzml .cluster span{color:#333;}#mermaid-svg-1aypGvQwAV6gCzml div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-1aypGvQwAV6gCzml .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-1aypGvQwAV6gCzml rect.text{fill:none;stroke-width:0;}#mermaid-svg-1aypGvQwAV6gCzml .icon-shape,#mermaid-svg-1aypGvQwAV6gCzml .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-1aypGvQwAV6gCzml .icon-shape p,#mermaid-svg-1aypGvQwAV6gCzml .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-1aypGvQwAV6gCzml .icon-shape .label rect,#mermaid-svg-1aypGvQwAV6gCzml .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-1aypGvQwAV6gCzml .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-1aypGvQwAV6gCzml .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-1aypGvQwAV6gCzml :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} PX4 Gazebo 模型目录
model.sdf
model.config
meshes 视觉/碰撞网格
传感器定义
Gazebo 插件
link: 机臂/机身/电机/云台
joint: 固定/转动/云台关节
质量/惯量/重心
PX4 GZ Bridge/MAVLink
核心设计点:
| 模块 | 设计内容 |
|---|---|
| 几何外形 | 视觉 mesh 和碰撞体 collision 可分开,视觉好看,碰撞简单 |
| 质量属性 | 每个 link 要设置 mass、inertia、pose,否则动力学不可信 |
| 电机/旋翼 | 由关节、推进力模型、控制通道映射共同决定 |
| 传感器 | camera、depth camera、lidar、IMU、GPS 等在 SDF 中定义 |
| 插件 | 处理升力、阻力、风、传感器输出、飞控接口 |
| 参数映射 | PX4 airframe 参数决定机型、执行器数量、控制分配 |
4. 怎么实现模拟仿真
无人机仿真不是只显示一个模型,而是把飞控、动力学、传感器、环境和地面站串起来:
ROS 2/RViz QGroundControl Gazebo PX4 SITL ROS 2/RViz QGroundControl Gazebo PX4 SITL #mermaid-svg-JVhMNOo54JuqAC35{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-JVhMNOo54JuqAC35 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-JVhMNOo54JuqAC35 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-JVhMNOo54JuqAC35 .error-icon{fill:#552222;}#mermaid-svg-JVhMNOo54JuqAC35 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-JVhMNOo54JuqAC35 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-JVhMNOo54JuqAC35 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-JVhMNOo54JuqAC35 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-JVhMNOo54JuqAC35 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-JVhMNOo54JuqAC35 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-JVhMNOo54JuqAC35 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-JVhMNOo54JuqAC35 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-JVhMNOo54JuqAC35 .marker.cross{stroke:#333333;}#mermaid-svg-JVhMNOo54JuqAC35 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-JVhMNOo54JuqAC35 p{margin:0;}#mermaid-svg-JVhMNOo54JuqAC35 .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-JVhMNOo54JuqAC35 text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-JVhMNOo54JuqAC35 .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-JVhMNOo54JuqAC35 .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-JVhMNOo54JuqAC35 .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-JVhMNOo54JuqAC35 .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-JVhMNOo54JuqAC35 #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-JVhMNOo54JuqAC35 .sequenceNumber{fill:white;}#mermaid-svg-JVhMNOo54JuqAC35 #sequencenumber{fill:#333;}#mermaid-svg-JVhMNOo54JuqAC35 #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-JVhMNOo54JuqAC35 .messageText{fill:#333;stroke:none;}#mermaid-svg-JVhMNOo54JuqAC35 .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-JVhMNOo54JuqAC35 .labelText,#mermaid-svg-JVhMNOo54JuqAC35 .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-JVhMNOo54JuqAC35 .loopText,#mermaid-svg-JVhMNOo54JuqAC35 .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-JVhMNOo54JuqAC35 .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-JVhMNOo54JuqAC35 .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-JVhMNOo54JuqAC35 .noteText,#mermaid-svg-JVhMNOo54JuqAC35 .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-JVhMNOo54JuqAC35 .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-JVhMNOo54JuqAC35 .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-JVhMNOo54JuqAC35 .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-JVhMNOo54JuqAC35 .actorPopupMenu{position:absolute;}#mermaid-svg-JVhMNOo54JuqAC35 .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-JVhMNOo54JuqAC35 .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-JVhMNOo54JuqAC35 .actor-man circle,#mermaid-svg-JVhMNOo54JuqAC35 line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-JVhMNOo54JuqAC35 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 电机/舵机控制输出物理积分、碰撞、传感器更新IMU/GPS/气压计/里程计数据MAVLink 状态、任务、姿态图像/点云/TF/里程计Offboard 控制指令
最常见实现路线:
- 用 PX4 SITL 运行真实飞控软件。
- 用 Gazebo 运行物理世界和机体模型。
- 用 QGroundControl 连接 MAVLink,执行起飞、降落、航点任务。
- 用 ROS 2 接收图像、点云、里程计,运行 SLAM、避障、路径规划。
- 用日志工具分析姿态、位置、执行器输出、电池、电机等数据。
5. Gazebo 使用方法和用途
5.1 机器人建模
Gazebo 可直接加载 SDF,也可通过 ROS 使用 URDF/Xacro。SDF 更适合完整仿真世界;URDF 更适合 ROS 机器人描述。复杂机器人常用 Xacro 生成 URDF,再给 Gazebo 增加 <gazebo> 标签或转 SDF。
5.2 传感器算法验证
可验证:
- 相机目标识别
- 深度相机点云避障
- 2D/3D LiDAR 建图
- GPS 丢失后的视觉/惯性定位
- 光流定点
- 精准降落
5.3 多机仿真
PX4 支持多机 Gazebo 仿真。关键是给每架飞机不同实例 ID、模型名、MAVLink 端口和 ROS 命名空间。
5.4 风场、移动平台和特殊环境
Gazebo 可以配置风、移动平台、墙体、地形、水面、动态障碍物。用于无人机甲板降落、强风稳定性、避障策略和编队控制。
5.5 能否做受力分析
Gazebo 可以做运行时动力学仿真,例如重力、碰撞、摩擦、升力、阻力、关节力矩、接触力等。但它不是专业有限元软件,不能替代 Ansys、Abaqus、COMSOL 对机臂强度、螺旋桨叶片应力、结构疲劳做高精度分析。工程上通常用:
#mermaid-svg-jfHiqrlx68PvBuEH{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-jfHiqrlx68PvBuEH .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-jfHiqrlx68PvBuEH .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-jfHiqrlx68PvBuEH .error-icon{fill:#552222;}#mermaid-svg-jfHiqrlx68PvBuEH .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-jfHiqrlx68PvBuEH .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-jfHiqrlx68PvBuEH .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-jfHiqrlx68PvBuEH .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-jfHiqrlx68PvBuEH .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-jfHiqrlx68PvBuEH .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-jfHiqrlx68PvBuEH .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-jfHiqrlx68PvBuEH .marker{fill:#333333;stroke:#333333;}#mermaid-svg-jfHiqrlx68PvBuEH .marker.cross{stroke:#333333;}#mermaid-svg-jfHiqrlx68PvBuEH svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-jfHiqrlx68PvBuEH p{margin:0;}#mermaid-svg-jfHiqrlx68PvBuEH .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-jfHiqrlx68PvBuEH .cluster-label text{fill:#333;}#mermaid-svg-jfHiqrlx68PvBuEH .cluster-label span{color:#333;}#mermaid-svg-jfHiqrlx68PvBuEH .cluster-label span p{background-color:transparent;}#mermaid-svg-jfHiqrlx68PvBuEH .label text,#mermaid-svg-jfHiqrlx68PvBuEH span{fill:#333;color:#333;}#mermaid-svg-jfHiqrlx68PvBuEH .node rect,#mermaid-svg-jfHiqrlx68PvBuEH .node circle,#mermaid-svg-jfHiqrlx68PvBuEH .node ellipse,#mermaid-svg-jfHiqrlx68PvBuEH .node polygon,#mermaid-svg-jfHiqrlx68PvBuEH .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-jfHiqrlx68PvBuEH .rough-node .label text,#mermaid-svg-jfHiqrlx68PvBuEH .node .label text,#mermaid-svg-jfHiqrlx68PvBuEH .image-shape .label,#mermaid-svg-jfHiqrlx68PvBuEH .icon-shape .label{text-anchor:middle;}#mermaid-svg-jfHiqrlx68PvBuEH .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-jfHiqrlx68PvBuEH .rough-node .label,#mermaid-svg-jfHiqrlx68PvBuEH .node .label,#mermaid-svg-jfHiqrlx68PvBuEH .image-shape .label,#mermaid-svg-jfHiqrlx68PvBuEH .icon-shape .label{text-align:center;}#mermaid-svg-jfHiqrlx68PvBuEH .node.clickable{cursor:pointer;}#mermaid-svg-jfHiqrlx68PvBuEH .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-jfHiqrlx68PvBuEH .arrowheadPath{fill:#333333;}#mermaid-svg-jfHiqrlx68PvBuEH .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-jfHiqrlx68PvBuEH .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-jfHiqrlx68PvBuEH .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-jfHiqrlx68PvBuEH .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-jfHiqrlx68PvBuEH .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-jfHiqrlx68PvBuEH .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-jfHiqrlx68PvBuEH .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-jfHiqrlx68PvBuEH .cluster text{fill:#333;}#mermaid-svg-jfHiqrlx68PvBuEH .cluster span{color:#333;}#mermaid-svg-jfHiqrlx68PvBuEH div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-jfHiqrlx68PvBuEH .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-jfHiqrlx68PvBuEH rect.text{fill:none;stroke-width:0;}#mermaid-svg-jfHiqrlx68PvBuEH .icon-shape,#mermaid-svg-jfHiqrlx68PvBuEH .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-jfHiqrlx68PvBuEH .icon-shape p,#mermaid-svg-jfHiqrlx68PvBuEH .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-jfHiqrlx68PvBuEH .icon-shape .label rect,#mermaid-svg-jfHiqrlx68PvBuEH .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-jfHiqrlx68PvBuEH .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-jfHiqrlx68PvBuEH .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-jfHiqrlx68PvBuEH :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} CAD 建模
Ansys/COMSOL/SolidWorks Simulation
Gazebo 运动/控制仿真
质量/刚度/惯量/载荷参数
参考资料
- PX4 Gazebo Simulation: https://docs.px4.io/main/en/sim_gazebo_gz/
- PX4 Simulation: https://docs.px4.io/main/en/simulation/
- PX4 Gazebo Vehicles: https://docs.px4.io/v1.16/en/sim_gazebo_gz/vehicles
- PX4 Gazebo Worlds: https://docs.px4.io/main/en/sim_gazebo_gz/worlds
- Gazebo URDF/SDF: https://gazebosim.org/docs/fortress/spawn_urdf