Contenido principal

Esta página se ha traducido mediante traducción automática. Haga clic aquí para ver la última versión en inglés.

estimateGravityRotationAndPoseScale

Estimar la rotación de la gravedad y la escala de la pose utilizando la optimización del gráfico de factores

Desde R2023a

    Descripción

    [gRot,scale,info] = estimateGravityRotationAndPoseScale(poses,gyroscopeReadings,accelerometerReadings) estima la rotación de gravedad y la escala de pose de las poses de entrada utilizando la optimización del gráfico de factores. La rotación de gravedad y la escala de pose le ayudan a transformar las poses de la cámara de entrada al marco de referencia de navegación local de una unidad de medición inercial (IMU). La función toma las poses de la cámara, las lecturas del giroscopio y las lecturas del acelerómetro de la IMU como entrada. Además de la rotación de gravedad y la escala de pose, devuelve info, que contiene las métricas utilizadas para validar las estimaciones, junto con estimaciones de velocidad y sesgo que puede utilizar para actualizar el gráfico de factores. Para obtener más información sobre la rotación de la gravedad, la escala de la pose y la validación de las estimaciones, consulte Rotación de gravedad y escala de pose.

    Nota

    Las poses de entrada deben estar en el marco de referencia IMU inicial, a menos que especifique el argumento de nombre-valor SensorTransform. Luego las poses pueden estar en un marco diferente.

    ejemplo

    [gRot,scale,info] = estimateGravityRotationAndPoseScale(___,Name=Value) especifica opciones que utilizan uno o más argumentos de nombre-valor para mejorar el proceso de estimación, además de los argumentos de entrada de la sintaxis anterior.

    ejemplo

    Ejemplos

    contraer todo

    Especifique poses de entrada en el marco de referencia de pose inicial de la cámara.

    poses = [0.1 0 0 0.7071 0 0 0.7071; ...
             0.1 0.4755 -0.1545 0.7071 0 0 0.7071];

    Especifique 10 lecturas de giroscopio y acelerómetro entre fotogramas de cámara consecutivos.

    accelReadings = repmat([97.9887 -3.0315 -22.0285],10,1);
    gyroReadings = zeros(10,3);

    Especifique los parámetros de la IMU.

    params = factorIMUParameters(SampleRate=100, ...
                                 ReferenceFrame="NED");

    Especifique una transformación que consista en traslación y rotación 3D para transformar las poses desde el marco de referencia de pose inicial de la cámara al marco de referencia de pose inicial de IMU.

    sensorTransform = se3(eul2rotm([-pi/2 0 0]),[0 0.1 0]);

    Especifique las opciones del solver de gráficos de factores.

    opts = factorGraphSolverOptions(MaxIterations=50);

    Calcule la rotación de la gravedad y la escala de pose utilizando mediciones IMU entre fotogramas de la cámara.

    [gRot,scale,solutionInfo] = estimateGravityRotationAndPoseScale(poses, ...
                                {gyroReadings},{accelReadings}, ...
                                IMUParameters=params, ...
                                SensorTransform=sensorTransform, ...
                                SolverOptions=opts)
    gRot = 3×3
    
        0.9804   -0.0656   -0.1856
       -0.1765    0.1251   -0.9763
        0.0872    0.9900    0.1111
    
    
    scale = 
    0.7357
    
    solutionInfo = struct with fields:
                        Status: FAILURE_NO_CONVERGENCE
             TranslationErrors: [0.0117 0.0123 0.0024]
                RotationErrors: [0.0126 0.0300 0.0607]
        VelocityInIMUReference: [2×3 double]
                          Bias: [2×6 double]
            PoseToIMUTransform: [1×1 se3]
           PosesInIMUReference: [2×7 double]
                   InitialCost: 2.3123e+03
                     FinalCost: 27.9810
                  FixedNodeIDs: [2 3 6]
              IsSolutionUsable: 1
            NumSuccessfulSteps: 30
          NumUnsuccessfulSteps: 21
              OptimizedNodeIDs: [0 1 4 5 7 8]
               TerminationType: 1
                     TotalTime: 0.0085
    
    

    Utilice la rotación por gravedad para transformar el vector de gravedad desde el marco de navegación local al marco de referencia inicial de la pose de la cámara.

    % gravity direction in NED frame is along Z-Axis.
    gravityDirectionNED = [0; 0; 1];
    % gravity direction in pose reference frame.
    gravityDirection = gRot*gravityDirectionNED
    gravityDirection = 3×1
    
       -0.1856
       -0.9763
        0.1111
    
    
    % gravity vector in pose reference frame.
    gravityMagnitude = 9.81;
    gravity = gravityDirection*gravityMagnitude
    gravity = 3×1
    
       -1.8211
       -9.5777
        1.0900
    
    

    Argumentos de entrada

    contraer todo

    Poses de cámara, a una escala desconocida estimada mediante estructura a partir de movimiento (SfM) basada en cámara monocular, especificada como uno de estos tipos de pose:

    • Matriz N por 7, donde cada fila tiene la forma [x y z qw qx qy qz]. Cada fila define la posición xyz, en metros, y la orientación del cuaternión, [qw qx qy qz].

    • Matriz de objetos se3.

    • Tabla de poses de cámara devuelta por la función poses (Computer Vision Toolbox) del objeto imageviewset (Computer Vision Toolbox).

    • Matriz de objetos rigidtform3d (Image Processing Toolbox).

    Se sugiere establecer la profundidad media de las poses en 1. Esto acerca las poses a la escala métrica de las mediciones de IMU e inicializa el problema de optimización de la estimación de escala cerca de la escala de ground-truth .

    Lecturas del giroscopio entre vistas de cámara o poses consecutivas, especificadas como un arreglo de celdas de (N-1) elementos de matrices de M por 3, en radianes por segundo. N es el número total de vistas de cámara o poses especificado en poses. M es el número de lecturas del giroscopio entre vistas de cámara consecutivas y las tres columnas de gyroscopeReadings representan las [x y z] mediciones entre las vistas de cámara o poses.

    Tenga en cuenta que puede haber un número diferente de lecturas entre vistas de cámara consecutivas.

    Tipos de datos: cell

    Lecturas del acelerómetro entre vistas de cámara o poses consecutivas, especificadas como un arreglo de celdas de (N-1) elementos de matrices de M por 3, en metros por segundo al cuadrado. N es el número total de vistas de cámara o poses especificado en poses. M es el número de lecturas del acelerómetro entre vistas de cámara consecutivas y las tres columnas de accelerometerReadings representan las [x y z] mediciones entre las vistas de cámara o poses.

    Tenga en cuenta que puede haber un número diferente de lecturas entre vistas de cámara consecutivas.

    Tipos de datos: cell

    Argumentos de par nombre-valor

    contraer todo

    Especifique pares de argumentos opcionales como Name1=Value1,...,NameN=ValueN, donde Name es el nombre del argumento y Value es el valor correspondiente. Los argumentos nombre-valor deben aparecer después de los otros argumentos, pero el orden de los pares no importa.

    Ejemplo: estimateGravityRotationAndPoseScale(poses,gyroscopeReadings,accelerometerReadings,IMUParameters=factorIMUParameters(SampleRate=100)) estima la rotación de la gravedad basándose en una IMU.

    Parámetros IMU, especificados como un objeto factorIMUParameters.

    Cada IMU puede tener características diferentes especificadas por sus parámetros IMU. Los valores de los parámetros predeterminados en el objeto factorIMUParameters especifican covarianzas de ruido de identidad, que son significativamente más grandes que las covarianzas IMU típicas en escenarios prácticos. Por lo tanto, estimar y especificar los parámetros de la IMU es importante para estimar con precisión la rotación de la gravedad y la escala de la pose. Si se desconocen los parámetros de ruido de IMU, AccelerometerNoise, AccelerometerBiasNoise, GyroscopeNoise y GyroscopeBiasNoise, utilice el análisis de varianza de Allan de las mediciones de IMU para estimarlos. Para ver un ejemplo de cómo utilizar la varianza de Allan para determinar los parámetros de ruido, consulte Análisis de ruido del sensor inercial utilizando la varianza de Allan.

    Ejemplo: IMUParameters=factorIMUParameters(SampleRate=100)

    Opciones del solucionador, especificadas como un objeto factorGraphSolverOptions.

    Ejemplo: SolverOptions=factorGraphSolverOptions(MaxIterations=50)

    Transformación del marco de referencia de la pose de entrada al marco de referencia del sensor IMU inicial, especificado como un objeto se3.

    La transformación entre el marco de referencia de la pose de entrada y el marco IMU inicial consiste en una traslación y rotación en 3D. Por ejemplo, si las poses de entrada son poses de la cámara en el marco de referencia inicial del sensor de la cámara, entonces la transformación del sensor gira y traduce una pose o un punto en el marco de referencia inicial del sensor de la cámara al marco de referencia inicial del sensor IMU. El origen del marco de referencia del sensor inicial es la primera pose de ese sensor.

    En algunos casos, la cámara y la IMU pueden estar unidas rígidamente a un marco de referencia base común, y las poses se calculan en el marco de referencia base. En este caso, la transformación del sensor especifica la transformación del marco de referencia base al marco de referencia IMU. Si se desconoce la transformación del sensor, se puede estimar mediante calibración extrínseca. Para ver un ejemplo que muestra el proceso de calibración extrínseca entre una cámara y una IMU para estimar una transformación homogénea SE(3), consulte Estimación de la transformación de cámara a IMU mediante calibración extrínseca.

    Ejemplo: SensorTransform=se3(eul2rotm([-pi/2 0 0]),[0 0.1 0])

    Desde R2025a

    Poses de entrada fijas durante la estimación, especificadas como true o false lógicos. Cuando se establece en true, la función trata las poses de entrada como parámetros fijos durante el proceso de optimización de la estimación. Cuando se establece en false, la función trata las poses de entrada como parámetros ajustables que puede refinar durante la optimización, pero solo dentro de un pequeño vecindario de sus valores especificados. No fijar las poses proporciona al evaluador más libertad y, en general, logra mejores resultados. Si espera que las poses de entrada sean muy precisas, corregirlas es computacionalmente menos costoso y puede generar una mayor precisión.

    Desde R2025a

    Estimación de velocidad inicial para la IMU, especificada como un vector fila de tres elementos. Por defecto, la velocidad inicial es desconocida. Especificar la velocidad inicial ayuda a estimar el sesgo. Puede calcular la velocidad inicial a partir de mediciones GPS.

    Ejemplo: InitialVelocity=[0 0 0] specifies the initial velocity in all directions as 0

    Tipos de datos: double

    Desde R2025a

    Valor de escala mínimo válido, especificado como un escalar numérico. double. Cuando scale es menor que este valor, el campo Status de info indica fallo debido a mala escala. Los valores de escala bajos pueden indicar que la estimación no es exitosa debido a que el ruido en las mediciones de IMU domina las mediciones de IMU reales.

    El parámetro ScaleThreshold es especialmente útil cuando los puntos del mapa estimados mediante odometría visual monocular en la referencia de pose de entrada tienen una profundidad de medio de 1 metro. La profundidad media es la distancia media de todos los puntos de referencia triangulados alrededor de la cámara. En tales casos, el umbral de escala representa la profundidad mediana mínima permitida. Por ejemplo, si la profundidad media estimada de los puntos del mapa estimados en la referencia de pose de entrada es de 1 metro, mientras que la profundidad media de la ground-truth es de 10 metros, la escala de pose de la ground-truth es 10.

    Un escenario en el que es útil tener una profundidad media de 1 metro es si se determina el umbral de escala en función de las limitaciones de la distancia focal. Normalmente, la profundidad media de la escena no puede ser inferior a 1 mm debido a limitaciones de la distancia focal, ya que la cámara no puede observar con precisión ningún punto de referencia que se encuentre a 1 mm de su campo de visión. Por tanto, la profundidad media mínima permitida es de 1 mm. En este caso, tener la profundidad media en 1 puede ser útil, ya que permite establecer el umbral de escala en 1 mm, filtrando cualquier estimación de escala por debajo de este valor. Téngase en cuenta que el ejemplo de una profundidad mediana mínima permitida de 1 mm es puramente ilustrativo. En la práctica, se puede determinar empíricamente una profundidad media mínima permitida más realista basándose en los datos recopilados.

    Tipos de datos: double

    Desde R2025a

    Umbral de predicción de pose de IMU, especificado como un vector fila de dos elementos con la forma [rotationErrorThreshold translationErrorThreshold]. Si cualquier error de rotación en el campo RotationErrors o cualquier error de traducción en el campo TranslationErrors de info excede rotationErrorThreshold, translationErrorThreshold respectivamente, el campo Status de la estructura info indica una fallo debido a una mala predicción.

    El error de rotación y el error de traducción miden qué tan bien se alinean las predicciones de la pose de la IMU con las poses de entrada después de la estimación. Este argumento define los errores máximos aceptables de rotación y traslación en radianes y metros respectivamente.

    El error de rotación es la diferencia en la rotación relativa entre un par de poses de entrada sucesivas calculadas directamente a partir de las poses de entrada y utilizando la predicción de poses IMU.

    El error de traducción es la diferencia en la traducción relativa entre un par de poses de entrada sucesivas calculadas directamente a partir de las poses de entrada y utilizando la predicción de poses IMU.

    Durante la estimación, la optimización minimiza estos errores. Los errores más bajos indican una mejor alineación entre las predicciones de la pose de la IMU y las poses de entrada y, por lo tanto, mejores estimaciones. Si espera que las poses de entrada sean precisas, puede especificar umbrales de predicción más pequeños, ya que requieren que las predicciones de poses de IMU se alineen más de cerca con las poses de entrada. Utilice umbrales más grandes cuando espere que las poses de entrada sean menos precisas.

    Tipos de datos: double

    Argumentos de salida

    contraer todo

    Rotación de gravedad, devuelta como una matriz de 3 por 3, un objeto se3 o un objeto rigidtform3d (Image Processing Toolbox) similar al tipo de pose de entrada. Contiene la rotación necesaria para transformar el vector de gravedad desde el marco de referencia de navegación local de IMU (NED o ENU) al marco de referencia de pose de entrada.

    Multiplicador por el cual escalar las poses de entrada, devuelto como un escalar numérico. Utilice este valor para escalar las poses de entrada a las mismas unidades métricas que las medidas de la IMU.

    Tipos de datos: double

    Diagnósticos de estimación y resultados de optimización, devueltos como una estructura. Los campos de la estructura son:

    CampoDescripción
    Status

    Estado de los cheques, devuelto como una enumeración con uno de estos valores.

    Valor de enumeraciónDescripción
    SUCCESS

    Sin fallos.

    FAILURE_BAD_SCALE

    La escala está por debajo del umbral especificado.

    FAILURE_BAD_PREDICTION

    El error de predicción está por encima del umbral especificado. Esto indica que uno o más errores de rotación en el campo RotationErrors, o uno o más errores de traducción en el campo TranslationErrors, han excedido el valor rotationErrorThreshold, translationErrorThreshold, respectivamente, del argumento PredictionThreshold.

    FAILURE_BAD_BIAS

    La variación del sesgo con respecto al valor inicial está fuera de los límites calculados a partir de los valores de covarianza de sesgo proporcionados.

    FAILURE_BAD_SCALE_PREDICTION

    La escala está por debajo del umbral especificado y el error de predicción está por encima del umbral especificado.

    FAILURE_BAD_SCALE_BIAS

    La escala está por debajo del umbral especificado y la variación del sesgo respecto del valor inicial está fuera de los límites esperados.

    FAILURE_BAD_PREDICTION_BIAS

    El error de predicción está por encima del umbral especificado y la variación del sesgo respecto del valor inicial está fuera de los límites esperados.

    FAILURE_BAD_SCALE_PREDICTION_BIAS

    La escala está por debajo del umbral especificado, el error de predicción está por encima del umbral especificado y la variación del sesgo respecto del valor inicial está fuera de los límites esperados.

    FAILURE_BAD_OPTIMIZATION

    La optimización encontró errores y las estimaciones no se pueden utilizar.

    FAILURE_NO_CONVERGENCE

    La optimización de inicialización no convergió en el número especificado de iteraciones. Aumente el número máximo de iteraciones.

    TranslationErrors

    Errores de traducción en la predicción de la pose de IMU, devueltos como una matriz de (N-1) por 3. Cada fila representa la diferencia en la traducción relativa entre un par de poses de entrada sucesivas calculadas directamente a partir de las poses de entrada y utilizando la predicción de poses IMU, en la forma [x y z]. Un error de traducción menor indica que la traducción relativa predicha utilizando mediciones IMU es muy cercana a la estimación de odometría visual.

    RotationErrors

    Errores de rotación en la predicción de la pose de la IMU, devueltos como una matriz de (N-1) por 3. Cada fila representa la diferencia en la rotación relativa entre un par de poses de entrada sucesivas calculadas directamente a partir de las poses de entrada y utilizando la predicción de poses IMU, en la forma [x y z]. Un error de rotación menor indica que la rotación relativa predicha utilizando mediciones de IMU es muy cercana a la estimación de odometría visual.

    InitialCost

    Coste inicial del problema de mínimos cuadrados no lineales formulado por el gráfico de factores antes de la optimización.

    FinalCost

    Coste final del problema de mínimos cuadrados no lineales formulado por el gráfico de factores después de la optimización.

    Nota

    El coste es la suma de términos de error, conocidos como residuos, donde cada residual es una función de un subconjunto de mediciones de factores.

    NumSuccessfulSteps

    Número de iteraciones en las que el solver reduce el coste. Este valor incluye la iteración de inicialización en 0 además de las iteraciones del minimizador.

    NumUnsuccessfulSteps

    Número de iteraciones en las que la iteración no es numéricamente válida o el solver no reduce el coste.

    TotalTime

    Tiempo total de optimización del solver en segundos.

    TerminationType

    Tipo de terminación como un número entero en el rango [0, 2]:

    • 0 — Solver encontró una solución que cumple con el criterio de convergencia y disminuye el costo después de la optimización.

    • 1 — El solucionador no pudo encontrar una solución que cumpla con el criterio de convergencia después de ejecutar la cantidad máxima de iteraciones.

    • 2 — El solucionador finalizó debido a un error.

    IsSolutionUsable

    La solución se puede utilizar si 1 (true), no se puede utilizar si 0 (false).

    PosesInIMUReference

    Poses optimizadas transformadas en el marco de referencia de navegación IMU utilizando la rotación de gravedad estimada y la escala de pose, devueltas en el mismo formato que las poses de entrada.

    VelocityInIMUReference

    Estimaciones de velocidad, devueltas como una matriz numérica N por 3, que representan las velocidades en el marco de referencia de navegación de la IMU en los tiempos de muestreo de la pose de entrada. Puede especificar que estos valores se puedan establecer como estimaciones iniciales para los nodos de velocidad recién creados en el gráfico del factor inercial visual, utilizando la función nodeState.

    Bias

    Estimaciones de sesgo en los tiempos de muestreo de la pose de entrada, devueltas como una matriz numérica N por 6. Puede especificar estos valores como estimaciones iniciales para los nodos de sesgo recién creados en el gráfico del factor visual-inercial, utilizando la función nodeState.

    PoseToIMUTransform

    Transformación del marco de referencia de pose de entrada al marco de referencia de navegación IMU, devuelto como un objeto se3. Esta es la inversa de la rotación de la gravedad.

    Tipos de datos: struct

    Más acerca de

    contraer todo

    Referencias

    [1] Campos, Carlos, Richard Elvira, Juan J. Gomez Rodriguez, Jose M. M. Montiel, and Juan D. Tardos. “ORB-SLAM3: An Accurate Open-Source Library for Visual, Visual–Inertial, and Multimap SLAM.” IEEE Transactions on Robotics 37, no. 6 (December 2021): 1874–90. https://doi.org/10.1109/TRO.2021.3075644.

    Capacidades ampliadas

    expandir todo

    Generación de código C/C++
    Genere código C y C++ mediante MATLAB® Coder™.

    Historial de versiones

    Introducido en R2023a

    expandir todo