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。
  • 轨迹跟踪。
  • 视觉定位。
  • 强化学习控制。
  • 最终上真实小飞机。

但现在先别想太远。

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

algorithms axis-angle bang-bang bode calibration chrome cmake cmakelists cnn colcon conan control cpp cpu d435i data_struct db design-pattern dots economics eigen factory-pattern fcpx figure finance forge fov gazebo gdb git gnu ibus interest isaac gym isaaclab kdl latex launch learning-notes legged locomotion legged-robot life linux mac math matlab matrix memory mlp money motion-control motor moveit mpc mujoco network ocs2 ode operator optimal algorithm optimal-control perf performance personal-finance ppo profiling python qos quadrotor realsense reinforcement learning rnn robot robotics ros ros2 rtb security shell simulation stl thread tools twist ubuntu uml unitree urdf vae valgrind vcxsrv velocity vim web wifi work wsl 中文输入 交叉编译 依赖管理 分支管理 四足机器人 实验诊断 强化学习 机器人视觉 构建系统 深度学习 深度相机 点云 版本控制 神经网络 训练曲线 输入法 配置类 飞控
知识共享许可协议