综上,可见采用刚体降维解耦的方式可以较好地简化机器人控制并能将该方法向多种不同构型的机器人进行推广,姿态、位置控制算法只需要关心刚体位姿控制问题,而具体这些虚拟控制力和力矩如何通过执行器输出则可采用不同的力分配原理就行,最终构建成一套完成的反馈控制系统,但由于该方法忽略了躯干质量和惯性使得在真实机器人系统中可能无法保证对期望质心运动轨迹跟踪的精度,因此在上述反馈控制的基础上进一步结合能量前馈控制就可以实现更复杂的运动模态,如弹跳和空翻在Raibert的书中采用该原理增加弹跳能量前馈实现了倒立摆周期稳定的动态平衡。因此,我们重新对四足机器人控制问题进行描述,首先SLIP降维解耦的原理将四足机器人简化为质量块加弹簧的模型。为实现弹跳需要对Z轴虚拟力前馈进行规划,另外同时在支撑相时完成对姿态的控制产生相应的虚拟转矩T。

再读《Legged-Robots-That-Balance》对四足机器人降维控制的新感悟如下(仅为本人个人看法)

1 四足机器人控制第一招:刚体解耦降维控制

Raibert所写的《Legged-Robots-That-Balance》为何牛逼,当你反复读反复读,同时着手无论在仿真还是在程序复现,你会发现这套理论真正做到了将机器人稳定控制这个高维度、非线性、欠驱动问题做到了降维处理。

回想刚接触四足机器人控制的时候主要还是使用原来自己制作四轴飞行器时的控制理念,采用姿态PD控制调节机器人关节角速度改变腿长从而模拟虚拟力输出,但实际上这样在舵机伺服上是不精确的,对于并联腿结构来说这样的误差暂且可以接受,但是对于串联腿部构型来说该方法无法适用。

虚拟力与位置腿长控制近似误差大

在之前文章介绍的虚拟力控制就是采用这样的思路,实际只是将顶层虚拟体的控制量转化到各腿Z轴高度近似实现了姿态角和高度的控制,通过增加SLIP开环前馈最终获得了较好的移动效果,但是只是在工程上做了一些Trick和真正力控方案并不一样。这要重新谈谈四足机器人稳定控制问题的特点,这样才能发现虚拟力控制理论的优点是啥:

(1)非线性:四足机器人如果忽略腿部结构那与四轴飞行器类似,都可认为是一个刚体位姿控制的问题,由于其系统模型涉及到姿态角对加速度的分解因此是一个典型的非线性控制问题。

(2)多输入:这里的多输入仅代指四足机器人控制输入维度多,四足机器人以刚体连杆简化后与无人机控制输入类似。无人机控制问题中仅有4个永远垂直于机臂向上的电机拉力,而四足机器人除了力幅值可控外,力矢量角度也能调节,因此相比无人机来说整个系统输入维度大了很多:

这样解释后,可以看出Moco-8就是采用传统无人机的控制理念,仅改变Z轴方向的虚拟力而不关心矢量具体方向和力臂长度,也是这样其对8自由度机器人较为适用,对于12自由度机器人来说无法使用,其最大的问题是机器人无法借助跨关节侧展来实现ROLL角的控制,导致机器人在ROLL轴上控制效果较差,也使得自身侧向稳定能力较差。

在这另外插一句,之前介绍近年来出现的许多强化学习训练机器人步态的研究,细读这些论文可以发现他们均未实现力控,其原因就是四足机器人力控action的维度太高导致网络收敛困难,就连ETH之前提出的效果最好的一个强化学习案例也仅输出了足端轨迹,而机器人柔顺性则类似之前一篇文章提到的改变腿部虚拟弹簧刚度方式实现,但在强化学习介绍一文中我提到有研究学者采用kMP和主成分分析理论实现对action空间的降维,不知道能不能沿着这种方式最终实现对机器人力控下的强化学习,下面给出之前总结近年来实现机器人强化学习论文的技术路线:

强化学习步态训练总结

(3)控制输入间断/欠驱动:四轴飞行器最大的特点就是自身控制的欠驱动,即螺旋桨角度固定,转向固定,因此只能提供向上的升力。四足机器人也十分类似,足端只能提供支撑压力而不能拉拽地面,但二者最不同是四足机器人存在步态切换的问题使得仅在腿支撑的时候才能提供力控输出,这也使得二者控制方式有所不同,如典型的对角步态时序如下图所示:

存在腾空过程的对角步态时序

上图为MIT《High speed trot-running: Implementation of a hierarchical controller using proprioceptive impedance control on the MIT Cheetah》一文中给出的步态时序,可以看到深色Bar为各腿支撑并输出力的时刻,这篇文章主要介绍了如何实现Gallop步态。我之前复现了其基于事件触发的步态开环规划算法和步态切换算法:

事件触发的步态相序规划仿真

从图中可以看到机器人首先开始Tort步态,在三分之一处开始切换Gallop步态,在最后三分之一切回Tort步态。这个算法原理简单,能方便地实现Bound、Pace等不同的步态。在实现之后十分激动想在Moco-8上尝试下,可是结果令人失望,这个算法目前在Mini Cheetah 开源代码中确实是被使用,那为何Moco-8却无法获得一个类似的效果,尽管已经相比原始算法保证同时有最少2个腿支撑,这个原因还是回到之前说的采用位置模拟力的不精确,在四足机器人步态相序间断完全腾空时误差将会随着步频的降低而成倍增加,最终无法实现对机器人稳定控制。

那Moco-8的控制方式除了借鉴虚拟力概念外到底与现有电驱动四足机器人有啥区别呢?为什么MIT小狗基于上面的时序规划就能稳定地实现多种不同步态?

Mini Cheetah Bound高速奔跑

我们重新回顾一下Moco-8的控制方式,首先使用虚拟体概念在机体上进行三通道解耦构建三个PD控制器完成俯仰角、横滚角和高度的控制,输出刚体位姿控制所需要的虚拟力和力矩,进一步采用等分配的方式分解虚拟力到各支撑腿上,最终使用雅克比矩阵转换虚拟力为关节力矩,采用伪力矩模型近似速度与关节力矩最终改变足端Z轴高度,实现位姿和高度的调节。

Moco 8控制原理

同MIT Balance的平衡控制器对比可以看到二者没有太多的区别,实际就是个PD控制器,这也是目前大多数四足机器人所采用的框架,即简化解耦为刚体控制问题,因此Raibert最牛的第一招就是降维简化复杂非线性控制问题,而Moco-8仅用了这一个降维简化思想就已经实现了稳定的Tort步态,但在实现其他步态控制的时候效果较差这个原因是什么?相信如果学习过机器人拉格朗日法建模的人可以马上发现Moco-8控制模型在将虚拟力输出时是采用的等比例分配到对角腿上,但是基于静力学分析要实现静力平衡是需要考虑力臂的,更不用说我们作用的仅是末端Z轴位置而不是实际足底力,这也是为何该算法受限的原因,所以Moco-8从理论框架上来说与MIT等机器人控制算法最大的不同即力分配方式不一样

通过上面的叙述可以看到多旋翼飞行器、Moco-8与其他四足机器人在刚体控制层都是一样的,核心控制方式都是基于期望位姿误差产生对应的虚拟力矩从而驱动刚体向期望状态转移

对于无人机来说十分简单,姿态控制产生的虚拟力矩直接通过机架构型进行分配,这也是网上大量提供的PID控制输出转速分配矩阵;Moco-8沿袭了无人机控制的思想,但是与无人机不同其还要应对落足与地面的冲撞的情况,因此在姿态控制中仅采用单级PD来模拟弹簧阻尼。

无人机更讲究控制刚度因此采用串级PID,对于Moco 8来说仅仅将产生的虚拟力像四轴飞行器一样分配到各个足端Z轴高度增量而已;而MIT等纯力控四足机器人采用PD做平衡控制,使用静力学、QP或MPC实现机体力矩和转矩向支撑腿的分配,从而实现了在有限时间内采用任意支撑腿最优化足力产生期望扭矩和转矩的目的,也使得Bound、Gallop和Pace步态得以实现。相比采用位置控制需要精细计算落足位置的方法(类似六足机器人),力控能更简洁的解决稳定控制问题,当然前提是机器人具有力反馈机制,这也是Raibert提出降维解耦控制的第二个关键技术--力分配

无人机与四足机器人原理共通

2 四足机器人控制第二招:力分配

如上一小节所述刚体层通过虚拟伺服弹簧能产生所需要的虚拟扭矩(控制姿态)和虚拟力(控制加速度),无人机和四足机器人都可以采用这样的简化控制方法获得较好的控制效果,实际工程实现时可以采用PD、串级PID或者其他非线性控制方法,如ADRC、鲁棒控制等,但不同之处是如何让执行器(无人机为电机、四足机器人为关节电机)能产生期望的虚拟力,而不同的执行器控制输出映射关系不同,如电机是油门而腿是关节扭矩,因此需要各自对应力的分配机制来实现

如Moco-8一样,最简单的方式是直接进行等比例分配,但是如前文所述四足机器人欠驱动,受腾空相移动中影响仅有少数腿能产生支撑,因此如何对虚拟力进行分配变得十分重要,这里仅以对角步态为例采用一篇经典论文作为数值解和静力学分析方法的代表《基于虚拟模型的四足机器人对角小跑步态控制方法》。

Tort步态下的静力学分析

Tort步态可以说是四足机器人最典型的步态也是入门四足机器人动态控制的门槛,这篇文章给出一种基于静力学分配和数值求解的力分配算法,如上图所示给出了Tort步态下的静力学分析示意图,基于最简单的力、力臂和力矩的关系在刚体假设下可以十分快速地列出图中的静力学分析公式,首先以重力为例前后两腿实现对整个刚体的支撑,以世界坐标系下的全局力实现后续数学描述,则前后腿Z轴支撑力应当抵消重力并产生期望Z轴虚拟力,即:

上式均为矢量因此不考虑正负号,同理可以列出X轴

和Y轴的虚拟力平衡公式:

对于机体扭矩来说需要考虑力臂作用,但同样由于刚体假设可以快速的得到Z轴的扭矩平衡公式为:

这个公式十分好理解,即Z轴扭矩是由X轴足端力乘以足端位置代表的力臂与Y轴足端力作用相减得到,同理可以得到X轴和Y轴的扭矩平衡公式,这里不再列出详细推导可以查看原文。这里我们先不像论文中一样考虑重力前馈补偿,则连联立上述三个力和三个力矩等式可以得到如下6*6方程组:

等式左边的F和T即刚体平衡控制器得到虚拟控制量为已知值,矩阵中间部主要包括足底位置可通过运动学正解得到,右边为我们想要求解的力分配结果,那直接求逆就应该可以得到对应的解,可惜现实总是很残酷。中间矩阵不满秩无法直接求逆运算,为求取该方程目前有许多近似的方法,其核心理念都是增加假设或约束来对中间矩阵降维,如本文中首先抛弃了对Y轴力的控制采用摆动腿实现侧向稳定,另外增加了前后腿足端y轴力相等

的假设将该问题降维简化如下方程组:

通过求解矩阵的逆即可由足端位置和虚拟力控制量求解对应足端力分配结果,由于在实际机器人系统中往往前后腿末端不会重合因此该矩阵可以保证满秩,而8自由度机器人本身就无法控制Y轴侧向力使得矩阵会出现多个奇异点,无法直接使用该方法,这也是为何Moco-8直接以平均分配的原因。在得到各腿力分配结果后采用雅克比矩阵将足力映射到各关键扭矩既可以实现基本的力控,可以看到该方法原理十分简单,作者仿真效果也十分不错,只要硬件力控带宽和精度能满足要求应该能得到一个不错的效果,但是还需要增加柔性位力混控和侧向力控制的Trick。

基于该方法我将其推广到任意两条以上腿支撑情况下的改进力分配方法,那进一步结合之前提到的MIT事件触发步态相序规划希望能实现Tort,Bound和Gallop步态的稳定控制,下面给出一些仿真图片(另外该方法我认为,要满足刚体假设需要保证力控频率在1Khz以上,这和无人机采用高控制频率解决非线性系统的问题十分类似,而MIT采用MPC等方法,控制频率仅需要0.5Khz甚至可以更低,这也是有了精确模型和先进控制理论来描述系统状态变化带来的好处,而上述方法最大的好处就是不需要优化,虽然现在QP优化已经大量应用于机器人力控问题中

Tort需要的静力学分配

Gallop需要的静力学分配

Balance需要的静力学分配

Pace和Bound需要的静力学分配

上图中左边为直接给定足力计算出的期望力和力矩(机体显示角度不是姿态角只是用扭曲程度近似代表扭矩),右边是由标准虚拟力矩采用上述改进力分配方法逆向求解出的足底力,可以看到该方法除了单腿触地外基本覆盖了常见步态所需的力分配情况,并且结果基本与原始给定一致,而单腿力控问题可以采用布态相序规划保证最少两条腿着地实现。

虽然上面的方法可以实现机器人的力控,但该方法大多是情况还是使用在Tort步态而如果要向其他支撑情况进行推广则需要知道精确的足底摩擦力,如果对地面的滑移率估计不精确则会引起较大的误差,甚至会产生与输入力矩完全相反的结果,而且如前文所述该算法为求解这个超定方程需要增加新的假设,在控制时也没有考虑地面摩擦圆锥、力的突变和每个腿能输出的最大力,这些复杂的约束使得该问题可以采用最优化理论来求解,这也是目前为何MIT和ETH等先进的四足机器人控制系统中基本已经主要采用优化的原因,如下为MIT论文中采用向量构建的静力学控制方程,该方程采用向量的形式进行计算,另外模型里也做了一些假设其中最重要的就是忽略了腿部的质量和惯量,而后续MIT采用WBC的方式则考虑了全局的机体质量,因此获得了更好的控制效果:

为求解最优的足力则可以构建一个如下的QP优化问题,引入多种约束进行求解,下式中最优化的目标是最小系统状态误差,同时考虑最小化力输出其可以优化机器人控制的功耗,另外最优化力的突变其可以避免力输出阶跃损坏执行器,通过两个权重则能在二者间找到适合的控制输出:

要求解上述的优化问题可以采用优化求解库实现,目前已经有很多能在嵌入式硬件上运行的优化库,采用模板的方式就能快速的构建QP优化问题。可以,基于上述两个公式所需要的参数只有足端位置、机体加速度、质量和机体的转动惯量而以,而机体期望加速度和角速度则直接采用之前提到的PD控制器输出即可,整个控制问题变得十分容易理解,更多的可能实在软件编程实现上的问题。另外,也可采用MPC控制器来实现同样的目的,但需要对其中的非线性部分进行近似处理才能求解,MIT论文和开源程序主要也是使用MPC构建控制问题通过近似后使用QP优化算法进行求解:

MPC控制问题

3 四足机器人控制第三招:弹簧倒立摆+虚拟腿降维简化

如上一节内容所述支撑相力控原理可知,其采用静力学平衡的方式来完成对降维虚拟体伺服的控制,在解耦控制中最重要的一步是对复杂的四足机器人进行降维处理,由于忽略腿部质量因此简化降维模型可以采用倒立摆描述,同时由于腿部虚拟弹簧刚度可调,因此可以进一步使用弹簧负载倒立摆SLIP模型进行建模,典型的SLIP模型如下图所示:

弹簧负载倒立摆模型

如上图所示,SLIP模型主要包括支撑和腾空两个状态,在前一篇知乎文章中介绍了基于调节弹簧刚度结合状态机、足力判断切换实现的单腿弹跳,机器人在支撑过程中通过调节弹簧力实现下一周期腾空高度的控制,通过调节跨关节扭矩实现机器人姿态的控制,而机器人移动速度则通过在腾空过程中调节落足点位置实现。将上述模型向四足机器人推广则需要使用虚拟腿的概念,即将多条不同腿抽象为同一条虚拟腿进行控制,如下图所示虚拟腿从直观上具有如下特点

(a) 虚拟腿摆动相具有相同的落足点;

(b) 虚拟腿在虚拟跨关节产生力和力矩;

(c) 虚拟腿产生的力为各腿总合力,力矩为各它们权重分配和;

虚拟腿简化过程

基于虚拟腿的概念可以将复杂的多足步态规划和控制简化为SLIP模型,将弹跳腾空所需要的能量补偿或者本体刚体控制所需的状态反馈量作为前馈输入到底层,进一步通过上一节的支撑相力分配实现Bound、Gallop等步态腾空过程,如下图所示为几种典型步态对应虚拟腿的降维简化示意图。

典型步态虚拟腿简化示意图

如图所示,Tort步态将对角腿简化为一条虚拟腿,因此在步态规划过程中对角腿具有相同的摆动相和支撑相,同理对于Pace和Bound步态来说相应的同侧腿被简化为一条虚拟腿,则可基于之前小节MIT的步态相序规划方法结合触地信号实现对摆动相的规划,对于支撑相来说则可以借助多种方式实现力控,一种是基于前文所提的静力学分配方式,该方法主要适用于对角支撑的情况,对于Bound和Pace出现同侧腿支撑的步态虽然可以适用,但前提是需要知道精确的足底滑移率,因此对足端滑移率的实时估计是静力学方法推广任意腿的难点,也是为何优化算法目前更受青睐的原因。实际采用传统自动控制理论也可以较好地实现Bound和Pace等腾空相较长的步态,其基本原理是建立刚体运动的状态空间方程,通过构建周期离散控制实现前馈量的可靠计算,在支撑相采用连续力控制实现反馈控制并进一步叠加SLIP模型前馈实现类似可靠的控制;另外,虽然采用虚拟腿的概念能较好地简化多腿规划调度的,但是实际上缺忽略了腿部构型的问题,典型的足式机器人腿部机构设计如下图所示。

机器人腿部构型

如图所示早期波士顿的BigDog机器人采用的是内膝式,而后续推出的Spotmini、Cheetha3和Laikago都是采用全肘式,而LS3等重载机器人则采用的是外膝式结构。上述几种机器人构型各有不同但在虚拟腿简化机理下都是一个弹簧连杆,对于平地移动时上述腿部构型没有太大区别,但在上下坡时如进一步考虑腿部构对应的工作空间则机器人爬坡能力和最高移动速度有所差别,因此在机器人上下斜坡时除了力控保证机体稳定外还需要实现对地面坡度进行估计并实时调节机器人姿态以保证腿部具有较大的工作空间和摩擦力,对于上述问题我们将单独在一篇文章中讨论。综上,总结Raibert使用弹簧负载倒立摆模型降维解耦力控的原理如下所示:

如上图所示为我总结的SLIP降维解耦框架,开展框架首先采用弹簧负载倒立摆模型简化足式机器人,假设机器人质量集中于机体并忽略腿部质量和惯量,则基于虚拟腿理论抽象为与质量块连接的单弹簧,进一步基于SLIP运动模型实现腾空和支撑的状态切换并以周期形式规划仿生前馈信号,即实现弹簧能力的补偿和吸收规划弹跳力前馈、前向牵引力前馈和侧向扰动的落足点前馈。进一步,基于在质量块上构建刚体控制虚拟伺服,实现对机器人三轴加速度和角度的控制,输出全局三轴期望力和力矩实现刚体位姿的闭环控制,通过叠加前馈信号实现腾空相控制,通过所述力分配算法将虚拟力向足力分解,进一步转化到跨部坐标系采用雅克比矩阵结合位力混控算法输出个关节期望扭矩,并最终转化为电路命令发送给电机实现电流环控制。可见,采用降维解耦的框架整个四足机器人的控制流程十分清晰,并且模块化程度高,可以在各个部分开展深入优化和研究,下图为采用上述原理实现的站立和弹跳,可优化部分去下:

(a)优化顶层虚拟伺服控制提高对刚体非线性模型的控制性能;

(b)优化SLIP前馈信号实现能量和误差的最优;

(c)优化力分配算法实现任意腿支撑的力矩控制,力最大值输出优化、力突变优化以及最重要的足底摩擦力优化;

(d)优化位力混控算法实现对力的精确跟踪实现柔顺阻抗控制;

(e)优化FOC底层电流控制克服减速箱力失真、间隙和摩擦等扰动,保证可靠的关节力矩反馈和足力估计,克服腿部惯性摆动引起的电流;

综上,整个降维解耦控制总决已经介绍清楚,下一步将对其中的状态估计和具体模块算法进行介绍。