ROS2 + MuJoCo 飞控学习 00:为什么先从仿真开始

写在前面

我想用 ROS2 玩飞控,但不想一开始就买硬件、装机架、调电调、担心炸机。

所以这个系列先从仿真开始:

MuJoCo 四旋翼动力学
↓
基础传感器:IMU / 里程计 / 位姿
↓
姿态控制 / 高度控制 / 位置控制
↓
ROS2 节点封装与话题通信
↓
再考虑 PX4 / MAVLink / 真机

这不是一个“我已经全部学完然后来写教程”的系列,而是一个从零开始的公开实验日志。目标很简单:一点点把 ROS2、MuJoCo 和飞控控制链路跑通。

为什么先选 MuJoCo

飞控仿真有很多路线,比如 Gazebo、AirSim、jMAVSim、Isaac Sim、MuJoCo 等。PX4 官方生态里 Gazebo 更顺,但我这次更想先用 MuJoCo,原因有三个:

  1. 动力学仿真比较干净
    MuJoCo 很适合研究刚体动力学、接触、执行器、传感器建模。对学习控制来说,反馈比较直接。

  2. 模型文件清晰
    MJCF/XML 能直接描述 body、joint、actuator、sensor。对理解无人机模型很有帮助。

  3. 适合先学控制本身
    一开始不急着接完整飞控栈,而是先理解:电机推力怎么产生、姿态怎么稳定、高度怎么闭环。

也就是说,MuJoCo 这条线更像是:

先把“飞机为什么能稳住”学明白,
再去接更完整的工程系统。

ROS2、MuJoCo、飞控分别负责什么

我先把角色关系粗略拆开:

MuJoCo

负责物理世界:

  • 四旋翼机体质量、惯量。
  • 螺旋桨/电机近似模型。
  • 重力和动力学积分。
  • IMU、位姿、速度等仿真传感器。

ROS2

负责软件系统:

  • 节点组织。
  • 话题通信。
  • 参数管理。
  • 可视化与日志。
  • 后续和导航、感知、规划模块连接。

控制器

负责把目标变成动作:

  • 给定目标高度,输出总推力。
  • 给定目标姿态,输出滚转/俯仰/偏航力矩。
  • 再把力和力矩分配到四个电机。

可以先简单理解成:

目标位置/姿态
↓
控制器 PID / geometric controller
↓
电机转速或推力
↓
MuJoCo 更新物理状态
↓
传感器反馈给控制器

第一阶段目标:让四旋翼悬停

最小闭环目标不是自主导航,也不是 SLAM,而是:悬停。

如果连悬停都没跑稳,后面的轨迹跟踪、避障、视觉导航都只是堆东西。

第一阶段我希望做到:

  • 能加载一个四旋翼 MuJoCo 模型。
  • 能读取机体位置、速度、姿态、角速度。
  • 能给四个电机输入控制量。
  • 写一个最基础的高度 PID。
  • 写一个姿态稳定控制。
  • 最后让飞机在空中稳定悬停几秒钟。

可能使用的开源项目

先记录几个后面会重点看的项目:

MuJoCo

https://github.com/google-deepmind/mujoco

官方物理引擎。本系列的底层仿真环境。

mujoco_menagerie

https://github.com/google-deepmind/mujoco_menagerie

Google DeepMind 维护的 MuJoCo 模型库。里面有很多质量比较高的机器人模型,可以参考它的建模方式。

mujoco_ros2_control

https://github.com/ros-controls/mujoco_ros2_control

把 MuJoCo 接到 ROS2 control 的项目。后面如果想更标准地接 ROS2 控制链路,这个项目很值得研究。

PX4-Autopilot

https://github.com/PX4/PX4-Autopilot

虽然这条系列先用 MuJoCo,但 PX4 仍然是后续值得接入的飞控生态。等基础控制熟悉后,可以再看 PX4 Offboard、uXRCE-DDS、MAVLink 等内容。

暂定学习路线

00:路线选择

也就是这篇:先把为什么用 MuJoCo、为什么从仿真开始说清楚。

01:环境搭建

计划包括:

  • Ubuntu 版本选择。
  • ROS2 Humble / Jazzy 选择。
  • MuJoCo 安装。
  • Python binding 测试。
  • 简单模型加载。

02:四旋翼模型拆解

重点看:

  • body 层级。
  • mass / inertia。
  • actuator。
  • sensor。
  • 电机推力和力矩怎么近似。

03:读取状态与传感器

包括:

  • 世界系位置。
  • 机体系速度。
  • 四元数姿态。
  • 角速度。
  • IMU 数据。

04:高度控制

从最简单的高度 PID 开始:

目标高度 z_ref
↓
高度误差 e_z
↓
PID 输出总推力
↓
平均分配给四个电机

05:姿态控制

让飞机不乱翻:

  • roll 控制。
  • pitch 控制。
  • yaw 控制。
  • 角速度阻尼。

06:位置控制

在悬停基础上,让飞机前后左右移动。

07:ROS2 化

把仿真和控制拆成 ROS2 节点:

/mujoco_sim
/controller
/state_estimator
/trajectory_publisher

可能的话,先设计这些话题:

/imu
/odom
/tf
/cmd_motor
/cmd_pose
/cmd_vel

先不做什么

为了避免一开始摊子太大,先不做这些:

  • 不急着买真实飞控。
  • 不急着接 PX4。
  • 不急着做视觉 SLAM。
  • 不急着做强化学习。
  • 不急着追求漂亮 UI。

先把最核心的闭环跑通。

当前结论

这个系列的第一目标是:

用 MuJoCo 搭一个能跑起来的四旋翼仿真环境,再用 ROS2 逐步组织控制、状态和可视化。

如果一切顺利,后面可以自然扩展到:

  • PX4 Offboard。
  • MAVLink / MAVSDK。
  • 轨迹跟踪。
  • 视觉定位。
  • 强化学习控制。
  • 最终上真实小飞机。

但现在先别想太远。

第一步就是:让仿真里的飞机稳稳悬停。

知识共享许可协议