移动机器人的运动学模型

发布于 2023-11-27
更新于 2024-05-21

概率运动学

前面的博客中讨论了机器人学中的空间描述与坐标变换,其中讲的是普适性的机器人学,现在我们来讨论简化的情况:平面移动机器人,它仅需2个位置参数和1个姿态参数即可。
假设有平面上移动的机器人,位姿通过二维坐标及其方位角表示:

$$ \begin{equation} \begin{pmatrix} x \\ y \\ \theta \end{pmatrix} \end{equation} $$

机器人的方向经常称为方位(bearing) 或航向(heading direction) 。机器人方向 $\theta=0$ 的方向为$x$轴,$\theta = \frac{\pi}{2}$ 方向为 $y$轴方向。
对于机器人所处的环境而言,有时仅需要位置参数即可:

$$ \begin{align} \begin{pmatrix} x \\ y \end{pmatrix} \end{align} $$

概率运动学模型就是条件概率,在对 $\boldsymbol{x}_{t-1}$ 状态下的机器人执行动作 $\boldsymbol{u}_t$ 后,机器人的运动学状态的后验分布为:

$$ \begin{align} p(\boldsymbol{x}_t | \boldsymbol{u}_t, \boldsymbol{x}_{t-1}) \end{align} $$

注意到,这里的 $\boldsymbol{x}_t$ 和 $\boldsymbol{x}_{t-1}$ 都是机器人位姿矢量, $\boldsymbol{u}_t$ 是运动控制,即机器人动作。实际应用中, $\boldsymbol{u}_t$ 有时由机器人里程计提供。
下面介绍两种特定的概率运动学模型。

速度运动模型

速度运动模型(velocity motion model) 认为可以通过两个速度(旋转速度和平移速度)来控制机器人。许多商业机器人会提供这样的控制接口。
用 $v_t$ 表示 $t$ 时刻的平移速度(translational velocity),用 $\omega_t$ 表示旋转速度(rotational velocity),有:

$$ \begin{align} u_t = \begin{pmatrix} v_t \\ \omega_t \end{pmatrix} \end{align} $$

规定:逆时针(左转), $\omega_t$ 为正,向前运动的 $v_t$ 为正。
下面来做纯数学的推导。
先像高中数学/物理一样,假设机器人运动时无噪声,令 $u_t = (v \space \omega)^T$ 表示$t$ 时刻的控制,如果在 $[t-1,t]$ 时间内输入的 $u_t$ 中平移速度和旋转速度都是常量,则机器人运动的轨迹半径为:

$$ \begin{align} r = \mid\frac{v}{w} \mid \end{align} $$

旋转速度为0时,轨迹半径为无穷大。我们都知道:

$$ \begin{align} v=\omega r \end{align} $$

令机器人初始位姿为 $x_{t-1} = (x \quad y \quad \theta)^T$ ,假设在 $\Delta t$ 时间内保持速度 $(v \quad \omega)^T$ 恒定。机器人轨迹圆弧中心为 $(x_c \enspace y_c)^T$ 。运动 $\Delta t$ 时间后,理想情况下机器人状态为 $x_{t} = (x' \quad y' \quad \theta')^T$ 有:

运动学分析示意图运动学分析示意图

$$ \begin{align} x_c & = x - \frac{v}{\omega} \sin \theta \\ y_c &= y + \frac{v}{\omega} \cos \theta \\ \begin{pmatrix} x' \\ y' \\ \theta ' \end{pmatrix} &= \begin{pmatrix} x_c + \frac{v}{\omega} \sin (\theta + \omega \Delta t) \\ y_c - \frac{v}{\omega} \cos (\theta + \omega \Delta t) \\ \omega \Delta t \end{pmatrix} \notag \\ &=\begin{pmatrix} x \\ y \\ \theta \end{pmatrix} + \begin{pmatrix} - \frac{v}{\omega} \sin \theta + \frac{v}{\omega} \sin (\theta + \omega \Delta t) \\ \frac{v}{\omega} \cos \theta - \frac{v}{\omega} \cos (\theta + \omega \Delta t) \\ \omega \Delta t \end{pmatrix} \end{align} $$

现在,我们来考虑引入噪声的情况,假设考虑噪声的实际速度为:

$$ \begin{align} \begin{pmatrix} \hat v \\ \hat \omega \end{pmatrix} = \begin{pmatrix} v \\ \omega \end{pmatrix} +\begin{pmatrix} \varepsilon_{\alpha _1 v^2 + \alpha_2 \omega ^2} \\ \varepsilon_{\alpha _3 v^2 + \alpha_4 \omega ^2} \end{pmatrix} \end{align} $$

其中, $\varepsilon_{b^2}$ 是一个方差为 $b^2$ 均值为0的误差变量,参数 $\alpha_1 \sim \alpha_4$ 是指定机器人的特定的误差参数。误差 $\varepsilon_{b^2}$ 可以有正态分布和三角分布两种:

$$ \begin{align} \varepsilon_{b^2}(a)=\frac{1}{\sqrt{2 \pi b^2}} \exp \{- \frac{1}{2} \frac{a^2}{b^2} \} \\ \varepsilon_{b^2}(a) = max \{ 0,\frac{1}{\sqrt{6} b} - \frac{|a|}{6 b^2} \} \end{align} $$

两种分布的均值都是0,方差都是 $b^2$ ,分布图如下图所示:

正态分布与三角分布.png正态分布与三角分布.png
图片引自《Probabilistic Robotics》
因此,在 $x_{t-1} = (x \quad y \quad \theta)^T$ 执行完运动指令 $u_t = (v \space \omega)^T$ 后真实位姿 $x_{t} = (x' \quad y' \quad \theta')^T$ 较好的模型为:

$$ \begin{align} \begin{pmatrix} x' \\ y' \\ \theta ' \end{pmatrix} =\begin{pmatrix} x \\ y \\ \theta \end{pmatrix} + \begin{pmatrix} - \frac{\hat v}{\hat \omega} \sin \theta + \frac{\hat v}{\hat \omega} \sin (\theta + \hat \omega \Delta t) \\ \frac{\hat v}{\hat\omega} \cos \theta - \frac{\hat v}{\hat\omega} \cos (\theta + \hat \omega \Delta t) \\ \hat \omega \Delta t \end{pmatrix} \end{align} $$

上式中,我们虽然考虑了噪声,但是仍然有一个假设:机器人运动轨迹为标准的圆弧,这在现实世界中显然是不可能的,这个假设在后面的贝叶斯滤波的状态估计时,可能会产生较大的影响,因此我们要找到不使后验分布退化的描述,假设机器人达到最终位姿时,旋转 $\hat \gamma$ ,不再根据上面的(13)式计算 $\theta '$ :

$$ \begin{align} \theta ' &= \theta + \hat \omega \Delta t + \hat\gamma \Delta t \\ \text{其中} \hat \gamma &= \varepsilon_{\alpha_5 v^2 + \alpha_6 \omega^2} \end{align} $$

这里的 $\alpha_5$ 和 $\alpha_6$ 确定附加的旋转噪声方差的额外的特定机器人参数。
运动模型为:

$$ \begin{align} \begin{pmatrix} x' \\ y' \\ \theta ' \end{pmatrix} =\begin{pmatrix} x \\ y \\ \theta \end{pmatrix} + \begin{pmatrix} - \frac{\hat v}{\hat \omega} \sin \theta + \frac{\hat v}{\hat \omega} \sin (\theta + \hat \omega \Delta t) \\ \frac{\hat v}{\hat\omega} \cos \theta - \frac{\hat v}{\hat\omega} \cos (\theta + \hat \omega \Delta t) \\ \hat \omega \Delta t + \hat\gamma \Delta t \end{pmatrix} \end{align} $$

现在我们不考虑最终的姿态 $\theta '$ ,机器人从 $x_{t-1} = (x \quad y \quad \theta)^T$ 移动到 $x_t = (x' \quad y')^T$ ,假设轨迹圆心为 $(x^{\ast} \quad y^{\ast})^T$ 并由下式给出:

$$ \begin{align} \begin{pmatrix} x^{\ast} \\ y^{\ast} \end{pmatrix} = \begin{pmatrix} x \\ y \end{pmatrix} + \begin{pmatrix} -\lambda \sin \theta \\ \lambda \cos \theta \end{pmatrix} =\begin{pmatrix} \frac{x+x'}{2} +\mu (y-y') \\ \frac{y + y'}{2} + \mu (x'-x) \end{pmatrix} \end{align} $$

对未知的 $\lambda ,\mu \isin \Re$ 第一个等式表示是圆心与机器人初始方向正交,第二个等式是约束圆心在起点和终点线段的中垂线上。上式可以求出解析解:

$$ \begin{align} \mu &= \frac{1}{2} \frac{(x-x') \cos \theta + (y - y') \sin \theta }{(y - y') \cos \theta - (x- x') \sin \theta } \\ &\Downarrow \notag \\ \begin{pmatrix} x^{\ast} \\ y^{\ast} \end{pmatrix} & = \begin{pmatrix} \frac{x+x'}{2} +\frac{1}{2} \frac{(x-x') \cos \theta + (y - y') \sin \theta }{(y - y') \cos \theta - (x- x') \sin \theta } (y-y') \\ \frac{y + y'}{2} + \frac{1}{2} \frac{(x-x') \cos \theta + (y - y') \sin \theta }{(y - y') \cos \theta - (x- x') \sin \theta } (x'-x) \end{pmatrix} \\ \end{align} $$

圆的半径有:

$$ \begin{align} r^{\ast} &=\sqrt{(x-x^{\ast} )^2 + (y - y^{\ast} )^2}=\sqrt{(x'-x^{\ast} )^2 + (y' - y^{\ast} )^2} \\ \Delta \theta& = atan2 (y' - y^{\ast} ,x' - x^{\ast}) - atan2 (y- y^{\ast},x-x^{\ast}) \\ atan2(y,x) &= \begin{cases} atan(y/x) &\text{if } x > 0 \\ sign(y) (\pi-atan(|y/x|)) &\text{if } x < 0 \\ 0 &\text{if } x=y=0 \\ sign(y) \pi /2 &\text{if } x=0,y \not= 0 \end{cases} \end{align} $$

机器人移动距离为:

$$ \begin{align} \Delta dist = r^{\ast} \Delta \theta \end{align} $$

现在由 $\Delta dist$ 和 $\Delta \theta$ 可以容易地计算出线速度 $\hat v$ 和角速度 $\hat \omega$ :

$$ \begin{align} \hat u_t = \begin{pmatrix} \hat v \\ \hat \omega \end{pmatrix} = \Delta t ^{-1} \begin{pmatrix} \Delta dist \\ \Delta \theta \end{pmatrix} \end{align} $$

由上面的式(14)、(15)得到旋转速度:

$$ \begin{align} \hat \gamma = \Delta t^{-1} (\theta ' \quad \theta ) - \hat \omega \end{align} $$

得到运动误差

$$ \begin{align} v_{err} &= v-\hat v \\ \omega _{err} &= \omega -\hat \omega \\ \gamma _{err} &= \hat \gamma \end{align} $$

再由上面的式(10)、(15)的误差模型,得到误差的概率:

$$ \begin{align} \varepsilon_{\alpha _1 v^2 + \alpha_2 \omega ^2} (v_{err})\\ \varepsilon_{\alpha _3 v^2 + \alpha_4 \omega ^2}(\omega _{err}) \\ \varepsilon_{\alpha_5 v^2 + \alpha_6 \omega^2} (\gamma _{err}) \end{align} $$

这里不同来源的误差是彼此独立的,于是我们需要的概率就有:

$$ \begin{align} p(x_t | u_t ,x_{t-1}) = \varepsilon_{\alpha _1 v^2 + \alpha_2 \omega ^2} (v_{err}) \varepsilon_{\alpha _3 v^2 + \alpha_4 \omega ^2}(\omega _{err}) \varepsilon_{\alpha_5 v^2 + \alpha_6 \omega^2} (\gamma _{err}) \end{align} $$

现在我们来看算法流程:

速度运动模型算法.png速度运动模型算法.png
函数 $prob(a^2,b)$ 是给定均值和方差计算概率的,参照上面的式(11)、(12)有:
计算两种不同的密度分布的算法计算两种不同的密度分布的算法

关于采样,下图的采样算法sample_motion_model_velocity 实现了前向模型。

sample_motion_model_velocity.pngsample_motion_model_velocity.png

下图的sample_normal_distribution 算法实现了对一个正态分布采样的通用近似。这个近似利用中心极限定理,即任意非退化随机变量的平均都收敛到一个正态分布。通过将12个均匀分布求平均,算法产生近似正态分布的值;尽管技术上,得到的值总是位于[ - 2b, 2b] 。最后的sample_triangular_distribution 算法实现一个三角形分布的采样。

sample_normal_distribution.pngsample_normal_distribution.png

里程计运动模型

里程通常可通过整合轮子的编码信息来得到;许多商业机器人在固定的时间间隔(如0. ls) 产生这样的积分位姿估计。这就引出了本章讨论的第二个运动模型,里程计运动模型(odometry motion model) 。里程计运动模型用距离测量代替控制。实际经验表明,里程计运动模型虽然仍存在误差,但通常比速度运动模型更精确。
里程计模型使用相对运动信息(relative motion information) , 该信息由机器人内部里程计测量。更具体地,在时间间隔 $(t-1,t]$ 内,机器人位姿由$x_{t-1}$ 前进到 $x_t$ ,里程计反馈了从 $\bar{x}_{t-1} = (\bar{x} \medspace \bar{y} \medspace \bar{\theta})^T$ 到 $\bar{x}_{t} = (\bar{x}' \medspace \bar{y}' \medspace \bar{\theta}')^T$ 的相对前进,不过该信息是机器人内部坐标系的信息,该坐标系与世界坐标系的关系是未知的。运动信息定义为:

$$ \begin{align} u_t = \begin{pmatrix} \bar{x}_{t-1} \\ \bar{x}_t \end{pmatrix} \end{align} $$

为了提取出相对距离信息,现在将 $u_t$ 分解:旋转、直线运动(平移)和另一个旋转,初始旋转 $\delta _{rot1}$ 平移 $\delta _{trans}$ 和第二次旋转 $\delta _{rot2}$ ,显然每对状态信息都具有唯一的分解,这是易证的。
在进行数学推导之前,我们先看一下算法流程:

基于里程计信息的算法基于里程计信息的算法

算法的输入信息是初始位姿$x_{t-1}$ 、从里程计获取到的一对位姿 $u_t = (\bar{x}_{t-1} \medspace \bar{x})^T$ 和一个假定的最终姿态 $x_t$ ,输出是数值概率 $p(x_t|u_t,x_{t-1})$ 。如果使用粒子滤波进行采样,下图是一种采样算法:

sample_motion_model_odometrysample_motion_model_odometry
采样算法比闭式算法更容易实现。

数学推导
从里程计的读数进行分解:

$$ \begin{align} \delta _{rot1} &= atan2 (\bar{y} '-\bar{y}, \bar{x}' - \bar{x}) - \bar{\theta} \\ \delta _{trans} &= \sqrt{(\bar{x} - \bar{x}')^2 + (\bar{y} -\bar{y}')^2} \\ \delta _{rot2} &= \bar{\theta}' - \bar{\theta} - \delta _{rot1} \end{align} $$

为了建立运动误差的模型,假定旋转和平移的“真实值”是用测量值减去均值为 $0$ 、方差为 $b^2$ 的独立噪声 $\varepsilon_{b^2}$ 获得,

$$ \begin{align} \bar{\delta}_{rot1} &= \delta _{rot1} - \varepsilon_{\alpha _1 \delta^2_{rot1} + \alpha_2 \delta ^2_{trans}} \\ \bar{\delta}_{trans} &= \delta _{trans} - \varepsilon_{\alpha _3 \delta^2_{trans} + \alpha_4 \delta ^2_{rot1} + \alpha_4 \delta ^2_{rot2}} \\ \bar{\delta}_{rot2} &= \delta _{rot2} -\varepsilon_{\alpha _1 \delta^2_{rot2} + \alpha_2 \delta ^2_{trans}} \end{align} $$

参数 $\alpha_1 \sim \alpha_4$ 是机器人的误差参数,它们指定运动的累计误差。

$$ \begin{align} \begin{pmatrix} x' \\ y' \\ \theta ' \end{pmatrix} =\begin{pmatrix} x \\ y \\ \theta \end{pmatrix} + \begin{pmatrix} \bar{\delta}_{trans} \cos (\theta + \bar{\delta}_{rot1}) \\ \bar{\delta}_{trans} \sin (\theta+\bar{\delta}_{rot2}) \\ \bar{\delta}_{rot1} +\bar{\delta}_{rot2} \end{pmatrix} \end{align} $$

算法sample_motion_model_odometry实现了上面的式(34)~式(40),对于算法motion_model_odometry的第5-7行,假设 $x_t$ 是最终的实际位姿,那么里程计误差为:

$$ \begin{align} \delta _{rot1} - \bar{\delta}_{rot1} \\ \delta _{trans} - \bar{\delta}_{trans} \\ \delta _{rot2} - \bar{\delta}_{rot2} \end{align} $$

前面式(37)-(39)的误差模型意味着这些误差的概率可以由上面定义的分布 $\varepsilon$ 给定:

$$ \begin{align} p_1 &= \varepsilon_{\alpha _1 \delta^2_{rot1} + \alpha_2 \delta ^2_{trans}} (\delta _{rot1} - \bar{\delta}_{rot1}) \\ p_2 &= \varepsilon_{\alpha _3 \delta^2_{trans} + \alpha_4 \delta ^2_{rot1} + \alpha_4 \delta ^2_{rot2}} (\delta _{trans} - \bar{\delta}_{trans}) \\ p_3 &= \varepsilon_{\alpha _1 \delta^2_{rot2} + \alpha_2 \delta ^2_{trans}} (\delta _{rot2} - \bar{\delta}_{rot2}) \end{align} $$

因为误差彼此之间相互独立,因此联合误差的概率为 $p_1 p_2 p_3$ 。

地图信息

许多情况下,总是给定一个地图 $\boldsymbol{m}$ ,它可能包括关于机器人能或不能通过的空间的信息。地图信息能给机器人位姿提供更多约束条件。此时模型表示为 $p(\boldsymbol{x}_t | \boldsymbol{u}_t, \boldsymbol{x}_{t-1},\boldsymbol{m})$ ,如果地图 $\boldsymbol{m}$ 携带有关位姿估计的信息,有:

$$ \begin{align} p(\boldsymbol{x}_t | \boldsymbol{u}_t, \boldsymbol{x}_{t-1}) \not = p(\boldsymbol{x}_t | \boldsymbol{u}_t, \boldsymbol{x}_{t-1},\boldsymbol{m}) \end{align} $$

基于地图的运动模型计算是指,被放置在地图 $\boldsymbol{m}$ 所表示的环境里的机器人在位姿 $\boldsymbol{x}_{t-1}$ 处执行动作 $\boldsymbol{u}_t$ 达到位姿 $\boldsymbol{x}_t$ 的可能性。闭式计算该运动模型是很困难的。 幸运的是,存在一种基于地图运动模型的高效近似,如果 $\boldsymbol{x}_{t-1}$ 和 $\boldsymbol{x}_t$ 之间距离很小(如比机器人直径的一半还小)时,该近似的效果很好,这种近似将基于地图的运动模型分解成两部分:

$$ \begin{align} p(\boldsymbol{x}_t | \boldsymbol{u}_t, \boldsymbol{x}_{t-1},\boldsymbol{m}) = \eta \frac{p(\boldsymbol{x}_t | \boldsymbol{u}_t, \boldsymbol{x}_{t-1})p(\boldsymbol{x}_t|\boldsymbol{m})} {p(\boldsymbol{x}_t)} \end{align} $$

通常 $p(x_t)$ 也是均匀的,可以将它归入前面的 $\eta$ 中,然后用无地图估计 $p(\boldsymbol{x}_t | \boldsymbol{u}_t, \boldsymbol{x}_{t-1})$ 简单地乘以机器人在地图某位置的概率,如果地图是占用栅格地图,对应位置为占用栅格时,$p(\boldsymbol{x}_t|\boldsymbol{m}) =0$ ,否则为一个常数。下图是这种算法的流程图:

motion_model_with_mapmotion_model_with_map
看一下它的数学推导:

$$ \begin{align} \begin{split} p(\boldsymbol{x}_t | \boldsymbol{u}_t, \boldsymbol{x}_{t-1},\boldsymbol{m}) = \eta p(\boldsymbol{m} |\boldsymbol{x}_t,\boldsymbol{u}_t,\boldsymbol{x}_{t-1}) p(\boldsymbol{x}_t| \boldsymbol{u}_t,\boldsymbol{x}_{t-1}) \end{split} \end{align} $$

如果用 $p(\boldsymbol{m}|\boldsymbol{x}_t)$ 近似 $p(\boldsymbol{m} |\boldsymbol{x}_t,\boldsymbol{u}_t,\boldsymbol{x}_{t-1})$ ,并且注意到 $p(\boldsymbol{m})$ 相当于要求的后验是常数,则:

$$ \begin{align} \begin{split} p(\boldsymbol{x}_t | \boldsymbol{u}_t, \boldsymbol{x}_{t-1},\boldsymbol{m}) &= \eta p(\boldsymbol{m}|\boldsymbol{x}_t) p(\boldsymbol{x}_t| \boldsymbol{u}_t,\boldsymbol{x}_{t-1}) \\ &=\eta \frac{p(\boldsymbol{x}_t| \boldsymbol{m}) p(\boldsymbol{m})}{p(\boldsymbol{x}_t)} p(\boldsymbol{x}_t| \boldsymbol{u}_t,\boldsymbol{x}_{t-1}) \\ & = \eta \frac{p(\boldsymbol{x}_t| \boldsymbol{m}) p(\boldsymbol{x}_t| \boldsymbol{u}_t,\boldsymbol{x}_{t-1})}{p(\boldsymbol{x}_t)} \end{split} \end{align} $$

在使用近似时,忽略了 $\boldsymbol{u}_t$ 和 $\boldsymbol{x}_{t-1}$ 两项,丢弃了去往 $\boldsymbol{x}_t$ 的机器人路径相关的信息,所以需要使 $\boldsymbol{x}_{t-1}$ 和 $\boldsymbol{x}_t$ 之间距离很小,算法的更新频率要比较高。
这个分析说明了有关算法实现的一个微妙之处,要特别注意更新频率。与那些只是偶尔更新的贝叶斯滤波相比,经常更新的贝叶斯滤波可能会产生出根本不同的结果。