介绍:WBC控制器是当今足式机器人最常用的控制器之一。基于多任务不同的优先级,它可以控制关节电机使其按照优先级的顺序满足各个任务的需求。MIT开源的cheetah mini就用到了MPC+WBIC算法来控制落足点。

推导的过程参考了以下的资料
mini cheetah中WBC公式解析
基于零空间方法(NUB)的全身控制(WBC)的简单实现
Robot Dynamics Lecture Notes
由于本人能力有限,对于WBC控制器的理解还不够深,推导过程有误之处欢迎批评指正。
联系方式:2250017028@qq.com

2.公式说明

Δ q i = Δ q i − 1 + J i ∣ p r e † ( e i − J i Δ q i − 1 ) q ˙ i c m d = q ˙ i − 1 cmd  + J i ∣ p r e † ( x ˙ i d e s − J i q ˙ i − 1 c m d ) q ¨ i c m d = q ¨ i − 1 c m d + J i ∣ p r e d y n ‾ ( x ¨ i c m d − J ˙ i q ˙ − J i q ¨ i − 1 c m d ) \begin{array}{l} \Delta \mathbf{q}_{i}=\Delta \mathbf{q}_{i-1}+\boldsymbol{J}_{i \mid p r e}^{\dagger}\left(\mathbf{e}_{i}-\boldsymbol{J}_{i} \Delta \mathbf{q}_{i-1}\right) \\\\ \dot{\mathbf{q}}_{i}^{\mathrm{cmd}}=\dot{\mathbf{q}}_{i-1}^{\text {cmd }}+\boldsymbol{J}_{i \mid p r e}^{\dagger}\left(\dot{\mathbf{x}}_{i}^{\mathrm{des}}-\boldsymbol{J}_{i} \dot{\mathbf{q}}_{i-1}^{\mathrm{cmd}}\right) \\\\ \ddot{\mathbf{q}}_{i}^{\mathrm{cmd}}=\ddot{\mathbf{q}}_{i-1}^{\mathrm{cmd}}+\overline{J_{i \mid p r e}^{\mathrm{dyn}}}\left(\ddot{\mathbf{x}}_{i}^{\mathrm{cmd}}-\dot{\boldsymbol{J}}_{i} \dot{\mathbf{q}}-\boldsymbol{J}_{i} \ddot{\mathbf{q}}_{i-1}^{\mathrm{cmd}}\right) \end{array} Δqi=Δqi1+Jipre(eiJiΔqi1)q˙icmd=q˙i1cmd +Jipre(x˙idesJiq˙i1cmd)q¨icmd=q¨i1cmd+Jipredyn(x¨icmdJ˙iq˙Jiq¨i1cmd)
where
J i ∣ p r c = J i N i − 1 N i − 1 = N 0 N 1 ∣ 0 ⋯ N i − 1 ∣ i − 2 N 0 = I − J c † J c N i ∣ i − 1 = I − J i ∣ i − 1 † J i ∣ i − 1 \begin{array}{l} \boldsymbol{J}_{i \mid p r c}=\boldsymbol{J}_{i} \boldsymbol{N}_{i-1} \\\\ \boldsymbol{N}_{i-1}=\boldsymbol{N}_{0} \boldsymbol{N}_{1 \mid 0} \cdots \boldsymbol{N}_{i-1 \mid i-2} \\\\ \boldsymbol{N}_{0}=\boldsymbol{I}-\boldsymbol{J}_{c}^{\dagger} \boldsymbol{J}_{c} \\\\ \boldsymbol{N}_{i \mid i-1}=\boldsymbol{I}-\boldsymbol{J}_{i \mid i-1}{ }^{\dagger} \boldsymbol{J}_{i \mid i-1} \end{array} Jiprc=JiNi1Ni1=N0N10Ni1i2N0=IJcJcNii1=IJii1Jii1

  • 推导过程涉及到了线性代数的伪逆矩阵零空间,可以参考维基百科中的描述
    伪逆矩阵
    零空间
  • q \mathbf{q} q:机器人的配置矩阵,反应了每个关节的位置。若关节i为旋转关节,则 q i {q}_i qi表示旋转角度。若关节i为移动关节,则 q i {q}_i qi表示位移量。

接下来主要推导以下这条公式:
q ˙ i c m d = q ˙ i − 1 c m d + J i ∣ p r e † ( x ˙ i d e s − J i q ˙ i − 1 c m d ) \dot{\mathbf{q}}_{i}^{\mathrm{cmd}}=\dot{\mathbf{q}}_{i-1}^{\mathrm{cmd}}+\boldsymbol{J}_{i \mid p r e}^{\dagger}\left(\dot{\mathbf{x}}_{i}^{\mathrm{des}}-\boldsymbol{J}_{i} \dot{\mathbf{q}}_{i-1}^{\mathrm{cmd}}\right) q˙icmd=q˙i1cmd+Jipre(x˙idesJiq˙i1cmd)

(1)首先了解任务的表示方法。
假定有n个任务,即n种目标状态,用 x i , i = 1 , . . . n x_i,i=1,...n xi,i=1,...n表示,则基于正运动学的知识得,
x i ˙ = J i q ˙ ⋮ x n ˙ = J n q ˙ \dot{x_i}=J_i\dot{q}\\ \vdots\\ \dot{x_n}=J_n\dot{q} xi˙=Jiq˙xn˙=Jnq˙

(2)冗余控制
q ˙ = J † x ˙ + ( I − J † J ) y \dot{q}=J^{\dagger}\dot{\boldsymbol{x}}+\left(I-J^{\dagger}J\right) y q˙=Jx˙+(IJJ)y
这也是WBC控制的核心思想,即其中 y y y是满足行数的任意向量。
对于控制任务 x \boldsymbol{x} x来说, ( I − J † J ) \left(I-J^{\dagger}J\right) (IJJ)是零向量矩阵,相当于一个“过滤器”,把与控制 x \boldsymbol{x} x无关的机器人自由度过滤掉
即,无论 y y y是什么,都不会对控制 x \boldsymbol{x} x产生任何影响。这样,我们就可以通过 y y y来控制更低优先级的控制任务,同时不影响高优先级的任务。
如图所示:子空间A表示第一个任务下的操作空间,B表示第二个任务的操作空间,C表示还剩下的冗余自由度。
在这里插入图片描述
(3)推导过程
任务一:
x 0 ˙ = J 0 q ˙ − − − − − ( 1 ) ↓ q ˙ = J 0 † x 0 ˙ + ( I − J 0 † J 0 ) y − − − − − ( 2 ) \boldsymbol{\dot{x_0}}=J_0\dot{q}-----(1)\\\\ \downarrow \\\\ \dot{q}= J^{\dagger}_0\dot{\boldsymbol{x_0}}+\left(I-J^{\dagger}_0J_0\right) y -----(2) x0˙=J0q˙(1)q˙=J0x0˙+(IJ0J0)y(2)
任务二:
x 1 ˙ = J 1 q ˙ − − − − − ( 3 ) ↓ q ˙ = J 1 † x 1 ˙ + ( I − J 1 † J 1 ) y − − − − − ( 4 ) \boldsymbol{\dot{x_1}}=J_1\dot{q}-----(3)\\\\ \downarrow \\\\ \dot{q}= J^{\dagger}_1\dot{\boldsymbol{x_1}}+\left(I-J^{\dagger}_1J_1\right) y-----(4) x1˙=J1q˙(3)q˙=J1x1˙+(IJ1J1)y(4)
将(2)代入(3)中
x 1 ˙ = J 1 J 0 † x 0 ˙ + J 1 ( I − J 0 † J 0 ) y ↓ x 1 ˙ − J 1 J 0 † x 0 ˙ = J 1 ( I − J 0 † J 0 ) y \boldsymbol{\dot{x_1}}=J_1J^{\dagger}_0\dot{\boldsymbol{x_0}}+J_1\left(I-J^{\dagger}_0J_0\right) y\\\\ \downarrow \\\\ \boldsymbol{\dot{x_1}}-J_1J^{\dagger}_0\dot{\boldsymbol{x_0}}=J_1\left(I-J^{\dagger}_0J_0\right) y x1˙=J1J0x0˙+J1(IJ0J0)yx1˙J1J0x0˙=J1(IJ0J0)y
根据上述公式中的参数定义:
N 0 = I − J 0 † J 0 J 1 ∣ 0 = J 1 N 0 ↓ x 1 ˙ − J 1 J 0 † x 0 ˙ = J 1 ∣ 0 y N_0=I-J^{\dagger}_0J_0\\\\ J_{1\mid0}=J_1N_0\\ \downarrow \\ \boldsymbol{\dot{x_1}}-J_1J^{\dagger}_0\dot{\boldsymbol{x_0}}=J_{1\mid0}y N0=IJ0J0J10=J1N0x1˙J1J0x0˙=J10y
由于 J 1 ∣ 0 J_{1\mid0} J10也是冗余矩阵,所以处理方法如上:
y = J 1 ∣ 0 † ( x 1 ˙ − J 1 J 0 † x 0 ˙ ) + ( I − J 1 ∣ 0 † J 1 ∣ 0 ) z ↓ y = J 1 ∣ 0 † ( x 1 ˙ − J 1 J 0 † x 0 ˙ ) + N 1 ∣ 0 z − − − − ( 5 ) y =J_{1\mid0}^{\dagger}(\boldsymbol{\dot{x_1}}-J_1J^{\dagger}_0\dot{\boldsymbol{x_0}})+ (I-J_{1\mid0}^{\dagger}J_{1\mid0})z\\ \downarrow\\ y =J_{1\mid0}^{\dagger}(\boldsymbol{\dot{x_1}}-J_1J^{\dagger}_0\dot{\boldsymbol{x_0}})+ N_{1\mid0}z ----(5) y=J10(x1˙J1J0x0˙)+(IJ10J10)zy=J10(x1˙J1J0x0˙)+N10z(5)
将(5)代回(2)中
q ˙ = J 0 † x 0 ˙ + N 0 J 1 ∣ 0 † ( x 1 ˙ − J 1 J 0 † x 0 ˙ ) + N 0 N 1 ∣ 0 z ↓ q ˙ = J 0 † x 0 ˙ + N 0 J 1 ∣ 0 † ( x 1 ˙ − J 1 J 0 † x 0 ˙ ) + N 1 z \dot{q}= J^{\dagger}_0\dot{\boldsymbol{x_0}}+N_0J_{1\mid0}^{\dagger}(\boldsymbol{\dot{x_1}}-J_1J^{\dagger}_0\dot{\boldsymbol{x_0}})+N_0N_{1\mid0}z\\ \downarrow\\ \dot{q}= J^{\dagger}_0\dot{\boldsymbol{x_0}}+N_0J_{1\mid0}^{\dagger}(\boldsymbol{\dot{x_1}}-J_1J^{\dagger}_0\dot{\boldsymbol{x_0}})+N_1z q˙=J0x0˙+N0J10(x1˙J1J0x0˙)+N0N10zq˙=J0x0˙+N0J10(x1˙J1J0x0˙)+N1z
根据零空间投影的性质
N 0 J 1 ∣ 0 † = J 1 ∣ 0 † ↓ q ˙ = J 0 † x 0 ˙ + J 1 ∣ 0 † ( x 1 ˙ − J 1 J 0 † x 0 ˙ ) + N 1 z N_0J_{1\mid0}^{\dagger}=J_{1\mid0}^{\dagger}\\ \downarrow\\ \dot{q}= J^{\dagger}_0\dot{\boldsymbol{x_0}}+J_{1\mid0}^{\dagger}(\boldsymbol{\dot{x_1}}-J_1J^{\dagger}_0\dot{\boldsymbol{x_0}})+N_1z N0J10=J10q˙=J0x0˙+J10(x1˙J1J0x0˙)+N1z
根据前面的讨论
q ˙ 0 c m d = J 0 † x 0 ˙ \dot{q}^{cmd}_0= J^{\dagger}_0\dot{\boldsymbol{x_0}} q˙0cmd=J0x0˙
若此时已无自由冗余度,则此时以得到最终的结果
q ˙ 1 c m d = q ˙ 0 c m d + J 1 ∣ 0 † ( x ˙ 0 c m d − J 1 q ˙ 0 c m d ) \dot{q}_1^{cmd}= \dot{q}^{cmd}_0+J_{1\mid0}^{\dagger}(\boldsymbol{\dot{x}_0^{cmd}}-J_1\dot{q}^{cmd}_0) q˙1cmd=q˙0cmd+J10(x˙0cmdJ1q˙0cmd)
比较要推导的公式,其实可以发现,形式已经一致了。所以不再作进一步的迭代。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐