最小二乘优化问题

这里给大家介绍一下最小二乘优化问题,然后举例里程计校准odometry calibration加深印象。

问题描述

  假设现有系统由 n n n个观测函数描述 { f i ( x ) } i = 1.. n \lbrace f_{i}(x) \rbrace_{i=1..n} {fi(x)}i=1..n,其中 x x x是状态向量, z i z_i zi是状态 x x x的测量,函数 z i ′ = f i ( x ) z'_i=f_i(x) zi=fi(x)是预测量,它将状态变量 x x x映射到预测测量 z i ′ z'_i zi
  此外,我们已知关于状态 x x x的每个测量 z 1 : n z_{1:n} z1:n都是有噪声的。
  我们现在要求状态 x x x的最佳估计,使得观测函数能最好的表达测量 z 1 : n z_{1:n} z1:n
  通俗解释, x x x就是要求的参数, z z z就是已知的测量值,我们希望通过最小二乘法使得观测函数能够最好的拟合测量值。状态量和观测量可以是多维变量,状态变量之间不独立
  比如 x x x可以是空间中3d特征的位置, z i z_i zi是这些3d特征在2d图像平面上投影的坐标,通过最小二乘法,给定图像上的2d坐标,最优估计空间中3d特征的位置。【其实这就是Direct Linear Transform算法,这里不扩展】
最小二乘优化问题_第1张图片

问题求解

  定义 e i e_i ei为预测量与实际观测量(不是ground truth)的差分 e i ( x ) = z i − f i ( x ) e_i(x)=z_i-f_i(x) ei(x)=zifi(x)  我们假设差分函数满足均值为0的正态高斯分布, Ω i \Omega_i Ωi是gaussian error的信息矩阵,这里的公式中 Ω i \Omega_i Ωi仅对应一个约束。这样观测函数的平方误差 e i ( x ) e_i(x) ei(x)仅依赖于状态量,且它是标量(不是李代数)。 e i ( x ) = e i ( x ) T Ω i e i ( x ) e_i(x)=\bm{e_i}(x)^T\Omega_i\bm{e_i}(x) ei(x)=ei(x)TΩiei(x)我们的目标是寻找状态变量 x ∗ x^* x使得所有观测量的误差最小,如下图所示:
最小二乘优化问题_第2张图片
  对于线性优化问题,直接求误差函数的一阶导数空域就可以得到问题的唯一解。但是对于非线性优化问题,我们采用一阶泰勒展开构造近似的线性函数,就是在当前状态变量(current initial guess)附近构造局部线性区域,求解该线性问题,得到迭代步长,希望估计的状态变量使得误差函数距离最小值更近一点。关于误差函数的一阶泰勒展开:
最小二乘优化问题_第3张图片
  那么均方误差的泰勒展开如下,由于所有变量都是标量,因此可以无视转置符号。
最小二乘优化问题_第4张图片
  定义新的变量,简化公式表达:
最小二乘优化问题_第5张图片
  全局误差是所有测量函数均方误差的和,我们用下式近似表达在当前状态解 x x x下的全局误差
最小二乘优化问题_第6张图片
  其中, b T = ∑ i e i T Ω i J i b^T=\sum_{i}e_i^T\Omega_iJ_i bT=ieiTΩiJi H = ∑ i J i T Ω J i H=\sum_{i}J_i^T\Omega J_i H=iJiTΩJi H H H为information matrix或precision matrix,它表达了观测的不确定性(观测的可信度),它是协方差的逆矩阵。信息矩阵本身是对称的稀疏矩阵,非零部分代表变量之间存在约束,因此非零元素的个数是约束数量的两倍。他的物理含义,当你的观测越确信,观测误差越小(我觉得协方差越小),那么信息矩阵的值越大。
  “In its physical meaning, information matrix represents how reliable this measurement is. Therefore, the more precisely the measurement is made or the more you trust in this measurement, the larger values in the information matrix you can set.
  对近似的全局误差函数(此处认为是线性函数了)在当前状态解 x x x上求一阶导数得到, ∂ F ( x + Δ x ) ∂ Δ x ≈ 2 b + 2 H Δ x \frac{\partial F(x+\Delta x)}{\partial \Delta x}\approx 2b+2H\Delta x ΔxF(x+Δx)2b+2HΔx 因此迭代步长的解 Δ x ∗ \Delta x^* Δx Δ x ∗ = − H − 1 b \Delta x^*=-H^{-1}b Δx=H1b
最小二乘法不断迭代如下步骤:

  • 围绕当前猜测的状态变量 x x x来线性化系统,并且计算每个观测值的差分 e i ( x + Δ x ) ≈ e i ( x ) + J i Δ x e_i(x+\Delta x) \approx e_i(x)+J_i\Delta x ei(x+Δx)ei(x)+JiΔx
  • 计算线性系统中间项, b T = ∑ i e i T Ω i J i b^T=\sum_{i}e_i^T\Omega_iJ_i bT=ieiTΩiJi H = ∑ i J i T Ω i J i H=\sum_iJ_i^T\Omega_iJ_i H=iJiTΩiJi
  • 计算新的最优迭代步长 Δ x ∗ = − H − 1 Δ x \Delta x^*=-H^{-1}\Delta x Δx=H1Δx
  • 更新之前的状态估计, x ← x + Δ x ∗ x\leftarrow x+\Delta x^* xx+Δx

应用举例:Odometry Calibration

  假设我们有机器人在环境中移动且可以获取里程测量值 u i u_i ui。但是由于里程计受系统误差systematic error影响,使得测量值不准确。我们想通过最小二乘法去除系统误差的影响(这个过程叫做calibration)。要想校准,对于每个观测变量 u i u_i ui,必须有对应的ground truth u i ∗ u^*_i ui,这个基准可以来自scan matching的近似计算或其他slam 过程。
  定义函数 f i ( x ) f_i(x) fi(x)来纠偏带噪声的里程计读数 u i u_i ui,给定一些偏置参数 x x x,输入 u i u_i ui,返回无偏 u i ‘ u_i‘ ui,如下所示,我们的目标是求参数 x x x
最小二乘优化问题_第7张图片
按照之前最小二乘法,状态向量为 x = ⟨ x 11   x 12   x 13   x 21   x 22   x 23   x 31   x 32   x 33 ⟩ T x=\langle x_{11}\ x_{12}\ x_{13}\ x_{21}\ x_{22}\ x_{23}\ x_{31}\ x_{32}\ x_{33}\rangle ^T x=x11 x12 x13 x21 x22 x23 x31 x32 x33T
误差函数为 e i ( x ) = u i ∗ − ( x 11 x 12 x 13 x 21 x 22 x 23 x 31 x 32 x 33 ) u i e_i(x)=u_i^*-\left(\begin{matrix}x_{11}&x_{12}&x_{13}\\x_{21}&x_{22}&x_{23}\\x_{31}&x_{32}&x_{33} \end{matrix}\right)u_i ei(x)=uix11x21x31x12x22x32x13x23x33ui,

偏导数为 J i = ∂ e i ( x ) ∂ x = − ( u i , x u i , j u i , θ u i , x u i , y u i , θ u i , x u i , y u i , θ ) J_i=\frac{\partial e_i(x)}{\partial x}=-\left(\begin{matrix}u_{i,x}&u_{i,j}&u_{i,\theta}&&&&&&\\&&&u_{i,x}&u_{i,y}&u_{i,\theta}&&&\\&&&&&&u_{i,x}&u_{i,y}&u_{i,\theta}\end{matrix}\right) Ji=xei(x)=ui,xui,jui,θui,xui,yui,θui,xui,yui,θ。从结果看,偏导函数并不依赖于偏置参数。
  代码是用octave写的,接近matlab,已上传github地址。
  数据文件z.dat格式:每行是单个里程计的测量值包括, u x ′   u y ′   u t ′   u x   u y   u t u'_x\ u'_y\ u'_t\ u_x\ u_y\ u_t ux uy ut ux uy ut,前三个是里程计ground truth,后三个里程计测量值,它们代表机器人前后两帧的运动。具体代码见github。

more off;
#load the calibration matrix
disp('loading the matrix');
Z=load('data/calib.dat');

#compute the ground truth trajectory
TrueTrajectory=compute_odometry_trajectory(Z(:,1:3));
disp('ground truth');
plot(TrueTrajectory(:,1),TrueTrajectory(:,2));
pause(1);

#compute the uncalibrated odometry
OdomTrajectory=compute_odometry_trajectory(Z(:,4:6));
disp('odometry');
plot(OdomTrajectory(:,1),OdomTrajectory(:,2));
pause(1);

disp('computing calibration parameters');
#compute the calibration parameters
X=ls_calibrate_odometry(Z);
disp(X);
pause(1);

disp('computing calibrated odometry');
COdom=apply_odometry_correction(X,Z(:,4:6));
CalTrajectory=compute_odometry_trajectory(COdom);
plot(CalTrajectory(:,1),CalTrajectory(:,2));

结果:
最小二乘优化问题_第8张图片
  此处的里程计校正是标量问题(欧式空间),变量本身没有约束。如果是求相机位姿之类的问题,由于旋转矩阵 R R R(非欧式空间),是正交矩阵并且行列式值为1,因此变成了有约束的优化问题。我们需要将这些李群转换成李代数,通过转换求解空间得到无约束优化问题,可以继续用牛顿高斯、LM算法在李代数上求导等等。

你可能感兴趣的:(slam)