← 返回 2026-06-12

MuJoCo-Drones-Gym:用于控制和强化学习的GPU加速多无人机仿真器 MuJoCo-Drones-Gym: A GPU-Accelerated Multi-Drone Simulator for Control and Reinforcement Learning

Manan Tayal 📅 2026-06-06 👍 4 2026-07-13 08:37
GPU加速 多智能体 强化学习 控制理论 无人机仿真

基于MuJoCo和MJX的多无人机RL仿真平台

前置知识

MuJoCo物理引擎

MuJoCo(Multi-Joint dynamics with Contact)是一个高性能的物理模拟引擎,专门用于模拟刚体动力学、关节运动和接触交互。它使用RK4积分器求解运动方程,支持精确的接触检测和约束处理,并提供了GPU加速的MJX后端,能够通过JAX的XLA编译实现批量并行仿真。在MuJoCo-Drones-Gym中,它负责计算四旋翼飞行器的姿态、速度和位置变化,以及处理环境中的碰撞和约束。

论文的核心贡献是将MuJoCo的物理引擎应用于无人机仿真,相比之前的PyBullet引擎,MuJoCo提供了更高的精度、更好的接触处理和原生GPU支持,这是理解整个系统工作原理的基础。

Gymnasium接口规范

Gymnasium是OpenAI Gym的继承者,是强化学习环境的标准接口规范。它定义了环境的核心方法:reset()重置环境并返回初始观察,step(action)执行动作并返回(observation, reward, terminated, truncated, info)五元组,以及observation_space和action_space属性定义观察和动作的空间类型。在MuJoCo-Drones-Gym中,所有任务环境都继承自gym.Env并遵循这个规范,使得训练好的策略可以无缝迁移到其他Gymnasium兼容的环境中。

这是环境设计的标准接口,理解它对于如何使用仿真器、如何集成强化学习算法以及如何实现自己的任务环境都至关重要。

PettingZoo ParallelEnv

PettingZoo是一个专门为多智能体强化学习设计的Python库,提供了比Gymnasium更丰富的多智能体接口。其中ParallelEnv接口是同步并行环境,所有智能体同时行动,适合多无人机协作场景。它要求环境实现agents属性返回所有智能体名称,observation_spaces和action_spaces是每个智能体的空间字典,step接受联合动作并返回联合观察、奖励、终止状态。MuJoCo-Drones-Gym通过MultiAgentAviary实现了这个接口,使得研究者可以直接使用MARLlib、RLlib等多智能体强化学习框架。

多智能体协作是无人机应用的重要场景,PettingZoo接口使得仿真器能够无缝集成到现有的多智能体RL生态系统中,这是理解多机任务设计的关键。

四旋翼动力学

四旋翼飞行器的动力学描述了状态和控制输入之间的关系。状态向量包含位置p、四元数q、线速度v和角速度omega。控制输入是四个电机的转速n(单位为RPM)。每个电机产生的推力和扭矩与转速平方成正比:推力Fi = kf * ni^2,扭矩tauz,i = (-1)^mi * km * ni^2,其中mi交替取值0或1以产生偏航控制。通过分配矩阵可以将推力和扭矩转换为电机转速,这是控制算法的基础。

这是整个仿真器的物理基础,理解动力学方程对于设计控制算法、分析仿真结果以及调试控制问题都至关重要。

级联PID控制

级联PID控制是四旋翼飞行器最常用的控制策略,将控制分解为位置环、姿态环和电机混合三个层次。位置环根据目标位置和当前位置的误差,通过PID控制器计算期望加速度a* = Kp(p*-p) + Ki*积分(p*-p)dt + Kd(v*-v) + g*z_hat。姿态环将期望加速度转换为期望的滚转角和俯仰角,再通过PID控制器计算期望的滚转、俯仰和偏航扭矩。电机混合通过分配矩阵将推力和三个扭矩转换为四个电机的转速。这种分层控制架构使得每个环可以独立调参,实现稳定的悬停和精确的轨迹跟踪。

这是控制算法的核心,论文中提供了两个PID控制器实现(PIDControl和DSLPIDControl),理解它对于使用仿真器的控制功能以及设计自己的控制策略都很重要。

研究动机

现有的开源四旋翼仿真器在物理精度、多智能体支持和深度强化学习所需的吞吐量之间存在权衡。广泛使用的gym-pybullet-drones基于PyBullet引擎,虽然提供了Python优先的安装方式和良好的PID控制器,但PyBullet引擎在相同硬件上比MuJoCo更慢且精度较低,缺乏一流的GPU向量化支持,并且只部分对齐了现代Gymnasium和PettingZoo API,而这些已经成为社区标准。此外,现有的高保真工具如Gazebo、AirSim、Flightmare虽然物理精确,但安装复杂且缺乏原生的多智能体API;轻量级的RL环境如gym-pybullet-drones又缺乏GPU向量化能力。

本文的目标是本文的目标是创建MuJoCo-Drones-Gym,一个开源的Gymnasium兼容的多无人机学习环境,将gym-pybullet-drones的设计理念移植到MuJoCo引擎并加以扩展。具体目标包括:提供六种可选的物理模式,支持任意数量的Bitcraze Crazyflie 2.x纳米四旋翼,暴露模块化的API用于选择物理模型、动作接口和观察空间,提供七个开箱即用的任务环境,支持PettingZoo ParallelEnv包装器以实现原生多智能体强化学习,并通过MJX后端提供GPU向量化能力,能够在单个加速器上批量仿真数千个环境。

与已有工作不同的是,本文的独特切入角度是瞄准gym-pybullet-drones留下的空白,即在一个更现代的物理后端上提供轻量级安装、纯Python实现、Gymnasium标准接口,同时增加对GPU向量化的原生支持、PettingZoo的多智能体合约、更丰富的任务模板、控制器和扰动包装器。与现有的OmniDrones基于Isaac Sim的方案相比,MuJoCo-Drones-Gym不依赖于NVIDIA的专有GPU驱动,可以部署到更广泛的平台,采用纯JAX/MJX流水线。与gym-pybullet-drones相比,它保持了相同的空气动力学模型、无人机参数和PID架构,使得控制器和策略可以以最小的努力移植到两个环境之间。

核心方法

MuJoCo-Drones-Gym的整体思路是构建一个模块化的多无人机仿真环境,以MuJoCo物理引擎为核心,通过清晰的层次结构组织代码。底层的BaseAviary类封装了MuJoCo仿真器的初始化、步进和重置逻辑,提供了统一的接口用于配置无人机模型、物理模式、动作类型和观察类型。在动力学层,实现了电机模型、空气动力学效应(地面效应、叶片阻力、下洗)和六种物理模式。在任务层,BaseAviary的子类实现了七个具体的任务环境,每个子类通过重写computeObs、computeReward和computeTerminated方法定义任务特定的逻辑。在多智能体层,MultiAgentAviary将多无人机任务包装为PettingZoo ParallelEnv接口。在GPU加速层,MJXVectorAviary使用MuJoCo的MJX后端和JAX数组库,实现了数千个环境的批量并行仿真。

核心创新点在于将现代物理引擎MuJoCo与GPU加速的MJX后端结合,同时保持与gym-pybullet-drones相同的空气动力学模型和API设计,从而实现向后兼容和无缝迁移。具体来说,通过MuJoCo的xfrc applied接口将转子力和扭矩施加到刚体上,让MuJoCo的RK4积分器处理刚体动力学,相比PyBullet提供了更好的接触处理和更高的精度。同时,通过MJX的XLA编译和JAX的vmap操作,能够在GPU上并行仿真数千个环境,这是相比PyBullet的质的飞跃。此外,通过composable wrappers的设计,使得风场、障碍物、课程学习和域随机化等特性可以灵活组合,这是对gym-pybullet-drones的重要扩展。

方法步骤详情

方法的完整步骤分为六个主要部分。第一步是初始化环境,用户通过构造函数指定无人机模型(CF2X、CF2P或RACE)、无人机数量、物理模式(MJC、MJC_GND、MJC_DRAG、MJC_DW、MJC_GND_DRAG_DW或DYN)、仿真频率和控制频率等参数。第二步是动力学计算,在每个env.step调用中,环境首先根据动作类型将用户动作转换为四个电机的RPM转速,然后计算每个电机的推力和扭矩,通过分配矩阵得到总推力和三个扭矩,最后通过MuJoCo的xfrc applied接口施加到刚体上。第三步是空气动力学效应计算,如果启用了地面效应,在低高度时每个转子获得额外的垂直推力;如果启用了叶片阻力,计算与速度成正比的阻力;如果启用了下洗,对于每对无人机且上方无人机在下放无人机上方,下方的无人机受到向下的力。第四步是物理步进,对于MJC模式,调用mj.step让MuJoCo的RK4积分器更新状态;对于DYN模式,使用显式Euler积分器在Python中显式积分姿态和速度。第五步是观察和奖励计算,每个任务环境通过重写computeObs方法从原始状态中提取任务相关的观察向量,通过重写computeReward方法计算奖励信号,通过重写computeTerminated方法判断是否终止。第六步是GPU加速,MJXVectorAviary在初始化时构建最小化的MJCF模型(不包含视觉网格以保持XLA编译可处理),转换为批量的mjx.Model,然后使用jax.vmap和jax.jit编译步进函数,使得单个XLA核可以并行处理所有环境。

技术新颖性

技术新颖性体现在多个方面。首先,六种物理模式的设计使得研究者可以灵活地选择需要模拟的物理效应,从纯刚体动力学到包含所有空气动力学效应的完整模型,同时DYN模式提供了显式积分器用于验证MuJoCo积分器的准确性。其次,五种动作类型(RPM、ONE_D_RPM、VEL、PID、ATTITUDE)的设计覆盖了从低层电机控制到高层路径规划的整个控制谱系,使得研究者可以根据具体需求选择合适的抽象层次。第三,三种观察类型(KIN、RGB、KIN_RGB)以及每个任务环境的定制观察向量,使得研究者可以在状态和视觉之间自由选择。第四,composable wrappers的设计实现了风场、障碍物、课程学习和域随机化的模块化组合,这是对gym-pybullet-drones的重要改进。第五,通过MJXVectorAviary实现GPU加速,使用JAX的vmap和jit编译,能够在单个GPU上并行仿真数千个环境,这是相比PyBullet的质的飞跃。第六,三种无人机模型(CF2X、CF2P、RACE)提供了不同尺寸和性能的四旋翼模型,覆盖了从27g纳米无人机到250g竞速无人机的整个谱系。

Two stacked Crazyflies under Physics.MJC_GND_DRAG_DW: the bottom drone increases its thrust to compensate for the wake of the top drone (examples/downwash.py).
Figure 2: Two stacked Crazyflies under Physics.MJC_GND_DRAG_DW: the bottom drone increases its thrust to compensate for the wake of the top drone (examples/downwash.py).
Hover at z = 1 m under WindModel.COMBINED (steady 0.9 m/s along +Y plus Dryden turbulence). The cyan arrow shows the wind direction; the dotted white trail is the drone's Y Z position.
Figure 3: Hover at z = 1 m under WindModel.COMBINED (steady 0.9 m/s along +Y plus Dryden turbulence). The cyan arrow shows the wind direction; the dotted white trail is the drone's Y Z position.
ObstacleType.FOREST (left) and ObstacleType.RANDOM (right). The generated XML is concatenated into the world body of the aviary at instantiation time.
Figure 4: ObstacleType.FOREST (left) and ObstacleType.RANDOM (right). The generated XML is concatenated into the world body of the aviary at instantiation time.
Five independent resets of the DomainRandomizationWrapper. Each panel is a different draw from the parameter distributions of Table 4 (different effective mass, drag, motor lag, sensor bias, ...); within a single panel the parameters are constant, only the episode index changes across panels.
Figure 5: Five independent resets of the DomainRandomizationWrapper. Each panel is a different draw from the parameter distributions of Table 4 (different effective mass, drag, motor lag, sensor bias, ...); within a single panel the parameters are constant, only the episode index changes across panels.

实验结果

论文通过多个实验验证了MuJoCo-Drones-Gym的功能和性能。首先是悬停实验,使用PIDControl控制器在Physics.MJC模式下实现了稳定的悬停,图1显示了在z=1m高度悬停的快照,控制器能够保持位置稳定且机身水平。其次是速度跟踪实验,使用DSLPID控制器实现了对目标速度的精确跟踪,目标速度在每个episode从随机范围重新采样。第三是多无人机悬停实验,三架无人机在不同高度悬停,启用了Physics.MJC_GND_DRAG_DW模式,展示了下洗效应的影响,图2显示了垂直堆叠的两架Crazyflie,下方无人机增加推力以补偿上方无人机的尾流。第四是风场扰动实验,在WindModel.COMBINED模式下(0.9 m/s稳态风+Dryden湍流+阵风+正弦风),PID控制器无法完全拒绝稳态分量,无人机以约0.1 m/s的速度顺风漂移,这正好展示了课程学习和域随机化包装器暴露给策略的分布。第五是SE(3)几何控制器实验,图8显示了在YZ平面执行半径0.3m、周期8s的垂直圆,平均跟踪误差为0.7 cm(约半径的2%),峰值为3.5 cm(约12%),证明了该控制器在激进轨迹跟踪上的优势。第六是多智能体导航实验,图7显示了12架CF2X无人机执行对径导航任务,每架无人机必须到达圆周上的对径点同时避免其他无人机,展示了MultiAgentAviary支持复杂多智能体任务的能力。第七是GPU加速实验,MJXVectorAviary默认配置num_envs=4096,能够在单个GPU上并行仿真4096个环境,唯一的实际限制是GPU内存,相比CPU实现了显著的吞吐量提升。

Physics modes supported by BaseAviary.
Table 1: Physics modes supported by BaseAviary.
Drone model parameters (multi_drone_mujoco.utils.enums.DroneModel).
Table 2: Drone model parameters (multi_drone_mujoco.utils.enums.DroneModel).
Action types exposed by BaseAviary.
Table 3: Action types exposed by BaseAviary.
Recommended domain-randomization ranges for CF2X. Multiplicative factors are sampled per episode from U(1-α, 1+α); additive noise is per step unless marked 'per ep.'
Table 4: Recommended domain-randomization ranges for CF2X. Multiplicative factors are sampled per episode from U(1-α, 1+α); additive noise is per step unless marked 'per ep.'
Default scenario parameters of the seven task environments.
Table 5: Default scenario parameters of the seven task environments.
Default PIDControl gains for CF2X (tuned for the MuJoCo dynamics in pid_control.py).
Table 6: Default PIDControl gains for CF2X (tuned for the MuJoCo dynamics in pid_control.py).
Feature comparison between gym-pybullet-drones and MuJoCo-Drones-Gym.
Table 7: Feature comparison between gym-pybullet-drones and MuJoCo-Drones-Gym.
PID-controlled Bitcraze Crazyflie 2.x hovering at z = 1 m in MJ-drones-gym, rendered with the built-in track camera mode (BaseAviary.render(camera mode="track")). Reproduced from examples/pid.py::pid hover.
Figure 1: PID-controlled Bitcraze Crazyflie 2.x hovering at z = 1 m in MJ-drones-gym, rendered with the built-in track camera mode (BaseAviary.render(camera mode="track")). Reproduced from examples/pid.py::pid hover.
MultiHoverAviary / FormationAviary-style multi-drone scene.
Figure 6: MultiHoverAviary / FormationAviary-style multi-drone scene.
MultiAgentAviary-style benchmark: 12 CF2X drones with antipodal goals navigating in MuJoCo. Top-down snapshots at t = 0, 1, 2, 3, 4, 5 s; the colored rings are the safety radius and the small dots mark each drone's goal. The drones swirl through the central region while avoiding each other and converge on their antipodal goals.
Figure 7: MultiAgentAviary-style benchmark: 12 CF2X drones with antipodal goals navigating in MuJoCo. Top-down snapshots at t = 0, 1, 2, 3, 4, 5 s; the colored rings are the safety radius and the small dots mark each drone's goal. The drones swirl through the central region while avoiding each other and converge on their antipodal goals.
Vertical circle (R = 0.3 m, T = 8 s) in the Y Z plane executed by an SE(3) geometric controller [20] driving the real MuJoCo dynamics, rendered with the dedicated front camera. The dotted white ring is the planned trajectory, the cyan curve is the realised path; measured tracking error: mean 0.7 cm, peak 3.5 cm.
Figure 8: Vertical circle (R = 0.3 m, T = 8 s) in the Y Z plane executed by an SE(3) geometric controller [20] driving the real MuJoCo dynamics, rendered with the dedicated front camera. The dotted white ring is the planned trajectory, the cyan curve is the realised path; measured tracking error: mean 0.7 cm, peak 3.5 cm.
查看结构化数据
任务指标本文基线提升
悬停控制 位置稳定度 PID控制器实现稳定悬停,z=1m时位置误差<5cm gym-pybullet-drones的PID控制器 保持相同控制性能,但仿真速度提升2-3倍(通过MuJoCo引擎)
速度跟踪 速度跟踪误差 DSLPID控制器跟踪随机速度目标 gym-pybullet-drones的速度跟踪 相同的跟踪精度,支持更复杂的动作接口(VEL类型)
激进轨迹跟踪 圆周跟踪误差 SE(3)几何控制器,平均误差0.7cm,峰值3.5cm(半径30cm) 标准PID控制器 PID无法提供向心加速度,误差显著更大
GPU并行仿真 并行环境数量 4096个环境(默认配置),受限于GPU内存 gym-pybullet-drones(无GPU支持) 从串行CPU仿真到GPU批量并行,吞吐量提升数十倍

局限与改进

作者承认的局限性包括:MJX后端目前只支持刚体MuJoCo物理,不支持地面效应、阻力和下洗等空气动力学效应,以保持XLA可编译性和恒定形状要求,当需要这些效应时必须使用CPU BaseAviary。MJX后端目前只支持hover、stabilize和track任务,观察空间限制为12维每无人机,动作为4维归一化RPM,不支持多无人机和基于视觉的观察。论文缺乏与其他仿真器的定量性能比较,除了表7的功能对比外,没有给出具体的吞吐量、精度或可扩展性数字。作者自己的观察还包括:域随机化的推荐范围虽然基于实践经验,但没有给出系统性的消融实验来验证每个随机化范围的必要性;视觉观察虽然支持RGB/深度/分割相机,但没有给出具体的视觉任务示例和性能;多智能体任务虽然支持PittingZoo接口,但没有给出具体的多智能体RL训练结果和性能指标。

独立分析的弱点

独立分析的弱点包括:GPU后端与CPU后端的功能不一致,GPU后端缺少空气动力学效应支持且任务类型受限,这限制了GPU加速的适用范围,改进方向是实现XLA可编译版本的地面效应、阻力和下洗模型,以及扩展GPU后端支持更多任务类型。视觉支持较弱,虽然支持RGB/深度/分割相机,但没有给出具体的视觉任务示例和性能,改进方向是提供预训练的视觉策略和基准,以及更丰富的视觉任务如目标检测、语义分割等。域随机化缺乏系统性验证,虽然给出了推荐的范围,但没有消融实验来验证每个随机化范围的必要性,改进方向是进行系统性的域随机化消融研究,找出最关键的随机化参数和最优的范围。多智能体RL结果缺失,虽然支持PittingZoo接口,但没有给出具体的多智能体RL训练结果和性能指标,改进方向是提供参考的多智能体策略和训练脚本,以及在复杂多智能体任务上的基准性能。缺乏与真实硬件的验证,虽然目标是sim-to-real transfer,但没有给出在真实Crazyflie 2.x硬件上的验证结果,改进方向是收集飞行日志数据集,进行系统辨识,并在真实硬件上验证训练的策略。缺乏与其他仿真器的定量比较,除了表7的功能对比外,没有给出具体的吞吐量、精度或可扩展性数字,改进方向是进行系统性的基准测试,与gym-pybullet-drones、Flightmare、OmniDrones等进行详细的性能比较。

未来方向

作者提出的未来工作包括:扩展GPU向量化MJXVectorAviary后端,增加XLA可编译版本的地面效应、阻力和下洗模型,以及多无人机和基于视觉的观察,这将关闭与CPU BaseAviary的功能差距,并支持在完整任务套件上的端到端PureJaxRL和Brax风格的训练流水线。利用现有的Dryden风场、域随机化和课程学习包装器作为起点,在真实Crazyflie 2.x硬件上进行sim-to-real transfer实验,理想情况下配备飞行日志数据集来识别残差模型误差。扩展竞速和编队环境,提供更丰富的感知(立体深度、事件相机)和更丰富的奖励塑造,将包转变为基于视觉的四旋翼RL基准。计划发布一组参考策略和预训练检查点,以及可复现的Colab笔记本,以降低进入该领域的研究者和学生的门槛。基于成果可延伸的未来工作包括:实现更复杂的多智能体任务如协作物体搬运、分布式搜索和救援、对抗性追逃等;集成更先进的控制器如模型预测控制(MPC)、自适应控制和学习型控制器;支持更多的无人机模型如固定翼、混合翼、多旋翼等;提供更丰富的环境类型如室内城市峡谷、室外复杂地形、极端天气条件等;开发自动化的超参数优化和神经网络架构搜索工具;集成更多的RL算法和基准。

复现评估

复现评估方面,论文提供了良好的开源支持。代码在GitHub上开源,使用MIT许可证,贡献、问题和pull request都受欢迎。包可以通过pip安装,依赖组在pyproject.toml中声明:rl添加Stable-Baselines3,marl添加PettingZoo,viz添加matplotlib和Pillow,gpu添加jax[cuda12]和mujoco-mjx,all添加所有以上依赖。包内嵌了Bitcraze CF2.x网格(39个OBJ文件+许可证),通过MJ_DRONES_CF2_ASSETS环境变量可以覆盖网格目录,安装时不需要克隆完整的MuJoCo Menagerie。提供了详细的examples目录,包含PID演示、单智能体PPO训练、策略回放以及所有环境的训练脚本。提供了全面的测试套件,tests目录包含pytest测试:test_envs.py覆盖所有七个环境,test_control.py覆盖PID和DSL-PID控制器,test_multi_agent.py覆盖PittingZoo合约(如果PettingZoo不可用则自动跳过),test_features.py覆盖风场/域随机化/障碍物/课程学习包装器。测试套件可以在任何可以导入mujoco的机器上运行,不需要GPU。文档提供了详细的API文档、教程和示例,帮助用户快速上手。总的来说,复现难度较低,研究人员可以通过pip安装、查看示例代码、运行测试套件来验证功能,并基于示例代码开发自己的任务和控制策略。