MIT Cheetah-Software架构解析

📅 2026/8/27 19:53:09
MIT Cheetah-Software架构解析
前言MIT Cheetah 是 MIT 仿生机器人实验室在金相培Sangbae Kim教授主持下发展的电动四足机器人系列Cheetah 1/2/3 与 Mini Cheetah。它用可反驱、高转矩密度的本体感受执行器取代液压使机器人在高速奔跑、越障跳跃乃至后空翻的同时把运输成本做到与动物相当并证明动态步态可用机载凸模型预测控制实时求解。2019 年开源的 Cheetah-Software 把仿真与真机控制打成同一套可复现框架Mini Cheetah 则把大型样机“不敢试、坏一次修一个月”变成可日复一日迭代的研究平台。该项目改写了“高性能腿足必须用液压”的默认路径成为后来准直驱四足、高校课程与 Unitree 等开源生态的重要基线并向 Boston Dynamics、人形公司及多所高校输送了核心人才是当代腿足机器人从实验室样机走向可复制研究基础设施的标志性工作。Cheetah-Software 是 MIT Biomimetics 实验室为 Mini Cheetah 与 Cheetah 3 写的机器人控制与仿真软件。它把「高层运动控制」和「底层硬件/仿真」拆开同一套 RobotController 既能挂到 Qt 仿真器也能挂到真实机载电脑。本文将用Kruchten 41 架构视图模型来分析Cheetah-Software架构。Kruchten 41 架构视图模型简介Kruchten 41 视图模型Philippe Kruchten1995IEEE Software用来解决一件事软件架构很难用一张图说清因为用户、开发者、系统工程师、项目经理关心的不是同一件事。于是用四个并列视图分别写架构再用一组场景把它们串起来、验证起来所以叫 41。Kruchten 41 架构视图模型包括四个视图即逻辑视图、进程视图、开发视图 、物理视图“1”场景 / 用例视图。选少量关键用例场景画出对象之间、进程之间的交互。它用来发现架构元素、说明四个视图如何协同、校验设计是否站得住。因为内容和另外四个有重叠所以不是第五根并列的柱子而是粘合剂所以写作 1。1逻辑视图Logical View描述系统静态结构解决功能如何分解。聚焦软件内部的功能模块、领域对象、职责划分是架构最核心的业务蓝图。面向对象时就是类/对象及其关系。2进程视图Process View运行时谁在跑、如何并发与通信。关注性能、可用性、伸缩对应非功能需求。3开发视图Development View代码、模块、包、库在开发环境里怎么组织面向程序员和配置管理。4物理视图 (Physical View)软件如何落到机器和网络上面向系统工程师关心分布、拓扑、容错。下文将以这四个视图为视角对Cheetah-Software展开介绍。1. 逻辑视图逻辑视图描述功能分解谁负责感知、谁负责决策、谁负责执行。本项目的核心抽象是「同一套控制代码对仿真和真机长得一样」。1.1 分层功能结构1.1.1 应用控制层user用户写一个继承 RobotController 的类实现 initializeController()、runController()。主控制器是 MIT_Controller另外还有 JPos_Controller、Example_Leg_InvDyn、MiniCheetahSpi_Controller 这类示例。MIT_Controller 内部用 ControlFSM 调度行为而不是把所有算法堆在一个 run() 里。1.1.2 运行框架层robotRobotRunner 以固定周期调用估计器、腿部接口、用户控制器。SimulationBridge / HardwareBridge 把「仿真共享内存」或「真机总线」适配成同一套指针IMU、腿数据、手柄、可视化。main_helper() 根据命令行 m|3机型和 s|r仿真/真机选择桥接。1.1.3 公共算法层common库名 biomimetics动力学Quadruped、FloatingBaseModel、DynamicsSimulator。腿控制LegController 屏蔽 Mini Cheetah 的 SPI Spine 与 Cheetah 3 的 TI Board。状态估计StateEstimatorContainer 可插拔多个 GenericEstimator。步态与足端轨迹GaitScheduler、FootSwingTrajectory。1.1.4 仿真表现层simSimulation 做刚体积分、碰撞、低层板卡仿真。Graphics3D SimControlPanel 提供 Qt 界面、手柄、参数面板。1.1.5 逻辑视图功能分层图1.2 控制闭环中的关键对象一次控制周期RobotRunner::run()的逻辑顺序如下。1.2.1 状态估计1StateEstimatorContainer::run() 依次跑已注册的估计器。2真机/正常仿真VectorNavOrientationEstimator姿态来自 IMU 四元数 LinearKFPositionVelocityEstimator18 维卡尔曼滤波估计位置/速度。3cheater_mode 打开时改用 CheaterOrientationEstimator 与 CheaterPositionVelocityEstimator直接读仿真真值。4ContactEstimator 始终参与提供足端接触相位。1.2.2 传感同步setupStep1Mini CheetahLegController::updateData(SpiData*)。2Cheetah 3LegController::updateData(TiBoardData*)。3得到每条腿的 q, qd, p, v, J关节角/角速度、髋坐标系足端位置/速度、雅可比。1.2.3 用户控制1前若干周期先禁腿、再由 JPosInitializer 把关节收到初始姿态。2之后调用 _robot_ctrl-runController()。对 MIT 控制器即步态调度 → 期望状态转换 → ControlFSM::runFSM()。1.2.4 指令下发finalizeStep1LegController::updateCommand() 把关节 PD、笛卡尔 PD、力矩前馈、力前馈叠加后写入 SpiCommand 或 TiBoardCommand。2同时用 LCM 发布 leg_control_data、leg_control_command、state_estimator。1.2.5 逻辑视图单周期控制数据流图1.3 MIT 控制器有限状态机control_mode仿真面板或 RC决定当前行为。状态定义见 FSM_State.h。模式号状态名职责0PASSIVE不出力安全默认态1STAND_UP关节插值站起3BALANCE_STAND平衡站立QP 平衡控制器4LOCOMOTION凸优化 MPC 步态行走6RECOVERY_STAND跌倒后恢复站立8VISION视觉 MPC高度图/障碍9BACKFLIP后空翻开环/数据回放11FRONTJUMP前跳51JOINT_PD关节空间 PD 调试52IMPEDANCE_CONTROL笛卡尔阻抗调试1.3.1 状态对象共性每个状态实现 onEnter / run / checkTransition / transition / onExit。共享 ControlFSMData四足模型、估计器、腿控制器、步态、期望状态、机器人参数、用户参数。SafetyChecker 在 FSM 前后做姿态安全、足端期望位置、前馈力限幅。1.3.2 行走状态的两级优化ConvexMPCLocomotion用 qpOASES / OSQP / JCQP 解凸 MPC得到未来地反力和落足。WBC_Ctrl WBIC在动力学约束下把任务机身位姿、足端映射成关节力矩任务集包括 BodyPosTask、BodyOriTask、LinkPosTask、JPosTask 等。GaitScheduler 提供 STAND / TROT / BOUND / GALLOP / PRONK 等相位表。1.3.3 逻辑视图ControlFSM 状态机1.4 动力学与仿真对象1.4.1 机器人模型MiniCheetah.h / Cheetah3.h 填几何、惯量、减速比生成 Quadruped。FloatingBaseModel 是 Featherstone 浮动基刚体树每个关节还带转子gear constraint。FBModelState 存机身位姿/速度与关节 q, qd。1.4.2 仿真器DynamicsSimulator 用 ABAArticulated Body Algorithm求加速度再积分。碰撞CollisionPlane / CollisionBox / CollisionMesh接触可用冲量或弹簧阻尼use_spring_damper。ImuSimulator 按 yaml 噪声参数伪造 VectorNav 数据。SpineBoard / TI_BoardControl 在仿真里复现真机底层板卡使控制器面对的接口与真机一致。1.4.3 腿部控制语义髋坐标系机体系x 向前、y 向左、z 向上。腿序号右前 0、左前 1、右后 2、左后 3。(q_abad, q_hip, q_knee) (0,0,0) 表示腿竖直向下。关节 PD 在电机驱动器上以约 40 kHz 执行高层 runController 约 1 kHzCheetah 3 为 1 msMini Cheetah 默认 2 ms。1.5 逻辑视图小结逻辑上这是一条经典的「估计 → 规划 → 全身控制 → 腿级 PD」管道外加 FSM 把站立、行走、特技、急停切开。RobotController 是唯一对用户开放的扩展点仿真与真机在这一层不可区分。2. 进程视图进程视图描述运行时并发几个进程、哪些线程、周期多少、如何同步。本项目有两条主部署路径开发仿真、真机。2.1 仿真模式双进程 共享内存握手启动方式先 ./sim/sim再 ./user/MIT_Controller/mit_ctrl m sm Mini Cheetahs simulation。2.1.1 进程 Asim仿真器Qt 主线程SimControlPanel、手柄Qt Gamepad、OpenGL 可视化。仿真循环 Simulation::runAtSpeed()按 dynamics_dt 积分按 low_level_dt 跑板卡仿真按 high_level_dt 唤醒控制器。通过 POSIX 共享内存对象 development-simulator 与控制器交换 SimulatorSyncronizedMessage。可选向 LCM 频道 simulator_state 发状态供 lcm-spy 调试。2.1.2 进程 B控制器如 mit_ctrlSimulationBridge::run() 死循环waitForSimulator() → 按 SimulatorMode 办事 → robotIsDone()。模式包括RUN_CONTROL_PARAMETERS改参数、RUN_CONTROLLER跑 RobotRunner、DO_NOTHING、EXIT。第一次 RUN_CONTROLLER 时完成 RobotRunner::init()之后每个高层步调用一次控制。2.1.3 同步语义避免双边同时写共享内存两个 POSIX 信号量simToRobotSemaphore、robotToSimSemaphore。约定顺序机器人等待仿真 → 仿真积分并写 IMU/腿数据 → simulatorIsDone() → 仿真等待机器人 → 机器人读数据跑控制并写指令/可视化 → robotIsDone()。调试日志不走共享内存走 LCM避免拖慢控制节拍。2.1.4 进程视图仿真双进程握手2.1.5 仿真默认时间步config/simulator-defaults.yaml参数默认值含义dynamics_dt0.001 s刚体积分步长1 kHzlow_level_dt0.0002 s仿真 Spine/TI 板卡5 kHzhigh_level_dt0.002 s唤醒高层控制器500 Hz与 Mini Cheetahcontroller_dt对齐simulation_speed1.0墙钟倍率按住t可尽量快放2.2 真机模式单进程多周期任务真机上 main_helper 走 MiniCheetahHardwareBridge::run() 或 Cheetah3HardwareBridge::run()。框架是 PeriodicTask每个任务独立 std::thread由 PeriodicTaskManager 统计超时。启动前会做实时准备prefaultStack()预触碰 16 KB 栈并 mlockall(MCL_CURRENT|MCL_FUTURE) 防止换页。setupScheduler()SCHED_FIFO优先级 49。需要 root。Mini Cheetah 线程表任务名周期线程类型职责robot-controlcontroller_dt默认 2 msPeriodicTaskRobotRunner估计 用户控制spi2 msPeriodicMemberFunctionrunSpi()拷命令、驱动 SPI、发spi_data/spi_commandlcm-vis16.7 ms约 60 HzPeriodicMemberFunction发布main_cheetah_visualizationrc_controller5 msPeriodicMemberFunctionSBUS 遥控microstrain-logger1 msPeriodicMemberFunction发布microstrainLCM无名IMU连续循环std::threadLordImu::run()填_vectorNavDatainterface LCM阻塞handle()std::thread订阅interface手柄、interface_request参数print-tasks0.5 sPrintTaskStatus任务超时监控Cheetah 3 线程表任务名周期职责robot-control1 ms高层控制ecat1 msSOEM EtherCATrt_ethercat_run()发布ecat_cmd/ecat_datalcm-vis16.7 ms可视化VectorNav 驱动传感器侧约 1 kHzrt_vectornav写 IMUinterface LCM同 Mini Cheetah手柄与参数进程视图Mini Cheetah 机载进程内线程2.3 进程间消息一览通道/介质方向内容共享内存SimulatorSyncronizedMessagesim ↔ 控制器IMU、腿、手柄、参数、可视化仅仿真LCMinterface开发机 → 机器人gamepad_lcmtLCMinterface_request/interface_response双向按名读写控制参数LCMspi_data/spi_command机器人 → 调试端Mini Cheetah 原始 SPILCMecat_cmd/ecat_data机器人 → 调试端Cheetah 3 EtherCATLCMmicrostrain/vectornav机器人 → 调试端IMULCMstate_estimator_lcmt控制器 → 调试端位姿速度估计LCMleg_control_*控制器 → 调试端腿指令与反馈LCMmain_cheetah_visualization机器人 →simGUI12 关节 机身位姿LCMsimulator_statesim→ 调试端仿真真值状态2.4 进程视图小结仿真用「双进程 信号量互斥共享内存」复现真机的「控制节拍与物理节拍分离」。真机把同一 RobotRunner 放进实时 FIFO 线程用更短周期的 SPI/EtherCAT 任务喂数据。LCM 一律旁路专管人机界面和日志不进入力矩闭环临界路径。3. 开发视图开发视图描述源码模块、库依赖、构建产物。顶层 CMakeLists.txt 按子目录组织C14默认 -O3 -WerrorLinux。3.1 顶层目录职责目录产物职责common/共享库biomimetics动力学、估计、腿接口、碰撞、共享内存、参数robot/共享库robotRobotRunner、Bridge、rt_*驱动sim/可执行文件sim唯一依赖 Qt5 的程序user/mit_ctrl、jpos_ctrl等具体控制器链接robotbiomimeticsthird-party/静态/内部库OSQP、qpOASES、SOEM、lord_imu、vectornav 等lcm-types/lcm-gen出的 hpp/java/py进程间契约config/yaml仿真、地形、机器人、用户参数默认值scripts/shell生成类型、部署到 Mini Cheetah、配 LCM 网卡resources/obj 网格可视化 CADdocumentation/md / doxygen入门与真机流程common/test/test-commongtestCMake 自动拉 googletest3.2 common 内部包结构按头文件目录逻辑包如下。Dynamics/1spatial.h、SpatialInertia空间向量。2FloatingBaseModel运动学/动力学树3MiniCheetah / Cheetah3机型参数工厂。4ActuatorModel电机/减速器。5DynamicsSimulator积分 接触。Controllers/1LegController、StateEstimatorContainer。2OrientationEstimator、PositionVelocityEstimator、ContactEstimator。3DesiredStateCommand、GaitScheduler、FootSwingTrajectory。Collision/CollisionPlane/Box/Mesh、ContactImpulse、ContactSpringDamper。ControlParameters/反射式参数表代码里 DECLARE_PARAMETERyaml 必须字段完全一致增删参数要重编译。SimUtilities/仿真专用但控制器也要链接的结构SimulatorMessage、SpineBoard、ti_boardcontrol、GamepadCommand、ImuSimulator。Utilities/PeriodicTask、SharedMemory、Timer、滤波器、Bezier 等。SparseCMPC/、FootstepPlanner/、Math/稀疏 MPC、落足规划、姿态工具。3.3 user/MIT_Controller 源码树user/MIT_Controller/ ← 树根├── main.cpp ← 入口├── MIT_Controller.cpp/.hpp├── FSM_States/ ← 行为状态机│ ├── ControlFSM│ ├── FSM_State_*│ ├── SafetyChecker│ └── ControlFSMData└── Controllers/├── convexMPC/ ← 行走 MPC├── WBC/ 与 WBC_Ctrl/ ← 全身控制├── VisionMPC/ ← 视觉 MPC├── BalanceController/ ← 站立平衡└── BackFlip/ ← 后空翻等特技3.4 构建与配置要点普通开发构建1scripts/make_types.shlcm-gen -jxp *.lcm生成 C/Java/Python 类型。2cmake … make -j4。3产物common/libbiomimetics.so、robot/librobot.so、sim/sim、user/…/mit_ctrl。Mini Cheetah 交叉风格构建1cmake -DMINI_CHEETAH_BUILDTRUE关掉 -marchnativeTHIS_COM 改成相对路径 …/以便拷到机载目录后仍能读 config/。2NO_SIMON 可在机载上不编 Qt 仿真器。外部依赖Qt 5.10含 Gamepad、LCM 1.3.1、Eigen、BLAS/LAPACK、freeglut、mesa可选 Ipopt-DIPOPT_OPTIONON。扩展一个新控制器开发视图的扩展规则1在 user/ 新建目录并加入 user/CMakeLists.txt。2继承 RobotControllergetUserControlParameters() 返回参数对象或 nullptr。3main 必须调用 main_helper(argc, argv, controller)。4不改 robot/ 与 common/ 即可在仿真和真机上跑。3.5 开发视图小结仓库按「共享算法库 / 运行时与驱动 / 仿真 GUI / 可插拔用户控制器 / 第三方求解器」切开。控制器的稳定接口是 RobotController LegController StateEstimateLCM 类型是跨语言调试契约yaml 与 C 参数表必须同步这是本项目刻意的编译期一致性检查。4. 物理视图物理视图描述软件部署到哪些计算机、传感器、执行器和网络。有三种物理拓扑。4.1 拓扑 A纯仿真单台开发机硬件一台 Linux PC也支持 macOS 编仿真、Logitech F310拨到 X 模式。进程放置同一台机器上sim mit_ctrl m s或 3 s。共享内存要求同机。人机左栏仿真器参数速度、地形摩擦等。中栏机器人参数controller_dt、cheater_mode。右栏MIT 用户参数。画面里灰色机体 仿真真值红色 状态估计。物理视图开发机纯仿真部署图4.2 拓扑 BMini Cheetah 真机4.2.1 机器人本体俯视前方两开关中间 电机电源右侧 电脑电源拨向机尾为开。电脑约 2 分钟启动。12 个关节电机经 4 块 Spine 板做腿级控制关节 PD 在驱动器上约 40 kHz。IMU代码默认 USE_MICROSTRAINLord Microstrain也可编 VectorNav。可选 SBUS 遥控。4.2.2 机载计算机默认 SSHuser10.0.0.34。多机时脚本支持 10.0.0.4x。开发机网卡需配 10.0.0.xxx。运行 cmake -DMINI_CHEETAH_BUILDTRUE 编出的控制器由 scripts/send_to_mini_cheetah.sh 把可执行文件、.so、config/、run_mc.sh 拷到 ~/robot-software。机上 ./configure_network_lcm.sh mc-top 配顶部以太网的 LCM 组播。sudo nohup 跑 run_mc.sh程序会等到开发机 sim 以 Robot 模式点 Start参数经 LCM 下完再进控制。4.2.3 开发机角色仍跑 sim模式选 Mini Cheetah RobotRobotInterface。手柄、参数面板、估计可视化都走 LCM不走共享内存。以太网既是 SSH 部署通道也是 LCM 调试总线。4.2.4 控制链路时延分层电机驱动器40 kHz 电流/关节 PD。SPI 任务2 ms约 500 Hz与高层 controller_dt0.002 对齐文档亦写腿数据约 700 Hz 量级。高层 MPC/WBC同一 2 ms 线程内。GUI/可视化60 Hz允许丢帧。物理视图Mini Cheetah 真机部署图4.3 拓扑 CCheetah 3 真机总线差异不用 SPI Spine而用 EtherCAT第三方库 SOEM。每腿一块 TI 控制板 TiBoardCommand/Data支持关节与笛卡尔指令、max_torque。ecat 任务 1 ms与 controller_dt0.001config/cheetah-3-defaults.yaml对齐。IMUrt_vectornav.cpp 初始化 VectorNav失败时打印 IMU DISABLED不直接 exit。与 Mini Cheetah 的物理共同点开发机仍用 LCM 下发手柄和参数Cheetah3HardwareBridge 同样 mlockall FIFO。SBUS 在 Cheetah 3 路径里目前注释掉。物理视图Cheetah 3 真机部署图4. 两款机器人物理栈对比维度Mini CheetahCheetah 3高层周期2 ms1 ms腿总线SPI → Spine BoardEtherCAT → TI Board总线任务周期2 ms1 msIMUMicrostrain默认或 VectorNavVectorNav机载构建必须MINI_CHEETAH_BUILD普通 Linux 构建即可典型 IP10.0.0.34文档未写死同样走 LCM 局域网关节 PD电机侧 ~40 kHzTI 板底层环4.4 物理视图小结软件故意做成「开发机算仿真、机载只跑控制」。仿真同机用共享内存追求确定性握手真机用千兆以太网跑 LCM用机器人内部 SPI/EtherCAT 跑力矩闭环。Qt 仿真器跨两种物理拓扑复用既是动力学沙盒也是真机遥控台。