SLAM面試總結...

1、什麼是閉環檢測,常用方法有哪些

隨着相機的運動,我們計算的相機位姿,三角化得到的點雲位置,都是有誤差的,即使我們使用局部的或全局的BA去優化,仍然會存在累積誤差。而消除誤差最有效的辦法是發現閉環,並根據閉環對所有結果進行優化。閉環是一個比BA更加強烈、更加準確的約束。

目前SLAM中用的比較多的方法是詞袋模型,詞袋模型中涉及到字典的生成和使用的問題,這一部分和機器學習的只是掛鉤比較深。
字典的生成問題就是非監督聚類問題,可以採用K-means對特徵點進行聚類,然後通過K叉樹進行表達,相似度判斷採用是TD-IDF的方法。

2、解釋一下梯度下降,牛頓法 ,高斯牛頓和LM算法

在這裏插入圖片描述

3 ceres庫

求F(x) F(x)F(x)平方和最小
思路:
第一步:利用模板,建立CostFunctor,有4個分別是F1(x1,x2); F2(x3,x4);F3(x2,x3); F4(x1,x4)
第二步:建立problem;先使用AutoDiffCostFunction分別對F1,F2,F3,F4求導,再problem.AddResidualBlock都加入殘差塊
第三步:solver解算器的options,summary

4 卡爾曼濾波的3個條件

狀態方程和觀測方程爲線性方程
觀測噪聲爲高斯噪聲
初始狀態分佈爲高斯分佈

5 緊耦合和鬆耦合

緊耦合系統將視覺測量殘差和IMU測量殘差一起加入後端優化系統中進行優化
鬆耦合系統是計算完視覺結果和IMU結果後再進行優化。

6 你認爲室內SLAM與自動駕駛SLAM有什麼區別

地圖不同:自動駕駛的高精地圖是經過標註後的語義地圖。視覺slam的地圖則主要用於導航使用。

自動駕駛的定位方案一般爲:GPS+IMU+里程計,爲了仿真在gps信號差的地方產生跳變,也會結合slam這種相對定位的方法。第二種方案是:GPS+多線雷達+高精度地圖。第三種方案是多個雙目視覺相機slam方案。

室內slam主要是以激光和視覺slam爲主流。

7 地圖點的構建方法有哪些

點雲地圖
2D柵格地圖
八叉樹地圖

8 魯棒核函數有哪些

9 介紹RANSAC等魯棒估計的方法

點:每一個數據,SLAM裏指的是匹配的點對
野值/外點:錯誤的點
內點:正確的點
內點集:內點的集合
外點集:外點的集合
模型:待估計的參數
s ss :估計模型所需要的最小點數
S SS :所有的點形成的點集

RANSAC的想法是從點集中隨機的選擇出s ss 個點,估計出一個模型,查看剩餘點是否符合這個模型。如果大部分點都符合這個模型,就相當於我們找到了一個合適的模型,自然的符合模型的點就是內點啦。由於是隨機選擇,一次可能難以找到正確的模型,因此需要多次纔可以。一般直線方程估計中採用點到線的距離的平方,基本矩陣估計中也使用點到極線的距離的平方,單應和相機內參估計中使用點到點的距離的平方。

10 求導

11 單目相機的內外參模型

相機內參包括焦距fx,fy,cx,cy,徑向畸變係數k1,k2,k3,切向畸變係數p1,p2
其中內參一般來說是不會改變,但是當使用可變焦距鏡頭時每次改變焦距需要重新標定內參
當圖像裁剪時內參cx,cy會發生改變,比如圖像從88變成44時,cx,cy需要除以2
一般標定工業相機時只需要得到畸變係數k1,k2即可,對於畸變係數較大的魚眼相機需要得到k3,p1,p2
相機外參分爲旋轉矩陣R和平移矩陣t,旋轉矩陣和平移矩陣共同描述瞭如何把點從世界座標系 轉換到攝像機座標系

12 VINS-Mono優缺點

13 如何標定相機和IMU的外參

採集圖像標定相機內參和畸變參數 ,重投影誤差在 0.1~0.2 標定結果較好,靜止採集兩個小時IMU數據的加速度計和陀螺噪聲以及隨機遊走.
同時採集imu和相機數據,將相機參數配置文件,imu參數配置文件,圖像與imu的bag文件,標定板參數輸入到kalibr_calibrate_imu_camera中,輸出camchain-imucam配置文件。
注意事項:
i,確保圖像不要模糊,運動不要太快。
ii,最好要遍歷imu的所有軸,即充分旋轉和加速。

14 給定一張圖片,已知相機和地面之間的相對關係,計算出圖的俯視圖

15 雙線性插值

16 視覺SLAM方法一般分爲特徵點法和直接法。請簡述一下特徵點法和直接法的概念,以及對應的優缺點。

特徵點法,根據提取匹配特徵點來估計相機運動,優化的是重投影誤差,對光照變化不敏感,是比較成熟的方案,常見的開源方案有orbslam
優點:特徵點本身對光照運動旋轉比較不敏感,所有比較穩定; 相機運動較快也能跟蹤成功,魯棒性好一些;方案成熟
缺點:關鍵點提取,描述子,匹配時間長;特徵點丟失場景無法適應;只能構建稀疏地圖;
直接法:根據相機的亮度信息估計相機運動,可以不需要計算關鍵點和描述子,優化的是光度誤差,根據使用像素數量可以分爲稀疏半稠密稠密三種
優點:速度快,可以省去計算特徵點,描述子時間;可以用在特徵缺失場合,特徵法在該情況下會極速變差
因爲假設了灰度不變,所以容易受光照變化影響,要求相機運動較慢或採集頻率較高;單個像素或像素塊區分度不強

17 用自己的語言描述一下關鍵幀是什麼?有什麼用?如何選擇關鍵幀?

關鍵幀可以減少待優化的幀數,並且可以代表其附近的幀。

選取指標爲:
(1)距離上一關鍵幀的幀數是否足夠多,比如我每隔固定幀數選擇一個關鍵幀,這樣編程簡單但是效果不好,比如運動很慢的時候,就會有大量相似的關鍵幀,運動快又會丟失很多。
(2)距離最近關鍵幀的距離是否足夠遠
(3)跟蹤質量(根據跟蹤過程中搜索到的點數和共視特徵點的比例)一方面,關鍵幀自身質量要好,例如不能是非常模糊的圖像、特徵點數量要充足、特徵點分佈要儘量均勻等等;另一方面,關鍵幀與其他關鍵幀之間的關係,需要和局部地圖中的其他關鍵幀有少量的共視關係,但大部分特徵點是新特徵點,以達到既存在約束,又儘量少的信息冗餘的效果,例如局部地圖點投影到此幀的點數低於一個閾值或前一個關鍵幀的特徵點在此幀裏已經有90%觀測不到等等。

18 什麼是極線約束?這個約束能帶來什麼好處?

能夠自己畫出上面圖片

極線約束的好處:從上面的描述我們可以看到,我們在做特徵點匹配時,左圖成像點p1的待匹配點p2一定在相對於p1的極線上,那麼我們在做搜索時就可以在極線附近(考慮實際可能 會有一點誤差)進行搜索,相對暴力匹配極大減少待匹配的點的數量。

19 什麼是邊緣化? First Estimate Jacobian? 一致性? 可觀性?

20 如何對匹配好的點做進一步的處理,更好保證匹配效果

(1)確定匹配最大距離,漢明距離小於最小距離的兩倍

(2)使用KNN-matching算法,令K=2。則每個match得到兩個最接近的descriptor,然後計算最接近距離和次接近距離之間的比值,當比值大於既定值時,才作爲最終match。

(3)RANSAC(使用RANSAC找到最佳單應性矩陣。由於這個函數使用的特徵點同時包含正確和錯誤匹配點,因此計算的單應性矩陣依賴於二次投影的準確性)

21 單目相機,F和H矩陣有何不同,E和F矩陣有何不同,只旋轉不平移能不能求F,只旋轉不平移能不能求H
在相機只有旋轉而沒有平移的情況,此時t爲0,E也將爲0,導致無法求解R,這時可以使用單應矩陣H求旋轉,但僅有旋轉,無法三角化求深度。

22 描述BA

BA的本質是一個優化模型,其目的是最小化重投影/光度誤差,用於優化相機位姿和世界點。局部BA用於優化局部的相機位姿,提高跟蹤的精確度;全局BA用於全局過程中的相機位姿,使相機經過長時間、長距離的移動之後,相機位姿還比較準確。BA是一個圖優化模型,一般選擇LM(Levenberg-Marquardt)算法並在此基礎上利用BA模型的稀疏性進行計算;可以直接計算,也可以使用g2o或者Ceres等優化庫進行計算。

Bundle Adjustment : 從視覺重建中提煉出最優的3D模型和相機參數(內參和外參),好似每一個特徵點都會反射幾束光線,當把相機位姿和特徵點位置做出最優的調整後,這些光線都收束到相機相機光心。也就是根據相機的投影模型構造構造代價函數,利用非線性優化(比如高斯牛頓或列文伯格馬誇而爾特)來求最優解,利用雅克比矩陣的稀疏性解增量方程,得到相機位姿和特徵點3D位置的最優解。

BA可以分爲基於濾波器的BA和基於迭代的BA

23 描述PnP

Perspective-n-Points, PnP(P3P)提供了一種解決方案,它是一種由3D-2D的位姿求解方式,即需要已知匹配的3D點和圖像2D點。目前遇到的場景主要有兩個,其一是求解相機相對於某2維圖像/3維物體的位姿;其二就是SLAM算法中估計相機位姿時通常需要PnP給出相機初始位姿。

在場景1中,我們通常輸入的是物體在世界座標系下的3D點以及這些3D點在圖像上投影的2D點,因此求得的是相機座標系相對於世界座標系(Twc)的位姿

在場景2中,通常輸入的是上一幀中的3D點(在上一幀的相機座標系下表示的點)和這些3D點在當前幀中的投影得到的2D點,所以它求得的是當前幀相對於上一幀的位姿變換,如圖所示:

兩種情況本質上是相同的,都是基於已知3D點和對應的圖像2D點求解相機運動的過程。

24 爲什麼要引入李羣李代數

旋轉矩陣自身是帶有約束的,正交且行列式爲1,他們作爲優化變量時,會引入額外的約束,時優化變的困難,通過李羣李代數的轉換關係,把位姿估計變成無約束的優化問題。

25 單目視覺slam中尺寸漂移是怎麼產生的

單目相機根據一張圖片無法得出一張圖片中物體的實際大小,同理也就無法得出運動的尺度大小,這是產生尺度漂移的根源。而在優化過程中,單目相機使用對極幾何中的三角測量原理,而三角測量中,極小的角度誤差在累積之後深度不確定都會變得很大,從而無法保證尺度一致性。

26 SLAM中的綁架問題

綁架問題就是重定位,是指機器人在缺少之前位置信息的情況下,如何去確定當前位姿。例如當機器人被安置在一個已經構建好地圖的環境中,但是並不知道它在地圖中的相對位置,或者在移動過程中,由於傳感器的暫時性功能故障或相機的快速移動,都導致機器人先前的位置信息的丟失,在這種情況下如何重新確定自己的位置。

27 KF和BA的區別

(1) EKF假設了馬爾科夫性,認爲k時刻的狀態只與k-1時刻有關。非線性優化使用所有的歷史數據,做全體的SLAM

(2) EKF做了線性化處理,在工作點處用一階泰勒展開式近似整個函數,但在工作點較遠處不一定成立。非線性優化每迭代一次,狀態估計發生改變,我們會重新對新的估計點做 泰勒展開,可以把EKF看做只有一次迭代的BA

28 常用的邊緣檢測算子和優缺點

邊緣檢測一般分爲三步,分別是濾波、增強、檢測。基本原理都是用高斯濾波器進行去噪,之後在用卷積內核尋找像素梯度。常用有三種算法:canny算子,sobel算子,laplacian算子

canny算子:一種完善的邊緣檢測算法,抗噪能力強,用高斯濾波平滑圖像,用一階偏導的有限差分計算梯度的幅值和方向,對梯度幅值進行非極大值抑制,採用雙閾值檢測和連接邊緣。

sobel算子:一階導數算子,引入局部平均運算,對噪聲具有平滑作用,抗噪聲能力強,計算量較大,但定位精度不高,得到的邊緣比較粗,適用於精度要求不高的場合。

laplacian算子:二階微分算子,具有旋轉不變性,容易受噪聲影響,不能檢測邊緣的方向,一般不直接用於檢測邊緣,而是判斷明暗變化。

29 爲什麼SLAM中常用L-M?

G-N中的H矩陣可能爲奇異矩陣或者病態矩陣,導致算法不收斂。而且當步長較大時,也無法保證收斂性,所以採用L-M求解增量方程,但是它的收斂速度可能較慢。

30 10個相機同時看到100個路標點,問BA優化的雅克比矩陣多少維,Heissian矩陣多少維
Jacob矩陣是 2000×360
因爲誤差對相機姿態的偏導數的維度是2×6,對路標點的偏導數是2×3,又10個相機可以同時看到100個路標點,所以一共有10×100×2行,100×3+10×6個塊。

Hession是360×360

31 GridMap給定起點和終點,求最優路徑

32 描述PnP算法

目前一共有兩種解法,直接線性變換方法(一對點能夠構造兩個線性約束,因此12個自由度一共需要6對匹配點),另外一種就是非線性優化的方法,假設空間座標點準確,根據最小重投影誤差優化相機位姿。
目前有兩個主要場景場景,其一是求解相機相對於某2維圖像/3維物體的位姿;其二就是SLAM算法中估計相機位姿時通常需要PnP給出相機初始位姿。
在場景1中,我們通常輸入的是物體在世界座標系下的3D點以及這些3D點在圖像上投影的2D點,因此求得的是相機座標系相對於世界座標系(Twc)的位姿
在場景2中,通常輸入的是上一幀中的3D點(在上一幀的相機座標系下表示的點)和這些3D點在當前幀中的投影得到的2D點,所以它求得的是當前幀相對於上一幀的位姿變換.

33 方差,期望,協方差概念

方差:描述了隨機變量的離散程度
方差性質:
D(X)=E[(xE[x])2)]D(X)=E[(x-E[x])^2)]D(X)=E(X2)E(x)2D(X) =E(X^2)-E(x)^2
如果X和Y相互獨立,則
D(X+Y) =D(X)+D(Y)
D(aX+b)=a2D(X)D(aX+b)=a^2D(X)

算法數據結構 C++

1 ORB-SLAM的共視圖是什麼結構

2 寫一個四叉樹結構

3 不用遞歸遍歷二叉樹

4 多線程的實現方式

5 求最大聯通域

6 Mat是如何構造的

7 重建二叉樹

8 實現一個稀疏矩陣的數據結構,並實現稀疏矩陣的加法

9 寫快速排序,寫反轉鏈表

10 從數組中找出第K小的數字

11 說一下什麼是虛函數和純虛函數,虛表,抽象類

  • 抽象類(虛基類)和普通類區別
    抽象類只能作爲基類,提供接口,不能有實例。
    普通類既可以作爲基類,又可以有實例。

  • 虛函數和純虛函數定義的區別

// 虛函數定義
class Person
{
public:
	virtual void BuyTicket()
	{
		cout<<"Price:全票"<<endl;
	}
};
 
class Student
{
public:
	virtual void BuyTicket()
	{
		cout<<"Price:半票"<<endl;
	}
};

 
// 純虛函數定義:在虛函數後面賦值0;
class A
{
   virtual void func() = 0; // 純虛函數
protected :
   string _a ;
};
class B : public A
{};

  • 虛函數需要實現,純虛函數不需要實現
    類裏如果聲明瞭虛函數,這個函數是實現的,哪怕是空實現,它的作用就是爲了能讓這個函數在它的子類裏面可以被覆蓋,這樣編譯器就可以使用後期綁定來達到多態了。純虛函數只是一個接口,是個函數的聲明而已,它要留到子類裏去實現。(純虛函數是接口,不能定義實現,需要到子類裏面實現; 虛函數是必須要實現,後面在子類裏面會被覆蓋)

  • 虛函數在子類裏面也可以不重載的;但純虛函數必須在子類去實現,這就像 Java 的接口一樣。通常把很多函數加上 virtual,是一個好的習慣,雖然犧牲了一些性能,但是增加了面向對象的多態性,因爲很難預料到父類裏面的這個函數不在子類裏面不去修改它的實現。

  • 虛函數的類用於“實作繼承”,繼承接口的同時也繼承了父類的實現。當然大家也可以完成自己的實現。純虛函數關注的是接口的統一性,實現由子類完成。

  • 帶純虛函數的類叫虛基類,這種基類不能直接生成對象,而只有被繼承,並重寫其虛函數後,才能使用。這樣的類也叫抽象類。抽象類和大家口頭常說的虛基類還是有區別的,在 C# 中用 abstract 定義抽象類,而在 C++ 中有抽象類的概念,但是沒有這個關鍵字。抽象類被繼承後,子類可以繼續是抽象類,也可以是普通類,而虛基類,是含有純虛函數的類,它如果被繼承,那麼子類就必須實現虛基類裏面的所有純虛函數,其子類不能是抽象類。

12 說一下智能指針,shared_ptr與unique_ptr

13 C++如何實現多態

14 給一個2D平面的兩個線段,判斷兩個線段是否相交

多線程瞭解

二叉樹排序,堆排序,希爾排序,桶排序時間複雜度

最長公共子串,最長公共子序列

三維空間最近鄰搜索常用的數據結構(八叉樹,kd樹)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章