point[][]初始化_vins-mono中的初始化

本文详细介绍了vins-mono的初始化过程,包括旋转外参数估计、滑动窗口视觉SfM、陀螺仪偏置标定、速度重力尺度初始化及重力优化。通过松耦合的传感器融合方法,结合视觉和IMU数据,实现系统初始化,为后续的视觉惯性导航奠定基础。
摘要由CSDN通过智能技术生成

vins-mono采用了一个松耦合传感器融合方法来获得真值,通过将只基于视觉的sfm结果与米制IMU预积分对齐,可以粗略地估计尺度,重力,速度和甚至偏置。在本文中,初始化阶段忽略加速度偏置项,加速度偏置与重力耦合,由于相对于重力的幅度来说,加速度偏置是个很小的数了,很难观察到。

A、估计旋转外参数(具体算法在InitialEXRotation::CalibrationExRotation中)

通过九点法估计基本矩阵,得到第时刻之间的旋转矩阵,通过预积分得到两个时刻间的imu之间的旋转积分为,则可以得到以下的旋转约束:

equation?tex=%5Cmathbf%7Bq%7D%5E%7Bb_k%7D_%7Bb_%7Bk%2B1%7D%7D%5Cotimes+%5Cmathbf%7Bq%7D%5Eb_c%3D%5Cmathbf%7Bq%7D%5Eb_c+%5Cotimes+%5Cmathbf%7Bq%7D%5E%7Bc_k%7D_%7Bc_%7Bk%2B1%7D%7D

上式可以写为:

equation?tex=%28%5B%5Cmathbf%7Bq%7D%5E%7Bb_k%7D_%7Bb_%7Bk%2B1%7D%7D%5D_L-%5B%5Cmathbf%7Bq%7D%5E%7Bc_k%7D_%7Bc_%7Bk%2B1%7D%7D%5D_R%29%5Cmathbf%7Bq%7D_c%5Eb%3D%5Cmathbf%7BQ%7D%5Ek_%7Bk%2B1%7Dq_c%5Eb%3D%5Cmathbf%7B0%7D

其中:

equation?tex=%5Bq%5D_L%3Dq_wI_%7B4%5Ctimes4%7D%2B%5Cbegin%7Bbmatrix%7D+%5Bq_v%5D_%7B%5Ctimes%7D+%26+q_v%5C%5C+-q_v%5ET+%26+0+%5Cend%7Bbmatrix%7D+%5C%5C+%5Bq%5D_R%3Dq_wI_%7B4%5Ctimes4%7D%2B%5Cbegin%7Bbmatrix%7D+-%5Bq_v%5D_%7B%5Ctimes%7D+%26+q_v%5C%5C+-q_v%5ET+%26+0+%5Cend%7Bbmatrix%7D+

将多个时刻的线性函数累计起来,并且加上鲁棒核权重,得到:

equation?tex=%5Cbegin%7Bbmatrix%7D+w%5E0_1+Q%5E0_1+%5C%5C+w%5E1_2+Q%5E1_2+%5C%5C+%5Cvdots+%5C%5C+w%5E%7BN-1%7D_%7BN%7D+Q%5E%7BN-1%7D_%7BN%7D+%5Cend%7Bbmatrix%7D+q%5Eb_c+%3D+0

求解的终止条件需要窗口中有足够的帧而且需要的零空间的秩为1,判断它的秩为1的条件是它的第二小奇异值是否大于某个阈值,代码中的阈值为0.25。

B、滑动窗口基于视觉的SfM

1、目的:

由于现在还不知道世界帧的任何信息,本文将第一个相机帧作为SFM的参考帧。所有帧的位姿和特征点位置是相对于第0帧的相机。假设已经有了关于相机和IMU之间的测量外参数,可以将位姿从相机坐标系转换为(IMU)坐标系(有旋转约束和平移约束):

equation?tex=%5Cmathbf%7Bq%7D%5E%7Bc_0%7D_%7Bb_k%7D%3D%5Cmathbf%7Bq%7D%5E%7Bc_0%7D_%7Bc_k%7D%5Cotimes+%28%5Cmathbf%7Bq%7D%5E%7Bb%7D_c%29%5E%7B-1%7D+%5C%5C+s%5Cmathbf%7Bp%7D%5E%7Bc_0%7D_%7Bb_k%7D%3Ds%5Cmathbf%7Bp%7D%5E%7Bc_0%7D_%7Bc_k%7D-%5Cmathbf%7BR%7D%5E%7Bc_0%7D_b%5Cmathbf%7Bp%7D%5Eb_c

2、具体方法:首先滑动窗口中的帧是满的,在最新一帧和窗口中的其它所有帧之间检查特征对应点。如果在最新一帧和在窗口中的其它帧之间找到了稳定的跟踪特征点(超过30个跟踪特征)和足够的视差(超过20个旋转补偿像素),则对这两帧恢复旋转和尺度位移。以上代码在Estimator::relativePose中。得到了这两帧的相对旋转和位移,对特征点进行三角化,通过三角化得到的路标点进行pnp操作估计在窗口中所有帧的位姿(代码在GlobalSFM::construct中),以及通过所有帧的位姿得到所有路标点,最后通过全局的Bundle Adjustment来最小化重投影误差。其中三角化的代码在GlobalSFM::triangulatePoint中,它的具体方法为:

  • 三角化:

考虑某路标点y被若干个帧看到,,取齐次坐标。每次观测为,取归一化平面的坐标(这样可以忽略掉内参)。记投影矩阵,为world系到camera系,他们之间的投影关系为:

equation?tex=%5Clambda_k+x_k+%3D+P_k+y

其中为第k帧的深度,为,为矩阵的第三行,将深度带入公式可得:

equation?tex=u_kP_%7Bk%2C3%7D%5ETy+-+P_%7Bk%2C1%7D%5ETy+%3D0+%5C%5C+v_kP_%7Bk%2C3%7D%5ETy++-+P_%7Bk%2C2%7D%5ETy%3D0%5C%5C

每次观测都可以提供这样的两个方程,可以将其合成为的形式,那么就是零空间的元素,所以将进行SVD分解得到的最后一维向量。具体代码如下所示:

void GlobalSFM::triangulatePoint(Eigen::Matrix<double, 3, 4> &Pose0, Eigen::Matrix<double, 3, 4> &Pose1,
                        Vector2d &point0, Vector2d &point1, Vector3d &point_3d)
{
    Matrix4d design_matrix = Matrix4d::Zero();
    design_matrix.row(0) = point0[0] * Pose0.row(2) - Pose0.row(0);
    design_matrix.row(1) = point0[1] * Pose0.row(2) - Pose0.row(1);
    design_matrix.row(2) = point1[0] * Pose1.row(2) - Pose1.row(0);
    design_matrix.row(3) = point1[1] * Pose1.row(2) - Pose1.row(1);
    Vector4d triangulated_point;
    triangulated_point =
              design_matrix.jacobiSvd(Eigen::ComputeFullV).matrixV().rightCols<1>();
    point_3d(0) = triangulated_point(0) / triangulated_point(3);
    point_3d(1) = triangulated_point(1) / triangulated_point(3);
    point_3d(2) = triangulated_point(2) / triangulated_point(3);
}

C、Visual-Inertial Alignment(视觉和IMU进行对齐)

1、陀螺仪偏置的标定

考虑在窗口中的连续两帧

equation?tex=b_k
equation?tex=b_%7Bk%2B1%7D ,前面已经通过pnp得到了两帧之间的位姿,然后将两帧之间的旋转通过sfm求出来
equation?tex=q%5E%7Bc_0%7D_%7Bb_k%7D
equation?tex=q%5E%7Bc_0%7D_%7Bb_%7Bk%2B1%7D%7D 。论文中是相对于相机坐标系来说的,其中通过对IMU数据的预处理得到了相机两帧之间的相对旋转,也通过相机的sfm得到了两帧的旋转,需要让这两者的误差达到最小,即:

equation?tex=%5Carg+%5Cmin+_%7B%5Cdelta+%5Cmathbf%7Bb%7D_%7Bw%7D%7D+%5Csum_%7Bk+%5Cin+B%7D%5Cleft%5C%7C2%5Cleft%5Clfloor%5Cmathbf%7Bq%7D%5E%7Bc_%7B0%7D+-1%7D_%7Bb_%7Bk%2B1%7D%7D+%5Cotimes+%5Cmathbf%7Bq%7D%5E%7Bc_%7B0%7D%7D_%7Bb_%7Bk%7D%7D+%5Cotimes+%5Cmathbf%7B%5Cgamma%7D%5E%7Bb_%7Bk%7D%7D_%7B+b_%7Bk%2B1%7D%7D%5Cright%5Crfloor_%7Bx+y+z%7D%5Cright%5C%7C%5E%7B2%7D

其中表示在滑动窗口中的所有图像帧。可以通过最小二乘法来进行求解,预积分的一阶泰勒近似为:

equation?tex=%5Cgamma+%5E%7Bb_k%7D_%7Bb_%7Bk%2B1%7D%7D%3D%5Chat%7B%5Cgamma%7D%5E%7Bb_k%7D_%7Bb_%7Bk%2B1%7D%7D+%5Cotimes+%5Cbegin%7Bbmatrix%7D+1%5C%5C+%5Cfrac%7B1%7D%7B2%7D%5Cmathbf%7BJ%7D%5E%7B%5Cmathbf%7B%5Cgamma%7D%7D_%7Bb_w%7D%5Cdelta+%5Cmathbf%7Bb%7D_w+%5Cend%7Bbmatrix%7D

所以可以求取雅克比矩阵,构建正定方程即可求解,具体的代码见initial_aligment.cpp 函数的solveGyroscopeBias()中。在得到陀螺仪偏置之后,重新对IMU预积分

equation?tex=%5Chat%7B%5Calpha%7D+%5E%7Bb_k%7D_%7Bb_%7Bk%2B1%7D%7D%2C%5Chat%7B%5Cbeta%7D+%5E%7Bb_k%7D_%7Bb_%7Bk%2B1%7D%7D%2C%5Chat%7B%5Cgamma%7D+%5E%7Bb_k%7D_%7Bb_%7Bk%2B1%7D%7D 进行估计。

2、速度、重力和米制尺度初始化

在估计完陀螺仪偏置之后需要估计速度,重力和尺度因子,这些变量可以写成以下形式:

equation?tex=%5Cmathcal%7BX%7D_I%3D%5Cbegin%7Bbmatrix%7D+%5Cmathbf%7Bv%7D%5E%7Bb_0%7D_%7Bb_0%7D%2C%5Cmathbf%7Bv%7D%5E%7Bb_1%7D_%7Bb_1%7D%2C%5Cdots%2C%5Cmathbf%7Bv%7D%5E%7Bb_n%7D_%7Bb_n%7D%2C%5Cmathbf%7Bg%7D%5E%7Bc_0%7D%2Cs+%5Cend%7Bbmatrix%7D

其中,

equation?tex=v%5E%7Bb_k%7D_%7Bb_k%7D 表示第k时刻的body坐标系下速度在取第k帧图像的时候,
equation?tex=g%5E%7Bc_0%7D 表示重力向量在第0帧相机坐标系下的表示。s表示尺度因子,将视觉轨迹拉伸到米制单位。在世界坐标系下的有:

equation?tex=%5Calpha%5E%7Bb_k%7D_%7Bb_%7Bk%2B1%7D%7D%3D%5Cmathbf%7BR%7D%5E%7Bb_k%7D_%7Bw%7D%28%5Cmathbf%7Bp%7D%5Ew_%7Bb_%7Bk%2B1%7D%7D-%5Cmathbf%7Bp%7D%5Ew_%7Bb_%7Bk%7D%7D-%5Cmathbf%7Bv%7D%5E%7Bw%7D_%7Bb_k%7D%5CDelta+t%2B%5Cfrac%7B1%7D%7B2%7Dg%5Ew+%5CDelta+t%5E2%29+%5C%5C+%5Cbeta%5E%7Bb_k%7D_%7Bb_%7Bk%2B1%7D%7D%3D%5Cmathbf%7BR%7D%5E%7Bb_k%7D_%7Bw%7D%28%5Cmathbf%7Bv%7D%5E%7Bw%7D_%7Bb_%7Bk%2B1%7D%7D-%5Cmathbf%7Bv%7D%5E%7Bw%7D_%7Bb_k%7D%2Bg%5Ew+%5CDelta+t%29

将其转换为以第0帧为坐标系的公式有:

equation?tex=%5Calpha%5E%7Bb_k%7D_%7Bb_%7Bk%2B1%7D%7D%3D%5Cmathbf%7BR%7D%5E%7Bb_k%7D_%7Bc_0%7D%28s%28%5Cmathbf%7B%5Cbar%7Bp%7D%7D%5E%7Bc_0%7D_%7Bb_%7Bk%2B1%7D%7D-%5Cmathbf%7B%5Cbar%7Bp%7D%7D%5E%7Bc_0%7D_%7Bb_%7Bk%7D%7D%29-%5Cmathbf%7BR%7D%5E%7Bc0%7D_%7Bb_k%7D%5Cmathbf%7Bv%7D%5E%7Bb_k%7D_%7Bb_k%7D%5CDelta+t%2B%5Cfrac%7B1%7D%7B2%7Dg%5E%7Bc_0%7D+%5CDelta+t%5E2%29+%29+%5C%5C+%5Cbeta%5E%7Bb_k%7D_%7Bb_%7Bk%2B1%7D%7D%3D%5Cmathbf%7BR%7D%5E%7Bb_k%7D_%7Bc_0%7D%28%5Cmathbf%7BR%7D%5E%7Bc0%7D_%7Bb_%7Bk%2B1%7D%7D%5Cmathbf%7Bv%7D%5E%7Bb_%7Bk%2B1%7D%7D_%7Bb_%7Bk%2B1%7D%7D-%5Cmathbf%7BR%7D%5E%7Bc0%7D_%7Bb_k%7D%5Cmathbf%7Bv%7D%5E%7Bb_k%7D_%7Bb_k%7D%2Bg%5E%7Bc_0%7D%5CDelta+t%29

将上式展开,并将B中的公式带入,得到:

equation?tex=%5Calpha%5E%7Bb_k%7D_%7Bb_%7Bk%2B1%7D%7D%3Ds%5Cmathbf%7BR%7D%5E%7Bb_k%7D_%7Bc_0%7D%28%5Cbar%7B%5Cmathbf%7Bp%7D%7D%5E%7Bc_k%7D_%7Bc_%7Bk%2B1%7D%7D-%5Cbar%7B%5Cmathbf%7Bp%7D%7D%5E%7Bc_k%7D_%7Bc_%7Bk%7D%7D%29-%5Cmathbf%7BR%7D_%7Bc_0%7D%5E%7Bb_%7Bk%7D%7D%5Cmathbf%7BR%7D%5E%7Bc_0%7D_%7Bb_%7Bk%2B1%7D%7D%5Cmathbf%7Bp%7D%5Eb_c%2B%5Cmathbf%7Bp%7D%5Eb_c%2B%5Cfrac%7B1%7D%7B2%7D%5Cmathbf%7BR%7D_%7Bc_0%7D%5E%7Bb_%7Bk%7D%7Dg%5E%7Bc_0%7D%5CDelta+t%5E2-%5Cmathbf%7Bv%7D%5E%7Bb_k%7D_%7Bb_k%7D%5CDelta+t+%5C%5C+%5Cbeta%5E%7Bb_k%7D_%7Bb_%7Bk%2B1%7D%7D%3D%5Cmathbf%7BR%7D%5E%7Bb_k%7D_%7Bc_0%7D%28%5Cmathbf%7BR%7D%5E%7Bc0%7D_%7Bb_%7Bk%2B1%7D%7D%5Cmathbf%7Bv%7D%5E%7Bb_%7Bk%2B1%7D%7D_%7Bb_%7Bk%2B1%7D%7D-%5Cmathbf%7BR%7D%5E%7Bc0%7D_%7Bb_k%7D%5Cmathbf%7Bv%7D%5E%7Bb_k%7D_%7Bb_k%7D%2Bg%5E%7Bc_0%7D%5CDelta+t%29

将需要优化的量放在右边,与优化无关的量放在左边,得到:

equation?tex=%5Chat%7B%5Cmathbf%7Bz%7D%7D%5E%7Bb_k%7D_%7Bb_%7Bk%2B1%7D%7D%3D%5Cbegin%7Bbmatrix%7D+%5Calpha%5E%7Bb_k%7D_%7Bb_%7Bk%2B1%7D%7D%2B%5Cmathbf%7BR%7D_%7Bc_0%7D%5E%7Bb_%7Bk%7D%7D%5Cmathbf%7BR%7D%5E%7Bc_0%7D_%7Bb_%7Bk%2B1%7D%7D%5Cmathbf%7Bp%7D%5Eb_c-%5Cmathbf%7Bp%7D%5Eb_c+%5C%5C+%5Cbeta%5E%7Bb_k%7D_%7Bb_%7Bk%2B1%7D%7D+%5Cend%7Bbmatrix%7D+%3D+%5Cbegin%7Bbmatrix%7D+-%5Cmathbf%7BI%7D%5CDelta+t+%26+%5Cmathbf%7B0%7D+%26+%5Cfrac%7B1%7D%7B2%7D%5Cmathbf%7BR%7D_%7Bc_0%7D%5E%7Bb_%7Bk%7D%7D%5CDelta+t%5E2+%26+%5Cmathbf%7BR%7D%5E%7Bb_k%7D_%7Bc_0%7D%28%5Cbar%7B%5Cmathbf%7Bp%7D%7D%5E%7Bc_k%7D_%7Bc_%7Bk%2B1%7D%7D-%5Cbar%7B%5Cmathbf%7Bp%7D%7D%5E%7Bc_k%7D_%7Bc_%7Bk%7D%7D%29+%5C%5C+%5Cmathbf%7BI%7D+%26+%5Cmathbf%7BR%7D%5E%7Bb_k%7D_%7Bc_0%7D%5Cmathbf%7BR%7D%5E%7Bc0%7D_%7Bb_%7Bk%2B1%7D%7D+%26+%5Cmathbf%7BR%7D%5E%7Bb_k%7D_%7Bc_0%7D%5CDelta+t+%26+%5Cmathbf%7B0%7D+%5Cend%7Bbmatrix%7D++%5Cbegin%7Bbmatrix%7D+%5Cmathbf%7Bv%7D%5E%7Bb_k%7D_%7Bb_k%7D+%5C%5C+%5Cmathbf%7Bv%7D%5E%7Bb_%7Bk%2B1%7D%7D_%7Bb_%7Bk%2B1%7D%7D+%5C%5C+%5Cmathbf%7Bg%7D%5E%7Bc_0%7D+%5C%5C+s+%5Cend%7Bbmatrix%7D++%5C%5C+%5Chat%7B%5Cmathbf%7Bz%7D%7D%5E%7Bb_k%7D_%7Bb_%7Bk%2B1%7D%7D%3D%5Cmathbf%7BH%7D%5E%7Bb_k%7D_%7Bb_%7Bk%2B1%7D%7D%5Cmathcal%7BX%7D_I%2B%5Cmathbf%7Bn%7D%5E%7Bb_k%7D_%7Bb_%7Bk%2B1%7D%7D

在上式中

equation?tex=%5Cmathbf%7BR%7D_%7Bc_0%7D%5E%7Bb_%7Bk%7D%7D%2C%5Cmathbf%7BR%7D%5E%7Bc_0%7D_%7Bb_%7Bk%2B1%7D%7D%2C%5Cbar%7B%5Cmathbf%7Bp%7D%7D%5E%7Bc_k%7D_%7Bc_%7Bk%2B1%7D%7D%2C%5Cbar%7B%5Cmathbf%7Bp%7D%7D%5E%7Bc_k%7D_%7Bc_%7Bk%7D%7D 都可以从SFM中获得,
equation?tex=%5CDelta+t 是两个图像帧之间的时间间隔,通过最小二乘法使下式最小化,就可以估计出速度,重力和尺度,

equation?tex=%5Cmin+_%7B%5Cmathcal%7BX%7D_%7BI%7D%7D+%5Csum_%7Bk+%5Cin+%5Cmathcal%7BB%7D%7D%5Cleft%5C%7C%5Chat%7B%5Cmathbf%7Bz%7D%7D_%7Bb_%7Bk%2B1%7D%7D%5E%7Bb_%7Bk%7D%7D-%5Cmathbf%7BH%7D_%7Bb_%7Bk%2B1%7D%7D%5E%7Bb_%7Bk%7D%7D+%5Cmathcal%7BX%7D_%7BI%7D%5E%7Bk%7D%5Cright%5C%7C%5E%7B2%7D

具体代码见: initial_aligment.cpp 函数 LinearAlignment()

3、重力优化

需要对重力进行优化的原因主要是因为在之前的线性初始化过程中并没有对重力的幅度进行限制,所有重力只有两个自由度。在许多场合下,重力的幅度是已知的,因此可以重新参数化重力向量在切平面的两个变量,与重力正交的且在切平面上的两个向量

equation?tex=b_1%2Cb_2 如下图所示:

9d9b7f6f3002721c3956ebd99c930867.png

如何找到可以通过以下算法找到:

f4f9be76e9a9a75bd4e5eed6f6ecaf7e.png

其代码为

MatrixXd TangentBasis(Vector3d &g0)
{
    Vector3d b, c;
    Vector3d a = g0.normalized();
    Vector3d tmp(0, 0, 1);
    if(a == tmp)
        tmp << 1, 0, 0;
    b = (tmp - a * (a.transpose() * tmp)).normalized();
    c = a.cross(b);
    MatrixXd bc(3, 2);
    bc.block<3, 1>(0, 0) = b;
    bc.block<3, 1>(0, 1) = c;
    return bc;
}

上面的过程其实是施密特正交化,将其转化为三个正交的向量,其中的一个向量[0,0,1]或者[1,0,0]是与地心对应的,那么剩余的两个向量刚好是地球的切平面。

重力向量被改写为

cffdc22ae8074efb0ef2f81fd7d76b22.png

将与之前求出的

equation?tex=%7C%7Cg%7C%7C%5Cbar%7Bg%7D%5E%7Bc0%7D 有关的变量移到方程的左边,再一次对
equation?tex=w%5E%7Bc_0%7D 进行优化,将优化得到的结果相加(由于w只有两个值所以只需要2个变量)。它的左边项也发生了改变,变成了:

equation?tex=%5Chat%7B%5Cmathbf%7Bz%7D%7D_%7Bb_%7Bk%2B1%7D%7D%5E%7Bb_%7Bk%7D%7D%3D%5Cleft%5B%5Cbegin%7Barray%7D%7Bc%7D%7B%5Cboldsymbol%7B%5Calpha%7D_%7Bb_%7Bk%7D+b_%7Bk%2B1%7D%7D-%5Cmathbf%7Bp%7D_%7Bb+c%7D%2B%5Cmathbf%7BR%7D_%7Bb_%7Bk%7D+c_%7B0%7D%7D+%5Cmathbf%7BR%7D_%7Bc_%7B0%7D+b_%7Bk%2B1%7D%7D+%5Cmathbf%7Bp%7D_%7Bb+c%7D-%5Cfrac%7B1%7D%7B2%7D+%5Cmathbf%7BR%7D_%7Bb_%7Bk%7D+c_%7B0%7D%7D+%5CDelta+t_%7Bk%7D%5E%7B2%7D%5C%7Cg%5C%7C+%5Ccdot+%5Chat%7B%5Cmathbf%7Bg%7D%7D%5E%7Bc_%7B0%7D%7D%7D+%5C%5C+%7B%5Cboldsymbol%7B%5Cbeta%7D_%7Bb_%7Bk%7D+b_%7Bk%2B1%7D%7D-%5Cmathbf%7BR%7D_%7Bb_%7Bk%7D+c_%7B0%7D%7D+%5CDelta+t_%7Bk%7D%5C%7Cg%5C%7C+%5Ccdot+%5Chat%7B%5Cmathbf%7Bg%7D%7D%5E%7Bc_%7B0%7D%7D%7D%5Cend%7Barray%7D%5Cright%5D

equation?tex=%5Cmathcal%7BX%7D_%7BI%7D%5E%7Bk%7D%3D%5Cleft%5B%5Cbegin%7Barray%7D%7Bc%7D%7B%5Cmathbf%7Bv%7D_%7Bk%7D%5E%7Bb_%7Bk%7D%7D%7D+%5C%5C+%7B%5Cmathbf%7Bv%7D_%7Bk%2B1%7D%5E%7Bb_%7Bk%2B1%7D%7D%7D+%5C%5C+%7B%5Cmathbf%7Bg%7D%5E%7Bc_%7B0%7D%7D%7D+%5C%5C+%7Bs%7D%5Cend%7Barray%7D%5Cright%5D+%5Crightarrow%5Cleft%5B%5Cbegin%7Barray%7D%7Bc%7D%7B%5Cmathbf%7Bv%7D_%7Bk%7D%5E%7Bb_%7Bk%7D%7D%7D+%5C%5C+%7B%5Cmathbf%7Bv%7D_%7Bk%2B1%7D%5E%7Bb_%7Bk%2B1%7D%7D%7D+%5C%5C+%7B%5Cmathbf%7Bw%7D%5E%7Bc_%7B0%7D%7D%7D+%5C%5C+%7Bs%7D%5Cend%7Barray%7D%5Cright%5D

优化参数少了一个,因为多另一个模值的信息,hessian矩阵对于重力优化的部分会乘以[w1, w2],这是个3*2的矩阵,所以优化变量就少了一个。

具体细节代码见:initial_alignment的RefineGravity。

4、完成初始化

重力优化后得到了在窗口中的第一帧的图像坐标系下的重力,之后就可以通过世界坐标系下的重力加速度和相机坐标系下的重力加速度之间的关系求解出世界坐标系与相机坐标系之间的旋转矩阵。通过

equation?tex=%5Cmathbf%7Bg%7D%5Ew
equation?tex=%5Cmathbf%7Bg%7D%5E%7Bc_0%7D 之间的叉乘可以得到两者的旋转轴,再除以两者叉乘的模长就能得到他们的单位旋转轴,他们的旋转角可以通过如下计算:

equation?tex=%7C%7C%5Cmathbf%7Bg%7D%5Ew+%5Ctimes+%5Cmathbf%7Bg%7D%5E%7Bc_0%7D%7C%7C%3D%7C%7C%5Cmathbf%7Bg%7D%5Ew%7C%7C%5Ccdot+%7C%7C%5Cmathbf%7Bg%7D%5E%7Bc_0%7D%7C%7C%5Csin%28%5Ctheta%29+%5C%5C+%5Cmathbf%7Bg%7D%5Ew+%5Ccdot+%5Cmathbf%7Bg%7D%5E%7Bc_0%7D+%3D+%7C%7C%5Cmathbf%7Bg%7D%5Ew%7C%7C%5Ccdot+%7C%7C%5Cmathbf%7Bg%7D%5E%7Bc_0%7D%7C%7C%5Ccos%28%5Ctheta%29%5C%5C+%5Ctheta+%3D+%5Carctan%28%5Cfrac%7B%7C%7C%5Cmathbf%7Bg%7D%5Ew+%5Ctimes+%5Cmathbf%7Bg%7D%5E%7Bc_0%7D%7C%7C%7D%7B%5Cmathbf%7Bg%7D%5Ew+%5Ccdot+%5Cmathbf%7Bg%7D%5E%7Bc_0%7D%7D%29

所以

equation?tex=%5Cmathbf%7BR%7D%5E%7Bw%7D_%7Bc_0%7D%3D%5Cexp%28%5B%5Cmathbf%7Bu%7D%5Ctheta%5D_%7B%5Ctimes%7D%29

在代码中

得到该旋转矩阵之后,可以将第一帧图像坐标系下的所有变量都转换为世界坐标系下的值,在窗口中的所有帧都设置成了关键帧。至此,完成了初始化。'

参考资料:

VINS-Mono: A Robust and Versatile Monocular Visual-Inertial State Estimator . Tong Qin, Peiliang Li, and Shaojie Shen

深蓝学院vio课程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值