腿式里程计:从关节和接触估计身体速度

腿式里程计:从关节和接触估计身体速度

第一次接触腿式里程计时,可以先把它理解成“用脚当临时路标”。轮式机器人可以通过轮子转了多少圈估计车体走了多远;腿式机器人没有连续滚动的轮子,但它有脚。只要某只脚正踩在地面上,并且没有打滑,那么这只脚在世界坐标系中就近似静止。机器人身体相对这只脚怎么动,就能反推出身体速度。

这里有一个关键假设:

vfoot,iW≈0 \mathbf{v}_{foot,i}^{W} \approx \mathbf{0} vfoot,iW0

其中 vfoot,iW∈R3\mathbf{v}_{foot,i}^{W} \in \mathbb{R}^3vfoot,iWR3 是第 iii 条腿足端在世界坐标系 WWW 中的速度,iii 是腿编号,例如左前、右前、左后、右后。上标 WWW 表示这个向量用世界坐标系表达。这个式子的意思是:如果第 iii 只脚处于稳定支撑相,那么它相对地面几乎不动。

在进入推导前,先明确腿式里程计的输入和输出。腿式里程计通常不是直接输出机器人位置,而是输出一个身体速度观测:

zleg=vB+rleg \mathbf{z}_{leg} = \mathbf{v}_B + \mathbf{r}_{leg} zleg=vB+rleg

其中 zleg∈R3\mathbf{z}_{leg} \in \mathbb{R}^3zlegR3 是腿式里程计输出的机体系速度观测,vB∈R3\mathbf{v}_B \in \mathbb{R}^3vBR3 是机器人机体在机体系 BBB 下的真实线速度,rleg∈R3\mathbf{r}_{leg} \in \mathbb{R}^3rlegR3 是腿式里程计误差。比如:

zleg=[0.420.01−0.02]m/s \mathbf{z}_{leg} = \begin{bmatrix} 0.42 \\ 0.01 \\ -0.02 \end{bmatrix} \mathrm{m/s} zleg=0.420.010.02m/s

表示机器人身体大约以 0.42 m/s0.42\ \mathrm{m/s}0.42 m/s 向前运动,侧向速度和竖直速度都比较小。这个速度观测随后会进入 EKF,用来约束 IMU 积分带来的速度漂移。

那腿式里程计的输入从哪里来?最核心的输入来自每个关节上的编码器。编码器会实时测量关节当前转到了多少角度,也就是关节角;控制器或驱动器通常还会给出关节角速度,有些机器人还会给出关节力矩。实际系统里,这些量常被组织成关节状态消息,概念上包含:

  • 关节角 q\mathbf{q}q:每个关节当前的位置。
  • 关节角速度 q˙\dot{\mathbf{q}}q˙:每个关节转动的速度。
  • 关节力矩 τ\boldsymbol{\tau}τ:每个关节受到或输出的力矩,可辅助判断足端是否接触地面。

其中 τ\boldsymbol{\tau}τ 是关节力矩向量,单位通常是 N⋅m\mathrm{N \cdot m}Nm。腿式里程计会用关节角计算足端位置,用关节角速度计算足端相对身体的速度,再结合接触状态反推出身体速度。

为了从“脚不动”推到“身体怎么动”,先定义第 iii 条腿的关节角向量:

qi=[qi,1qi,2qi,3] \mathbf{q}_i = \begin{bmatrix} q_{i,1} \\ q_{i,2} \\ q_{i,3} \end{bmatrix} qi=qi,1qi,2qi,3

其中 qi∈R3\mathbf{q}_i \in \mathbb{R}^3qiR3 表示第 iii 条腿的三个关节角,qi,1q_{i,1}qi,1qi,2q_{i,2}qi,2qi,3q_{i,3}qi,3 分别表示这条腿上第 1、2、3 个关节的角度。这里的“角向量”不是说某个角本身有方向,而是把多个关节角按固定顺序排成一个列向量,方便统一计算。不同机器人每条腿的关节数可能不同,这里用三关节腿作为四足机器人的常见例子。

比如一条腿有三个转动关节:髋关节外展/内收、髋关节前后摆动、膝关节弯曲。若当前三个关节角分别是:

qi,1=10∘,qi,2=30∘,qi,3=−60∘ q_{i,1}=10^\circ,\quad q_{i,2}=30^\circ,\quad q_{i,3}=-60^\circ qi,1=10,qi,2=30,qi,3=60

则可以写成:

qi=[10∘30∘−60∘] \mathbf{q}_i = \begin{bmatrix} 10^\circ \\ 30^\circ \\ -60^\circ \end{bmatrix} qi=103060

计算时通常会把角度转成弧度,因为三角函数和求导更自然使用弧度:

10∘=10π180 rad 10^\circ = \frac{10\pi}{180}\ \mathrm{rad} 10=18010π rad

正运动学告诉我们:只要知道关节角,就能算出足端相对机体的位置:

ri,B=fi(qi) \mathbf{r}_{i,B} = \mathbf{f}_i(\mathbf{q}_i) ri,B=fi(qi)

其中 ri,B∈R3\mathbf{r}_{i,B} \in \mathbb{R}^3ri,BR3 是第 iii 个足端相对于机体坐标系 BBB 原点的位置,fi(⋅)\mathbf{f}_i(\cdot)fi() 是第 iii 条腿的正运动学函数,机体坐标系 BBB 固定在机器人身体上。下标 i,Bi,Bi,B 表示“第 iii 条腿足端、用机体系描述”。

所谓“相对位置”,就是从机体坐标系原点指向足端的向量。如果机体坐标系 BBB 的原点在躯干中心,xxx 轴指向机器人前方,yyy 轴指向左方,zzz 轴指向上方,那么:

ri,B=[xiyizi] \mathbf{r}_{i,B} = \begin{bmatrix} x_i \\ y_i \\ z_i \end{bmatrix} ri,B=xiyizi

其中 xix_ixi 是足端相对躯干中心的前后位置,yiy_iyi 是左右位置,ziz_izi 是上下位置。比如 xi=0.3x_i=0.3xi=0.3 表示脚在身体前方 0.3 m0.3\ \mathrm{m}0.3 mzi=−0.5z_i=-0.5zi=0.5 表示脚在身体下方 0.5 m0.5\ \mathrm{m}0.5 m

为了把公式讲具体,我们先看一个平面二连杆腿的例子。假设腿只在 xxx-zzz 平面内运动,有两个关节角:

q=[q1q2] \mathbf{q} = \begin{bmatrix} q_1 \\ q_2 \end{bmatrix} q=[q1q2]

其中 q1q_1q1 是髋关节角,q2q_2q2 是膝关节角。设大腿长度为 l1l_1l1,小腿长度为 l2l_2l2,二者单位都是米。为了简化,令髋关节就是机体坐标系原点,并且 xxx 轴向前、zzz 轴向下。

这里要特别小心:正运动学真正需要的不是“膝关节处两根杆子的夹角本身”,而是每一段连杆相对于机体坐标系的方向。设大腿相对于机体坐标系的方向为:

θ1 \theta_1 θ1

设小腿相对于机体坐标系的方向为:

θ2 \theta_2 θ2

其中 θ1\theta_1θ1 是大腿的绝对方向角,θ2\theta_2θ2 是小腿的绝对方向角。所谓“绝对方向”,是指相对于机体坐标系 BBB 的角度,而不是相对于上一段连杆的角度。

在这个定义下,足端相对髋关节的位置最一般地写成:

x=l1sin⁡θ1+l2sin⁡θ2 x = l_1\sin \theta_1+ l_2\sin \theta_2 x=l1sinθ1+l2sinθ2

z=l1cos⁡θ1+l2cos⁡θ2 z = l_1\cos \theta_1+ l_2\cos \theta_2 z=l1cosθ1+l2cosθ2

这才是本质:l1l_1l1 用大腿的绝对方向 θ1\theta_1θ1l2l_2l2 用小腿的绝对方向 θ2\theta_2θ2

很多教材或机器人模型会进一步令:

θ1=q1 \theta_1=q_1 θ1=q1

如果膝关节变量 q2q_2q2 被定义为“小腿相对大腿延长方向的有符号偏转角””,也就是:

q2=θ2−θ1 q_2=\theta_2-\theta_1 q2=θ2θ1

那么才有:

θ2=θ1+q2=q1+q2 \theta_2=\theta_1+q_2=q_1+q_2 θ2=θ1+q2=q1+q2

于是公式会变成常见写法:

x=l1sin⁡q1+l2sin⁡(q1+q2) x = l_1\sin q_1+ l_2\sin(q_1+q_2) x=l1sinq1+l2sin(q1+q2)

z=l1cos⁡q1+l2cos⁡(q1+q2) z = l_1\cos q_1+ l_2\cos(q_1+q_2) z=l1cosq1+l2cos(q1+q2)

但如果说 q2q_2q2 是“大腿和小腿之间的几何夹角”,也就是两根杆子的内夹角,那么就不能直接写成 q1+q2q_1+q_2q1+q2。设这个几何夹角为:

α \alpha α

其中 α\alphaα 是大腿和小腿之间的内夹角。若 α=180∘\alpha=180^\circα=180,表示大腿和小腿完全伸直、方向相同,这时确实应该有:

θ2=θ1 \theta_2=\theta_1 θ2=θ1

因此在这种夹角定义下,小腿相对大腿的偏转量不是 α\alphaα,而是相对于伸直状态的弯曲量。常见的一种约定是:

θ2=θ1+(π−α) \theta_2 = \theta_1 + (\pi-\alpha) θ2=θ1+(πα)

其中 π\piπ 表示 180∘180^\circ180。当 α=π\alpha=\piα=π 时:

θ2=θ1+(π−π)=θ1 \theta_2=\theta_1+(\pi-\pi)=\theta_1 θ2=θ1+(ππ)=θ1

这就符合你说的情况:如果大腿和小腿夹角是 180∘180^\circ180,小腿相对于机体的方向应该和大腿相同,而不是再额外加 180∘180^\circ180

所以文中后续使用 q1+q2q_1+q_2q1+q2 时,默认采用的是“q2q_2q2 表示小腿相对大腿延长方向的有符号偏转角”这个约定,而不是“q2q_2q2 表示两根杆子的几何内夹角”。具体机器人里到底是哪一种,要看 URDF、关节零位和编码器正方向如何定义。

也可以把足端位置拆成“髋关节到膝关节”和“膝关节到足端”两段。膝关节位置为:

xknee=l1sin⁡q1,zknee=l1cos⁡q1 x_{knee}=l_1\sin q_1,\quad z_{knee}=l_1\cos q_1 xknee=l1sinq1,zknee=l1cosq1

其中 xkneex_{knee}xkneezkneez_{knee}zknee 是膝关节相对髋关节的位置。小腿这一段应该使用小腿的绝对方向 θ2\theta_2θ2,所以小腿对足端位置的贡献是:

xshank=l2sin⁡θ2,zshank=l2cos⁡θ2 x_{shank}=l_2\sin\theta_2,\quad z_{shank}=l_2\cos\theta_2 xshank=l2sinθ2,zshank=l2cosθ2

其中 xshankx_{shank}xshankzshankz_{shank}zshank 是从膝关节指向足端的向量分量。最后足端位置就是两段相加:

x=xknee+xshank x=x_{knee}+x_{shank} x=xknee+xshank

z=zknee+zshank z=z_{knee}+z_{shank} z=zknee+zshank

举例来说,如果采用“有符号偏转角”约定,并且 q1=30∘q_1=30^\circq1=30q2=−60∘q_2=-60^\circq2=60,那么小腿相对机体坐标系的方向不是 −60∘-60^\circ60,而是:

q1+q2=30∘−60∘=−30∘ q_1+q_2=30^\circ-60^\circ=-30^\circ q1+q2=3060=30

所以计算 l2l_2l2 这一段的位置贡献时,要使用 −30∘-30^\circ30

但如果采用“几何内夹角”约定,并且大腿和小腿夹角为 α=180∘\alpha=180^\circα=180,则:

θ2=q1+(π−α)=q1 \theta_2=q_1+(\pi-\alpha)=q_1 θ2=q1+(πα)=q1

这时小腿方向和大腿方向完全一致。

于是足端相对位置可以写成:

r=[xz]=[l1sin⁡q1+l2sin⁡(q1+q2)l1cos⁡q1+l2cos⁡(q1+q2)] \mathbf{r} = \begin{bmatrix} x \\ z \end{bmatrix} = \begin{bmatrix} l_1\sin q_1 + l_2\sin(q_1+q_2) \\ l_1\cos q_1 + l_2\cos(q_1+q_2) \end{bmatrix} r=[xz]=[l1sinq1+l2sin(q1+q2)l1cosq1+l2cos(q1+q2)]

这就是一个非常具体的正运动学函数:

r=f(q) \mathbf{r}=\mathbf{f}(\mathbf{q}) r=f(q)

其中 r∈R2\mathbf{r} \in \mathbb{R}^2rR2 是平面足端位置,q∈R2\mathbf{q}\in\mathbb{R}^2qR2 是平面二连杆的关节角向量。

举一个数值例子。设:

l1=0.25 m,l2=0.25 m l_1=0.25\ \mathrm{m},\quad l_2=0.25\ \mathrm{m} l1=0.25 m,l2=0.25 m

q1=30∘,q2=−60∘ q_1=30^\circ,\quad q_2=-60^\circ q1=30,q2=60

因为:

sin⁡30∘=0.5,sin⁡(−30∘)=−0.5 \sin 30^\circ=0.5,\quad \sin(-30^\circ)=-0.5 sin30=0.5,sin(30)=0.5

cos⁡30∘≈0.866,cos⁡(−30∘)≈0.866 \cos 30^\circ\approx0.866,\quad \cos(-30^\circ)\approx0.866 cos300.866,cos(30)0.866

所以:

x=0.25×0.5+0.25×(−0.5)=0 x = 0.25\times0.5 +0.25\times(-0.5) =0 x=0.25×0.5+0.25×(0.5)=0

z=0.25×0.866+0.25×0.866≈0.433 m z = 0.25\times0.866 +0.25\times0.866 \approx0.433\ \mathrm{m} z=0.25×0.866+0.25×0.8660.433 m

这表示在这个简化平面模型里,脚大约位于髋关节正下方 0.433 m0.433\ \mathrm{m}0.433 m

举个直观例子:如果机器人身体原点在躯干中心,某只脚在身体前方 0.3 m0.3\ \mathrm{m}0.3 m、左侧 0.2 m0.2\ \mathrm{m}0.2 m、下方 0.5 m0.5\ \mathrm{m}0.5 m,那么可以写成:

ri,B=[0.30.2−0.5]m \mathbf{r}_{i,B} = \begin{bmatrix} 0.3 \\ 0.2 \\ -0.5 \end{bmatrix} \mathrm{m} ri,B=0.30.20.5m

足端位置会随关节角变化。对时间求导,可以得到足端因为关节运动产生的速度:

r˙=ddtf(q) \dot{\mathbf{r}} = \frac{d}{dt}\mathbf{f}(\mathbf{q}) r˙=dtdf(q)

因为 r\mathbf{r}r 不是直接随时间变化,而是通过关节角 q(t)\mathbf{q}(t)q(t) 随时间变化,所以要使用链式法则:

r˙=∂f∂qq˙ \dot{\mathbf{r}} = \frac{\partial \mathbf{f}}{\partial \mathbf{q}} \dot{\mathbf{q}} r˙=qfq˙

其中 r˙\dot{\mathbf{r}}r˙ 是足端相对机体的速度,∂f∂q\frac{\partial \mathbf{f}}{\partial \mathbf{q}}qf 是正运动学函数对关节角的偏导矩阵,q˙\dot{\mathbf{q}}q˙ 是关节角速度向量。这个偏导矩阵就是雅可比矩阵:

J(q)=∂f∂q \mathbf{J}(\mathbf{q}) = \frac{\partial \mathbf{f}}{\partial \mathbf{q}} J(q)=qf

所以:

r˙i,B=Ji(qi)q˙i \dot{\mathbf{r}}_{i,B} = \mathbf{J}_i(\mathbf{q}_i)\dot{\mathbf{q}}_i r˙i,B=Ji(qi)q˙i

其中 r˙i,B∈R3\dot{\mathbf{r}}_{i,B} \in \mathbb{R}^3r˙i,BR3 是足端相对机体的速度,Ji(qi)∈R3×3\mathbf{J}_i(\mathbf{q}_i) \in \mathbb{R}^{3 \times 3}Ji(qi)R3×3 是第 iii 条腿的雅可比矩阵,q˙i∈R3\dot{\mathbf{q}}_i \in \mathbb{R}^3q˙iR3 是第 iii 条腿的关节角速度。雅可比矩阵可以理解为“关节速度到足端速度的转换器”:关节每秒转多少,足端就会以怎样的线速度相对身体移动。

继续用平面二连杆例子推导雅可比。前面有:

x=l1sin⁡q1+l2sin⁡(q1+q2) x = l_1\sin q_1+ l_2\sin(q_1+q_2) x=l1sinq1+l2sin(q1+q2)

z=l1cos⁡q1+l2cos⁡(q1+q2) z = l_1\cos q_1+ l_2\cos(q_1+q_2) z=l1cosq1+l2cos(q1+q2)

分别对 q1q_1q1q2q_2q2 求偏导:

∂x∂q1=l1cos⁡q1+l2cos⁡(q1+q2) \frac{\partial x}{\partial q_1} = l_1\cos q_1 + l_2\cos(q_1+q_2) q1x=l1cosq1+l2cos(q1+q2)

∂x∂q2=l2cos⁡(q1+q2) \frac{\partial x}{\partial q_2} = l_2\cos(q_1+q_2) q2x=l2cos(q1+q2)

∂z∂q1=−l1sin⁡q1−l2sin⁡(q1+q2) \frac{\partial z}{\partial q_1} = -l_1\sin q_1- l_2\sin(q_1+q_2) q1z=l1sinq1l2sin(q1+q2)

∂z∂q2=−l2sin⁡(q1+q2) \frac{\partial z}{\partial q_2} = -l_2\sin(q_1+q_2) q2z=l2sin(q1+q2)

因此雅可比矩阵为:

J(q)=[∂x∂q1∂x∂q2∂z∂q1∂z∂q2]=[l1cos⁡q1+l2cos⁡(q1+q2)l2cos⁡(q1+q2)−l1sin⁡q1−l2sin⁡(q1+q2)−l2sin⁡(q1+q2)] \mathbf{J}(\mathbf{q}) = \begin{bmatrix} \frac{\partial x}{\partial q_1} & \frac{\partial x}{\partial q_2} \\ \frac{\partial z}{\partial q_1} & \frac{\partial z}{\partial q_2} \end{bmatrix} = \begin{bmatrix} l_1\cos q_1 + l_2\cos(q_1+q_2) & l_2\cos(q_1+q_2) \\ -l_1\sin q_1 - l_2\sin(q_1+q_2) & -l_2\sin(q_1+q_2) \end{bmatrix} J(q)=[q1xq1zq2xq2z]=[l1cosq1+l2cos(q1+q2)l1sinq1l2sin(q1+q2)l2cos(q1+q2)l2sin(q1+q2)]

如果关节角速度为:

q˙=[q˙1q˙2] \dot{\mathbf{q}} = \begin{bmatrix} \dot{q}_1 \\ \dot{q}_2 \end{bmatrix} q˙=[q˙1q˙2]

其中 q˙1\dot{q}_1q˙1 是髋关节角速度,q˙2\dot{q}_2q˙2 是膝关节角速度,单位是 rad/s\mathrm{rad/s}rad/s,那么足端速度就是:

r˙=[x˙z˙]=J(q)q˙ \dot{\mathbf{r}} = \begin{bmatrix} \dot{x} \\ \dot{z} \end{bmatrix} = \mathbf{J}(\mathbf{q})\dot{\mathbf{q}} r˙=[x˙z˙]=J(q)q˙

代入刚才的数值 l1=l2=0.25 ml_1=l_2=0.25\ \mathrm{m}l1=l2=0.25 mq1=30∘q_1=30^\circq1=30q2=−60∘q_2=-60^\circq2=60,可得:

J(q)≈[0.4330.21700.125] \mathbf{J}(\mathbf{q}) \approx \begin{bmatrix} 0.433 & 0.217 \\ 0 & 0.125 \end{bmatrix} J(q)[0.43300.2170.125]

若关节角速度为:

q˙=[1.0−2.0]rad/s \dot{\mathbf{q}} = \begin{bmatrix} 1.0 \\ -2.0 \end{bmatrix} \mathrm{rad/s} q˙=[1.02.0]rad/s

则:

r˙≈[0.4330.21700.125][1.0−2.0]=[−0.001−0.25]m/s \dot{\mathbf{r}} \approx \begin{bmatrix} 0.433 & 0.217 \\ 0 & 0.125 \end{bmatrix} \begin{bmatrix} 1.0 \\ -2.0 \end{bmatrix} = \begin{bmatrix} -0.001 \\ -0.25 \end{bmatrix} \mathrm{m/s} r˙[0.43300.2170.125][1.02.0]=[0.0010.25]m/s

这个结果表示:在这个姿态和关节速度下,足端相对身体主要沿 zzz 方向移动,xxx 方向速度几乎为零。三维四足机器人的计算更复杂,但本质完全一样:先用正运动学 ri,B=fi(qi)\mathbf{r}_{i,B}=\mathbf{f}_i(\mathbf{q}_i)ri,B=fi(qi) 算位置,再用雅可比 Ji(qi)=∂fi∂qi\mathbf{J}_i(\mathbf{q}_i)=\frac{\partial \mathbf{f}_i}{\partial \mathbf{q}_i}Ji(qi)=qifi 把关节角速度变成足端相对速度。

现在考虑身体本身也在动。足端在世界中的速度由三部分组成:

  1. 身体平移带来的速度。
  2. 身体旋转带来的速度。
  3. 关节运动让足端相对身体运动产生的速度。

我们从足端的世界坐标位置开始推导。设机器人机体原点在世界坐标系中的位置为:

pBW \mathbf{p}_{B}^{W} pBW

其中 pBW∈R3\mathbf{p}_{B}^{W} \in \mathbb{R}^3pBWR3 表示机体坐标系 BBB 的原点相对于世界坐标系 WWW 的位置。设第 iii 个足端在世界坐标系中的位置为:

pfoot,iW \mathbf{p}_{foot,i}^{W} pfoot,iW

其中 pfoot,iW∈R3\mathbf{p}_{foot,i}^{W} \in \mathbb{R}^3pfoot,iWR3 表示第 iii 个足端相对于世界坐标系 WWW 的位置。足端世界位置可以写成:

pfoot,iW=pBW+RWBri,B \mathbf{p}_{foot,i}^{W} = \mathbf{p}_{B}^{W}+ \mathbf{R}_{WB}\mathbf{r}_{i,B} pfoot,iW=pBW+RWBri,B

这里 ri,B∈R3\mathbf{r}_{i,B} \in \mathbb{R}^3ri,BR3 是足端相对于机体原点的位置,并且用机体系表达;RWB∈R3×3\mathbf{R}_{WB} \in \mathbb{R}^{3 \times 3}RWBR3×3 是从机体系 BBB 转到世界系 WWW 的旋转矩阵。这个式子的意思很直观:足端的世界位置等于“身体原点的世界位置”加上“从身体原点指向足端的向量转换到世界系后的结果”。

因为足端位置 ri,B\mathbf{r}_{i,B}ri,B 会随着关节运动变化,所以更完整地写成:

pfoot,iW=pBW+RWBri,B(qi) \mathbf{p}_{foot,i}^{W} = \mathbf{p}_{B}^{W}+ \mathbf{R}_{WB}\mathbf{r}_{i,B}(\mathbf{q}_i) pfoot,iW=pBW+RWBri,B(qi)

其中 qi\mathbf{q}_iqi 是第 iii 条腿的关节角向量,ri,B(qi)\mathbf{r}_{i,B}(\mathbf{q}_i)ri,B(qi) 表示足端相对机体的位置由关节角决定。

对时间 ttt 求导,就得到足端速度:

ddtpfoot,iW=ddtpBW+ddt(RWBri,B(qi)) \frac{d}{dt}\mathbf{p}_{foot,i}^{W} = \frac{d}{dt}\mathbf{p}_{B}^{W}+ \frac{d}{dt}\left(\mathbf{R}_{WB}\mathbf{r}_{i,B}(\mathbf{q}_i)\right) dtdpfoot,iW=dtdpBW+dtd(RWBri,B(qi))

左边定义为足端世界速度:

vfoot,iW=ddtpfoot,iW \mathbf{v}_{foot,i}^{W} = \frac{d}{dt}\mathbf{p}_{foot,i}^{W} vfoot,iW=dtdpfoot,iW

第一项定义为机体原点世界速度:

vBW=ddtpBW \mathbf{v}_{B}^{W} = \frac{d}{dt}\mathbf{p}_{B}^{W} vBW=dtdpBW

第二项要用乘积求导法则:

ddt(RWBri,B)=R˙WBri,B+RWBr˙i,B \frac{d}{dt}\left(\mathbf{R}_{WB}\mathbf{r}_{i,B}\right) = \dot{\mathbf{R}}_{WB}\mathbf{r}_{i,B}+ \mathbf{R}_{WB}\dot{\mathbf{r}}_{i,B} dtd(RWBri,B)=R˙WBri,B+RWBr˙i,B

其中 R˙WB\dot{\mathbf{R}}_{WB}R˙WB 是旋转矩阵对时间的导数,r˙i,B\dot{\mathbf{r}}_{i,B}r˙i,B 是足端相对机体的位置变化率,也就是关节运动造成的足端相对速度。

先看 R˙WBri,B\dot{\mathbf{R}}_{WB}\mathbf{r}_{i,B}R˙WBri,B。如果机体有角速度 ωBW\boldsymbol{\omega}_{B}^{W}ωBW,那么一个固定在机体上的向量会因为机体旋转而在世界系中产生速度。这个结论可以用李群 SO(3)SO(3)SO(3) 和李代数 so(3)\mathfrak{so}(3)so(3) 推导出来。

旋转矩阵 RWB\mathbf{R}_{WB}RWB 属于三维旋转群:

RWB∈SO(3) \mathbf{R}_{WB} \in SO(3) RWBSO(3)

其中 SO(3)SO(3)SO(3) 表示所有三维旋转矩阵组成的集合。角速度向量 ωBW\boldsymbol{\omega}_{B}^{W}ωBW 可以通过“帽算子”变成一个反对称矩阵:

(ωBW)∧=[0−ωzωyωz0−ωx−ωyωx0] \left(\boldsymbol{\omega}_{B}^{W}\right)^{\wedge} = \begin{bmatrix} 0 & -\omega_z & \omega_y \\ \omega_z & 0 & -\omega_x \\ -\omega_y & \omega_x & 0 \end{bmatrix} (ωBW)=0ωzωyωz0ωxωyωx0

其中 ωBW=[ωx,ωy,ωz]T\boldsymbol{\omega}_{B}^{W}=[\omega_x,\omega_y,\omega_z]^TωBW=[ωx,ωy,ωz]Tωx\omega_xωxωy\omega_yωyωz\omega_zωz 分别是角速度在世界坐标系 xxxyyyzzz 轴上的分量。这个反对称矩阵属于李代数 so(3)\mathfrak{so}(3)so(3)。帽算子的关键性质是:对任意向量 a∈R3\mathbf{a}\in\mathbb{R}^3aR3,都有:

(ωBW)∧a=ωBW×a \left(\boldsymbol{\omega}_{B}^{W}\right)^{\wedge}\mathbf{a} = \boldsymbol{\omega}_{B}^{W}\times\mathbf{a} (ωBW)a=ωBW×a

其中 ×\times× 是叉乘。

当角速度使用世界坐标系表达时,旋转矩阵的导数满足下面这个关系。我们先从一个很短的时间间隔 Δt\Delta tΔt 看起。设当前时刻为 ttt,下一时刻为 t+Δtt+\Delta tt+Δt。如果机体在这段极短时间内的角速度近似为常量 ωBW\boldsymbol{\omega}_{B}^{W}ωBW,那么这段时间内新增的小旋转可以写成指数映射:

exp⁡((ωBW)∧Δt) \exp\left(\left(\boldsymbol{\omega}_{B}^{W}\right)^{\wedge}\Delta t\right) exp((ωBW)Δt)

其中 exp⁡(⋅)\exp(\cdot)exp() 是矩阵指数映射,它把李代数 so(3)\mathfrak{so}(3)so(3) 中的反对称矩阵转换成李群 SO(3)SO(3)SO(3) 中的旋转矩阵。因为 ωBW\boldsymbol{\omega}_{B}^{W}ωBW 用世界坐标系表达,所以这个小旋转是左乘到当前旋转矩阵上的:

RWB(t+Δt)=exp⁡((ωBW)∧Δt)RWB(t) \mathbf{R}_{WB}(t+\Delta t) = \exp\left(\left(\boldsymbol{\omega}_{B}^{W}\right)^{\wedge}\Delta t\right) \mathbf{R}_{WB}(t) RWB(t+Δt)=exp((ωBW)Δt)RWB(t)

这里容易误解:左乘还是右乘,不是由“世界坐标系是否静止、机体坐标系是否运动”直接决定的,而是由“小旋转增量用哪个坐标系表达”决定的。

如果小旋转用世界坐标系表达,记为:

ΔRW=exp⁡((ωBW)∧Δt) \Delta\mathbf{R}^{W} = \exp\left(\left(\boldsymbol{\omega}_{B}^{W}\right)^{\wedge}\Delta t\right) ΔRW=exp((ωBW)Δt)

其中 ΔRW\Delta\mathbf{R}^{W}ΔRW 表示用世界坐标系轴描述的短时间旋转增量。因为 RWB\mathbf{R}_{WB}RWB 的输出已经在世界坐标系中,所以这个增量作用在世界系一侧,需要左乘:

RWB(t+Δt)=ΔRWRWB(t) \mathbf{R}_{WB}(t+\Delta t) = \Delta\mathbf{R}^{W}\mathbf{R}_{WB}(t) RWB(t+Δt)=ΔRWRWB(t)

如果小旋转用机体坐标系表达,记为:

ΔRB=exp⁡((ωBB)∧Δt) \Delta\mathbf{R}^{B} = \exp\left(\left(\boldsymbol{\omega}_{B}^{B}\right)^{\wedge}\Delta t\right) ΔRB=exp((ωBB)Δt)

其中 ωBB\boldsymbol{\omega}_{B}^{B}ωBB 是机体角速度在机体系 BBB 中的表达,ΔRB\Delta\mathbf{R}^{B}ΔRB 表示用机体系轴描述的短时间旋转增量。因为它作用在机体系输入一侧,所以需要右乘:

RWB(t+Δt)=RWB(t)ΔRB \mathbf{R}_{WB}(t+\Delta t) = \mathbf{R}_{WB}(t)\Delta\mathbf{R}^{B} RWB(t+Δt)=RWB(t)ΔRB

也就是:

RWB(t+Δt)=RWB(t)exp⁡((ωBB)∧Δt) \mathbf{R}_{WB}(t+\Delta t) = \mathbf{R}_{WB}(t) \exp\left(\left(\boldsymbol{\omega}_{B}^{B}\right)^{\wedge}\Delta t\right) RWB(t+Δt)=RWB(t)exp((ωBB)Δt)

两种写法都正确,只是角速度表达坐标系不同。二者满足:

ωBW=RWBωBB \boldsymbol{\omega}_{B}^{W} = \mathbf{R}_{WB}\boldsymbol{\omega}_{B}^{B} ωBW=RWBωBB

直观地说,左乘表示“用世界坐标系的轴描述这次增量旋转”,右乘表示“用机体坐标系的轴描述这次增量旋转”。本文这里使用的是 ωBW\boldsymbol{\omega}_{B}^{W}ωBW,也就是世界系表达,所以采用左乘。

Δt\Delta tΔt 很小时,矩阵指数可以用一阶近似:

exp⁡((ωBW)∧Δt)≈I+(ωBW)∧Δt \exp\left(\left(\boldsymbol{\omega}_{B}^{W}\right)^{\wedge}\Delta t\right) \approx \mathbf{I} + \left(\boldsymbol{\omega}_{B}^{W}\right)^{\wedge}\Delta t exp((ωBW)Δt)I+(ωBW)Δt

其中 I\mathbf{I}I3×33\times33×3 单位矩阵。代回上一式:

RWB(t+Δt)≈(I+(ωBW)∧Δt)RWB(t) \mathbf{R}_{WB}(t+\Delta t) \approx \left( \mathbf{I} + \left(\boldsymbol{\omega}_{B}^{W}\right)^{\wedge}\Delta t \right) \mathbf{R}_{WB}(t) RWB(t+Δt)(I+(ωBW)Δt)RWB(t)

展开:

RWB(t+Δt)≈RWB(t)+(ωBW)∧RWB(t)Δt \mathbf{R}_{WB}(t+\Delta t) \approx \mathbf{R}_{WB}(t) + \left(\boldsymbol{\omega}_{B}^{W}\right)^{\wedge} \mathbf{R}_{WB}(t) \Delta t RWB(t+Δt)RWB(t)+(ωBW)RWB(t)Δt

两边减去 RWB(t)\mathbf{R}_{WB}(t)RWB(t)

RWB(t+Δt)−RWB(t)≈(ωBW)∧RWB(t)Δt \mathbf{R}_{WB}(t+\Delta t)-\mathbf{R}_{WB}(t) \approx \left(\boldsymbol{\omega}_{B}^{W}\right)^{\wedge} \mathbf{R}_{WB}(t) \Delta t RWB(t+Δt)RWB(t)(ωBW)RWB(t)Δt

再除以 Δt\Delta tΔt

RWB(t+Δt)−RWB(t)Δt≈(ωBW)∧RWB(t) \frac{ \mathbf{R}_{WB}(t+\Delta t)-\mathbf{R}_{WB}(t) }{ \Delta t } \approx \left(\boldsymbol{\omega}_{B}^{W}\right)^{\wedge} \mathbf{R}_{WB}(t) ΔtRWB(t+Δt)RWB(t)(ωBW)RWB(t)

Δt→0\Delta t\rightarrow0Δt0,左边就是旋转矩阵的时间导数:

R˙WB=(ωBW)∧RWB \dot{\mathbf{R}}_{WB} = \left(\boldsymbol{\omega}_{B}^{W}\right)^{\wedge} \mathbf{R}_{WB} R˙WB=(ωBW)RWB

这个式子可以理解为:R˙WB\dot{\mathbf{R}}_{WB}R˙WB 描述旋转矩阵正在怎样变化,而这个变化由当前世界系角速度对应的李代数元素 (ωBW)∧\left(\boldsymbol{\omega}_{B}^{W}\right)^{\wedge}(ωBW) 生成。

将它乘到 ri,B\mathbf{r}_{i,B}ri,B 上:

R˙WBri,B=(ωBW)∧RWBri,B \dot{\mathbf{R}}_{WB}\mathbf{r}_{i,B} = \left(\boldsymbol{\omega}_{B}^{W}\right)^{\wedge} \mathbf{R}_{WB}\mathbf{r}_{i,B} R˙WBri,B=(ωBW)RWBri,B

再利用帽算子和叉乘的等价关系,令:

a=RWBri,B \mathbf{a}=\mathbf{R}_{WB}\mathbf{r}_{i,B} a=RWBri,B

就得到:

R˙WBri,B=ωBW×(RWBri,B) \dot{\mathbf{R}}_{WB}\mathbf{r}_{i,B} = \boldsymbol{\omega}_{B}^{W} \times \left(\mathbf{R}_{WB}\mathbf{r}_{i,B}\right) R˙WBri,B=ωBW×(RWBri,B)

这就是刚体旋转速度公式 v=ω×r\mathbf{v}=\boldsymbol{\omega}\times\mathbf{r}v=ω×r 的矩阵形式:一个点相对旋转中心的位置是 r\mathbf{r}r,刚体角速度是 ω\boldsymbol{\omega}ω,那么这个点仅由旋转产生的线速度就是 ω×r\boldsymbol{\omega}\times\mathbf{r}ω×r

需要注意表达坐标系。如果角速度用机体系表达,记作 ωBB\boldsymbol{\omega}_{B}^{B}ωBB,则旋转矩阵导数常写成:

R˙WB=RWB(ωBB)∧ \dot{\mathbf{R}}_{WB} = \mathbf{R}_{WB} \left(\boldsymbol{\omega}_{B}^{B}\right)^{\wedge} R˙WB=RWB(ωBB)

如果角速度用世界系表达,记作 ωBW\boldsymbol{\omega}_{B}^{W}ωBW,则写成:

R˙WB=(ωBW)∧RWB \dot{\mathbf{R}}_{WB} = \left(\boldsymbol{\omega}_{B}^{W}\right)^{\wedge} \mathbf{R}_{WB} R˙WB=(ωBW)RWB

二者通过旋转矩阵联系:

ωBW=RWBωBB \boldsymbol{\omega}_{B}^{W} = \mathbf{R}_{WB}\boldsymbol{\omega}_{B}^{B} ωBW=RWBωBB

本文这里使用的是世界系表达的角速度 ωBW\boldsymbol{\omega}_{B}^{W}ωBW,所以采用左乘形式。

令:

ri,W=RWBri,B \mathbf{r}_{i,W} = \mathbf{R}_{WB}\mathbf{r}_{i,B} ri,W=RWBri,B

其中 ri,W∈R3\mathbf{r}_{i,W} \in \mathbb{R}^3ri,WR3 是“从机体原点指向足端”的相对位置向量,但用世界坐标系表达。于是旋转造成的速度可以写成:

ωBW×ri,W \boldsymbol{\omega}_{B}^{W}\times\mathbf{r}_{i,W} ωBW×ri,W

这个叉乘项的直觉是:如果身体绕某个轴旋转,那么离旋转中心越远的点线速度越大,速度方向垂直于角速度方向和半径方向。

再看 RWBr˙i,B\mathbf{R}_{WB}\dot{\mathbf{r}}_{i,B}RWBr˙i,B。前面已经推导过,关节运动造成的足端相对速度为:

r˙i,B=Ji(qi)q˙i \dot{\mathbf{r}}_{i,B} = \mathbf{J}_i(\mathbf{q}_i)\dot{\mathbf{q}}_i r˙i,B=Ji(qi)q˙i

其中 Ji(qi)\mathbf{J}_i(\mathbf{q}_i)Ji(qi) 是第 iii 条腿的雅可比矩阵,q˙i\dot{\mathbf{q}}_iq˙i 是第 iii 条腿的关节角速度向量。因此关节运动对世界系足端速度的贡献是:

RWBJi(qi)q˙i \mathbf{R}_{WB}\mathbf{J}_i(\mathbf{q}_i)\dot{\mathbf{q}}_i RWBJi(qi)q˙i

把三项合在一起,就得到世界坐标系中的足端速度公式。

把这三部分写在世界坐标系中:

vfoot,iW=vBW+ωBW×ri,W+RWBJi(qi)q˙i \mathbf{v}_{foot,i}^{W} = \mathbf{v}_{B}^{W}+ \boldsymbol{\omega}_{B}^{W} \times \mathbf{r}_{i,W}+ \mathbf{R}_{WB}\mathbf{J}_i(\mathbf{q}_i)\dot{\mathbf{q}}_i vfoot,iW=vBW+ωBW×ri,W+RWBJi(qi)q˙i

其中 vBW∈R3\mathbf{v}_{B}^{W} \in \mathbb{R}^3vBWR3 是机体原点在世界坐标系中的线速度,ωBW∈R3\boldsymbol{\omega}_{B}^{W} \in \mathbb{R}^3ωBWR3 是机体在世界坐标系中的角速度,ri,W∈R3\mathbf{r}_{i,W} \in \mathbb{R}^3ri,WR3 是足端相对机体原点的位置但用世界坐标系表达,RWB∈R3×3\mathbf{R}_{WB} \in \mathbb{R}^{3 \times 3}RWBR3×3 是把机体系向量转换到世界系的旋转矩阵。

因为本文前面把滤波器速度主要写成机体系速度 vB\mathbf{v}_BvB,所以我们把上式转回机体系。下面推导机体系下第 iii 个足端速度公式。

坐标系转换的方法是左乘 RWBT\mathbf{R}_{WB}^{T}RWBT。这里 RWBT\mathbf{R}_{WB}^{T}RWBTRWB\mathbf{R}_{WB}RWB 的转置,也是从世界系转回机体系的旋转矩阵。于是:

vfoot,i=RWBTvfoot,iW \mathbf{v}_{foot,i} = \mathbf{R}_{WB}^{T}\mathbf{v}_{foot,i}^{W} vfoot,i=RWBTvfoot,iW

vB=RWBTvBW \mathbf{v}_B = \mathbf{R}_{WB}^{T}\mathbf{v}_{B}^{W} vB=RWBTvBW

ωB=RWBTωBW \boldsymbol{\omega}_B = \mathbf{R}_{WB}^{T}\boldsymbol{\omega}_{B}^{W} ωB=RWBTωBW

ri,B=RWBTri,W \mathbf{r}_{i,B} = \mathbf{R}_{WB}^{T}\mathbf{r}_{i,W} ri,B=RWBTri,W

其中 vfoot,i\mathbf{v}_{foot,i}vfoot,i 是足端速度的机体系表达,vB\mathbf{v}_BvB 是机体原点速度的机体系表达,ωB\boldsymbol{\omega}_BωB 是机体角速度的机体系表达。

叉乘项在旋转变换下保持结构(矩阵具有结合律),也就是说:

RWBT(ωBW×ri,W)=ωB×ri,B \mathbf{R}_{WB}^{T} \left( \boldsymbol{\omega}_{B}^{W}\times\mathbf{r}_{i,W} \right) = \boldsymbol{\omega}_B\times\mathbf{r}_{i,B} RWBT(ωBW×ri,W)=ωB×ri,B

关节速度项本来就是先在机体系中由 Ji(qi)q˙i\mathbf{J}_i(\mathbf{q}_i)\dot{\mathbf{q}}_iJi(qi)q˙i 得到,再通过 RWB\mathbf{R}_{WB}RWB 转到世界系。所以转回机体系后:

RWBT(RWBJi(qi)q˙i)=Ji(qi)q˙i \mathbf{R}_{WB}^{T} \left( \mathbf{R}_{WB}\mathbf{J}_i(\mathbf{q}_i)\dot{\mathbf{q}}_i \right) = \mathbf{J}_i(\mathbf{q}_i)\dot{\mathbf{q}}_i RWBT(RWBJi(qi)q˙i)=Ji(qi)q˙i

因此世界系公式整体转回机体系后,就得到:

vfoot,i=vB+ωB×ri,B+Ji(qi)q˙i \mathbf{v}_{foot,i} = \mathbf{v}_B+ \boldsymbol{\omega}_B \times \mathbf{r}_{i,B}+ \mathbf{J}_i(\mathbf{q}_i)\dot{\mathbf{q}}_i vfoot,i=vB+ωB×ri,B+Ji(qi)q˙i

其中:

  • vfoot,i∈R3\mathbf{v}_{foot,i} \in \mathbb{R}^3vfoot,iR3 是第 iii 个足端在机体系表达下的速度。
  • vB∈R3\mathbf{v}_B \in \mathbb{R}^3vBR3 是机体原点的线速度,用机体系表达。
  • ωB∈R3\boldsymbol{\omega}_B \in \mathbb{R}^3ωBR3 是机体角速度,用机体系表达。
  • ωB×ri,B\boldsymbol{\omega}_B \times \mathbf{r}_{i,B}ωB×ri,B 是身体旋转导致足端产生的速度。
  • Ji(qi)q˙i\mathbf{J}_i(\mathbf{q}_i)\dot{\mathbf{q}}_iJi(qi)q˙i 是关节运动导致足端相对身体产生的速度。

这个式子是腿式里程计最重要的一步。它说:脚的速度不是只由关节决定,也不是只由身体决定,而是身体平移、身体旋转和关节运动三者叠加的结果。

当足端稳定接触地面时,足端世界速度近似为零。由于旋转坐标变换不会改变“零向量”这个事实,所以机体系中也可以把足端速度近似看成零:

vfoot,i≈0 \mathbf{v}_{foot,i} \approx \mathbf{0} vfoot,i0

把它代入刚才的速度关系:

0≈vB+ωB×ri,B+Ji(qi)q˙i \mathbf{0} \approx \mathbf{v}_B + \boldsymbol{\omega}_B \times \mathbf{r}_{i,B} + \mathbf{J}_i(\mathbf{q}_i)\dot{\mathbf{q}}_i 0vB+ωB×ri,B+Ji(qi)q˙i

移项后得到由第 iii 条支撑腿估计出的机体速度:

vB,i≈−ωB×ri,B−Ji(qi)q˙i \mathbf{v}_{B,i} \approx -\boldsymbol{\omega}_B \times \mathbf{r}_{i,B}- \mathbf{J}_i(\mathbf{q}_i)\dot{\mathbf{q}}_i vB,iωB×ri,BJi(qi)q˙i

其中 vB,i∈R3\mathbf{v}_{B,i} \in \mathbb{R}^3vB,iR3 表示仅由第 iii 条腿反推出的机体速度估计。注意它是一个观测值,不等于真实速度本身;它会受到关节编码器噪声、接触判断错误、足端打滑、运动学模型误差等影响。

用一个一维简化例子帮助理解。假设机器人只有前后方向运动,忽略身体旋转,即 ωB=0\boldsymbol{\omega}_B=\mathbf{0}ωB=0。某条支撑腿的关节运动让脚相对身体向后移动,速度为:

Ji(qi)q˙i=[−0.400]m/s \mathbf{J}_i(\mathbf{q}_i)\dot{\mathbf{q}}_i = \begin{bmatrix} -0.4 \\ 0 \\ 0 \end{bmatrix} \mathrm{m/s} Ji(qi)q˙i=0.400m/s

脚踩在地上不动,所以如果从身体上看脚在向后跑,那么从地面上看身体就在向前走。代入公式:

vB,i≈−[−0.400]=[0.400]m/s \mathbf{v}_{B,i} \approx - \begin{bmatrix} -0.4 \\ 0 \\ 0 \end{bmatrix} = \begin{bmatrix} 0.4 \\ 0 \\ 0 \end{bmatrix} \mathrm{m/s} vB,i0.400=0.400m/s

这就是腿式里程计的直觉:支撑脚相对身体向后运动,身体相对地面向前运动。

真实四足机器人通常同时有多条腿接触地面。每条支撑腿都能给出一个速度估计:

vB,1, vB,2, vB,3, vB,4 \mathbf{v}_{B,1},\ \mathbf{v}_{B,2},\ \mathbf{v}_{B,3},\ \mathbf{v}_{B,4} vB,1, vB,2, vB,3, vB,4

其中 vB,1\mathbf{v}_{B,1}vB,1vB,4\mathbf{v}_{B,4}vB,4 分别是四条腿各自给出的机体速度估计。如果每条腿都同样可靠,可以简单平均:

zleg=1Nc∑i∈CvB,i \mathbf{z}_{leg} = \frac{1}{N_c}\sum_{i \in \mathcal{C}}\mathbf{v}_{B,i} zleg=Nc1iCvB,i

其中 zleg∈R3\mathbf{z}_{leg} \in \mathbb{R}^3zlegR3 是最终输出给滤波器的腿式速度观测,C\mathcal{C}C 是当前被认为处于接触状态的腿集合,NcN_cNc 是接触腿数量。

但现实中每条腿并不一样可靠。刚落脚的腿可能发生冲击,快离地的腿可能接触不稳,踩在松软地面上的腿可能打滑。因此更常见的是给每条腿一个接触置信度。令 si∈[0,1]s_i \in [0,1]si[0,1] 表示第 iii 条腿处于稳定支撑状态的概率或权重,si=0s_i=0si=0 表示完全不相信这条腿,si=1s_i=1si=1 表示非常相信这条腿。加权融合后:

zleg=∑isivB,i∑isi \mathbf{z}_{leg} = \frac{\sum_i s_i \mathbf{v}_{B,i}}{\sum_i s_i} zleg=isiisivB,i

其中 vB,i\mathbf{v}_{B,i}vB,i 是由第 iii 条腿反推出的身体速度。

接下来要回答一个问题:sis_isi 从哪里来?最直接的方法是根据地面反作用力判断。设 Fz,iF_{z,i}Fz,i 表示第 iii 条腿竖直方向的地面反作用力,FthF_{th}Fth 表示接触判断阈值。如果 Fz,iF_{z,i}Fz,i 大于阈值,就认为脚踩在地上:

si={1,Fz,i>Fth0,Fz,i≤Fth s_i = \begin{cases} 1, & F_{z,i} > F_{th} \\ 0, & F_{z,i} \le F_{th} \end{cases} si={1,0,Fz,i>FthFz,iFth

其中 Fz,iF_{z,i}Fz,i 的单位是牛顿,FthF_{th}Fth 的单位也是牛顿。比如 Fth=82 NF_{th}=82\ \mathrm{N}Fth=82 N,如果某条腿测得 Fz,i=120 NF_{z,i}=120\ \mathrm{N}Fz,i=120 N,则认为它在支撑;如果只测得 Fz,i=20 NF_{z,i}=20\ \mathrm{N}Fz,i=20 N,则认为它没有稳定接触。

硬阈值容易在临界点附近抖动。比如 Fz,iF_{z,i}Fz,i80 N80\ \mathrm{N}80 N85 N85\ \mathrm{N}85 N 之间来回跳,接触状态就会频繁切换。为了更稳定,可以使用迟滞判断:进入接触用较高阈值 FhighF_{high}Fhigh,离开接触用较低阈值 FlowF_{low}Flow,并要求状态持续一小段时间才切换。也可以使用逻辑回归,把力、关节速度等信息转成平滑概率:

si=11+exp⁡(−(β0+β1Fz,i)) s_i = \frac{1}{1+\exp(-(\beta_0+\beta_1 F_{z,i}))} si=1+exp((β0+β1Fz,i))1

其中 exp⁡(⋅)\exp(\cdot)exp() 是指数函数,β0\beta_0β0β1\beta_1β1 是通过数据拟合得到的参数。这个式子输出总在 000111 之间,适合当作接触概率。

现在再看一个多腿加权例子。假设四条腿给出的速度估计分别为:

vB,1=[0.420.020.00],vB,2=[0.390.010.01],vB,3=[0.90−0.200.10],vB,4=[0.410.000.00] \mathbf{v}_{B,1} = \begin{bmatrix} 0.42 \\ 0.02 \\ 0.00 \end{bmatrix}, \quad \mathbf{v}_{B,2} = \begin{bmatrix} 0.39 \\ 0.01 \\ 0.01 \end{bmatrix}, \quad \mathbf{v}_{B,3} = \begin{bmatrix} 0.90 \\ -0.20 \\ 0.10 \end{bmatrix}, \quad \mathbf{v}_{B,4} = \begin{bmatrix} 0.41 \\ 0.00 \\ 0.00 \end{bmatrix} vB,1=0.420.020.00,vB,2=0.390.010.01,vB,3=0.900.200.10,vB,4=0.410.000.00

单位都是 m/s\mathrm{m/s}m/s。其中第三条腿的估计明显异常,可能是打滑或接触判断不稳。假设接触权重为:

s1=1.0,s2=0.8,s3=0.1,s4=1.0 s_1=1.0,\quad s_2=0.8,\quad s_3=0.1,\quad s_4=1.0 s1=1.0,s2=0.8,s3=0.1,s4=1.0

则融合速度为:

zleg=1.0vB,1+0.8vB,2+0.1vB,3+1.0vB,41.0+0.8+0.1+1.0 \mathbf{z}_{leg} = \frac{ 1.0\mathbf{v}_{B,1} +0.8\mathbf{v}_{B,2} +0.1\mathbf{v}_{B,3} +1.0\mathbf{v}_{B,4} }{ 1.0+0.8+0.1+1.0 } zleg=1.0+0.8+0.1+1.01.0vB,1+0.8vB,2+0.1vB,3+1.0vB,4

计算后大约为:

zleg≈[0.4250.0030.007]m/s \mathbf{z}_{leg} \approx \begin{bmatrix} 0.425 \\ 0.003 \\ 0.007 \end{bmatrix} \mathrm{m/s} zleg0.4250.0030.007m/s

可以看到,第三条腿虽然给出了离谱速度,但因为权重只有 0.10.10.1,它对最终结果影响很小。这就是接触概率或接触权重的意义:不是盲目相信每一条腿,而是根据接触可信度决定每条腿说话的分量。

腿式里程计最终进入滤波器的是速度观测:

zleg=vB+rleg \mathbf{z}_{leg} = \mathbf{v}_B + \mathbf{r}_{leg} zleg=vB+rleg

其中 rleg∈R3\mathbf{r}_{leg} \in \mathbb{R}^3rlegR3 是腿式速度观测噪声。这个式子表达的是:腿式里程计观测到的速度 zleg\mathbf{z}_{leg}zleg 等于真实机体速度 vB\mathbf{v}_BvB 加上一些误差。

观测协方差可写为:

Rleg=diag⁡(σvx2,σvy2,σvz2) \mathbf{R}_{leg} = \operatorname{diag}(\sigma_{vx}^2, \sigma_{vy}^2, \sigma_{vz}^2) Rleg=diag(σvx2,σvy2,σvz2)

其中 Rleg∈R3×3\mathbf{R}_{leg} \in \mathbb{R}^{3 \times 3}RlegR3×3 是腿式里程计观测协方差,σvx\sigma_{vx}σvxσvy\sigma_{vy}σvyσvz\sigma_{vz}σvz 分别是机体系 xxxyyyzzz 方向速度观测标准差。标准差越大,表示越不相信腿式里程计。

例如:

σvx=0.05,σvy=0.05,σvz=0.15 \sigma_{vx}=0.05,\quad \sigma_{vy}=0.05,\quad \sigma_{vz}=0.15 σvx=0.05,σvy=0.05,σvz=0.15

表示系统比较相信前后和左右速度,但不太相信竖直速度。原因很直观:腿式机器人在崎岖地面上行走时,足端接触高度、地形起伏和冲击会让竖直方向速度更难估计。

腿式里程计解决的问题是:限制 IMU 的速度漂移,尤其在视觉不稳定或视觉频率较低时,提供强有力的短时速度约束。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值