日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

视觉激光融合——VLOAM / LIMO算法解析

發布時間:2025/3/20 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 视觉激光融合——VLOAM / LIMO算法解析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

視覺激光融合——VLOAM / LIMO算法解析

  • 視覺激光融合——VLOAM / LIMO算法解析
    • 1. VLOAM算法
      • 1.1 總體框架
      • 1.2 視覺里程計
      • 1.3 激光里程計
      • 1.4 實驗結果
    • 2. LIMO算法
      • 2.1 總體框架
      • 2.2 尺度估計
      • 2.3 幀間估計與后端優化
      • 2.4 實驗結果

視覺激光融合——VLOAM / LIMO算法解析

在激光SLAM領域,LOAM、Lego-LOAM屬于純激光領域,除此之外還衍生處理視覺激光結合、激光IMU結合,甚至三者結合的算法,本篇博客介紹的VLOAM和LIMO算法就是屬于視覺和激光結合的算法,其中VLOAM算法更偏向于是一種激光SLAM算法,而LIMO算法更偏向于是一種視覺SLAM算法,具體地如下:

1. VLOAM算法

VLOAM算法是在2015年ICRA上提出的,但至今在KITTI榜的Odometry數據集上成績仍然靠前

VLOAM原論文名為《Visual-lidar Odometry and Mapping: Low-drift, Robust, and Fast》,作者并沒有對代碼進行開源,復現的版本有兩個,分別是YukunXia/VLOAM-CMU-16833和Jinqiang/demo_lidar,其中,前者是在去年CMU的幾位大佬在A-LOAM代碼基礎上進行改進的,并通過報告對結果進行了詳細的分析,本博客就是在此基礎上VLOAM的原理和代碼進行簡單總結。

對A-LOAM還不了解的同學可以參考下博客學習LOAM筆記——特征點提取與匹配

1.1 總體框架

VLOAM算法的總體框架如下:

VLOAM算法整體分為視覺里程計VO和激光里程計LO兩部分,視覺里程計以60HZ的頻率運行,視覺里程計通過激光獲一部分視覺特征點的深度,其輸出位姿變換積分后為幀間變換估計(Sweep to Sweep Refinement)提供先驗,而激光里程計以1HZ進行幀間變換估計以及幀到地圖的位姿估計(Sweep to Map Registraion),并最終融合視覺里程計的60Hz輸出和激光里程計的1Hz輸出作為最終的60Hz輸出,可看出來,VLOAM主要有如下特點:

  • 核心其實以LOAM為基礎的激光里程計,視覺里程計僅僅是提供了先驗,視覺里程計完全可以由IMU或者其他高頻里程計代替;
  • 視覺里程計的優勢是可以提供高頻輸出,但是沒有尺度且對于光照、紋理等要求比較強,激光里程計的優勢是對環境要求較低并可以構建地圖,但是輸出頻率較低,因此從某種成都上說VLOAM算法正式很好地利用了他們的特點進行了互補才達到相對較好的效果;
  • 下面具體分析下各個部分的算法

    1.2 視覺里程計

    VLOAM視覺里程計中追蹤部分沒啥特別的,使用光流法或者特征點匹配都可以,較為特別的一點是VLOAM使用激光來恢復視覺特征點的深度(在圖像系下尋找最近的三個激光點擬合平面或者求均值,在后面LIMO算法中詳細介紹),從而獲得了具備深度的特征點Xik=[xik,yik,zik]T\mathbf{X}_{i}^{k}=\left[\begin{array}{lll}x_{i}^{k}, & y_{i}^{k}, & z_{i}^{k}\end{array}\right]^{T}Xik?=[xik?,?yik?,?zik??]T以及不具備深度的特征點X^ik=[x^ik,y^ik,z^ik]T\hat{\mathbf{X}}_{i}^{k}=\left[\begin{array}{lll}\hat{x}_{i}^{k}, & \hat{y}_{i}^{k}, & \hat{z}_{i}^{k}\end{array}\right]^{T}X^ik?=[x^ik?,?y^?ik?,?z^ik??]T兩種類型,前后幀匹配特征點均滿足變換方程Xik+1=RXik+T\mathbf{X}_{i}^{k+1}=\mathbf{R} \mathbf{X}_{i}^{k}+\mathbf{T} Xik+1?=RXik?+T
    對于具備深度的點:
    對于前一幀有深度的點,下一幀未必有深度,因此我們可以總是假設下一幀該點無法通過激光獲得該點深度,有Xik+1=dik+1X^ik+1\mathbf{X}_{i}^{k+1}=d_{i}^{k+1} \hat{\mathbf{X}}_{i}^{k+1}Xik+1?=dik+1?X^ik+1?,其中dik+1d_{i}^{k+1}dik+1?是下一幀該點假設深度,通過聯立該方程和變換方程, 并消除dik+1d_{i}^{k+1}dik+1?就可以獲得如下方程組(z^ik+1R1?x^ik+1R3)Xik+z^ik+1T1?x^ik+1T3=0\left(\hat{z}_{i}^{k+1} \mathbf{R}_{1}-\hat{x}_{i}^{k+1} \mathbf{R}_{3}\right) \mathbf{X}_{i}^{k}+\hat{z}_{i}^{k+1} T_{1}-\hat{x}_{i}^{k+1} T_{3}=0 (z^ik+1?R1??x^ik+1?R3?)Xik?+z^ik+1?T1??x^ik+1?T3?=0(z^ik+1R2?y^ik+1R3)Xik+z^ik+1T2?y^ik+1T3=0\left(\hat{z}_{i}^{k+1} \mathbf{R}_{2}-\hat{y}_{i}^{k+1} \mathbf{R}_{3}\right) \mathbf{X}_{i}^{k}+\hat{z}_{i}^{k+1} T_{2}-\hat{y}_{i}^{k+1} T_{3}=0 (z^ik+1?R2??y^?ik+1?R3?)Xik?+z^ik+1?T2??y^?ik+1?T3?=0其中R1R2,R3\mathbf{R}_{1}\,\mathbf{R}_{2},\mathbf{R}_{3}R1?R2?,R3?分別為旋轉矩陣的第一、第二和第三行,T1,T2,T3T_{1},T_{2},T_{3}T1?,T2?,T3?分別為平移向量的第一、第二和第三行。
    對于不具備深度的點
    我們有dikX^ikd_{i}^{k} \hat{\mathbf{X}}_{i}^{k}dik?X^ik?dik+1X^ik+1d_{i}^{k+1} \hat{\mathbf{X}}_{i}^{k+1}dik+1?X^ik+1?,其中dikd_{i}^{k}dik?dik+1d_{i}^{k+1}dik+1?為當前幀和下一幀該點假設深度,我們同樣將該方程與變換方程聯立,通過消除dikd_{i}^{k}dik?dik+1d_{i}^{k+1}dik+1?得到[?y^ik+1T3+z^ik+1T2?x^ik+1T3?z^ik+1T1?x^ik+1T2+y^ik+1T1]RX^ik=0\left[\begin{array}{c} -\hat{y}_{i}^{k+1} T_{3}+\hat{z}_{i}^{k+1} T_{2} \\ -\hat{x}_{i}^{k+1} T_{3}-\hat{z}_{i}^{k+1} T_{1} \\ -\hat{x}_{i}^{k+1} T_{2}+\hat{y}_{i}^{k+1} T_{1} \end{array}\right] \mathbf{R} \hat{\mathbf{X}}_{i}^{k}=0 ????y^?ik+1?T3?+z^ik+1?T2??x^ik+1?T3??z^ik+1?T1??x^ik+1?T2?+y^?ik+1?T1?????RX^ik?=0在論文中推導的都是解析解的計算方式,而在基于Ceres復現的代碼中分別實現了3D-3D,3D-2D,2D-3D,2D-2D四種特征點基于優化的求解運算并在報告中做了對比,對于具備深度的點,也就是3D-2D的情況,殘差構建就是將前一幀具備深度的點變換到后一幀坐標系下,并在歸一化平面上構建X方向和Y方向的殘差,如下:

    struct CostFunctor32 { // 32 means 3d - 2d observation pairCostFunctor32(double observed_x0, double observed_y0, double observed_z0, double observed_x1_bar,double observed_y1_bar): // TODO: check if const & is necessaryobserved_x0(observed_x0), observed_y0(observed_y0), observed_z0(observed_z0), // 3observed_x1_bar(observed_x1_bar), observed_y1_bar(observed_y1_bar){} // 2template <typename T>bool operator()(const T* const angles, const T* const t, T* residuals) const{T X0[3] = { T(observed_x0), T(observed_y0), T(observed_z0) };T observed_x1_bar_T = T(observed_x1_bar);T observed_y1_bar_T = T(observed_y1_bar);T R_dot_X0[3];ceres::AngleAxisRotatePoint(angles, X0, R_dot_X0);R_dot_X0[0] += t[0];R_dot_X0[1] += t[1];R_dot_X0[2] += t[2];residuals[0] = R_dot_X0[0] - R_dot_X0[2] * observed_x1_bar_T;residuals[1] = R_dot_X0[1] - R_dot_X0[2] * observed_y1_bar_T;return true;}

    對于不具備深度的點,也就是2D-2D的情況,殘差構建就是將前一幀不具備深度點變換到后一幀后構建一維投影殘差(點積),這和我們平常求解基礎矩陣后者本質矩陣的方法是不太一樣的,為啥這樣做呢,我的理解是需要和具備深度點求解的變換保證在同一尺度下?我不是特別確定,具體如下:

    struct CostFunctor22 { // 22 means 2d - 2d observation pairCostFunctor22(double observed_x0_bar, double observed_y0_bar, double observed_x1_bar, double observed_y1_bar): // TODO: check if const & is necessaryobserved_x0_bar(observed_x0_bar), observed_y0_bar(observed_y0_bar), // 2observed_x1_bar(observed_x1_bar), observed_y1_bar(observed_y1_bar){} // 2template <typename T>bool operator()(const T* const angles, const T* const t, T* residuals) const{T observed_X0_bar_T[3] = { T(observed_x0_bar), T(observed_y0_bar), T(1.0) };T observed_X1_bar_T[3] = { T(observed_x1_bar), T(observed_y1_bar), T(1.0) };T observed_X0_bar_T_to1[3];ceres::AngleAxisRotatePoint(angles, observed_X0_bar_T, observed_X0_bar_T_to1);T t_cross_observed_X0_bar_T_to1[3];ceres::CrossProduct(t, observed_X0_bar_T_to1, t_cross_observed_X0_bar_T_to1);residuals[0] = ceres::DotProduct(observed_X1_bar_T, t_cross_observed_X0_bar_T_to1);return true;}static ceres::CostFunction* Create(const double observed_x0_bar, const double observed_y0_bar,const double observed_x1_bar, const double observed_y1_bar){return (new ceres::AutoDiffCostFunction<CostFunctor22, 1, 3, 3>(new CostFunctor22(observed_x0_bar, observed_y0_bar, observed_x1_bar, observed_y1_bar)));}double observed_x0_bar, observed_y0_bar, observed_x1_bar, observed_y1_bar;// TODO: check if the repeated creations of cost functions will decreases the performance? };

    1.3 激光里程計

    VLOAM激光里程計和LOAM是幾乎一致的,在作者的代碼實現中也是直接復用了A-LOAM的代碼,唯一可能有一些區別的是在Sweep to Sweep Refinement的頻率是1Hz,并且是使用視覺里程計積分獲得先驗。

    1.4 實驗結果

    在復現代碼的報告中也對算法精度進行了詳細的評估, 如下表所示:

    上表中,LO表示只是通過Sweep to Sweep Refinement計算激光里程計,MO表示Sweep to Map計算激光里程計,(D)表示不使用視覺里程計作為激光里程計的先驗,(D)表示使用視覺里程計作為激光里程計的先驗,也就是VLOAM算法,從表中平均值可以看到VLOAM算法的確是所有算法里誤差最小的,但是,01數據集上也有例外,在視覺里程計失效的情況下整個VLOAM算法也會失效,這也是VLOAM算法的弊端,以上就是對VLOAM算法的簡單總結,對該算法感興趣的同學推薦讀一下原Paper以及復現代碼的報告。

    2. LIMO算法

    LIMO算法2018年發表在IROS會議,原論文名為《LIMO: LiDAR-Monocular Visual Odometry》,該論文是有開源的johannes-graeter/limo,該算法我并沒有閱讀源碼,而是通過其他論文博客對該算法進行了一些初步了解,簡單總結如下

    2.1 總體框架

    LIMO算法的總體框架如下:

    從上圖中可以看出,LIMO算法框架主要包括特征提取、特征預處理、幀間運動估計、尺度估計、BA和回環檢測,整體上就是一個完整的VSLAM的算法框架,區別較大的地方就是接入了激光進行尺度估計,原論文中也指出,作者是想要組合激光準確的深度估計和相機的強大特征追蹤能力,換句話說,LIMO就是一種激光深度增強的VSLAM算法。

    下面我主要簡單介紹下LIMO是如何進行尺度估計以及后端優化的

    2.2 尺度估計

    所謂尺度估計就是指通過激光來恢復視覺特征點的深度
    首先將激光點云投影到對應的相機坐標系中,然后對每個特征點,執行如下步驟:

  • 首先尋找該特征點周圍的矩形框內的激光點;
  • 然后對這些激光點按照深度進行劃分;
  • 尋找最靠近該特征點的深度區間的點云,擬合平面;
  • 我們認為該特征點位于該平面上,根據光心和特征點的連線與平面的交點記為該特征點的深度;
  • 檢測估計深度的準確性:光心和特征點連線與平面的夾角必須小于某個閾值,并拒絕深度高于30m的特征點。
  • 對于地面上的特征點進行特殊處理。首先從激光點云中提取地面,然后直接利用地面點云擬合平面,而不需要第2和第3步。該方法和VLOAM應該是大同小異。

    2.3 幀間估計與后端優化

    LIMO的幀間估計和VLOAM中的視覺里程計類似,也是將特征點分為具備深度的特征點和不具備深度的特征點,整體的
    殘差計算公式如下:argmin?x,y,z,α,β,γ∑iρ3d→2d(∥φi,3d→2d∥22)+ρ2d→2d(∥φi,2d→2d∥22)\underset{x, y, z, \alpha, \beta, \gamma}{\operatorname{argmin}} \sum_{i} \rho_{3 d \rightarrow 2 d}\left(\left\|\varphi_{i, 3 d \rightarrow 2 d}\right\|_{2}^{2}\right)+\rho_{2 d \rightarrow 2 d}\left(\left\|\varphi_{i, 2 d \rightarrow 2 d}\right\|_{2}^{2}\right) x,y,z,α,β,γargmin?i?ρ3d2d?(φi,3d2d?22?)+ρ2d2d?(φi,2d2d?22?)其中φi,3d→2d=pˉi?π(pi,P(x,y,z,α,β,γ))\varphi_{i, 3 d \rightarrow 2 d}=\bar{p}_{i}-\pi\left(p_{i}, P(x, y, z, \alpha, \beta, \gamma)\right) φi,3d2d?=pˉ?i??π(pi?,P(x,y,z,α,β,γ))φi,2d→2d=pˉiF(xz,yz,α,β,γ)p~i\varphi_{i, 2 d \rightarrow 2 d}=\bar{p}_{i} F\left(\frac{x}{z}, \frac{y}{z}, \alpha, \beta, \gamma\right) \tilde{p}_{i} φi,2d2d?=pˉ?i?F(zx?,zy?,α,β,γ)p~?i?通過公式看出來,具備深度的特征點構建的PnP問題,即將前一幀三維空間點投影到后一幀二維平面上,并與對應特征點構建距離殘差,而不具備深度的特征點構建的極線約束問題,即通過基本矩陣約束,這和前面提到VLOAM中構建的方法不同也更為常見。
    對于后端優化,實際上就是構建了一個基于滑窗的BA問題,具體形式為:argmin?Pj∈P,li∈L,di∈Dw0∥ν(P1,P0)∥22+∑i∑jw1ρ?(∥?i,j(li,Pi)∥22)+w2ρξ(∥ξi,j(li,Pj)∥22)\operatorname{argmin}_{P_{j} \in \mathcal{P}, l_{i} \in \mathcal{L}, d_{i} \in \mathcal{D}} w_{0}\left\|\nu\left(P_{1}, P_{0}\right)\right\|_{2}^{2}+\sum_{i} \sum_{j} w_{1} \rho_{\phi}\left(\left\|\phi_{i, j}\left(l_{i}, P_{i}\right)\right\|_{2}^{2}\right)+w_{2} \rho_{\xi}\left(\left\|\xi_{i, j}\left(l_{i}, P_{j}\right)\right\|_{2}^{2}\right) argminPj?P,li?L,di?D?w0?ν(P1?,P0?)22?+i?j?w1?ρ??(?i,j?(li?,Pi?)22?)+w2?ρξ?(ξi,j?(li?,Pj?)22?)第一項ν(P1,P0)=∥translation?(P0?1P1)∥22?s\nu\left(P_{1}, P_{0}\right)=\| \text { translation }\left(P_{0}^{-1} P_{1}\right) \|_{2}^{2}-s ν(P1?,P0?)=?translation?(P0?1?P1?)22??s表達是滑窗中最舊的兩幀之間的平移不能變化過大,sss為該兩幀優化前的平移值
    第二項?i,j(li,Pj)=lˉi,j?π(li,Pj)\phi_{i, j}\left(l_{i}, P_{j}\right)=\bar{l}_{i, j}-\pi\left(l_{i}, P_{j}\right) ?i,j?(li?,Pj?)=lˉi,j??π(li?,Pj?)指的是滑窗中的特征點在圖像上的重投影誤差
    第三項ξi,j(li,Pj)=d^i,j?[001]τ(li,Pj)\xi_{i, j}\left(l_{i}, P_{j}\right)=\hatozvdkddzhkzd_{i, j}-\left[\begin{array}{lll} 0 & 0 & 1 \end{array}\right] \tau\left(l_{i}, P_{j}\right) ξi,j?(li?,Pj?)=d^i,j??[0?0?1?]τ(li?,Pj?)即對于有深度的點進行深度約束,即優化后的點的深度和估計的深度差距不能過大,以上就是幀間約束和后端優化的基本介紹

    2.4 實驗結果

    在原論文中,對算法效果進行了評估對比:

    通過對比可以看到,加入激光進行深度估計的相對原始的視覺里程計在效果上確實有明顯提升,但是算法整體精度相對VLOAM并沒那么高,畢竟是基于視覺的里程計算法,在KITTI的Odometry榜上排在40+

    以上就完成VLOAM和LIMO兩種視覺激光融合的定位算法的介紹,就我目前了解,除了VLOAM(如果算)之外,目前還沒有特別成熟視覺和激光的緊耦合框架,如果有知道的小伙伴歡迎評論區交流

    此外,對其他SLAM算法感興趣的同學可以看考我的博客SLAM算法總結——經典SLAM算法框架總結

    總結

    以上是生活随笔為你收集整理的视觉激光融合——VLOAM / LIMO算法解析的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 天天操夜夜干 | 日韩午夜在线 | 亚洲精品乱码久久久久久麻豆不卡 | 国语对白做受欧美 | 成年人免费看视频 | 日韩制服在线 | 高h在线观看 | 一区二区三区四区高清视频 | 亚洲成人av免费 | 日本中文字幕高清 | 精品国产无码一区二区三区 | 片集网| 无人码人妻一区二区三区免费 | 亚洲石原莉奈一区二区在线观看 | 亚洲免费看黄 | 国产精品v欧美精品v日韩精品 | 日本三区视频 | 思思久久久 | 黄色a级在线观看 | 蜜臀久久99精品久久久画质超高清 | 亚洲精品久久久久久宅男 | 免费成人美女在线观看 | 男同激情视频 | 欧美中出 | 星空大象在线观看免费播放 | 精品国产视频一区二区三区 | 好吊色欧美一区二区三区视频 | 成人午夜精品福利 | 免费香蕉视频 | 亚洲精品一区二三区不卡 | 嫩草99| 久久aaaa片一区二区 | xxxx 国产| 亚洲免费在线观看av | 自拍偷拍亚洲 | 潘金莲一级淫片aaaaa武则天 | 日韩毛片在线看 | 成人欧美一区二区三区黑人 | 欧美 丝袜 自拍 制服 另类 | 国产在线精品一区二区三区 | 激情综合激情五月 | 欧美亚洲丝袜 | 日日爽天天 | 日本女人黄色片 | 天天插天天射天天干 | 久草视频免费播放 | 亚洲国产一区二区在线观看 | 爱射网| 日韩欧美日韩 | 亚洲天堂免费视频 | 国产一级高清视频 | 原创少妇半推半就88av | 毛片久久久 | 少妇精品一区二区三区 | 国产青草视频 | 蜜臀aⅴ国产精品久久久国产老师 | 欧美午夜在线观看 | 麻豆91在线观看 | 波多野结衣一二三四区 | 国产sm主人调教女m视频 | 91精品视频网 | 欧美亚洲免费 | 制服.丝袜.亚洲.中文.综合 | 国产专区一区 | 中国大陆高清aⅴ毛片 | 国产精品久久精品三级 | 超碰成人97| 国产青草视频在线观看 | 成人av网站免费 | 欧美精品一区二 | 黄色av三级 | 亚洲日本不卡 | 狠久久 | 深爱五月激情网 | 星铁乱淫h侵犯h文 | 中国少妇毛片 | 欧美激情在线狂野欧美精品 | 亚洲xx视频 | www在线观看国产 | 一区二区在线观看视频 | 美妇av| 在线观看福利网站 | 北条麻妃av在线播放 | 国产91亚洲 | 性高潮久久久久久久久久 | 在线播放91灌醉迷j高跟美女 | 久久久欧美精品 | 樱花电影最新免费观看国语版 | 国产精品一区二区三区免费视频 | 嫩草天堂 | 澳门久久久 | 成人28深夜影院 | 欧美一区免费看 | 日韩激情在线播放 | 国产精品色图 | 日本三级生活片 | 少妇av网| 黄色av网站免费在线观看 | 手机看片一区 |