PnP問題可構建成一個定義於李代數上的非線性最小二乘問題。
線性方法往往是先求位姿,再求空間點位置。非線性優化把它們都看成優化變量,放在一起優化。在PnP中,這個Bundle Adjustment問題,是一個最小化重投影誤差(Reprojection error)的問題。
n個三維空間點P及其投影p,希望計算相機的位姿 R,t ,它的李代數爲 ξ 。假設某空間點座標爲 Pi=[Xi,Yi,Zi]T ,投影像素座標爲 ui=[ui,vi] 。像素位置於空間點位置關係如下:
si⎣⎡uivi1⎦⎤=Kexp(ξ∧)⎣⎢⎢⎡XiYiZi1⎦⎥⎥⎤
除了用 ξ表示相機位姿之外,別的都和之前的定義保持一致。寫成矩陣形式就是:
siui=Kexp(ξ∧)Pi
中間隱含齊次座標到非齊次座標的轉換。由於相機位姿未知及觀測點的噪聲,該等式存在一個誤差,因此,把誤差求和,構建最小二乘問題,然後尋找最好的相機位姿,使它最小化:
ξ∗=argξmin21∑i=1n∥∥∥ui−si1Kexp(ξ∧)Pi∥∥∥22
該問題的誤差項,是將像素座標(觀測到的投影位置)於3D點安裝當前估計的位姿進行投影得到的位置相比較得到的誤差,作以稱爲重投影誤差。使用齊次座標時,這個座標有3維。不過,由於 u 最後一維爲1,該維度的誤差一直爲零,因而使用非齊次座標,於是誤差就只有兩維了。
通過特徵匹配知道了 p1,p2 是同一個空間點P的投影,但不知道相機的位姿。在初始值中,P的投影 p^2 與實際的 p2 之間有一定的距離。於是調整相機的位姿,使得這個距離變小。由於調整需要考慮很多個點,最好每個點的誤差通常不會精確爲零。
每個誤差項關於優化變量的導數,線性化:
e(x+Δx)≈e(x)+JΔx
當 e 爲像素座標(2維), x 爲相機座標(6維)時, J 是一個 2×6 的矩陣。J 的形式推導如下:
變換到相機座標系下的空間點座標爲P′ ,取出前三維:
P′=(exp(ξ∧)P)1:3=[X′,Y′,Z′]T
相機投影模型相對於 P’ 爲
su=KP′
展開:
⎣⎡susvs⎦⎤=⎣⎡fx000fy0cxcy1⎦⎤⎣⎡X′Y′Z′⎦⎤
利用第三行消去s(實際上就是 P’ 的距離),得:
u=fxZ′X′+cx,v=fyZ′X′+cy
求誤差時,可以把這裏的u,v與實際的測量值進行比較,求差。定義了中間變量後對 ξ∧ 左乘擾動量 δξ ,然後考慮 e 的變化關於擾動量的導數。利用鏈式法則:
∂δξ∂e=lim∂ξ→0δξe(δξ⊕ξ)=∂P′∂e∂δξ∂P′
⊕ 指李代數上的左乘擾動。第一項是誤差關於投影點的導數:
∂P′∂e=−[∂X′∂u∂X′∂v∂Y′∂u∂Y′∂v∂Z′∂u∂Z′∂v]=−[Z′fx00Z′fyZ′2fxX′−Z′2fyY′]
第二項爲變換到相機座標系下的空間點 P’ 關於李代數的導數
∂δξ∂(TP)=(TP)⊙=[I0T−P′∧0T]
在 P’ 的定義中,去除前三維得:
∂δξ∂P′=[I−P′∧]
將這兩項相乘,就得到了 2\times6 的雅可比矩陣:
∂δξ∂e=−[Z′fx00Z′fyZ′2fxX′−Z′2fyY′−Z′2fxX′Y′−fy−Z′2fyY′2fx+Z′2fxX′2Z′2fyX′Y′−Z′fxY′Z′fyX′]
這個雅可比矩陣描述了重投影誤差關於相機位姿李代數的一階變化關係。保留了前面的負號,是因爲誤差由觀測值減預測值定義。可以反過來,定義成“預測值減觀測值”的形式,此時,去掉負號即可。如果 se(3) 的定義形式是旋轉在前,平移在後,只要把這個矩陣的前3列與後3列對調即可。
除了優化位姿,還需要優化特徵點的空間位置,需要討論 e 關於空間點 P 的導數。仍用鏈式法則:
∂P∂e=P′∂e∂P∂P′
第一項前面已經推導:
∂P′∂e=−[∂X′∂u∂X′∂v∂Y′∂u∂Y′∂v∂Z′∂u∂Z′∂v]=−[Z′fx00Z′fyZ′2fxX′−Z′2fyY′]
關於第二項,按照定義:
P′=exp(ξ∧)P=RP+t
P’ 對 P 求導後僅剩下 R ,於是:
∂P∂e=−[Z′fx00Z′fyZ′2fxX′−Z′2fyY′]R
因此,觀測相機方程關於相機位姿和特徵點的兩個導數矩陣都求到了,在優化過程中提供了重要的梯度方向,指導優化的迭代。
使用BA優化: