Comment dériver Camera Jacobian

Nov 20 2020

Je suis confronté à une situation de filtre de Kalman, essayant de suivre des points en 3D à l'aide de caméras, dont chacune peut représenter un point 3D sous forme de projection 2D selon:

$$ \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} $$

$u$ et $v$ sont les coordonnées de pixel d'un point dans l'image de la caméra; $ \begin{bmatrix} \alpha_x & \gamma & u_0 \\ 0 & \alpha_y & v_0 \end{bmatrix} $correspond aux deux rangées supérieures de la matrice de la caméra $K$, $R_{3x3}$est une matrice de rotation décrivant la rotation du cadre de coordonnées universelles par rapport à la caméra; et$\vec{T}_{3x1}$ est une traduction qui décrit la position du cadre de coordonnées universelles par rapport à la caméra.

J'aimerais vraiment que ce soit sous la forme

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

J'ai vu ça $H$appelé la «matrice d'observation» et dans d'autres cas le «jacobien». Mais Jacobien impliquerait une structure comme

$$ \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} $$

et il n'est pas clair pour moi que cela vous donnerait réellement $\vec{y}$ de $\vec{x}$.

Donc je suppose que j'ai quelques questions:

  • Comment puis-je en tirer un seul $H$ mettre ma transformation sous une forme qu'un filtre de Kalman peut gérer?

  • Dois-je utiliser des coordonnées homogènes (virement sur certains 1) à la place? La mise à jour du filtre de Kalman vers l'état conserverait-elle de manière fiable sa dernière entrée à 1 alors?

  • Je pourrais faire mon $\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}$, mais ce n'est vraiment pas ce que je veux.

  • Est-ce que le fait de garder le terme additif à droite rend cela non linéaire? $\vec{y} = H_{2\times3} \vec{x} + K_{2\times3}\vec{T}_{3\times1} \rightarrow \vec{y} = \tilde{H}(\vec{x}) $? Comment cela se rapporte-t-il alors au Jacobien?

Réponses

PavelKomarov Nov 21 2020 at 03:21

J'ai fait des progrès.

Tout d'abord, mon équation de caméra était définitivement fausse: il me manquait une division par plage à objet. Cette vidéo est ce qui m'a fait voir la lumière. Vraiment:

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

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

Le apprêté ($'$) représentent les coordonnées de l'objet que vous essayez de projeter sur la caméra dans le cadre de référence de la caméra, et les variables non amorcées représentent les coordonnées dans le cadre du monde. J'essaye de trouver$H$ dans le cadre du monde.

Cela fait

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

Si vous suivez l'équation jacobienne que j'ai laissée ci-dessus dans la question (très attentivement, en prenant des $x$ et amis plutôt que $x'$ et d'autres amis) à travers une page et demie de calcul et de simplification de l'algèbre linéaire, vous vous retrouvez finalement avec

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

$ \vec{x'} = \begin{bmatrix} x' \\ y' \\ z' \end{bmatrix} $, $R_3$ est la troisième rangée du $R$ matrice, et $\otimes$ est un produit extérieur.

Notez que vous pouvez éventuellement inclure la translation avant la rotation dans l'équation (1), et cela ne fait aucune différence pour les dérivées car $x$, $y$, et $z$ n'apparaissent pas dans le terme de traduction.

Deuxièmement, il y a une distinction à faire entre l'évolution du système et les fonctions d' observation et les jacobiens. Celles-ci ont tendance à s'estomper car dans le cas linéaire, la multiplication par le jacobien revient à évaluer la fonction. Prenons l'exemple$y_1 = ax_1 + bx_2$, $y_2 = cx_1 + dx_2$. Ensuite, nous pouvons écrire le système comme suit:

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

Mais aussi

$$ \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} $$

Ceci est pratique si vous devez à la fois trouver $\vec{y}$ de $\vec{x}$et faire d'autres choses comme projeter des matrices de covariance autour , mais dans un système non linéaire, vous faites ces choses par des méthodes séparées:

Remarquez que la première ligne utilise $h(x)$, mais sur les lignes suivantes, nous utilisons le jacobien $H$ évalué à $x$. De même à l'étape de mise à jour, nous utilisons$f(x)$ faire évoluer le système et $F$ évalué à $x$ pour mettre à jour la covariance.

Maintenant, pour répondre spécifiquement à mes questions:

  • Tu n'as pas juste un seul $H$; tu as besoin des deux$H(\vec{x})$ et $h(\vec{x})$, évalué à $\vec{x}$ car la non-linéarité fait varier la forme d'un endroit à l'autre.

  • Non, n'utilisez pas de coordonnées homogènes. C'est en fait si non linéaire (grâce à cette division par$z'$) dont vous allez certainement devoir utiliser le Jacobien de toute façon. Je ne sais pas si un filtre pourrait jamais être fiable pour maintenir une variable d'état stationnaire. S'il n'y avait pas de bruit dans cette variable et que les équations de mise à jour l'étaient, peut-être? Hors de propos ici maintenant.

  • Cette soustraction n'est pas ... non.

  • Je pense que la linéarité n'est pas réellement violée par ce terme additif, car ce n'est qu'un décalage. Mais la linéarité est violée ici après tout.