Jak wyprowadzić Camera Jacobian

Nov 20 2020

Mam do czynienia z sytuacją z filtrem Kalmana, próbując śledzić punkty w 3D za pomocą kamer, z których każda może reprezentować punkt 3D jako projekcję 2D według:

$$ \begin{bmatrix} u \\ v \end{bmatrix} = \begin{bmatrix} \alpha_x & \gamma & u_0 \\ 0 & \alpha_y & v_0 \end{bmatrix} \cdot R_{3\times3} \cdot \begin{bmatrix} x \\ y \\ z \end{bmatrix} + \begin{bmatrix} \alpha_x & \gamma & u_0 \\ 0 & \alpha_y & v_0 \end{bmatrix} \cdot \vec{T}_{3\times1} $$

Gdzie $u$ i $v$ są współrzędnymi w pikselach punktu w kadrze kamery; $ \begin{bmatrix} \alpha_x & \gamma & u_0 \\ 0 & \alpha_y & v_0 \end{bmatrix} $to dwa górne rzędy matrycy kamery $K$, $R_{3x3}$jest macierzą obrotu opisującą obrót układu współrzędnych świata względem kamery; i$\vec{T}_{3x1}$ to tłumaczenie opisujące położenie układu współrzędnych świata względem kamery.

Naprawdę chciałbym, żeby to było w formie

$$ \vec{y} = H \vec{x} $$

Widziałem to $H$zwana „matrycą obserwacji”, aw innych przypadkach „jakobianem”. Ale jakobian sugerowałby taką strukturę

$$ \begin{bmatrix} \frac{\partial y_1}{\partial x_1} & \frac{\partial y_1}{\partial x_2} & \frac{\partial y_1}{\partial x_3} \\ \frac{\partial y_2}{\partial x_1} & \frac{\partial y_2}{\partial x_2} & \frac{\partial y_2}{\partial x_3} \end{bmatrix} $$

i nie jest dla mnie jasne, czy to faktycznie ci da $\vec{y}$ od $\vec{x}$.

Więc myślę, że mam kilka pytań:

  • Jak mogę uzyskać pojedynczy $H$ umieścić moją transformację w formie, którą może obsłużyć filtr Kalmana?

  • Czy powinienem zamiast tego używać jednorodnych współrzędnych (halsowanie na niektórych jedynkach)? Czy filtr Kalmana zaktualizowałby się do stanu niezawodnie zachowałby swój ostatni wpis na 1?

  • Mógłbym zrobić mój $\vec{y} = \begin{bmatrix} u \\ v \end{bmatrix} - \begin{bmatrix} \alpha_x & \gamma & u_0 \\ 0 & \alpha_y & v_0 \end{bmatrix} \cdot \vec{T}_{3\times1}$, ale to naprawdę nie jest to, czego chcę.

  • Czy trzymanie dodatkowego składnika po prawej stronie sprawia, że ​​jest to nieliniowe? $\vec{y} = H_{2\times3} \vec{x} + K_{2\times3}\vec{T}_{3\times1} \rightarrow \vec{y} = \tilde{H}(\vec{x}) $? Jak to się ma zatem do Jakobianina?

Odpowiedzi

PavelKomarov Nov 21 2020 at 03:21

Zrobiłem postęp.

Po pierwsze, moje równanie kamery było zdecydowanie błędne: brakowało mi podziału na zakres do obiektu. To wideo spowodowało, że zobaczyłem światło. Naprawdę:

$$ \begin{bmatrix} u \\ v \end{bmatrix} = K_{2\times3} \cdot \begin{bmatrix} x' \\ y' \\ z' \end{bmatrix}/z' $$

gdzie

$$ \begin{bmatrix} x' \\ y' \\ z' \end{bmatrix} = R_{3\times3} \cdot \begin{bmatrix} x \\ y \\ z \end{bmatrix} + T \tag{1}$$

Zagruntowany ($'$) zmienne reprezentują współrzędne rzeczy, którą próbujesz wyświetlić na kamerę w ramce odniesienia kamery, a zmienne nie uruchomione reprezentują współrzędne w ramce świata. Próbuję znaleźć$H$ w ramie świata.

To sprawia

$$ u = \frac{\alpha_x x'}{z'} + u_0 $$ $$ v = \frac{\alpha_x x'}{z'} + u_0 $$

Jeśli zastosujesz się do równania Jakobiana, które zostawiłem powyżej w pytaniu (bardzo ostrożnie, biorąc pochodne wrt $x$ i przyjaciół zamiast $x'$ i inni przyjaciele) przez półtorej strony rachunku różniczkowego i upraszczając algebrę liniową, w końcu skończysz

$$ Jacobian_{2\times3} = \frac{KR}{z'} - \frac{K\vec{x'} \otimes R_3}{z'^2} $$

gdzie $ \vec{x'} = \begin{bmatrix} x' \\ y' \\ z' \end{bmatrix} $, $R_3$ jest trzecim wierszem $R$ macierz i $\otimes$ jest produktem zewnętrznym.

Zauważ, że możesz opcjonalnie uwzględnić translację przed obrotem w równaniu (1) i nie ma to znaczenia dla pochodnych, ponieważ $x$, $y$, i $z$ nie pojawiają się w tekście tłumaczenia.

Po drugie, należy dokonać rozróżnienia między ewolucją systemu i funkcjami obserwacyjnymi a jakobianami. Mają one tendencję do zacierania się, ponieważ w przypadku liniowym mnożenie przez jakobian jest tym samym, co ocenianie funkcji. Weź przykład$y_1 = ax_1 + bx_2$, $y_2 = cx_1 + dx_2$. Następnie możemy zapisać system jako:

$$ \begin{bmatrix} y_1 \\ y_2 \end{bmatrix} = \begin{bmatrix} a & b \\ c & d \end{bmatrix} \begin{bmatrix} x_1 \\ x_2 \end{bmatrix} $$

Ale również

$$ \begin{bmatrix} \frac{\partial y_1}{\partial x_1} & \frac{\partial y_1}{\partial x_2} \\ \frac{\partial y_2}{\partial x_1} & \frac{\partial y_2}{\partial x_2} \end{bmatrix} = \begin{bmatrix} a & b \\ c & d \end{bmatrix} $$

Jest to wygodne, jeśli musisz znaleźć oba $\vec{y}$ od $\vec{x}$i robisz inne rzeczy, takie jak projektowe macierze kowariancji wokół , ale w systemie nieliniowym robisz te rzeczy osobnymi metodami:

Zwróć uwagę, że pierwsza linia używa $h(x)$, ale na kolejnych liniach używamy jakobianu $H$ oceniono w $x$. Podobnie na etapie aktualizacji używamy$f(x)$ rozwijać system i $F$ oceniono w $x$ zaktualizować kowariancję.

A teraz konkretnie odpowiem na moje pytania:

  • Nie dostajesz tylko jednego $H$; potrzebujesz obu$H(\vec{x})$ i $h(\vec{x})$, oszacowany na $\vec{x}$ ponieważ nieliniowość sprawia, że ​​kształt zmienia się w zależności od miejsca.

  • Nie, nie używaj jednorodnych współrzędnych. W rzeczywistości jest to tak nieliniowe (dzięki temu podziałowi przez$z'$), że i tak na pewno będziesz musiał użyć Jacobian. Nie jestem pewien, czy można kiedykolwiek ufać filtrowi, który utrzyma zmienną stanu w stanie stacjonarnym. Gdyby w tej zmiennej nie było szumu, a równania aktualizacji były po prostu takie, może? Nie ma tu teraz znaczenia.

  • To odejmowanie nie jest… nie.

  • Myślę, że liniowość nie jest w rzeczywistości naruszona przez ten dodatkowy termin, ponieważ jest to tylko przesunięcie. Ale liniowość jest tutaj jednak naruszona.