LoopClosing中为什么要使用剥离尺度的sim3计算投影匹配
1.問題描述
在LoopClosing中,得到當前幀的閉環(huán)候選幀之后,會使用詞袋進行這兩幀之間2D特征點的匹配。注意2D特征點的匹配純粹是得到兩幀之間在詞袋同一node下的描述子距離最近的匹配。由于這些特征點都是有對應的地圖點的(詞袋匹配過程中篩掉了沒有地圖點的那些特征點匹配),所以就相當于得到了兩幀之間地圖點的匹配關(guān)系。于是后面就可以利用這兩幀之間地圖點的匹配關(guān)系,來計算當前幀坐標系和閉環(huán)候選幀坐標系之間的sim3變換。之所以計算sim3,是因為單目存在尺度漂移,也就是其實當前幀的位姿和它計算出來的地圖點世界坐標都是不準確的,但是當前幀的地圖點在當前幀坐標系下的坐標是準確的,因為這是一個局部的關(guān)系。
在上面得到了初步的sim3變換后,bool LoopClosing::ComputeSim3()函數(shù)中會調(diào)用matcher.SearchBySim3()函數(shù)在閉環(huán)候選幀的地圖點中,尋找更多的和當前幀的匹配關(guān)系。在這里面匹配投影的時候,使用的是上面初步計算的sim3變換,因為這個時候在兩個相機坐標系下的坐標變換關(guān)系就是sim3,是考慮了尺度漂移的,因此是相對準確的。得到更多的匹配關(guān)系之后,就使用g2o優(yōu)化得到更加精確的sim3變換。
問題出現(xiàn)在最后一步:其實單純從計算sim3來說,上面已經(jīng)完成任務了。但是為了謹慎判斷閉環(huán)匹配到底是否成功,程序中還用matcher.SearchByProjection()把閉環(huán)候選幀和它的共視關(guān)鍵幀的地圖點再次投影到當前幀中,看最終有多少匹配的地圖點。其實可以認為閉環(huán)候選幀和它的共視關(guān)鍵幀之間由于離的很近所以是沒有尺度漂移的,因此可以把閉環(huán)候選幀的共視關(guān)鍵幀的地圖點利用歐式變換到閉環(huán)候選幀中, 然后按照2中的操作,利用sim3變換到當前幀中尋找匹配。但是不同的地方有兩點:
- matcher.SearchBySim3()僅僅是兩幀的地圖點之間的匹配,他們的視角相差不會太大。但是現(xiàn)在是用閉環(huán)候選幀的共視關(guān)鍵幀組中的所有地圖點與當前幀的地圖點進行匹配,就很可能出現(xiàn)視角相差太大的情況,在ORB-SLAM中視角差>60度就認為匹配是不準的。所以要得到當前幀相機光心到閉環(huán)候選幀的共視關(guān)鍵幀組的地圖點的方向向量,因此需要知道到相機光心的世界坐標真實值。
2.為什么要剝離尺度s
一開始我認為自己想明白了,但是后面仔細一想發(fā)現(xiàn)還是有很多不明白。但是一個比較模糊的想法可以總結(jié)一句話就是把尺度s剝離后,sim3變換就是如下形式:
X′=sR?X+t=s(R?X+1st)X' = sR*X + t = s(R*X + \frac{1}{s}t)X′=sR?X+t=s(R?X+s1?t)
其中由RRR和1st\frac{1}{s}ts1?t組成的就是一個歐式變換,而歐式變換是可以表示位姿的。所以說使用剝離尺度的這種方式,就相當于恢復出了相機的真實位姿,那么尺度s代表什么呢?此時尺度s就是相機坐標軸刻度的縮放。比如在世界坐標系下長度為1的向量,如果是單純的歐式變換那么長度還是1。但是在這里使用sim3變換,可以認為是按照由RRR和1st\frac{1}{s}ts1?t組成的歐式變換進行變換,但是變換后坐標還要進行一個s的縮放。就相當于相機的坐標軸經(jīng)過歐式變換之后,又經(jīng)過了縮放,坐標軸的長度不是單位1了,變成了s(坐標軸是沒有長度的,這樣比喻可能不太合適,但是就是這個意思)。
總結(jié)
以上是生活随笔為你收集整理的LoopClosing中为什么要使用剥离尺度的sim3计算投影匹配的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 量化交易之股票数据的获取——同花顺软件
- 下一篇: 百钱买百鸡问题,Python编程解决