在MIT cheetah的controller中共有10运动状态(运动模式),分别为:PASSIVE、JOINT_PD、IMPEDANCE_CONTROL、STAND_UP、BALANCE_STAND、LOCOMOTION、RECOVERY_STAND、VISION、BACKFLIP、FRONTJUMP。每种运动状态分别对应了一种机器人运动模式,例如奔跑LOCOMOTION、后空翻BACKFLIP、平衡站立BALANCE_STAND、关节运动JOINT_PD等。在工程代码中,每一种运动状态的控制都对应了一个类,这些类都继承自 FSM_State,因此使用了多态的程序设计思想。每一种运动模式都重写了FSM_State中的五个函数分别如下:

 virtual void onEnter()
 virtual void run()
 virtual FSM_StateName checkTransition()
 virtual TransitionData<T> transition() 
 virtual void onExit()

这五个函数主要用于机器人的运动状态转移和运动控制。

OnEnter:机器人从一个状态进入新的状态时,会调用新状态的onEnter函数,初始化相关位置信息。

checkTransition():检查外部输入状态,是否发生新的运动控制模式转变。

Run():机器人处于当前状态的运动下,会周期调用run(),运行相关控制算法产生控制指令。

Transition():机器人从一个状态转移到另一个状态时,会重复调用transition(),直到完成运动状态的切换。

OnExit():机器人退出当前运动状态时,会调用onExit()函数,其实就是一个空函数。

其中关键控制算法的实现和控制指令的输出都在run函数中。

如下图所示,是机器人所有的运动模式,在不同的运动模式下,相关核心算法函数都是在右侧的run()中被调用。

可以看出,主要用到的算法模块包括:

1. 在腿部swing阶段,采用了基于3阶贝塞尔曲线的机器人腿部末端轨迹规划,规划算法在computeSwingTrajectoryBezier函数中实现,使用了阻抗控制就行了轨迹的跟踪控制。

2. 机器人腿部的凸MPC控制,在ConvexMPCLocomotion::run(data)中实现。

3. 基于机器人动力学的前馈补偿,计算腿部关节力矩,作为力矩前馈项加入到电机控制中,以此增加机器人在swing阶段的腿部反应速度,同时在stance阶段计算腿部末端力的位置方向及大小。动力学的中间计算数据在函数WBC_Ctrl::run(wbc_data, data)中有实现。

以上算法模块主要是在LocoMotion中被调用,也就是机器人奔跑模式下。

4. ComputeCommand()

主要在前空翻FrontJumpCtrl和后空翻BackFlipCtrl两种运动模式中被调用,是一种固定的轨迹规划,预配置和规划好关节行为,然后更新参数包括前馈的关节转矩、关节速度、关节位置及关节位置环的PID参数kp,kd。每个控制周期更新的控制参数都是采用matlab提前算好的,在代码中的体现是直接从config/mcflip.dat和config/front_jump_pitchup_v2.dat中读取的规划控制参数。

5. setContactPhase(contactState) -> BalanceStandStep()

主要在平衡站立模式BalanceStand下被调用,平衡站立模式的控制指令输入主要有pBody_RPY_des和pBody_des,也就是机器人的期望姿态以及期望的机器人本体的位置高度,这些指令将会被输入到WBC_Ctrl中进行机器人的运动学和动力学计算,此时机器人需要维持机器人本体的高度和姿态,保证机器人的身体平衡

控制核心模块大概就是上面这几种了,其它主要用到了机器人关节的位置控制模式。

在外部输入状态cmd_sts作用下,机器人运动状态转移状体机如下所示:

机器人从当前运动状态transition到另一个运动状态下的状态机如下图所示: