PSINS toolbox learning (2) Concepto y conversión de matriz de actitud, cuaternión, ángulo de Euler, vector de rotación equivalente

Directorio de artículos


La actitud del portaaviones se refiere a la relación de orientación entre el sistema de coordenadas del portaaviones y el sistema de coordenadas de navegación , y la relación de orientación directa entre los dos sistemas de coordenadas puede ser equivalente al problema de rotación de punto fijo de cuerpo rígido en mecánica . En la teoría de rotación de punto fijo de cuerpos rígidos, los métodos tradicionales para describir la relación de orientación del sistema de coordenadas en movimiento en relación con el sistema de coordenadas de referencia incluyen el método del ángulo de Euler, el método del coseno director y el método del cuaternión . Tanto el método del coseno director tradicional como el método del cuaternión suponen que el cuerpo se mueve con un eje fijo y, en este caso, no hay error de no conmutabilidad . Sin embargo, en el sistema de navegación inercial strapdown, el dispositivo inercial se instala directamente en el cuerpo y sigue el movimiento del cuerpo, por lo que no es adecuado para el entorno real suponer que el movimiento del cuerpo es un eje fijo. para entornos muy dinámicos, existe una solución de actitud de mayor precisión Método de cálculo: método del vector de rotación equivalente .

Dado que el sistema de navegación inercial strapdown adopta la plataforma matemática establecida por el cálculo de la matriz de actitud, en el algoritmo de actualización de la actitud, velocidad y posición del sistema de navegación inercial strapdown, el algoritmo de actitud tiene la mayor influencia en la precisión del conjunto. sistema, y ​​es el punto clave de la investigación y el diseño del algoritmo .

Objetivo de la solución de actitud: conocer los parámetros de actitud iniciales y generar los parámetros de actitud en tiempo real de acuerdo con la medición del giroscopio :

inserte la descripción de la imagen aquí

1. Conceptos básicos

1. Definición de sistema de coordenadas

El sistema de coordenadas de navegación inercial se puede dividir en cuatro categorías según la posición y el eje del origen:

1. Sistema de coordenadas inercial (sistema i)

También conocido como ECI, el origen está en el centro de masa de la tierra y el eje de coordenadas no gira con la tierra (el eje Z apunta al Polo Norte y el eje X apunta al equinoccio vernal). La salida del sensor de inercia se basa en esto. A pesar de verse afectado por el campo gravitatorio del sol, existe 6 ∗ 1 0 − 7 g 6*10^{-7}g61 07 gde fuerza centrípeta orbital; sin embargo, cuando la tierra se usa como referencia de navegación inercial en la superficie de la tierra, el portador en movimiento y la tierra están aproximadamente en el mismo campo gravitatorio solar, y su influencia puede ignorarse.

2. Sistema de coordenadas fijo en la Tierra centrado en la Tierra (sistema e)

También conocido como ECEF, el origen está en el centro de masa del mapa y el eje de coordenadas gira con la tierra (el eje Z apunta al polo norte y el eje X apunta a la intersección del ecuador y el meridiano principal). ). Este sistema de coordenadas es el más utilizado por los sistemas GNSS. El movimiento angular de ECEF relativo a ECI es la tasa angular de rotación de la tierra ω ie \omega_{ie}Vayayo _

3. Sistema de coordenadas de navegación (sistema n)

También conocido como sistema local de coordenadas horizontales, el origen está en la portadora y el eje de coordenadas no cambia con la portadora . Hay dos descripciones: North East Earth (NED) y North East Heaven (ENU). Es el sistema de coordenadas utilizado por la navegación inercial para resolver los parámetros.El cálculo de la navegación inercial se preocupa especialmente por la aceleración de la gravedad, que se puede mostrar en este sistema de coordenadas.

4. Sistema de coordenadas de transporte (sistema b)

El origen está en la portadora y el eje de coordenadas cambia con la portadora . En comparación con el sistema de coordenadas de navegación, también hay dos descripciones: frontal inferior derecha (FRD) y frontal superior derecha (RFU). Hay muchas series b en un sistema de navegación: serie b de IMU, serie b de soporte, serie b de cámara, etc. La relación de acimut entre el sistema b y el sistema i se puede describir mediante un conjunto de ángulos de Euler.

En PSINS: sistema de coordenadas de navegación (n): este E-norte N-día U, sistema de coordenadas del vehículo (b): derecha R-frente F-arriba U

inserte la descripción de la imagen aquí

2. Matriz antisimétrica

( V × ) = [ 0 − V z V y V z 0 − V x − V y V x 0 ] (\boldsymbol{V} \times)=\left[\begin{array}{ccc} 0 & -V_ {z} & V_{y} \\ V_{z} & 0 & -V_{x} \\ -V_{y} & V_{x} & 0 \end{matriz}\right]( V × )= 0VzVtuVz0VxVtuVx0

puntos de antisimetría

  1. Ambos son 0 en la diagonal, y las partes superior e inferior son simétricas y opuestas, es decir: ( V × ) = − ( V × ) T (V \times)=-(V\times)^{T}( V × )=( V × )T , por lo que se llama matriz antisimétrica.

  2. El producto cruzado de un vector por otro vector es igual al producto puntual de la matriz antisimétrica de otro vector, y el producto cruzado se convierte en producto puntual .

  3. 反对称阵的幂方通式:
    ( V × ) yo = { ( − 1 ) ( yo − 1 ) / 2 vi − 1 ( V × ) yo = 1 , 3 , 5 , ⋯ ( − 1 ) ( yo − 2 ) / 2 vi − 2 ( V × ) 2 yo = 2 , 4 , 6 , ⋯ (\boldsymbol{V} \times)^{i}=\left\{\begin{array}{ll} (-1 )^{(i-1) / 2} v^{i-1}(\boldsymbol{V} \times) & i=1,3,5, \cdots \\ (-1)^{(i-2 ) / 2} v^{i-2}(\boldsymbol{V} \times)^{2} & i=2,4,6, \cdots \end{array}\right.( V × )i={ ( -1 ) _( yo 1 ) / 2vyo 1 (V×)( -1 ) _( yo 2 ) / 2vyo 2 (V×)2i=1 ,3 ,5 ,i=2 ,4 ,6 ,

3. Ángulo de Euler

A = [ θ γ ψ ] T \símbolo de bola{A}=\left[\begin{array}{lll}\theta & \gamma & \psi\end{array}\right]^{\mathrm{T}} ;A=[iCpag]T

El ángulo de Euler es un método clásico para describir la actitud relativa entre dos sistemas de coordenadas por el ángulo transformado alrededor del eje de coordenadas El significado físico es intuitivo y fácil de entender, especialmente para describir el movimiento del sistema de coordenadas del portador en relación con la coordenada de navegación local sistema _

Los ángulos de Euler representan la rotación : en el espacio tridimensional, la relación de orientación de un sistema de coordenadas rectangulares en relación con otro sistema de coordenadas rectangulares puede describirse mediante tres rotaciones secuenciales , y el eje de coordenadas alrededor de cada rotación es ortogonal a los ejes de rotación frontal y posterior. Euler demostró que la relación de orientación relativa entre dos sistemas de coordenadas ortogonales cualquiera puede describirse mediante un conjunto de ángulos no menor de 3, y los ángulos de rotación de estas tres rotaciones se denominan conjunto de ángulos de Euler (grupo de ángulos de Euler ) .

inserte la descripción de la imagen aquí

Los ángulos de Euler representan la actitud : para describir la actitud del portador, puede especificar un sistema de coordenadas de referencia y luego usar un conjunto de ángulos de Euler para describir la rotación del sistema de coordenadas que está conectado al portador y el sólido en relación con el sistema de coordenadas de referencia. En las aplicaciones de navegación cerca de la Tierra, el sistema de coordenadas de referencia generalmente selecciona el sistema de coordenadas geográficas local por defecto, mientras que el sistema de coordenadas en movimiento es un sistema de coordenadas conectado de forma fija al vehículo.

inserte la descripción de la imagen aquí

  • Ángulo de curso : El ángulo incluido entre la proyección del eje longitudinal positivo de la portadora en el plano horizontal local y la dirección del norte geográfico local. A menudo se toma como positivo de norte a este, generalmente representado por ψ, y el rango del ángulo es 0 ∼ 360◦ o −180◦ ∼ +180◦ .
  • Ángulo de cabeceo : el ángulo entre la dirección positiva del eje longitudinal del portador y su línea de proyección horizontal, se define como positivo cuando el portador "levanta la cabeza", generalmente representado por θ, y su valor oscila entre −90◦ y 90◦.
  • Ángulo de balanceo : el ángulo entre la dirección positiva del eje vertical del portaaviones y el plano vertical donde se encuentra el eje longitudinal del portaaviones.Cuando el portaaviones se inclina hacia la derecha (como cuando se presiona hacia abajo el ala derecha del avión) , es positivo Use ϕ \ phiϕ indica que el rango de valores es −180◦ ∼ +180◦.

Fundamentos de los ángulos de Euler

  1. La relación de orientación relativa entre dos sistemas de coordenadas ortogonales se puede describir mediante un conjunto de ángulos de Euler, dado un conjunto de ángulos de Euler, la secuencia de ejes de rotación correspondiente debe especificarse al mismo tiempo. PSINS usa el cielo del noreste, 312 ángulos de Euler
  2. El ángulo de actitud de navegación, incluido el ángulo de rumbo, el ángulo de cabeceo y el ángulo de balanceo, está estrechamente relacionado con el eje físico del vehículo y no tiene nada que ver con el sistema de coordenadas matemáticas seleccionado del vehículo.
  3. Cuando el ángulo de inclinación es ± 9 0 ∘ \pm 90^{\circ}± 9 0Cuando ∘ , hay un valor singular en la transformación del ángulo de Euler, y el ángulo de balanceo y el ángulo de rumbo no se pueden distinguir en este momento. Por lo tanto, el método del ángulo de Euler no se puede utilizar para aplicaciones de navegación de actitud completa.
  4. Los conjuntos de ángulos de Euler no se pueden sumar directamente para representar la composición de dos rotaciones.

4. Matriz de rotación/matriz de coseno director

C = [ cxxcxycxzcyxcyycyzczx czyczz ] \boldsymbol{C}=\left[\begin{array}{lll}c_{xx} & c_{xy} & c_{xz} \\ c_{yx} & c_{yy} & c_ {yz} \\ c_{zx} & c_{zy} & c_{zz}\end{matriz}\right]C= CxxCy xCz xCx yCyyCzyCx zCyzCzz

La matriz de coseno director (Direction Cosine Matrix, DCM) es una matriz de actitud representada por el coseno director del vector, que a menudo se usa para describir la actitud relativa de dos sistemas de coordenadas. En comparación con los ángulos de Euler, la matriz de coseno director es mucho más abstracta, pero es muy conveniente para manejar la transformación de proyección de vectores .

Sabemos que los tres valores de proyección del vector en el espacio son las coordenadas, y el mismo vector está en iii serie ybbEl sistema b tiene dos conjuntos de coordenadas, y su relación se puede expresar como:
V = V xiii + V yiji + V ziki = V xbib + V ybjb + V zbkb \boldsymbol{V}=V_{x}^{i} \boldsymbol{ i}_{i}+V_{y}^{i} \boldsymbol{j}_{i}+V_{z}^{i} \boldsymbol{k}_{i}=V_{x} ^{b} \boldsymbol{i}_{b}+V_{y}^{b} \boldsymbol{j}_{b}+V_{z}^{b} \boldsymbol{k}_{b}V=VXyoiyo+Vyyojyo+Vzyokyo=VXsegundoisegundo+Vysegundojsegundo+Vzsegundoksegundo
[ iijiki ] [ V xi V yi V zi ] = [ ibjbkb ] [ V xb V yb V zb ] = [ iijiki ] PAGS [ V xb V yb V zb ] \left[\begin{array}{lll}\boldsymbol {i}_{i} & \boldsymbol{j}_{i} & \boldsymbol{k}_{i}\end{matriz}\right]\left[\begin{matriz}{c}V_{x} ^{i} \\ V_{y}^{i} \\ V_{z}^{i}\end{matriz}\right]=\left[\begin{matriz}{lll}\boldsymbol{i}_ {b} & \boldsymbol{j}_{b} & \boldsymbol{k}_{b}\end{matriz}\right]\left[\begin{matriz}{c}V_{x}^{b} \\ V_{y}^{b} \\ V_{z}^{b}\end{matriz}\right]=\left[\begin{matriz}{lll}\boldsymbol{i}_{i} & \boldsymbol{j}_{i} & \boldsymbol{k}_{i}\end{array}\right] \boldsymbol{P}\left[\begin{array}{c}V_{x}^{b } \\ V_{y}^{b} \\ V_{z}^{b}\end{matriz}\right][iyojyokyo] VXyoVyyoVzyo =[isegundojsegundoksegundo] VXsegundoVysegundoVzsegundo =[iyojyokyo]PAG VXsegundoVysegundoVzsegundo

有:
[ V xi V yi V zi ] = P [ V xb V yb V zb ] \left[\begin{array}{c}V_{x}^{i} \\ V_{y}^{i} \ \ V_{z}^{i}\end{matriz}\right]=\boldsymbol{P}\left[\begin{matriz}{c}V_{x}^{b} \\ V_{y}^{ b} \\ V_{z}^{b}\end{matriz}\right] VXyoVyyoVzyo =PAG VXsegundoVysegundoVzsegundo
记为V i = PV b = C bi V b \boldsymbol{V}^{i}=\boldsymbol{P} \boldsymbol{V}^{b}=\boldsymbol{C}_{b}^{i} \boldsymbol{V}^{b}Vi=PV _b=CbyoVbC bi C_b^iCbyoSe llama matriz de transformación del sistema de coordenadas (i->b) o matriz de transformación de coordenadas (b->i), también conocida como matriz de coseno director y matriz de transición .

Aspectos básicos de la matriz de coseno de dirección

  1. Dado que todos son matrices de unidades, cada elemento en la matriz de coseno de dirección representa el valor del coseno del ángulo entre los ejes de coordenadas de los dos conjuntos de sistemas de coordenadas, de ahí el nombre.
  2. Distinga entre la matriz de transformación del sistema de coordenadas y la matriz de transformación de coordenadas .
  3. Aunque la matriz del coseno director tiene 9 parámetros, contiene 6 restricciones, es decir, el módulo del vector fila es 1 y cada par es ortogonal, y solo 3 parámetros son independientes.
  4. 方向余弦矩阵是正交矩阵, ( C α β ) − 1 = ( C α β ) T \left(\mathbf{C}_{\alpha}^{\beta}\right)^{-1}=\left(\mathbf{C}_{\alpha}^{\beta}\right)^{\mathrm{T}} (Cαβ)1=(Cαβ)T多次连续转动可以用相应的多个方向余弦矩阵连乘来表示: C a d = C b d C a b \mathbf{C}_{a}^{d}=\mathbf{C}_{b}^{d} \mathbf{C}_{a}^{b} Cad=CbdCab
  5. 当载体运动时,两个坐标系之间的相对姿态随时间变化,对应的方向余弦矩阵 C b R ( t ) \mathbf{C}_{b}^{R}(t) CbR(t) 则是 一个时变矩阵, 其微分方程为 C ˙ b R = C b R ( ω R b b × ) \dot{\mathrm{C}}_{b}^{R}=\mathbf{C}_{b}^{R}\left(\boldsymbol{\omega}_{R b}^{b} \times\right) C˙bR=CbR(ωRbb× )
  6. El método de iteración de Picard se puede utilizar para resolver la ecuación diferencial de la matriz del coseno director, y se obtiene una serie representada por una integral repetida infinitamente, que también se denomina serie de Picard. La serie anterior es cerrada, pero solo en el " fijo rotación del eje " Solo en un caso especial se puede obtener la solución cerrada de la siguiente forma: C b R ( t ) = C ( 0 ) exp ⁡ ( ∫ 0 t Ω ( τ ) d τ ) \mathbf{C}_{ b}^{R}( t)=\mathbf{C}(0) \exp \left(\int_{0}^{t} \boldsymbol{\Omega}(\tau) d \tau\right)CbR( t )=do ( 0 )Exp( 0tΩ (τ)reτ ) .
  7. 姿态手机公式:C segundo ( k ) yo = C segundo ( k − 1 ) yo C segundo ( k ) segundo ( k − 1 ) \mathbf{C}_{b(k)}^{i}=\mathbf{ C}_{b(k-1)}^{i} \mathbf{C}_{b(k)}^{b(k-1)}Cb ( k )yo=Csegundo ( k - 1 )yoCb ( k )segundo ( k 1 ), C segundo ( k ) segundo ( k - 1 ) = yo + pecado ⁡ Δ θ k Δ θ k [ Δ θ k × ] + 1 - porque ⁡ Δ θ k Δ θ k 2 [ Δ θ k × ] 2 \mathbf {C}_{b(k)}^{b(k-1)}=\mathbf{I}+\frac{\sin \Delta \theta_{k}}{\Delta \theta_{k}}\left [\Delta \símbolo de bola{\theta}_{k}\times\right]+\frac{1-\cos \Delta\theta_{k}}{\Delta\theta_{k}^{2}}\left [ \Delta\ballsymbol{\theta}_{k}\times\right]^{2}Cb ( k )segundo ( k 1 )=I+yo _kpecado _ _yo _k[ D yok× ]+yo _k21 - co s _yo _k[ D yok× ]2
  8. Para aplicaciones comunes de navegación inercial, bbLa suposición de rotación de eje fijo del sistema b generalmente no es válidaCuando esta condición no se cumple, el incremento de ángulo generado por el giróscopo todavía se aplica a la fórmula para el cálculo recursivo de la actualización de actitud, lo que conducirá a unaProblema irreversible en la solución de actualización de actitud Error sexual,el vector de rotación equivalente se puede utilizar para resolver este problema.

5. Cuaterniones

Q = q 0 + q 1 i + q 2 j + q 3 k = q 0 + qv \boldsymbol{Q}=q_{0}+q_{1} \boldsymbol{i}+q_{2} \boldsymbol{j }+q_{3} \boldsymbol{k}=q_{0}+\boldsymbol{q}_{v}q=q0+q1i+q2j+q3k=q0+qv

Sabemos que los números complejos se pueden considerar como vectores en el plano complejo, es decir, un vector bidimensional, ampliando el concepto de números complejos, se pueden obtener cuaterniones para describir vectores en el espacio tridimensional.

Esenciales del cuaternión

  1. Los cuaterniones tienen principalmente las siguientes representaciones: q = q 0 + q 1 i + q 2 j + q 3 k \boldsymbol{q}=q_{0}+q_{1} \boldsymbol{i}+q_{2} \boldsymbol {j}+q_{3} \boldsymbol{k}q=q0+q1i+q2j+q3k , forma de coordenadas vectorialesq = [ q 0 , q 1 , q 2 , q 3 ] T \boldsymbol{q}=\left[q_{0}, q_{1}, q_{2}, q_{3}\ derecha]^{\mathrm{T}}q=[ q0,q1,q2,q3]Tq = qs + qv \boldsymbol{q}=q_{s}+\boldsymbol{q}_{v}q=qs+qvO la forma trigonométrica q = cos ⁡ θ 2 + u sin ⁡ θ 2 \boldsymbol{q}=\cos \frac{\theta}{2}+\boldsymbol{u} \sin \frac{\theta}{2}q=porque2i+tupecado2i(Está relacionado con el vector de rotación equivalente, normalizado, y el módulo es uno)

  2. La multiplicación entre unidades imaginarias de cuaternión tiene las siguientes características: cuando la unidad se multiplica por sí misma, el rendimiento es el mismo que el de los números complejos, y la multiplicación entre dos pares es igual al producto exterior (producto cruzado) de tres -vectores dimensionales.
    { yo ∘ yo = j ∘ j = k ∘ k = − 1 yo ∘ j = k , j ∘ k = yo , k ∘ yo = j , j ∘ yo = − k , k ∘ j = − yo , yo ∘ k = − j \left\{\begin{array}{l}\boldsymbol{i} \circ \boldsymbol{i}=\boldsymbol{j} \circ \boldsymbol{j}=\boldsymbol{k} \circ \boldsymbol {k}=-1 \\ \boldsymbol{i} \circ \boldsymbol{j}=\boldsymbol{k}, \quad \boldsymbol{j} \circ \boldsymbol{k}=\boldsymbol{i}, \quad \boldsymbol{k} \circ \boldsymbol{i}=\boldsymbol{j}, \quad \boldsymbol{j} \circ \boldsymbol{i}=-k, \quad k \circ \boldsymbol{j}=-i , \quad \boldsymbol{i} \circ \boldsymbol{k}=-\boldsymbol{j}\end{array}\right.{ ii=jj=kk=1ij=k ,jk=yo ,ki=j ,ji=-k , _kj=- yo ,ik= j

  3. La transformación de coordenadas del vector tridimensional se puede realizar utilizando el operador de transformación de rotación del cuaternión: v R = qb R ∘ vb ∘ qb R ∗ \boldsymbol{v}^{R}=\boldsymbol{q}_{ b}^{R} \circ \boldsymbol{v}^{b} \circ \boldsymbol{q}_{b}^{R^{*}}vR=qbRvbqbR

  4. Unidad de notación trigonométrica de cuaterniones : Q = q 0 + qv = cos ⁡ ϕ 2 + u sin ⁡ ϕ 2 \boldsymbol{Q}=q_{0}+\boldsymbol{q}_{v}=\cos \frac {\phi {2}+\boldsymbol{u} \sin \frac{\phi}{2}q=q0+qv=porque2ϕ+tupecado2ϕtiene un claro significado físico. A menudo agrega un subíndice a la derecha del cuaternión, escrito como Q bi \boldsymbol{Q}_{b}^{i}qbyo,中u \boldsymbol{u}u representa el sistema de coordenadas en movimiento (bbb ) relativo al sistema de coordenadas de referencia (iii system) el eje unitario de rotación,ϕ \phiϕ indica el tamaño del ángulo de rotación,ϕ u \phi \boldsymbol{u}ϕ u representa el vector de rotación equivalente. Después de usar subíndices, el cuaternión conjugado se puede escribir comoQ ib = ( Q bi ) ∗ \boldsymbol{Q}_{i}^{b}=\left(\boldsymbol{Q}_{b}^{i }\ derecha)^{*}qisegundo=( Qbyo) , que es similar a la representación de la transposición de matrices, comoC ib = ( C bi ) T \boldsymbol{C}_{i}^{b}=\left(\boldsymbol{C}_{b}^{ yo }\right)^{\mathrm{T}}Cisegundo=( Cbyo)T. _

  5. Ecuación diferencial para cuaterniones: q ˙ b R = 1 2 qb R ∘ [ 0 ω R bb ] \dot{\boldsymbol{q}}_{b}^{R}=\frac{1}{2} \ boldsymbol{ q}_{b}^{R} \circ\left[\begin{array}{c}0 \\ \boldsymbol{\omega}_{R b}^{b}\end{array}\right ]q˙bR=21qbR[0VayaRb _segundo] , o en forma de matriz:q ˙ b R = 1 2 W qb R \dot{\boldsymbol{q}}_{b}^{R}=\frac{1}{2} \mathbf{W} \boldsymbol {q}_{b}^{R}q˙bR=21W qbR. Así, se establece la relación entre el cuaternión y la velocidad angular de rotación.

  6. Resolver ecuaciones diferenciales para cuaterniones, cuando bbCuando el sistema b satisface la condición de "rotación de eje fijo", se puede obtener la solución analítica:qb R ( t ) = \boldsymbol{q}_{b}^{R}(t)=qbR( t )= [ yo porque ⁡ Δ θ 2 + Θ Δ θ pecado ⁡ Δ θ 2 ] qb R ( 0 ) \left[\mathbf{I} \cos \frac{\Delta \theta}{2}+\frac{\Theta }{\Delta\theta}\sin\frac{\Delta\theta}{2}\right] \bold symbol{q}_{b}^{R}(0)[ yoporque2yo _+yo _elpecado2yo _]qbR( 0 )

  7. También hay octoniones, que se utilizan para describir el movimiento en espiral, el movimiento de alambre y el movimiento angular.

6. Vector de rotación equivalente

Euler propuso por primera vez el concepto de vector de rotación equivalente al estudiar el movimiento de los cuerpos rígidos. Señaló que cualquier rotación finita de punto fijo de un cuerpo rígido puede realizarse de manera equivalente mediante una rotación alrededor de un eje que pasa por el punto fijo . Y se establece la fórmula de transformación del vector unitario sobre el cuerpo rígido antes y después de la rotación. La clave para la investigación del moderno algoritmo de actualización de actitud de navegación inercial strapdown es cómo utilizar el valor medido del giroscopio para construir el vector de rotación equivalente correspondiente , a fin de minimizar o eliminar el error no intercambiable en el algoritmo de actualización de actitud . El uso subsiguiente del vector de rotación equivalente para calcular el cambio de actitud, tal como se expresa mediante una matriz de coseno director o un cuaternión, será muy simple.

Use los valores de muestreo de varios incrementos angulares para calcular un vector de rotación equivalente de acuerdo con varios algoritmos de muestra y luego use el vector de rotación equivalente calculado para actualizar la matriz de coseno de dirección y el cuaternión.

inserte la descripción de la imagen aquí

vector espacial rrr Vector de eje de rotaciónuurotas ϕ\phiϕ , el vector r ′ r^{'}obtenido por rotaciónr' . Las cuatro cantidades deben tener directamente una relación funcionalr ′ = f ( r , u , ϕ ) r^{'}=f(r,u,\phi)r=f ( r ,tu ,ϕ ),利用一些几何关系,可以推导得到:
r ′ = ( u ⋅ r ) u + ( u × r ) × u ​​cos ⁡ ϕ + u × r pecado ⁡ ϕ = [ yo + ( u × ) 2 ] r − ( tu × ) 2 r porque ⁡ ϕ + tu × r pecado ⁡ ϕ = [ yo + pecado ⁡ ϕ ( tu × ) + ( 1 − porque ⁡ ϕ ) ( tu × ) 2 ] r = re r \begin{alineado } \boldsymbol{r}^{\prime} & =(\boldsymbol{u} \cdot \boldsymbol{r}) \boldsymbol{u}+(\boldsymbol{u} \times \boldsymbol{r}) \times \ boldsymbol{u} \cos \phi+\boldsymbol{u} \times \boldsymbol{r} \sin \phi \\ & =\left[\boldsymbol{I}+(\boldsymbol{u} \times)^{2} \right] \boldsymbol{r}-(\boldsymbol{u} \times)^{2} \boldsymbol{r} \cos \phi+\boldsymbol{u} \times \boldsymbol{r} \sin \phi \\ & =\left[\boldsymbol{I}+\sin \phi(\boldsymbol{u} \times)+(1-\cos \phi)(\boldsymbol{u} \times)^{2}\right] \boldsymbol {r}=\boldsymbol{D} \boldsymbol{r}\end{alineado}r=( tur ) tu+( tu×r )×tuporqueϕ+tu×rpecadoϕ=[ yo+( tu × )2 ]r( tu × )2r _porqueϕ+tu×rpecadoϕ=[ yo+pecadoϕ ( tu × )+( 1porqueϕ ) ( tu × )2 ]r=dr _
可记D = yo + pecado ⁡ ϕ ( tu × ) + ( 1 − cos ⁡ ϕ ) ( tu × ) 2 \bold símbolo{D}=\bold símbolo{I}+\sin \phi(\bold símbolo{u } \times )+(1-\cos \phi)(\símbolo en negrita{u}\times)^{2}D=I+pecadoϕ ( tu × )+( 1porqueϕ ) ( tu × )2 , esta fórmula se llamafórmula de rotación de Rodrigue;r ′ r'r' ir arrLa matriz multiplicada por r se denomina matriz de rotación de Rodriguey el eje de rotaciónuuu y ángulo de rotaciónϕ \phiϕ está relacionado.

Aplicando la fórmula de rotación de Rodrigue al eje de coordenadas unitarias del sistema de coordenadas cartesianas, el sistema de coordenadas de referencia se puede transferir al sistema de coordenadas en movimiento: ib =
D iijb = D jikb = D ki } \left.\begin{array}{c} \ boldsymbol{i}_{b}=\boldsymbol{D} \boldsymbol{i}_{i} \\ \boldsymbol{j}_{b}=\boldsymbol{D} \boldsymbol{j}_{i} \ \ \boldsymbol{k}_{b}=\boldsymbol{D} \boldsymbol{k}_{i}\end{matriz}\right\}isegundo=Di _yojsegundo=DJ _yoksegundo=re kyo

{ Relación de transformación de rotación base: [ ibjbkb ] = D [ iijiki ] Relación de transformación de proyección base: [ ibjbkb ] = [ iijiki ] P \left\{\begin{array}{c} Relación de transformación de rotación base: \left[\begin{ array}{lll}\boldsymbol{i}_{b} & \boldsymbol{j}_{b} & \boldsymbol{k}_{b}\end{array}\right]=\boldsymbol{D}\left [\begin{array}{lll}\boldsymbol{i}_{i} & \boldsymbol{j}_{i} & \boldsymbol{k}_{i}\end{array}\right] \\ proyección base Relación de transformación: {\left[\begin{array}{lll}\boldsymbol{i}_{b} & \boldsymbol{j}_{b} & \boldsymbol{k}_{b}\end{array}\ derecha]=\izquierda[\begin{matriz}{lll}\boldsymbol{i}_{i} & \boldsymbol{j}_{i} & \boldsymbol{k}_{i}\end{matriz}\right ] \boldsymbol{P}} \\ \end{matriz}\right.{ Relación de transformación de rotación base:[isegundojsegundoksegundo]=D[iyojyokyo]Relación de transformación de proyección base: [isegundojsegundoksegundo]=[iyojyokyo]pag

在 i 系投影: [ ibijbikbi ] = D [ iiijiikii ] = DI [ ibijbikbi ] = [ iiijiikii ] P = IP } D = P = C bi 在 i 系投影:\left.\begin{array}{l}{\ izquierda[\begin{array}{lll}\boldsymbol{i}_{b}^{i} & \boldsymbol{j}_{b}^{i} & \boldsymbol{k}_{b}^{i }\end{matriz}\right]=\boldsymbol{D}\left[\begin{matriz}{lll}\boldsymbol{i}_{i}^{i} & \boldsymbol{j}_{i}^ {i} & \boldsymbol{k}_{i}^{i}\end{array}\right]=\boldsymbol{D} \boldsymbol{I}} \\ {\left[\begin{array}{lll }\boldsymbol{i}_{b}^{i} & \boldsymbol{j}_{b}^{i} & \boldsymbol{k}_{b}^{i}\end{matriz}\right] =\left[\begin{array}{lll}\boldsymbol{i}_{i}^{i} & \boldsymbol{j}_{i}^{i} & \boldsymbol{k}_{i}^ {i}\end{array}\right] \boldsymbol{P}=\boldsymbol{IP}}\end{array}\right\} \quad \boldsymbol{D}=\boldsymbol{P}=\boldsymbol{C }_{b}^{yo}Proyección en el sistema i :[ibijbikbi]=D[iiijiikii]=DI[ibijbikbi]=[iiijiikii]P=IP}D=P=Cbi

P = D P=D P=D 表明,罗德里格旋转矩阵 D D D 正好是从参考坐标系( i i i 系)到动坐标系( b b b 系)的过渡矩阵,它也是从 b b b 系到 i i i 系的坐标变换矩阵。因此可以将罗德里格旋转公式重新写为方向阵的形式:
C b i = I + sin ⁡ ϕ ( u × ) + ( 1 − cos ⁡ ϕ ) ( u × ) 2 \boldsymbol{C}_{b}^{i}=\boldsymbol{I}+\sin \phi(\boldsymbol{u} \times)+(1-\cos \phi)(\boldsymbol{u} \times)^{2} Cbi=I+sinϕ(u×)+(1cosϕ)(u×)2
进一步, 若记 ϕ = ϕ u \boldsymbol{\phi}=\phi \boldsymbol{u} ϕ=ϕu ϕ = ∣ ϕ ∣ \phi=|\boldsymbol{\phi}| ϕ=ϕ, 则有 u = ϕ / ϕ \boldsymbol{u}=\boldsymbol{\phi} / {\phi} u=ϕ/ϕ ,得:
C b i = I + sin ⁡ ϕ ϕ ( ϕ × ) + 1 − cos ⁡ ϕ ϕ 2 ( ϕ × ) 2 \boldsymbol{C}_{b}^{i}=\boldsymbol{I}+\frac{\sin \phi}{\phi}(\boldsymbol{\phi} \times)+\frac{1-\cos \phi}{\phi^{2}}(\boldsymbol{\phi} \times)^{2} Cbi=I+ϕsinϕ(ϕ×)+ϕ21cosϕ(ϕ×)2
这里 ϕ \boldsymbol{\phi} ϕ 称为等效旋转矢量(RV,简称旋转矢量)

等效旋转矢量要点

  1. 刚体的有限转动是不可交换的。刚体的定点有限旋转都可以用绕经过该固定点的一个轴的一次转动来实现。
  2. 其矢量方向表示旋转的方向,模的大小表示旋转角度大小。
  3. 当载体的角速度方向随时间变化而不是做 “定轴转动” 时, 直接将传感器角增量测量值代入方向余弦矩阵或四元数微分方程的求解计算式中,则会带来 “不可交换性误差”。
  4. Bortz 方程 ϕ ˙ = ω + 1 2 ( ϕ × ω ) + 1 ϕ 2 [ 1 − ϕ sin ⁡ ϕ 2 ( 1 − cos ⁡ ϕ ) ] ϕ × ( ϕ × ω ) \dot{\phi}=\boldsymbol{\omega}+\frac{1}{2}(\phi \times \omega)+\frac{1}{\phi^{2}}\left[1-\frac{\phi \sin \phi}{2(1-\cos \phi)}\right] \boldsymbol{\phi} \times(\boldsymbol{\phi} \times \boldsymbol{\omega}) ϕ˙=ω+21(ϕ×ω)+ϕ21[12(1cosϕ)ϕsinϕ]ϕ×(ϕ×ω) 。是一种常用的等效旋转矢量微分方程,利用等效旋转矢量进行转动不可交换误差补偿。
  5. 等效旋转矢量的双子样求解式: ϕ k = Δ θ k + 1 12 Δ θ k − 1 × Δ θ k \phi_{k}=\Delta \theta_{k}+\frac{1}{12} \Delta \theta_{k-1} \times \Delta \theta_{k} ϕk=Δθk+121Δθk1×Δθk

二、PSINS中的表示转换

1、姿态阵/姿态四元数/欧拉角的表示 Cnb/qnb/att

  • 有角标的符号书写一般遵从规律是从左到右从上到下

  • 姿态阵:Cnb,表示从 b 系到 n 系的坐标变换矩阵。对应姿态四元数写为qnb

  • 欧拉角:att=[俯仰pitch; 横滚roll; 方位yaw]。没有按照转到顺序来写,如果按转动顺序,东北天坐标系转到右前下坐标系,常见先转方位角、然后俯仰角、横滚角

    inserte la descripción de la imagen aquí

2、四元数计算

1. 四元数共轭:qconj

实部不变,虚部取反。

function qo = qconj(qi)
    qo = [qi(1); -qi(2:4)];

性质:

  • 加的共轭等于共轭的加: ( P + Q ) ∗ = P ∗ + Q ∗ (\boldsymbol{P}+Q)^{*}=P^{*}+Q^{*} (P+Q)=P+Q
  • 乘的共轭等于共轭的和: ( P ∘ Q ) ∗ = Q ∗ ∘ P ∗ (\boldsymbol{P} \circ Q)^{*}=Q^{*} \circ P^{*} (PQ)=QP

2. 四元数归一化:qconj

function qnb = qnormlz(qnb)
    qnb = qnb/norm(qnb);

3. Multiplicación de cuaterniones: qmual

{ yo ∘ yo = j ∘ j = k ∘ k = − 1 yo ∘ j = k , j ∘ k = yo , k ∘ yo = j , j ∘ yo = − k , k ∘ j = − yo , yo ∘ k = − j \left\{\begin{array}{l}\boldsymbol{i} \circ \boldsymbol{i}=\boldsymbol{j} \circ \boldsymbol{j}=\boldsymbol{k} \circ \boldsymbol {k}=-1 \\ \boldsymbol{i} \circ \boldsymbol{j}=\boldsymbol{k}, \quad \boldsymbol{j} \circ \boldsymbol{k}=\boldsymbol{i}, \quad \boldsymbol{k} \circ \boldsymbol{i}=\boldsymbol{j}, \quad \boldsymbol{j} \circ \boldsymbol{i}=-k, \quad k \circ \boldsymbol{j}=-i , \quad \boldsymbol{i} \circ \boldsymbol{k}=-\boldsymbol{j}\end{array}\right.{ ii=jj=kk=1ij=k ,jk=yo ,ki=j ,ji=-k , _kj=- yo ,ik= j

El tipo de cambio no se cumple. yo, j, ki, j, kijk 正向相乘等于后面一项,反向相乘要加负号。

inserte la descripción de la imagen aquí

function q = qmul(q1, q2)
    if length(q2)==3, q2=[0; q2]; end  % 0-scale quaternion
    q = [ q1(1) * q2(1) - q1(2) * q2(2) - q1(3) * q2(3) - q1(4) * q2(4);
          q1(1) * q2(2) + q1(2) * q2(1) + q1(3) * q2(4) - q1(4) * q2(3);
          q1(1) * q2(3) + q1(3) * q2(1) + q1(4) * q2(2) - q1(2) * q2(4);
          q1(1) * q2(4) + q1(4) * q2(1) + q1(2) * q2(3) - q1(3) * q2(2) ];

AI解释
这个函数实现了两个四元数的乘法操作。四元数是一种用于表示旋转和仿射变换的数学对象。在这个函数中,q1和q2是两个四元数,函数将它们相乘,并将结果存储在变量q中。

  1. 首先,函数会检查q2的长度是否为3。如果是,它会将q2扩展为长度为4的四元数,其中一个元素被设置为0。这是为了避免在后续计算中出现除以0的情况。
  2. 接下来,函数通过使用四元数的乘法公式来计算结果。四元数的乘法可以通过将两个四元数的各个分量对应相乘,然后将乘积相加得到。
  3. 最后,函数将计算得到的结果存储在变量q中,并返回该变量作为函数输出。

4. 四元数乘向量(三维向量的坐标变换):qmulv

假设一个三维矢量 r r r,在载体坐标系( b b b 系)和参考坐标系( i i i 系)中的投影分别为: r b = [ r x b r y b r z b ] T \boldsymbol{r}^{b}=\left[\begin{array}{lll}r_{x}^{b} & r_{y}^{b} & r_{z}^{b}\end{array}\right]^{\mathrm{T}} rb=[rxbrybrzb]Tri = [ rxiryirzi ] T \boldsymbol{r}^{i}=\left[\begin{array}{lll}r_{x}^{i} & r_{y}^{i} & r_{z }^{i}\end{matriz}\right]^{\mathrm{T}}ri=[rXyoryyorzyo]T , ahora para el vectorrb \boldsymbol{r}^{b}rb (tratado como un cuaternión escalar cero) implementa la siguiente operación de multiplicación de cuaterniones:
Q bi ∘ rb ∘ Q ib = MQ bi ( rb ∘ Q ib ) = MQ bi ( MQ ib ′ [ 0 rb ] ) = MQ bi MQ ib ′ [ 0 rb ] = [ q 0 − q 1 − q 2 − q 3 q 1 q 0 - q 3 q 2 q 2 q 3 q 0 - q 1 q 3 - q 2 q 1 q 0 ] [ q 0 q 1 q 2 q 3 - q 1 q 0 - q 3 q 2 - q 2 q 3 q 0 - q 1 - q 3 - q 2 q 1 q 0 ] [ 0 rxbrybrzb ] = [ 1 0 0 0 0 q 0 2 + q 1 2 - q 2 2 - q 3 2 2 ( q 1 q 2 - q 0 q 3 ) 2 ( q 1 q 3 + q 0 q 2 ) 0 2 ( q 1 q 2 + q 0 q 3 ) q 0 2 - q 1 2 + q 2 2 - q 3 2 2 ( q 2 q 3 - q 0 q 1 ) 0 2 ( q 1 q 3 - q 0 q 2 ) 2 ( q 2 q 3 + q 0 q 1 ) q 0 2 - q 1 2 - q 2 2 + q 3 2 ] [ 0 rxbrybrzb ] \begin{alineado} \boldsymbol{Q}_{b}^{i} \circ \boldsymbol{r}^{b} \circ \boldsymbol{Q}_{i}^{b}= & \boldsymbol{M}_{Q_{b}^{i}}\left(\boldsymbol{r}^{b} \circ \boldsymbol{Q}_{i}^{b}\right)=\boldsymbol{ M}_{Q_{b}^{i}}\left(\boldsymbol{M}_{Q_{i}^{b}}^{\prime}\left[\begin{array}{c}0 \ \\boldsymbol{r}^{b}\end{matriz}\right]\right)=\boldsymbol{M}_{Q_{b}^{i}} \boldsymbol{M}_{Q_{i}^{ b}}^{\prime}\left[\begin{array}{c}0 \\ \boldsymbol{r}^{b}\end{array}\right]= \\ & {\left[\begin{ matriz}{ccccc}q_{0} & -q_{1} & -q_{2} & -q_{3} \\ q_{1} & q_{0} & -q_{3} & q_{2} \ \ q_{2} & q_{3} & q_{0} & -q_{1} \\ q_{3} & -q_{2} & q_{1} & q_{0}\end{matriz}\right ]\left[\begin{matriz}{cccc}q_{0} & q_{1} & q_{2} & q_{3} \\ -q_{1} & q_{0} & -q_{3} & q_{2} \\ -q_{2} & q_{3} & q_{0} & -q_{1} \\ -q_{3} & -q_{2} & q_{1} & q_{0} \end{matriz}\right]\left[\begin{matriz}{c}0 \\ r_{x}^{b} \\ r_{y}^{b} \\ r_{z}^{b} \end{matriz}\right]=} \\ & {\left[\begin{matriz}{ccccc}1 & 0 & 0 & 0 \\ 0 & q_{0}^{2}+q_{1}^ {2}-q_{2}^{2}-q_{3}^{2} & 2\izquierda(q_{1} q_{2}-q_{0}q_{3}\derecha) & 2\izquierda(q_{1} q_{3}+q_{0} q_{2}\derecha) \\ 0 & 2\izquierda(q_{1} q_{2}+q_ {0} q_{3}\derecha) & q_{0}^{2}-q_{1}^{2}+q_{2}^{2}-q_{3}^{2} & 2\izquierda (q_{2} q_{3}-q_{0} q_{1}\derecha) \\ 0 & 2\izquierda(q_{1} q_{3}-q_{0} q_{2}\derecha) & 2\izquierda(q_{2} q_{3}+q_{0} q_{1}\derecha) & q_{0}^{2}-q_{1}^{2}-q_{2}^{2 }+q_{3}^{2}\end{matriz}\right]\left[\begin{matriz}{c}0 \\ r_{x}^{b} \\ r_{y}^{b} \\ r_{z}^{b}\end{matriz}\right] }\end{alineado}r_{z}^{b}\end{matriz}\right] }\end{alineado}r_{z}^{b}\end{matriz}\right] }\end{alineado}qbyorbqisegundo=METROqbyo( rbqisegundo)=METROqbyo( Mqisegundo′′[0rsegundo] )=METROqbyoMETROqisegundo′′[0rsegundo]= q0q1q2q3q1q0q3q2q2q3q0q1q3q2q1q0 q0q1q2q3q1q0q3q2q2q3q0q1q3q2q1q0 0rXsegundorysegundorzsegundo = 10000q02+q12q22q322( q1q2+q0q3)2( q1q3q0q2)02( q1q2q0q3)q02q12+q22q322( q2q3+q0q1)02( q1q3+q0q2)2( q2q3q0q1)q02q12q22+q32 0rXsegundorysegundorzsegundo
Se puede encontrar que la matriz de bloque diagonal de tercer orden en la esquina inferior derecha de la matriz es exactamente la matriz de actitud, que se puede abreviar como:
Q bi ∘ rb ∘ Q ib = [ 1 0 1 × 3 0 3 × 1 C bi ] [ 0 rb ] = [ 0 C birb ] = [ 0 ri ] \boldsymbol{Q}_{b}^{i} \circ \boldsymbol{r}^{b} \circ \boldsymbol{Q }_{i}^{b}=\ izquierda[\begin{matriz}{cc}1 & \mathbf{0}_{1 \times 3} \\ \mathbf{0}_{3 \times 1} & \boldsymbol{C}_{b}^{ i}\end{arreglo}\right]\left[\begin{arreglo}{c}0 \\ \boldsymbol{r}^{b}\end{arreglo}\ derecha]=\izquierda[\begin{matriz} {c}0 \\ \boldsymbol{C}_{b}^{i} \boldsymbol{r}^{b}\end{matriz}\right]=\left [\begin{matriz}{c}0 \ \ \boldsymbol{r}^{i}\end{matriz}\right]qbyorbqisegundo=[103 × 101 × 3Cbyo][0rsegundo]=[0Cbyorsegundo]=[0ryo]
Esto muestra queQ bi ∘ rb ∘ Q ib Q_{b}^{i} \circ \boldsymbol{r}^{b} \circ \boldsymbol{Q}_{i}^{b}qbyorbqisegundoEl resultado de es también un cuaternión escalar cero cuya parte imaginaria corresponde exactamente a la transformación de coordenadas ri = C birb \boldsymbol{r}^{i}=\boldsymbol{C}_{b}^{i} \ boldsymbol{r }^{b}ri=Cbyorsegundo _ Para escribir de manera concisa, similar al hábito de expresión de transformación de coordenadas de la matriz, se puede definir la operación de multiplicación entre el cuaternión y el vector tridimensional, es decir, la fórmula de transformación de coordenadas del cuaternión: ri = Q bi ⊗ rbr^{ i}
=Q_{b}^{ i} \otimes r^{b}ri=qbyorEl significado de b
es realizar primero la multiplicación de cuaterniones y luego extraer la parte imaginaria del resultado.

function vo = qmulv(q, vi)
    qo1 =              - q(2) * vi(1) - q(3) * vi(2) - q(4) * vi(3);
    qo2 = q(1) * vi(1)                + q(3) * vi(3) - q(4) * vi(2);
    qo3 = q(1) * vi(2)                + q(4) * vi(1) - q(2) * vi(3);
    qo4 = q(1) * vi(3)                + q(2) * vi(2) - q(3) * vi(1);
    vo = vi;
    vo(1) = -qo1 * q(2) + qo2 * q(1) - qo3 * q(4) + qo4 * q(3);
    vo(2) = -qo1 * q(3) + qo3 * q(1) - qo4 * q(2) + qo2 * q(4);
    vo(3) = -qo1 * q(4) + qo4 * q(1) - qo2 * q(3) + qo3 * q(2);

5. Quaternion más error de ángulo de desalineación: qaddphi

Desde el sistema de navegación real ( nnn sistema) al sistema de navegación computacional (n ′ n^{\prime}norte system) el ángulo de desalineación esϕ \boldsymbol{\phi}ϕ , por el contrario, den ′ n^{\prime}norte' está vinculado annEl ángulo de desalineación del sistema n debe ser − ϕ -\boldsymbol{\phi}ϕ , si− ϕ -\phiϕ se considera un vector de rotación equivalente, entonces el cuaternión de transformación correspondiente esQ nn ′ Q_{n}^{n^{\prime}}qnortenorte′′. En el programa, las variables qpb, , qnbrepresentan phiQ bn ′ , Q bn Q_{b}^{n^{\prime}}, Q_{b}^{n} respectivamenteqbnorte′′,qbny ϕ\phiϕ _

function qpb = qaddphi(qnb, phi)
    qpb = qmul(rv2q(-phi),qnb);

6. Cuaternión menos error de desalineación: qdelphi

Correspondiente a la fórmula Q bn = Q n ′ n ∘ Q b ′ Q_{b}^{n}=Q_{n^{\prime}}^{n}{ }^{\circ} Q_{b}^{ \ principal}qbn=qnorten Qb′′, lo que significa: Después de deducir el ángulo de desalineación en el cálculo del cuaternión de actitud, se obtiene el cuaternión de actitud real (más preciso).

function qnb = qdelphi(qpb, phi)
    qnb = qmul(rv2q(phi), qpb);

7. Calcule el error del ángulo de desalineación del cuaternión y el cuaternión real: qq2phi

Primero, según la fórmula Q n ′ n = Q bn ∘ ( Q bn ′ ) ∗ Q_{n^{\prime}}^{n}=Q_{b}^{n} \circ\left(Q_{b }^{ n^{\principal}}\derecho){ }^{*}qnorten=qbn( Qbnorte′′) Obtener el cuaternión de errorQ n ′ n Q_{n^{\prime}}^{n}qnorten, y luego por Q n ′ n Q_{n^{\prime}}^{n}qnortenResolviendo para el ángulo de desalineación ϕ \boldsymbol{\phi}ϕ _

function phi = qq2phi(qpb, qnb)
    qnp = qmul(qnb, qconj(qpb));
    phi = q2rv(qnp);

3. Conversión de varias representaciones de gestos

inserte la descripción de la imagen aquí

1. Ángulo de Euler -> matriz de actitud: a2mat

El ángulo de Euler usa tres selecciones para representar el cambio de actitud, y las tres matrices de selección se multiplican para obtener la matriz del coseno director (matriz de actitud), y el orden de rotación es crítico.
C b t = C ψ C C C γ = [ c ψ − s ψ 0 s ψ ˙ c ψ 0 0 0 1 ] [ 1 0 0 0 c θ − s θ 0 s θ c θ ] [ c γ 0 s γ 0 1 0 − s γ 0 c γ ] = [ c ψ c γ − s ψ s θ s γ − s ψ c θ c ψ s γ + s ψ s θ c γ s ψ c γ + c ψ s θ s γ c ψ c θ s ψ s γ − c ψ s θ c γ − c θ s γ s θ c θ c γ ] = [ C 11 C 12 C 13 C 21 C 22 C 23 C 31 C 32 C 33 ] \begin{array}{l} \boldsymbol{C}_{b}^{t}= \boldsymbol{C}_{\psi} \boldsymbol{C}_{\boldsymbol{C}} \boldsymbol{C}_{\gamma}=\left[\begin{array}{ccc}c_{\psi} & -s_{\psi} & 0 \\ s_{\dot{\psi}} & c_{\psi} & 0 \\ 0 & 0 & 1\end{array}\right]\left[\begin{array}{ccc}1 & 0 & 0 \\ 0 & c_{\theta} & -s_{\theta} \\ 0 & s_{\theta} & c_{\theta}\end{array}\right]\left[\begin{array}{ccc}c_{\gamma} & 0 & s_{\gamma} \\ 0 & 1 & 0 \\ -s_{\gamma} & 0 & c_{\gamma}\end{array}\right]= \\ {\left[\begin{array}{ccc}c_{\psi} c_{\gamma}-s_{\psi} s_{\theta} s_{\gamma} & -s_{\psi} c_{\theta} & c_{\psi} s_{\gamma}+s_{\psi} s_{\theta} c_{\gamma} \\ s_{\psi} c_{\gamma}+c_{\psi} s_{\theta} s_{\gamma} & c_{\psi} c_{\theta} & s_{\psi} s_{\gamma}-c_{\psi} s_{\theta} c_{\gamma} \\ -c_{\theta} s_{\gamma} & s_{\theta} & c_{\theta} c_{\gamma}\end{array}\right]=\left[\begin{array}{ccc}C_{11} & C_{12} & C_{13} \\ C_{21} & C_{22} & C_{23} \\ C_{31} & C_{32} & C_{33}\end{array}\right] }\end{array} Cbt=CpagCcCC= Cpagspag˙0- spagCpag0001 1000Cisi0- siCi CC0- sC010sC0CC = CpagCCspagsisCspagCC+CpagsisC- cisC- spagCiCpagCisiCpagsC+spagsiCCspagsCCpagsiCCCiCC = C11C21C31C12C22C32C13C23C33

function [Cnb, Cnbr] = a2mat(att)
% Convert Euler angles to direction cosine matrix(DCM).
% 欧拉角->姿态阵
% Prototype: [Cnb, Cnbr] = a2mat(att)
% Input: att - att=[pitch; roll; yaw] in radians
% Outputs: Cnb - DCM from navigation-frame(n) to body-frame(b), in yaw->pitch->roll
%                (3-1-2) rotation sequence
%          Cnbr - DCM in yaw->roll->pitch (3-2-1) rotation sequence
    s = sin(att); c = cos(att);
    si = s(1); sj = s(2); sk = s(3); 
    ci = c(1); cj = c(2); ck = c(3);
    Cnb = [ cj*ck-si*sj*sk, -ci*sk,  sj*ck+si*cj*sk;
            cj*sk+si*sj*ck,  ci*ck,  sj*sk-si*cj*ck;
           -ci*sj,           si,     ci*cj           ];
    if nargout==2  % dual Euler angle DCM
        Cnbr = [ cj*ck, si*sj*ck-ci*sk, ci*sj*ck+si*sk;
                 cj*sk, si*sj*sk+ci*ck, ci*sj*sk-si*ck;
                -sj,    si*cj,          ci*cj            ];
    endfunction [Cnb, Cnbr] = a2mat(att)
    s = sin(att); c = cos(att);
    si = s(1); sj = s(2); sk = s(3); 
    ci = c(1); cj = c(2); ck = c(3);
    Cnb = [ cj*ck-si*sj*sk, -ci*sk,  sj*ck+si*cj*sk;
            cj*sk+si*sj*ck,  ci*ck,  sj*sk-si*cj*ck;
           -ci*sj,           si,     ci*cj           ];
    if nargout==2  % dual Euler angle DCM
        Cnbr = [ cj*ck, si*sj*ck-ci*sk, ci*sj*ck+si*sk;
                 cj*sk, si*sj*sk+ci*ck, ci*sj*sk-si*ck;
                -sj,    si*cj,          ci*cj            ];
    end

Explicación de AI :
este código es una función que convierte los ángulos de Euler en una matriz de pose. Genera dos parámetros de salida: Cnb y Cnbr, que representan respectivamente la matriz de actitud del sistema de navegación al sistema de la aeronave y otra matriz de actitud del sistema de navegación al sistema de la aeronave. Si el número de parámetros de salida de la función es 2 (es decir, se requiere que Cnb y Cnbr se generen al mismo tiempo), también se calculará la matriz Cnbr. La matriz Cnbr está construida en un orden de rotación "guiñada-alabeo-cabeceo" (3-2-1).

2. Matriz de actitud -> ángulo de Euler: m2att

θ = arcsin ⁡ ( C 32 ) { γ = − atan ⁡ 2 ( C 31 , C 33 ) ψ = − atan ⁡ 2 ( C 12 , C 22 ) ∣ C 32 ∣ ⩽ 0.999999 { γ = atan ⁡ 2 ( C 13 , C 11 ) ∣ C 32 ∣ > 0.999.999 ψ = 0 \begin{array}{l}\theta=\arcsin \left(C_{32}\right) \\ \left\{\begin{array}{l}\gamma=-\operatorname{atan} 2\left(C_{31}, C_{33}\right) \\ \psi=-\operatorname{atan} 2\left(C_{12}, C_{22}\right)\end{array}\left|C_{32}\right| \leqslant 0.999999\right. \\ \left\{\begin{array}{ll}\gamma=\operatorname{atan} 2\left(C_{13}, C_{11}\right) & \left|C_{32}\right|>0.999 .999 \\ \psi=0\end{array}\right. \\\end{array} θ=arcsin(C32){ γ=atan2(C31,C33)ψ=atan2(C12,C22)C320.999999{ γ=atan2(C13,C11)pag=0C32>0.999.999

function [att, attr] = m2att(Cnb)
% Convert direction cosine matrix(DCM) to Euler attitude angles.
% 姿态阵 -> 欧拉角
% Prototype: [att, attr] = m2att(Cnb)
% Input: Cnb - DCM from navigation-frame(n) to body-frame(b)
% Outputs: att - att=[pitch; roll; yaw] in radians, in yaw->pitch->roll
    att = [ asin(Cnb(3,2));
            atan2(-Cnb(3,1),Cnb(3,3)); 
            atan2(-Cnb(1,2),Cnb(2,2)) ];
    if nargout==2  % dual Euler angles
        attr = [ atan2(Cnb(3,2),Cnb(3,3)); 
                 asin(-Cnb(3,1)); 
                 atan2(Cnb(2,1),Cnb(1,1)) ];
    end

AI Explicación :
este código es una función de MATLAB para convertir la matriz de coseno de dirección (DCM) en ángulo de actitud de Euler. El nombre de la función es m2att, el parámetro de entrada es la matriz DCM Cnb, el parámetro de salida es el ángulo de actitud de Euler att y el eje de rotación opcional y el ángulo de rotación attr. La función del código es la siguiente:

  1. Exprese cada columna de la matriz Cnb de DCM como un vector unitario que representa el vector de rotación desde el sistema de coordenadas de navegación (n) hasta el sistema de coordenadas del cuerpo (b).
  2. Utilice estos vectores de rotación para calcular la pose del marco del cuerpo en relación con el marco de navegación, lo que da como resultado ángulos de pose de Euler.
  3. Almacene el ángulo de actitud de Euler calculado en la matriz att, organizado en el orden de guiñada -> cabeceo -> balanceo, en radianes.
  4. Si el parámetro de salida attr se especifica en forma de ángulos de Euler dobles (juzgando el valor de la variable nargout), también es necesario calcular el eje de rotación y el ángulo de rotación.
  5. La fórmula para calcular el eje de rotación es: (Cnb(3,2), Cnb(3,3)), que es el vector formado por los elementos de la tercera fila, segunda columna y tercera columna de la matriz DCM.
  6. La fórmula para calcular el ángulo de rotación es: [-asin(-Cnb(3,1)); atan2(Cnb(2,1), Cnb(1,1))], es decir, primero calcula el ángulo de rotación alrededor el eje z (a través de DCM Los signos de los elementos en la fila 3, columna 1 de la matriz están invertidos), y luego calcule el ángulo de rotación alrededor del eje x' (a través de los elementos en la fila 2, columna 1 y fila 1 , columna 1 de la matriz DCM).
  7. Almacene el eje de rotación y el ángulo de rotación calculados en la matriz attr, en radianes.
    Cabe señalar que el código utiliza las funciones asin y atan2 en MATLAB para representar las funciones arcoseno y arcocoseno, y juzgar el valor de la variable nargout para determinar la forma del parámetro de salida.

3. Cuaternión -> matriz de actitud: q2mat

C b n = [ q 0 2 + q 1 2 − q 2 2 − q 3 2 2 ( q 1 q 2 − q 0 q 3 ) 2 ( q 1 q 3 + q 0 q 2 ) 2 ( q 1 q 2 + q 0 q 3 ) q 0 2 − q 1 2 + q 2 2 − q 3 2 2 ( q 2 q 3 − q 0 q 1 ) 2 ( q 1 q 3 − q 0 q 2 ) 2 ( q 2 q 3 + q 0 q 1 ) q 0 2 − q 1 2 − q 2 2 + q 3 2 ] \boldsymbol{C}_{b}^{n}=\left[\begin{array}{ccc}q_{0}^{2}+q_{1}^{2}-q_{2}^{2}-q_{3}^{2} & 2\left(q_{1} q_{2}-q_{0} q_{3}\right) & 2\left(q_{1} q_{3}+q_{0} q_{2}\right) \\ 2\left(q_{1} q_{2}+q_{0} q_{3}\right) & q_{0}^{2}-q_{1}^{2}+q_{2}^{2}-q_{3}^{2} & 2\left(q_{2} q_{3}-q_{0} q_{1}\right) \\ 2\left(q_{1} q_{3}-q_{0} q_{2}\right) & 2\left(q_{2} q_{3}+q_{0} q_{1}\right) & q_{0}^{2}-q_{1}^{2}-q_{2}^{2}+q_{3}^{2}\end{array}\right] Cbn= q02+q12q22q322(q1q2+q0q3)2(q1q3q0q2)2(q1q2q0q3)q02q12+q22q322(q2q3+q0q1)2(q1q3+q0q2)2(q2q3q0q1)q02q12q22+q32

function Cnb = q2mat(qnb)
% Convert attitude quaternion to direction cosine matrix(DCM).
% 四元数 -> 姿态阵
% Prototype: Cnb = q2mat(qnb)
% Input: qnb - attitude quaternion
% Output: Cnb - DCM from body-frame to navigation-frame
    q11 = qnb(1)*qnb(1); q12 = qnb(1)*qnb(2); q13 = qnb(1)*qnb(3); q14 = qnb(1)*qnb(4); 
    q22 = qnb(2)*qnb(2); q23 = qnb(2)*qnb(3); q24 = qnb(2)*qnb(4);     
    q33 = qnb(3)*qnb(3); q34 = qnb(3)*qnb(4);  
    q44 = qnb(4)*qnb(4);
    Cnb = [ q11+q22-q33-q44,  2*(q23-q14),     2*(q24+q13);
            2*(q23+q14),      q11-q22+q33-q44, 2*(q34-q12);
            2*(q24-q13),      2*(q34+q12),     q11-q22-q33+q44 ];

4. 姿态阵 -> 四元数:m2qua

q 0 2 + q 1 2 − q 2 2 − q 3 2 = C 11 q 0 2 − q 1 2 + q 2 2 − q 3 2 = C 22 q 0 2 − q 1 2 − q 2 2 + q 3 2 = C 33 q 0 2 + q 1 2 + q 2 2 + q 3 2 = 1 } ⇒ ∣ q 0 ∣ = 0.5 1 + C 11 + C 22 + C 33 ∣ q 1 ∣ = 0.5 1 + C 11 − C 22 − C 33 ∣ q 2 ∣ = 0,5 1 − C 11 + C 22 − C 33 ∣ q 3 ∣ = 0,5 1 − C 11 − C 22 + C 33 \left.\begin{array}{l}q_{ 0}^{2}+q_{1}^{2}-q_{2}^{2}-q_{3}^{2}=C_{11} \\ q_{0}^{2}-q_ {1}^{2}+q_{2}^{2}-q_{3}^{2}=C_{22} \\ q_{0}^{2}-q_{1}^{2}- q_{2}^{2}+q_{3}^{2}=C_{33} \\ q_{0}^{2}+q_{1}^{2}+q_{2}^{2} +q_{3}^{2}=1\end{array}\right\} \Rightarrow \begin{array}{l}\left|q_{0}\right|=0.5 \sqrt{1+C_{11 }+C_{22}+C_{33}} \\ \left|q_{1}\right|=0.5 \sqrt{1+C_{11}-C_{22}-C_{33}} \\ \left |q_{2}\right|=0.5 \sqrt{1-C_{11}+C_{22}-C_{33}} \\ \left|q_{3}\right|=0.5 \sqrt{1-C_ {11}-C_{22}+C_{33}}\end{matriz}q02+q12q22q32=C11q02q12+q22q32=C22q02q12q22+q32=C33q02+q12+q22+q32=1 q0=0.51+C11+C22+C33 q1=0.51+C11C22C33 q2=0.51C11+C22C33 q3=0.51C11C22+C33

2 ( q 1 q 2 − q 0 q 3 ) = C 12 2 ( q 1 q 2 + q 0 q 3 ) = C 21 2 ( q 1 q 3 + q 0 q 2 ) = C 13 2 ( q 1 q 3 − q 0 q 2 ) = C 31 2 ( q 2 q 3 − q 0 q 1 ) = C 23 2 ( q 2 q 3 + q 0 q 1 ) = C 32 } ⇒ 4 q 0 q 1 = C 32 − C 23 4 q 0 q 2 = C 13 − C 31 4 q 0 q 3 = C 21 − C 12 4 q 1 q 2 = C 12 + C 21 4 q 1 q 3 = C 13 + C 31 4 q 2 q 3 = C 23 + C 32 } \izquierda.\izquierda.\begin{array}{l}2\left(q_{1} q_{2}-q_{0} q_{3}\right)=C_{12} \\ 2\left(q_{1} q_{2 }+q_{0} q_{3}\right)=C_{21} \\ 2\left(q_{1} q_{3}+q_{0} q_{2}\right)=C_{13} \ \ 2\izquierda(q_{1} q_{3}-q_{0} q_{2}\derecha)=C_{31} \\ 2\izquierda(q_{2} q_{3}-q_{0} q_ {1}\right)=C_{23} \\ 2\left(q_{2} q_{3}+q_{0} q_{1}\right)=C_{32}\end{matriz}\right\ } \Rightarrow \begin{array}{l}4 q_{0} q_{1}=C_{32}-C_{23} \\ 4 q_{0} q_{2}=C_{13}-C_{31 } \\ 4 q_{0} q_{3}=C_{21}-C_{12} \\ 4 q_{1} q_{2}=C_{12}+C_{21} \\ 4 q_{1} q_{3}=C_{13}+C_{31} \\ 4 q_{2} q_{3}=C_{23}+C_{32}\end{matriz}\right\}2( q1q2q0q3)=C122( q1q2+q0q3)=C212( q1q3+q0q2)=C132( q1q3q0q2)=C312( q2q3q0q1)=C232( q2q3+q0q1)=C32 4q _0q1=C32C234q _0q2=C13C314q _0q3=C21C124q _1q2=C12+C214q _1q3=C13+C314q _2q3=C23+C32

Aunque solo sea de acuerdo con la fórmula uno, será difícil determinar los signos positivo y negativo de cada elemento del cuaternión. Si se conoce un determinado elemento del cuaternión, se pueden resolver otros elementos según la fórmula 2, pero se debe evitar que el elemento conocido sea 0. Por condición de normalización de cuaterniones q 0 2 + q 1 2 q_{0}^{2}+q_{1}^{2}q02+q12 + q 2 2 + q 3 2 = 1 +q_{2}^{2}+q_{3}^{2}=1+ q22+q32=1 muestra que debe habermax ⁡ ( qi 2 ) ⩾ 1 / 4 \max \left(q_{i}^{2}\right) \geqslant 1 / 4máximo( qi2)Se establece 1/4 , es decir, debe haber algún ∣ qi ∣ ⩾ \left|q_{i}\right| \geqslantentre los cuatro elementosqyo 1 / 2 1 / 21/2 . En la aplicación práctica, un cierto elemento más grandeqi q_{i}qyo(Se puede tomar como un valor positivo), y luego calcular los tres elementos restantes de acuerdo con la fórmula (B. 10).

function qnb = m2qua(Cnb)
% Convert direction cosine matrix(DCM) to attitude quaternion.
%
% Prototype: qnb = m2qua(Cnb)
% Input: Cnb - DCM from body-frame to navigation-frame
% Output: qnb - attitude quaternion
    C11 = Cnb(1,1); C12 = Cnb(1,2); C13 = Cnb(1,3); 
    C21 = Cnb(2,1); C22 = Cnb(2,2); C23 = Cnb(2,3); 
    C31 = Cnb(3,1); C32 = Cnb(3,2); C33 = Cnb(3,3); 
%     q0t = 0.5*sqrt(1+C11+C22+C33);
%     q1t = 0.5*sqrt(1+C11-C22-C33);
%     q2t = 0.5*sqrt(1-C11+C22-C33);
%     q3t = 0.5*sqrt(1-C11-C22+C33);
    if C11>=C22+C33
        q1 = 0.5*sqrt(1+C11-C22-C33);  qq4 = 4*q1;
        q0 = (C32-C23)/qq4; q2 = (C12+C21)/qq4; q3 = (C13+C31)/qq4;
    elseif C22>=C11+C33
        q2 = 0.5*sqrt(1-C11+C22-C33);  qq4 = 4*q2;
        q0 = (C13-C31)/qq4; q1 = (C12+C21)/qq4; q3 = (C23+C32)/qq4;
    elseif C33>=C11+C22
        q3 = 0.5*sqrt(1-C11-C22+C33);  qq4 = 4*q3;
        q0 = (C21-C12)/qq4; q1 = (C13+C31)/qq4; q2 = (C23+C32)/qq4;
    else
        q0 = 0.5*sqrt(1+C11+C22+C33);  qq4 = 4*q0;
        q1 = (C32-C23)/qq4; q2 = (C13-C31)/qq4; q3 = (C21-C12)/qq4;
    end
    qnb = [q0; q1; q2; q3];

Explicación de AI :
la función acepta un parámetro de entrada Cnb, que es una matriz de 3x3 que representa el DCM desde el sistema de coordenadas del cuerpo hasta el sistema de coordenadas de navegación. La salida de la función es un vector cuaternión qnb que representa la actitud correspondiente para un DCM dado. La implementación del código es la siguiente:

  1. Extraiga los valores de los elementos de la matriz Cnb de entrada y asígnelos a las variables C11, C12, C13, C21, C22, C23, C31, C32 y C33 respectivamente.
  2. En función de los valores de los elementos del DCM, se utilizan una serie de declaraciones condicionales para determinar cómo se calcula cada elemento y luego se calculan los elementos individuales del vector cuaternión.
  3. De acuerdo con el resultado del juicio condicional, seleccione un método de cálculo apropiado para obtener el vector cuaternión final qnb.

5. Ángulo de Euler -> cuaternión: a2qua

Los cuaterniones se usan comúnmente en algoritmos de actualización de actitud de navegación inercial. Los resultados de salida de la navegación inercial a menudo se expresan como ángulos de Euler, y se requiere una conversión mutua entre cuaterniones y ángulos de Euler. De acuerdo con el significado geométrico de los cuaterniones unitarios:
Q bn = Q ψ ∘ Q θ ∘ Q γ = ( C ψ / 2 + ks ψ / 2 ) ∘ ( C θ / 2 + es θ / 2 ) ∘ ( C γ / 2 + js γ / 2 ) = ( C ψ / 2 c θ / 2 + ic ψ / 2 s θ / 2 + ks ψ / 2 c θ / 2 + k ∘ yo ψ / 2 s θ / 2 ) ∘ ( c γ / 2 + js γ / 2 ) = ( C ψ / 2 C θ / 2 + ic ψ / 2 s θ / 2 + ks ψ / 2 C θ / 2 + js ψ / 2 s θ / 2 ) ∘ ( C γ / 2 + js γ / 2 ) = [ C ψ / 2 C θ / 2 C γ / 2 − s ψ / 2 s θ / 2 s γ / 2 C ψ / 2 s θ / 2 C γ / 2 − s ψ / 2 C θ / 2 s γ / 2 s ψ / 2 s θ / 2 c γ / 2 + c ψ / 2 c θ / 2 s γ / 2 s ψ / 2 c θ / 2 c γ / 2 + c ψ / 2 s θ / 2 s γ / 2 ] \begin{alineado} \boldsymbol{Q}_{b}^{n}= & \boldsymbol{Q}_{\psi}{ }{\circ} \boldsymbol{Q}_{\theta} \circ \boldsymbol{Q}_{\gamma}=\left(c_{\psi / 2}+\boldsymbol{k} s_{\psi / 2}\right) \circ\left(c_{\theta / 2}+ \boldsymbol{i} s_{\theta / 2}\right) \circ\left(c_{\gamma / 2}+\boldsymbol{j} s_{\gamma / 2}\right)= \\ &\left(c_{\psi / 2} c_{\theta / 2}+\boldsymbol{i} c_{\psi / 2} s_{\theta / 2}+\boldsymbol{k} s_{\psi / 2} c_{\theta / 2}+\boldsymbol{k} \circ \boldsymbol{i}_{\psi / 2} s_{\theta / 2}\right) \circ\left(c_{\gamma / 2}+ \boldsymbol{j} s_{\gamma / 2}\right)= \\ & \left(c_{\psi / 2} c_{\theta / 2}+\boldsymbol{i} c_{\psi / 2} s_ {\theta / 2}+\boldsymbol{k} s_{\psi / 2} c_{\theta / 2}+\boldsymbol{j} s_{\psi / 2} s_{\theta / 2}\right) \ circ\left(c_{\gamma / 2}+\boldsymbol{j} s_{\gamma / 2}\right)= \\ & {\left[\begin{array}{l}c_{\psi / 2} c_{\theta / 2} c_{\gamma / 2}-s_{\psi / 2} s_{\theta / 2} s_{\gamma / 2} \\ c_{\psi / 2} s_{\theta / 2} c_{\gamma / 2}-s_{\psi / 2} c_{\theta / 2} s_{\gamma / 2} \\ s_{\psi / 2} s_{\theta / 2} c_{\ gamma / 2}+c_{\psi / 2} c_{\theta / 2} s_{\gamma / 2} \\ s_{\psi / 2} c_{\theta / 2} c_{\gamma / 2}+ c_{\ psi / 2}s_{\theta / 2} s_{\gamma / 2}\end{matriz}\right] }\end{alineado}qbn=qpag QiqC=( doψ / 2+k sψ / 2)( doθ / 2+yo sθ / 2)( doc / 2+js _c / 2)=( doψ / 2Cθ / 2+yo cψ / 2sθ / 2+k sψ / 2Cθ / 2+kiψ / 2sθ / 2)( doc / 2+js _c / 2)=( doψ / 2Cθ / 2+yo cψ / 2sθ / 2+k sψ / 2Cθ / 2+js _ψ / 2sθ / 2)( doc / 2+js _c / 2)= Cψ / 2Cθ / 2Cc / 2sψ / 2sθ / 2sc / 2Cψ / 2sθ / 2Cc / 2sψ / 2Cθ / 2sc / 2sψ / 2sθ / 2Cc / 2+Cψ / 2Cθ / 2sc / 2sψ / 2Cθ / 2Cc / 2+Cψ / 2sθ / 2sc / 2

function qnb = a2qua(att)
% Convert Euler angles to attitude quaternion.
% 欧拉角 -> 四元数
% Prototype: qnb = a2qua(att)
% Input: att - att=[pitch; roll; yaw] in radians
% Output: qnb - attitude quaternion
    att2 = att/2;
    s = sin(att2); c = cos(att2);
    sp = s(1); sr = s(2); sy = s(3); 
    cp = c(1); cr = c(2); cy = c(3); 
    qnb = [ cp*cr*cy - sp*sr*sy;
            sp*cr*cy - cp*sr*sy;
            cp*sr*cy + sp*cr*sy;
            cp*cr*sy + sp*sr*cy ];

Explicación de AI :
la salida del número es un cuaternión qnb, que representa la actitud correspondiente al ángulo de Euler dado. La implementación del código es la siguiente:

  1. Divide el vector att por 2 para obtener el vector att2, que representa la mitad de cada ángulo.
  2. Utilice las funciones sin y cos para calcular los valores de seno y coseno del vector att2 para obtener los vectores s y c correspondientes.
  3. Asigne los elementos de los vectores s y c a las variables sp, sr, sy, cp, cr y cy, respectivamente, para cálculos posteriores.
  4. Calcula cada elemento del cuaternión qnb según la fórmula del cuaternión.

6. Cuaternión -> Ángulo de Euler: q2att

No es fácil resolver directamente el ángulo de Euler por cuaternión, y la matriz de actitud se puede usar como una cantidad de transición intermedia.
θ = arcsin ⁡ ( 2 ( q 2 q 3 + q 0 q 1 ) ) { para γ = − ⁡ 2 ( 2 ( q 1 q 3 − q 0 q 2 ) , q 0 2 − q 1 2 − q 2 2 + q 3 2 ) Para ψ = − ⁡ 2 ( 2 ( q 1 q 2 − q 0 q 3 ) , q 0 2 − q 1 2 + q 2 2 − q 3 2 ) ∣ 2 ( q 2 q 3 + q 0 q 1 ) ∣ ⩽ 0.999999 } { γ = para ⁡ 2 ( 2 ( q 1 q 3 + q 0 q 2 ) , q 0 2 + q 1 2 − q 2 2 − q 3 2 ) ∣ 2 ( q 2 q 3 + q 0 q 1 ) ∣ > 0.999999 ψ = 0 \begin{array}{l}\theta=\arcsin\left(2\left(q_{2} q_{3}+q_{0} q_{1} \right)\right) \\ \left\{\begin{array}{ll}\gamma=-\operatorname{atan} 2\left(2\left(q_{1} q_{3}-q_{0} q_{2}\derecha), q_{0}^{2}-q_{1}^{2}-q_{2}^{2}+q_{3}^{2}\derecha) \\\psi =-\nombre del operador{entonces} 2\left(2\left(q_{1} q_{2}-q_{0} q_{3}\right), q_{0}^{2}-q_{1}^ {2}+q_{2}^{2}-q_{3}^{2}\right) & \left|2\left(q_{2}q_{3}+q_{0}q_{1}\ derecha)\derecha| \leqslanti=arcsen( 2( q2q3+q0q1) ){ C=con el propósito2( 2( q1q3q0q2),q02q12q22+q32)pag=con el propósito2( 2( q1q2q0q3),q02q12+q22q32)2( q2q3+q0q1)0.999999}{ C=con el propósito2( 2( q1q3+q0q2),q02+q12q22q32)pag=02( q2q3+q0q1)>0.999999

function att = q2att(qnb)
% Convert attitude quaternion to Euler attitude angles.
% 四元数 -> 欧拉角
% Prototype: att = q2att(qnb)
% Input: qnb - attitude quaternion
% Output: att - Euler angles att=[pitch; roll; yaw] in radians
    q11 = qnb(1)*qnb(1); q12 = qnb(1)*qnb(2); q13 = qnb(1)*qnb(3); q14 = qnb(1)*qnb(4); 
    q22 = qnb(2)*qnb(2); q23 = qnb(2)*qnb(3); q24 = qnb(2)*qnb(4);     
    q33 = qnb(3)*qnb(3); q34 = qnb(3)*qnb(4);  
    q44 = qnb(4)*qnb(4);
    C12=2*(q23-q14);
    C22=q11-q22+q33-q44;
    C31=2*(q24-q13); C32=2*(q34+q12); C33=q11-q22-q33+q44;
    att = [ asin(C32); 
            atan2(-C31,C33); 
            atan2(-C12,C22) ];

Explicación de AI :
este código es una función que convierte cuaterniones en ángulos de Euler. Toma un cuaternión como entrada y devuelve un vector que contiene los ángulos de Euler (cabeceo, guiñada y balanceo). Los pasos principales del código son los siguientes:

  1. Definición de variables: primero, el código descompone el cuaternión de entrada en los cuadrados de sus componentes y los almacena en las variables q11, q22, q33 y q44. Estas variables se utilizan en cálculos posteriores.
  2. Definición de los elementos de la matriz de rotación: A continuación, el código utiliza los componentes del cuaternión para calcular los elementos C12, C22, C31, C32 y C33 de la matriz de rotación. Estos elementos se utilizarán para calcular los ángulos de Euler.
  3. Calcular ángulos de Euler: Finalmente, el código usa los elementos de la matriz de rotación para calcular los ángulos de Euler. Primero, use la función asen para calcular el valor de C32 para obtener el ángulo de inclinación. Luego, use la función atan2 para calcular la tangente de los valores de C31 y C33 para obtener el ángulo de guiñada. Finalmente, utilice la función atan2 para calcular la tangente de los valores de C12 y C22 para obtener el ángulo de balanceo.
  4. Finalmente, la función devuelve un vector att que contiene los ángulos de Euler (cabeceo, guiñada y balanceo). Estos ángulos de Euler representan el ángulo de rotación de la pose correspondiente al cuaternión en el espacio tridimensional.

7. Cuaternión -> Vector de rotación equivalente: q2rv

function rv = q2rv(q) 
% Convert transformation quaternion to rotation vector.
%  四元数 -> 等效旋转矢量
% Prototype: rv = q2rv(q) 
% Input: q - transformation quaternion
% Output: rv - corresponding rotation vector, such that
	if(q(1)<0)
	    q = -q;
	end
    n2 = acos(q(1));
    if n2>1e-40
        k = 2*n2/sin(n2);
    else
        k = 2;
    end
    rv = k*q(2:4);   % q = [ cos(|rv|/2); sin(|rv|/2)/|rv|*rv ];

Explicación de AI :
este código es una función que convierte un cuaternión transformado en un vector de rotación equivalente. Toma un cuaternión como entrada y devuelve el vector de rotación correspondiente. Los pasos principales del código son los siguientes:

  1. Conversión del signo del cuaternión: el código primero comprueba si el primer elemento del cuaternión es negativo. Si es negativo, el cuaternión se niega para garantizar que el signo del vector de rotación sea el esperado.
  2. Calcular la magnitud del vector de rotación: el código usa la función acos para calcular el arcocoseno del primer elemento del cuaternión para obtener la magnitud del vector de rotación (también conocido como ángulo de rotación). Aquí se usa una declaración condicional, si n2 (es decir, el ángulo de rotación) es mayor que un pequeño umbral (1e-40), el tamaño del vector de rotación se calcula mediante una fórmula; de lo contrario, el tamaño del vector de rotación es establecido en 2.
  3. Calcular la dirección del vector de rotación: De acuerdo con la magnitud del vector de rotación, el código utiliza las funciones seno y coseno para calcular la dirección del vector de rotación correspondiente a los elementos segundo a cuarto del cuaternión. Específicamente, la dirección del vector de rotación se obtiene multiplicando la magnitud del vector de rotación por el producto del segundo al cuarto elemento del cuaternión.
  4. Finalmente, la función devuelve el vector de rotación calculado rv. Este vector de rotación representa el vector de rotación equivalente de la actitud correspondiente al cuaternión en el espacio tridimensional.

Tenga en cuenta que durante la conversión, el signo del código ajusta el cuaternión de entrada para garantizar que el signo del vector de rotación sea el esperado.

8. Vector de rotación equivalente -> cuaternión: rv2q

Primero, convierta el cuaternión en un cuaternión escalar no negativo; segundo, según la fórmula Q = q 0 + qv = cos ⁡ ϕ 2 + u sin ⁡ ϕ 2 = Q=q_{0}+\boldsymbol{q} _ {v}=\cos \frac{\phi}{2}+\boldsymbol{u} \sin \frac{\phi}{2}=q=q0+qv=porque2ϕ+tupecado2ϕ= cos ⁡ ϕ 2 + ϕ 2 ⋅ pecado ⁡ ( ϕ / 2 ) ϕ / 2 \cos \frac{\phi}{2}+\frac{\phi}{2} \cdot \frac{\sin (\phi / 2)}{\phi / 2}porque2ϕ+2ϕ/ 2s yo norte ( ϕ / 2 ), primero de la relación escalar del cuaternión q 0 = cos ⁡ ϕ 2 q_{0}=\cos \frac{\phi}{2}q0=porque2ϕEncuentra la mitad del módulo del vector de rotación ϕ 2 = \frac{\phi}{2}=2ϕ= arccos ⁡ ( q 0 ) \arcos \left(q_{0}\right)arccos( q0) , y luego por la relación vectorialqv = ϕ 2 ⋅ sin ⁡ ( ϕ / 2 ) ϕ / 2 \boldsymbol{q}_{v}=\frac{\boldsymbol{\phi}}{2} \cdot \frac {\ pecado (\ phi / 2)}{\ phi / 2}qv=2ϕ/ 2s yo norte ( ϕ / 2 )Encuentra el vector de rotación equivalente ϕ = 2 ( ϕ / 2 ) sin ⁡ ( ϕ / 2 ) qv \boldsymbol{\phi}=2 \frac{(\phi / 2)}{\sin (\phi / 2)} \ negrita{q}_{v}ϕ=2s yo norte ( ϕ / 2 )( ϕ /2 )qvQ = q 0 + qv = porque ⁡ ϕ 2 + tu sin ⁡ ϕ 2 Q=q_{0} +
\boldsymbol{q}_{v}=\cos \frac{\phi}{2}+\boldsymbol{ u } \sin \frac{\phi}{2}q=q0+qv=porque2ϕ+tupecado2ϕ

function q = rv2q(rv)
% Convert rotation vector to transformation quaternion.
%
% Prototype: q = rv2q(rv)
% Input: rv - rotation vector
% Output: q - corresponding transformation quaternion, such that
%             q = [ cos(|rv|/2); sin(|rv|/2)/|rv|*rv ]
    q = zeros(4,1);
    n2 = rv(1)*rv(1) + rv(2)*rv(2) + rv(3)*rv(3);
    if n2<1.0e-8  % cos(n/2)=1-n2/8+n4/384; sin(n/2)/n=1/2-n2/48+n4/3840
        q(1) = 1-n2*(1/8-n2/384); s = 1/2-n2*(1/48-n2/3840);
    else
        n = sqrt(n2); n_2 = n/2;
        q(1) = cos(n_2); s = sin(n_2)/n;
    end
    q(2) = s*rv(1); q(3) = s*rv(2); q(4) = s*rv(3);

Este código es una función que convierte un vector de rotación en un cuaternión de transformación. Toma un vector de rotación como entrada y devuelve el cuaternión de transformación correspondiente. Los pasos principales del código son los siguientes:

  1. Inicialice el cuaternión: el código primero crea un vector cero q de tamaño 4, que se utiliza para almacenar los elementos del cuaternión transformado.
  2. Calcular la magnitud del vector de rotación: el código utiliza el primer elemento del vector de rotación como la magnitud del vector de rotación (también conocido como ángulo de rotación). Aquí se usa una declaración condicional. Si el cuadrado estándar del vector de rotación es menor que un umbral pequeño (1.0e-8), el tamaño del vector de rotación se calcula usando la expansión de la serie de Taylor; de lo contrario, el tamaño del vector de rotación es calculado por la fórmula estándar.
  3. Calcular la dirección del vector de rotación: en función de la magnitud del vector de rotación, el código utiliza las funciones seno y coseno para calcular la dirección del vector de rotación. Específicamente, la dirección del vector de rotación se obtiene multiplicando la magnitud del vector de rotación por el signo del primer elemento del vector de rotación y multiplicando el resultado por los otros tres elementos del vector de rotación.
  4. Construir cuaternión de transformación: según el tamaño y la dirección del vector de rotación, el código construye el cuaternión de transformación correspondiente. Específicamente, divida la magnitud del vector de rotación por 2, luego use las funciones seno y coseno para calcular los elementos individuales del cuaternión transformado.
  5. Finalmente, la función devuelve el cuaternión de transformación calculado q. Este cuaternión de transformación representa la representación de la pose correspondiente al vector de rotación en el espacio del cuaternión.

Tenga en cuenta que en el proceso de cálculo, el código usa diferentes fórmulas para tratar con diferentes situaciones del tamaño del vector de rotación para mejorar la precisión del cálculo.

9. Matriz de actitud -> Vector de rotación equivalente: m2rv

function rv = m2rv(m)
% Convert transformation matrix to rotation vector.
%
% Prototype: rv = m2rv(m)
% Input: m - transformation matrix
% Output: rv - corresponding rotation vector, such that
        rv = [m(3,2)-m(2,3); m(1,3)-m(3,1); m(2,1)-m(1,2)];  % 11/10/2022
        phi = acos((m(1,1)+m(2,2)+m(3,3)-1)/2);
        if phi<1e-10, afa=1/2; else afa=phi/(2*sin(phi)); end
%         afa = phi/sqrt(rv'*rv);
        rv = afa*rv;
        return;
%     rv = iaskew(m-glv.I33);  % coarse init is ok when rv is small, otherwise may fail
%     rvx = askew(rv); % good! the following iteration due to the
    for k=1:2        % accuracy deduce of sqrt(.) in function m2qua
        xx = rv(1)*rv(1); xy = rv(1)*rv(2); xz = rv(1)*rv(3);
        yy = rv(2)*rv(2); yz = rv(2)*rv(3); zz = rv(3)*rv(3);
        n2 = xx+yy+zz;
%         n2 = rv'*rv; 
        if n2>1.0e-40
            n = sqrt(n2);
%             rvx = (m-eye(3)-(1-cos(n))/n2*rvx*rvx) * (n/sin(n));
            rvx = (m1-(1-cos(n))/n2*[-yy-zz,xy,xz; xy,-xx-zz,yz; xz,yz,-xx-yy]) * (n/sin(n));
            rv = [rvx(3,2); rvx(1,3); rvx(2,1)]; % rv = iaskew(rvx);
        else
            rv = zeros(3,1);
            break;
        end
    end

Explicación de AI:
este código es una función que convierte una matriz de transformación en un vector de rotación. Sus principales funciones son las siguientes:

  1. Calcule el vector de rotación: al restar los elementos en la diagonal de los elementos de la matriz de transformación y luego aplicar un cierto paso de cálculo, se obtiene el vector de rotación.
  2. Calcule el ángulo de rotación: use la función acos para calcular el ángulo de rotación en el vector de rotación.
  3. Calcular el coeficiente de normalización del vector de rotación: Calcular el coeficiente de normalización del vector de rotación según el valor del ángulo de rotación. Si el ángulo de rotación es muy pequeño (menos de 1e-10), establezca el factor de normalización en 1/2; de lo contrario, calcule según la fórmula.
  4. Normalizar vector de rotación: normaliza el vector de rotación utilizando un factor de normalización.
  5. Calcule iterativamente el vector de rotación: calcule iterativamente el vector de rotación a través de un bucle. Primero, inicialice el vector de rotación a un vector con una pequeña diferencia de la matriz de transformación (usando inicio grueso). Luego, el vector de rotación se actualiza a través de una serie de pasos computacionales. Este proceso iterativo se realiza dos veces.

10. Vector de rotación equivalente -> matriz de actitud: rv2m

C bi = yo + pecado ⁡ ϕ ϕ ( ϕ × ) + 1 − porque ⁡ ϕ ϕ 2 ( ϕ × ) 2 \boldsymbol{C}_{b}^{i}=\boldsymbol{I}+\frac{\ sin \phi}{\phi}(\boldsymbol{\phi} \times)+\frac{1-\cos \phi}{\phi^{2}}(\boldsymbol{\phi} \times)^{2 }Cbyo=I+ϕpecadoϕ( ϕ × )+ϕ21porqueϕ( ϕ × )2

function m = rv2m(rv)
% Convert rotation vector to transformation matrix.
% 等效旋转矢量 -> 姿态阵
% Prototype: m = rv2m(rv)
% Input: rv - rotation vector
% Output: m - corresponding DCM, such that

	xx = rv(1)*rv(1); yy = rv(2)*rv(2); zz = rv(3)*rv(3);
	n2 = xx+yy+zz;
    if n2<1.e-8
        a = 1-n2*(1/6-n2/120); b = 0.5-n2*(1/24-n2/720);  % a->1, b->0.5
    else
        n = sqrt(n2);
        a = sin(n)/n;  b = (1-cos(n))/n2;
    end
	arvx = a*rv(1);  arvy = a*rv(2);  arvz = a*rv(3);
	bxx = b*xx;  bxy = b*rv(1)*rv(2);  bxz = b*rv(1)*rv(3);
	byy = b*yy;  byz = b*rv(2)*rv(3);  bzz = b*zz;
	m = zeros(3,3);
	% m = I + a*(rvx) + b*(rvx)^2;
	m(1)=1     -byy-bzz; m(4)= -arvz+bxy;     m(7)=  arvy+bxz;
	m(2)=  arvz+bxy;     m(5)=1     -bxx-bzz; m(8)= -arvx+byz;
	m(3)= -arvy+bxz;     m(6)=  arvx+byz;     m(9)=1     -bxx-byy;

Explicación de AI:
esta función es una función que convierte un vector de rotación en una matriz de pose. Toma un vector de rotación como entrada y devuelve la matriz de pose correspondiente como salida. El proceso es el siguiente:

  1. Primero, la función calcula los tres componentes del vector de rotación (es decir, xx, yy y zz) tomando el producto escalar del vector de rotación de entrada y el vector unitario, respectivamente.
  2. A continuación, la función calcula una variable n2 que es igual a la suma de los cuadrados de las tres componentes del vector de rotación. Si n2 es menor que un umbral pequeño (1.e-8), entonces la longitud del vector de rotación es muy cercana a cero, en cuyo caso se utiliza una solución aproximada para calcular los elementos de la matriz de pose.
  3. Si n2 es mayor o igual a 1.e-8, significa que la longitud del vector de rotación no es 0. En este momento, se utiliza la expansión de la serie de Taylor para calcular los elementos de la matriz de actitud. En este caso, la función primero calcula la longitud n del vector de rotación y luego calcula los valores de sin(n) y (1-cos(n)) según la longitud n, que se utilizará para construir el elementos de la matriz de pose.
  4. A continuación, la función construye cada elemento de la matriz de pose en función de los valores calculados anteriormente. Estos elementos incluyen a rv(1), a rv(2) y a rv(3), y b xx, b rv(1) rv(2), b rv(1) rv(3), b yy, b rv(2) rv(3) y bzz .
  5. Finalmente, la función llena estos elementos en una matriz de 3x3 y devuelve esta matriz como salida.

En resumen, la función de esta función es convertir el vector de rotación en una matriz de pose. Utiliza la expansión de la serie de Taylor y soluciones aproximadas para manejar el caso en el que la longitud del vector de rotación es cercana a cero para evitar inestabilidades numéricas.

11. Matriz antisimétrica

askew: Encuentre la matriz antisimétrica del vector tridimensional

function m = askew(v)
    m = [ 0,     -v(3),   v(2); 
          v(3),   0,     -v(1); 
         -v(2),   v(1),   0     ];

Supongo que te gusta

Origin blog.csdn.net/daoge2666/article/details/131640848
Recomendado
Clasificación