19 votos

Matriz jacobiana de la fórmula de Rodrigues (mapa exponencial)

Estoy trabajando en un algoritmo que debe alinear un par de imágenes. El modelo de movimiento, que describe la pose pp de una imagen (con respecto a la segunda) en el espacio 3D, es puramente rotacional.

Teoría a mi pregunta:

Según la fórmula de Rodrigues para las matrices de rotación, la matriz exponencial R(p)=eˆp para un vector p=(px,py,pz)TR3 viene dada por R(p)=eˆp=I+ˆp||p||sin(||p||)+ˆp2||p||2(1cosθ) donde ||p||=p2x+p2y+p2z y ˆp=[0pzpypz0pxpypx0].

Resumiendo los elementos de R(p) produce R(p)=[1(p2y+p2z)spzr+pxpyspyr+pxpzspzr+pxpys1(p2x+p2z)spxr+pypzspzr+pxpzspxr+pypzs1(p2x+p2y)s] donde r=sin(||p||)||p|| y s=(1cos(||p||))||p||2 se introdujeron para mayor claridad.

Ahora, dejemos que Rs(p)R9×1 sea la versión apilada de R(p) es decir, todas las columnas se apilan en una sola columna y deja que Rsi(p) denotan el i -éste es el elemento de Rs(p) donde 1i9 .

La matriz jacobiana JRR9×3 con respecto al vector p viene dada por JR=Rsp=[Rs1pxRs1pyRs1pzRs9pxRs9pyRs9pz]

El primer elemento de JR puede expresarse entonces como Rs1px=px(1(p2y+p2z)(1cos(||p||))||p||2)=[(p2y+p2z)sin(||p||)px||p||(1cos(||p||)2px)||p||4] el segundo como Rs1py=py(1(p2y+p2z)(1cos(||p||))||p||2)=[2py1cos(||p||)||p||2+(p2yp2z)sin(||p||)py||p||(1cos(||p||)2py)||p||4] y el tercer elemento de la primera fila como Rs1pz=pz(1(p2y+p2z)(1cos(||p||))||p||2)=[2pz1cos(||p||)||p||2+(p2yp2z)sin(||p||)pz||p||(1cos(||p||)2pz)||p||4]

Ya es un Muchas gracias por haber leído hasta aquí ;-)

Mi pregunta: ¿Es la derivación de estos 3 primeros elementos de JR ¿Matemáticamente correcto? Si he hecho algo mal, ¿podríais detectar el error o los errores y ayudarme a corregirlos?

Cuando lo tenga todo claro, publicaré la matriz jacobiana completa como respuesta a esta pregunta. Para que cualquiera que se enfrente al mismo problema pueda volver a comprobar sus propios resultados...

La razón por la que necesito este jacobiano:

La postura p de una imagen en la aplicación mencionada anteriormente puede describirse mediante un eje de rotación unitario y un ángulo (en radianes). Alternativamente, el eje unitario puede ser escalado de acuerdo con el ángulo de rotación, que es lo que estoy utilizando. Para hacer el mapeo exponencial de R3 a SO(3) utilizo la fórmula de Rodrigues (que es el método estándar, creo).

El algoritmo se "desliza" por el gradiente de una función de error, que se rige por la pose p es decir E(p)=i(I1(x(xi;p))I0(xi))2 donde x() es la función que mapea los píxeles de un espacio de imagen al otro espacio de imagen con respecto a la pose actual p .

Para calcular el gradiente de E(p) Tendré que calcular el gradiente de las matrices de rotación, lo que me lleva a mi verdadero problema.

0 votos

Tienes razón, usar esos cuatro parámetros no tiene sentido. ¿Por qué es θωx=ωxθ ? Por la forma en que los presentaste, ωx es un componente del vector unitario ω que es independiente de θ . Parece que te has confundido θ con un ángulo en una representación de coordenadas esféricas de ω ? Creo que querrás tomar derivadas parciales con respecto a los componentes de p pero para decir más sería bueno saber lo que estás haciendo realmente - ¿para qué necesitas el jacobiano?

0 votos

Utilizo un modelo de movimiento puramente rotacional para alinear un par de imágenes. Los parámetros de pose, es decir, el eje y el ángulo de rotación, se actualizan en función del gradiente de una función de error que mide ese solapamiento correcto entre las dos imágenes. En ese gradiente me encuentro con el gradiente de las matrices de rotación. Para eso lo necesito.

18voto

steve Puntos 11

No creo que necesites el jacobiano general pexp(ˆp) pero sólo el jacobiano mucho más simple pexp(ˆp)|p=0 con p estar en la identidad.

Antecedentes

El grupo de rotaciones 3d (SO3) es un grupo matricial de mentira. Por lo tanto, en general tenemos la exponencial matricial:

exp(M):=k01k!Mk

que mapea un elemento del álgebra de Lie matricial en el conjunto de los elemetos del grupo de Lie matricial. Además, tenemos una función ˆ:RnRm×m,ˆa=nk=0aiGi que mapea un n -en el conjunto de elementos del álgebra de Lie matricial (=matrices). Así, para SO3 los generadores son: G1=[000001010],G2=[001000100],G3=[010100000]

Derivada en la identidad

Para los grupos matriciales de Lie, se puede demostrar que akexp(ˆa)|a=0=Gk.

Así, para el SO3 pexp(ˆp)|p=0=[G1G2G3] recibimos un 3 d vector de filas de 3×3 matrices, por lo que a 3×3×3 tensor jacobiano. (Como alternativa, se podrían apilar las columnas de Gi en un vector 9 y se recibiría un 9×3 matriz jacobiana).

Antecedentes: Optimización por mínimos cuadrados

Supongamos que queremos minimizar la función F:RnR con respecto a un vector euclidiano x . Además, supongamos que tenemos un problema de mínimos cuadrados con

F=f(x)f(x)

Siguiendo a Gauss-Newton resolvemos repetidamente una actualización δ fx(m)fx(m)δ=fx(m)f(x(m)) y actualizar nuestra estimación x(m+1)=δ+x(m)

Optimización por mínimos cuadrados en grupos matriciales de Lie

Este esquema sólo es válido para los espacios vectoriales euclidianos y es necesario adaptarlo para los grupos matriciales de Lie. Especialmente, calculamos la derivada en el espacio tangente alrededor de la identidad:

J:=f(exp(ˆp)R(m))p|p=0 (Se puede calcular a partir de los generadores y utilizando la regla de la cadena).

Entonces resolvemos para δ :

JJδ=Jf(R(m))

Por último, adaptamos la regla de actualización: R(m+1)=exp(ˆδ)R(m).

0 votos

Muchas gracias por su detallada y clara respuesta. Sólo hay dos cosas que me hacen dudar: (1) ¿por qué el gradiente más simple es suficiente para una actualización de movimiento? ¿Cuál es la intuición detrás de ella? (2) mi enfoque, aunque más complicado y computacionalmente más costoso, no está mal, ¿verdad?

1 votos

(2) Creo que tu planteamiento está bien (aunque no he comprobado tus jacobianos en detalle). Dudo que tu enfoque alcance la misma tasa de convergencia, ya que estás utilizando una actualización aditiva en las rotaciones (eje-ángulo) que supongo que no es 100% correcta para actualizaciones más grandes: exp(a+b)exp(a)exp(b) .

1 votos

(1) Este es el milagro de los colectores: Ser localmente euclidianos. Básicamente es como la función seno que puede ser aproximada por una línea con pendiente 1 para x cerca de la identidad: sin(x)x|x=0=1

2voto

gregsdennis Puntos 118

El enfoque de la optimización por mínimos cuadrados en los grupos matriciales de Lie también se explica en un informe técnico sobre Minimización en el grupo de Lie SO(3) y en las variedades relacionadas .

0 votos

Hay una duda: Para optimizar una función objetivo O(R(m)) : O(R(m+1))O(R(m))+gδ+δHδ El gradiente g y Hessian H se calculan en el punto correspondiente a R(m) que es inicialmente p=0 . Mi pregunta es que en cuanto actualicemos R(m) , corresponde por más tiempo a p=0 . Por lo tanto, tenemos que calcular el gradiente y el hessiano en diferentes p es decir p(m+1)=δ+p(m)

1 votos

Sé que esto es viejo, pero sólo para aclararlo: El sentido del informe es que el gradiente y el hessiano se calculan en función de las coordenadas locales, es decir, se eligen las coordenadas para que la matriz del paso anterior esté en el origen. ¡Gracias por la interesante lectura! El informe utiliza las mismas técnicas que la excelente respuesta de Hauke Strasdat.

0 votos

El informe utiliza R(w)=R0exp(δ) mientras que @Hauke utiliza la multiplicación por la izquierda. ¿Por qué?

2voto

eliasm Puntos 21

Un trabajo reciente de Guillermo Gallego y Anthony Yezzi sugiere una fórmula compacta para derivar la matriz de rotación en las coordenadas del mapa exponencial: http://arxiv.org/pdf/1312.0788v1.pdf

La fórmula (III.7) de la página 5 es lo que estabas buscando.

0 votos

Es difícil relacionar esta pregunta con esta fórmula en el papel.

1voto

Jakob Gade Puntos 6006
  1. pregunta: No es una respuesta completa, pero ¿no debería derivar para p y no ω ? Pero tal vez pueda hacer la derivada para ω como paso previo, y luego derivar esto para p

  2. pregunta: El jacobiano no es un 9×4 porque los 4 valores de una representación de 4 componentes no son independientes entre sí. O bien se toma un eje arbitrario con un ángulo - esto no sería único - o bien se toma un vector unitario con un ángulo - entonces los vectores-componentes no pueden ser elegidos libremente, ya que tienen que cumplir x2+y2+z2=1 . Así que sólo se necesitan 3 parámetros independientes para representar una rotación. Por lo tanto, el jacobiano es 9×3 y no 9×4 .

0 votos

Sí, tienes razón. Debería derivarse para p no ω . Y gracias también por la aclaración en el segundo trimestre.

0 votos

He editado y reformulado mi pregunta. ¿Le importaría echarle un segundo vistazo?

1voto

soliton Puntos 742

En este punto estoy bastante seguro de haber computado los tres primeros elementos de JR correctamente. Así que puedo seguir calculando los elementos restantes de la matriz.

Una forma de confirmar que el gradiente analítico es correcto, es mirar el gradiente numérico y luego comparar los valores entre ambos. Para ello, puede comprobar la función gradient() en Matlab u Octave.

El script que escribí es algo así:

S=1.
[x,y,z]=meshgrid(-2*pi:S:2*pi);
v=f(x,y,z); % this function is the one at element R(0,0)
[dx,dy,dz]=df(x,y,z) % these are the three partial gradients above
[ndx,ndy,ndz]=gradient(v,S)
figure
hold on;
quiver3(x,y,z,ndx,ndy,ndz, 'color','red','LineWidth',1);
quiver3(x,y,z,dx,dy,dz, 'color','green','LineWidth',1);
hold off;
legend('numeric gradient','analytic gradient');

Si todas las flechas tienen aproximadamente la misma orientación y longitud, es un buen indicador de que los gradientes parciales derivados son correctos.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X