前言
之前的所有仿真实验的环境都是基于Gazebo,虽然Gazebo对于ros的支持较好,网络上教程较多且上手较低,但Gazebo是通用的机器人仿真平台,对于后续更深入的强化学习相关无人机项目的支持还是太低了。因此,尝试更换为基于unity的flightmare仿真器,其视觉渲染能力更强、更适合RL与并行仿真训练。不过对于入门的无人机仿真学习,仍然推荐使用Gazebo,当建立起无人机仿真环境的结构化思想后再转换到flightmare。
Flightmare介绍
Flightmare 是专为无人机仿真设计的高性能仿真框架,由苏黎世联邦理工学院(ETH Zurich)开发。其核心设计目标是为视觉导航和强化学习任务提供高质量的图像渲染与高效的动力学仿真。
主要特点
- 渲染与仿真分离:物理动力学计算与图像渲染运行在独立进程中,通过 ZMQ 通信。渲染器基于 Unity 引擎,能生成逼真的光照、纹理、深度图,适合视觉导航任务。
- 高性能仿真:由于物理计算不受渲染帧率限制,在不启动渲染器时可超实时运行,适合强化学习的大规模训练场景。
- 灵活的使用模式:
- 纯 Python/C++ 模式:通过 flightgym 接口直接调用,无需 ROS
- ROS 模式:提供 ROS 话题接口,可复用现有 ROS 生态
- PX4 SITL 模式:作为 PX4 的物理仿真后端,替换 Gazebo,保留完整飞控栈
- 与 PX4 集成:支持 PX4 SITL + MAVROS 工作流,现有基于 Gazebo 的导航代码无需修改即可迁移。
如何理解渲染与仿真分离?
首先要理解两部分的作用分别是什么,渲染器是根据无人机的位姿与地图环境,告诉摄像机能够看到什么;而仿真器则是根据无人机的推力,计算出无人机会运动到什么位置。在理解了两部分的作用后自然能理解,在Gazebo仿真中,Gazebo同时负责了两部分;而在flightmare中,其unity模块负责根据无人机的位置与地图给出摄像头能看到的内容,其动力学模块负责计算出无人机的位置。
各仿真器的对比
| 仿真器 | 核心特点 | 主要优点 | 主要缺点 | 适合领域 | 适用人群 |
|---|---|---|---|---|---|
| Gazebo | ROS 官方标准 | 生态最成熟,插件极其丰富 | 视觉效果一般,物理仿真较慢 | 系统集成、全栈导航测试 | 机器人开发者、ROS 用户 |
| AirSim | UE4 引擎驱动 | 视觉最真实,传感器最全面 | 微软停止维护,资源消耗大 | 视觉感知、SLAM、环境识别 | 计算机视觉研究者 |
| Flightmare | 物理渲染解耦 | 物理极速,支持大规模并行 | 环境构建较复杂,生态相对小 | 敏捷飞行、高性能控制 | 飞控算法工程师 |
| Isaac Lab | 全 GPU 加速 | 吞吐量极大,训练效率极高 | 硬件门槛高(显卡),学习较难 | 大规模集群、深度强化学习 | AI 与强化学习研究者 |
目前为止,在无人机领域还没有比较统一的仿真器,需要根据自己的情况选择使用。在此处,因为flightmare对于视觉环境与强化学习的良好支持,以及其较小的体积而选择它。 |
与Gazebo举例对比
启动方式
Gazebo:
roslaunch rotors_simulator mav_hovering_example.launch
或 PX4+Gazebo
roslaunch px4 mavros_posix_sitl.launch
Flightmare:
先启动 Unity 渲染器(独立进程)
./FlightmareUnity.x86_64
再启动 ROS 节点
roslaunch flightros flight_pilot.launch
Flightmare 的渲染器和仿真器是分离的两个进程,通过 ZMQ 通信。
传感器数据获取
Gazebo — 通过 ROS topic 直接订阅:
1 | rospy.Subscriber("/camera/image_raw", Image, callback) |
Flightmare — 通过 C++ API 或 Python 接口:
1 | from flightgym import QuadrotorEnv_v1 |
obs 直接包含图像、状态等
控制接口
Gazebo(配合 MAVROS):
发布位置指令
pub = rospy.Publisher('/mavros/setpoint_position/local', PoseStamped)
需要处理飞控状态机(OFFBOARD模式等)
Flightmare:
直接发送底层控制量(集体推力 + 角速度)
1
2
command = np.array([thrust, wx, wy, wz])
env.step(command)
跳过飞控层,直接控制动力学
1 | command = np.array([thrust, wx, wy, wz]) |
强化学习集成
Gazebo: 需要自己封装 gym 环境,速度慢,不适合大规模训练。Flightmare: 原生支持,内置 gym 接口:
1
2
3
4
from flightgym import QuadrotorEnv_v1
import gym
env = gym.make("quadrotor-v1")
可直接用 stable-baselines3 等框架训练
1 | from flightgym import QuadrotorEnv_v1 |
典型工作流对比
Gazebo 工作流:
PX4/ArduPilot → MAVROS → ROS节点 → Gazebo物理 → Gazebo渲染
Flightmare 工作流:
控制策略 → Flightmare动力学 → ZMQ → Unity渲染
↓
(可选) ROS bridge