追蹤線程添加IMU的思路-2020-04-23

初始化完成之后進(jìn)入追蹤每一幀圖像:

Vec4 tres = trackNewCoarse(fh);

對(duì)像素使用旋轉(zhuǎn)和位移的作用比來判斷運(yùn)動(dòng)狀態(tài)
返回的是第0層殘差和三維光流信息,用來判斷是否生成關(guān)鍵幀;
[ step 1 ]生成5+26種運(yùn)動(dòng)模式氯檐。
[ step 2 ]遍歷5+26種運(yùn)動(dòng)模式强胰,判斷追蹤效果:
對(duì)新來的幀進(jìn)行跟蹤, 優(yōu)化得到位姿, 光度參數(shù)哼鬓,把到目前為止最好的殘差值作為每一層的閾值,粗層的能量值大, 也不繼續(xù)優(yōu)化了, 來節(jié)省時(shí)間毯辅。


bool trackingIsGood = coarseTracker->trackNewestCoarse(
                fh, lastF_2_fh_this, aff_g2l_this,
                pyrLevelsUsed-1,
                achievedRes);

  • 使用金字塔進(jìn)行跟蹤, 從頂層向下開始跟蹤
    [ step 1 ] 計(jì)算殘差, 保證最多60%殘差大于閾值, 計(jì)算正規(guī)方程
  • 保證大于閾值的點(diǎn)小于60%
    [ step 2 ] LM迭代優(yōu)化
    [ step 2.1 ] 計(jì)算增量
    [ step 2.2 ] 使用增量更新后, 重新計(jì)算能量值
    [ step 2.3 ] 接受則求正規(guī)方程, 繼續(xù)迭代, 優(yōu)化到增量足夠小
    [ step 3 ] 記錄上一次殘差, 光流指示, 如果調(diào)整過閾值則重新計(jì)算這一層发钝。如果算出來大于閾值,說明初始值不好,及時(shí)return,不浪費(fèi)時(shí)間,最好的直接放棄菇篡。
    [ step 4 ] 判斷優(yōu)化失敗情況,求解的變化太大,不可能突變特別多,說明求解錯(cuò)誤

[ step 3 ] 如果跟蹤正常, 并且0層殘差比最好的還好留下位姿, 保存最好的每一層的能量值漩符。
[ step 4 ] 小于閾值則暫停, 并且為下次設(shè)置閾值;把這次得到的最好值給下次用來當(dāng)閾值驱还。

IMU預(yù)積分

1.成員變量有:

    // delta measurements, position/velocity/rotation(matrix)
    Eigen::Vector3d _delta_P;    // P_k+1 = P_k + V_k*dt + R_k*a_k*dt*dt/2
    Eigen::Vector3d _delta_V;    // V_k+1 = V_k + R_k*a_k*dt
    Eigen::Matrix3d _delta_R;    // R_k+1 = R_k*exp(w_k*dt).     note: Rwc, Rwc'=Rwc*[w_body]x

    // jacobian of delta measurements w.r.t bias of gyro/acc
    Eigen::Matrix3d _J_P_Biasg;     // position / gyro
    Eigen::Matrix3d _J_P_Biasa;     // position / acc
    Eigen::Matrix3d _J_V_Biasg;     // velocity / gyro
    Eigen::Matrix3d _J_V_Biasa;     // velocity / acc
    Eigen::Matrix3d _J_R_Biasg;   // rotation / gyro

    // noise covariance propagation of delta measurements
    Mat99 _cov_P_V_Phi;

    double _delta_time;

2.成員函數(shù)有:

// reset to initial state
void reset();

// incrementally update 1)delta measurements, 2)jacobians, 3)covariance matrix
void update(const Vec3& omega, const Vec3& acc, const double& dt);


inline Sophus::Quaterniond normalizeRotationQ(const Sophus::Quaterniond& r)
{
    Sophus::Quaterniond _r(r);
    if (_r.w()<0)
    {
        _r.coeffs() *= -1;
    }
    return _r.normalized();
}

inline Mat33 normalizeRotationM (const Mat33& R)
{
    Sophus::Quaterniond qr(R);
    return normalizeRotationQ(qr).toRotationMatrix();
}

3.主要是IMUPreintegrator::update:

// incrementally update 1)delta measurements, 2)jacobians, 3)covariance matrix
// acc: acc_measurement - bias_a, last measurement!! not current measurement
// omega: gyro_measurement - bias_g, last measurement!! not current measurement
void IMUPreintegrator::update(const Vec3& omega, const Vec3& acc, const double& dt)
{
    double dt2 = dt*dt;

    Mat33 dR = Expmap(omega*dt);
    Mat33 Jr = JacobianR(omega*dt);

    // noise covariance propagation of delta measurements
    // err_k+1 = A*err_k + B*err_gyro + C*err_acc
    Mat33 I3x3 = Mat33::Identity();
    Mat99 A = Mat99::Identity();
    A.block<3,3>(6,6) = dR.transpose();
    A.block<3,3>(3,6) = -_delta_R*skew(acc)*dt;
    A.block<3,3>(0,6) = -0.5*_delta_R*skew(acc)*dt2;
    A.block<3,3>(0,3) = I3x3*dt;
    Mat93 Bg = Mat93::Zero();
    Bg.block<3,3>(6,0) = Jr*dt;
    Mat93 Ca = Mat93::Zero();
    Ca.block<3,3>(3,0) = _delta_R*dt;
    Ca.block<3,3>(0,0) = 0.5*_delta_R*dt2;
    _cov_P_V_Phi = A*_cov_P_V_Phi*A.transpose() +
        Bg*GyrCov*Bg.transpose() +
        Ca*AccCov*Ca.transpose();


    // jacobian of delta measurements w.r.t bias of gyro/acc
    // update P first, then V, then R
    _J_P_Biasa += _J_V_Biasa*dt - 0.5*_delta_R*dt2;
    _J_P_Biasg += _J_V_Biasg*dt - 0.5*_delta_R*skew(acc)*_J_R_Biasg*dt2;
    _J_V_Biasa += -_delta_R*dt;
    _J_V_Biasg += -_delta_R*skew(acc)*_J_R_Biasg*dt;
    _J_R_Biasg = dR.transpose()*_J_R_Biasg - Jr*dt;

    // delta measurements, position/velocity/rotation(matrix)
    // update P first, then V, then R. because P's update need V&R's previous state
    _delta_P += _delta_V*dt + 0.5*_delta_R*acc*dt2;    // P_k+1 = P_k + V_k*dt + R_k*a_k*dt*dt/2
    _delta_V += _delta_R*acc*dt;
    _delta_R = normalizeRotationM(_delta_R*dR);  // normalize rotation, in case of numerical error accumulation


//    // noise covariance propagation of delta measurements
//    // err_k+1 = A*err_k + B*err_gyro + C*err_acc
//    Mat33 I3x3 = Mat33::Identity();
//    MatrixXd A = MatrixXd::Identity(9,9);
//    A.block<3,3>(6,6) = dR.transpose();
//    A.block<3,3>(3,6) = -_delta_R*skew(acc)*dt;
//    A.block<3,3>(0,6) = -0.5*_delta_R*skew(acc)*dt2;
//    A.block<3,3>(0,3) = I3x3*dt;
//    MatrixXd Bg = MatrixXd::Zero(9,3);
//    Bg.block<3,3>(6,0) = Jr*dt;
//    MatrixXd Ca = MatrixXd::Zero(9,3);
//    Ca.block<3,3>(3,0) = _delta_R*dt;
//    Ca.block<3,3>(0,0) = 0.5*_delta_R*dt2;
//    _cov_P_V_Phi = A*_cov_P_V_Phi*A.transpose() +
//        Bg*IMUData::getGyrMeasCov*Bg.transpose() +
//        Ca*IMUData::getAccMeasCov()*Ca.transpose();

    // delta time
    _delta_time += dt;

}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末嗜暴,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子议蟆,更是在濱河造成了極大的恐慌闷沥,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件咐容,死亡現(xiàn)場(chǎng)離奇詭異舆逃,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門颖侄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鸟雏,“玉大人,你說我怎么就攤上這事览祖⌒⑷担” “怎么了?”我有些...
    開封第一講書人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵展蒂,是天一觀的道長(zhǎng)又活。 經(jīng)常有香客問我,道長(zhǎng)锰悼,這世上最難降的妖魔是什么柳骄? 我笑而不...
    開封第一講書人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮箕般,結(jié)果婚禮上耐薯,老公的妹妹穿的比我還像新娘。我一直安慰自己丝里,他們只是感情好曲初,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著杯聚,像睡著了一般臼婆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上幌绍,一...
    開封第一講書人閱讀 49,821評(píng)論 1 290
  • 那天颁褂,我揣著相機(jī)與錄音,去河邊找鬼傀广。 笑死颁独,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的伪冰。 我是一名探鬼主播誓酒,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼糜值!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起坯墨,我...
    開封第一講書人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤寂汇,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后捣染,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體骄瓣,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年耍攘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了榕栏。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片畔勤。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖扒磁,靈堂內(nèi)的尸體忽然破棺而出庆揪,到底是詐尸還是另有隱情,我是刑警寧澤妨托,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布缸榛,位于F島的核電站,受9級(jí)特大地震影響兰伤,放射性物質(zhì)發(fā)生泄漏内颗。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一敦腔、第九天 我趴在偏房一處隱蔽的房頂上張望均澳。 院中可真熱鬧,春花似錦符衔、人聲如沸找前。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽纸厉。三九已至,卻和暖如春五嫂,著一層夾襖步出監(jiān)牢的瞬間颗品,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來泰國打工沃缘, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留躯枢,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓槐臀,卻偏偏與公主長(zhǎng)得像锄蹂,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子水慨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容