WBC学习笔记(一):手推WBC公式
1.介绍:WBC控制器是当今足式机器人最常用的控制器之一。基于多任务不同的优先级,它可以控制关节电机使其按照优先级的顺序满足各个任务的需求。MIT开源的cheetah mini就用到了MPC+WBIC算法来控制落足点。推导的过程参考了以下的资料mini cheetah中WBC公式解析基于零空间方法(NUB)的全身控制(WBC)的简单实现Robot Dynamics Lecture Notes由于本
介绍: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=Δqi−1+Ji∣pre†(ei−JiΔqi−1)q˙icmd=q˙i−1cmd +Ji∣pre†(x˙ides−Jiq˙i−1cmd)q¨icmd=q¨i−1cmd+Ji∣predyn(x¨icmd−J˙iq˙−Jiq¨i−1cmd)
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}
Ji∣prc=JiNi−1Ni−1=N0N1∣0⋯Ni−1∣i−2N0=I−Jc†JcNi∣i−1=I−Ji∣i−1†Ji∣i−1
- 推导过程涉及到了线性代数的伪逆矩阵和零空间,可以参考维基百科中的描述
伪逆矩阵
零空间 - 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˙i−1cmd+Ji∣pre†(x˙ides−Jiq˙i−1cmd)
(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˙=J†x˙+(I−J†J)y
这也是WBC控制的核心思想,即其中
y
y
y是满足行数的任意向量。
对于控制任务
x
\boldsymbol{x}
x来说,
(
I
−
J
†
J
)
\left(I-J^{\dagger}J\right)
(I−J†J)是零向量矩阵,相当于一个“过滤器”,把与控制
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˙=J0†x0˙+(I−J0†J0)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˙=J1†x1˙+(I−J1†J1)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˙=J1J0†x0˙+J1(I−J0†J0)y↓x1˙−J1J0†x0˙=J1(I−J0†J0)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=I−J0†J0J1∣0=J1N0↓x1˙−J1J0†x0˙=J1∣0y
由于
J
1
∣
0
J_{1\mid0}
J1∣0也是冗余矩阵,所以处理方法如上:
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=J1∣0†(x1˙−J1J0†x0˙)+(I−J1∣0†J1∣0)z↓y=J1∣0†(x1˙−J1J0†x0˙)+N1∣0z−−−−(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˙=J0†x0˙+N0J1∣0†(x1˙−J1J0†x0˙)+N0N1∣0z↓q˙=J0†x0˙+N0J1∣0†(x1˙−J1J0†x0˙)+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
N0J1∣0†=J1∣0†↓q˙=J0†x0˙+J1∣0†(x1˙−J1J0†x0˙)+N1z
根据前面的讨论
q
˙
0
c
m
d
=
J
0
†
x
0
˙
\dot{q}^{cmd}_0= J^{\dagger}_0\dot{\boldsymbol{x_0}}
q˙0cmd=J0†x0˙
若此时已无自由冗余度,则此时以得到最终的结果
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+J1∣0†(x˙0cmd−J1q˙0cmd)
比较要推导的公式,其实可以发现,形式已经一致了。所以不再作进一步的迭代。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)