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.

Estimación de la transformación de cámara a IMU mediante calibración extrínseca

Desde R2024a

Este ejemplo muestra el proceso de calibración extrínseca entre una cámara y una IMU para estimar la transformación homogénea SE(3), también conocida como transformación rígida. Este proceso es necesario para garantizar el rendimiento preciso de los algoritmos de odometría visual-inercial (VIO) y de localización y mapeo simultáneos visual-inerciales (VI-SLAM), que son componentes integrales de un sistema de navegación visual-inercial (VINS). Los sistemas de navegación visual-inercial se basan en estos algoritmos para la estimación precisa del estado durante el mapeo y los flujos de trabajo de navegación autónoma.

Visión general

El objetivo de la calibración extrínseca de la cámara-IMU es determinar con precisión la transformación SE(3) que define la relación espacial entre la cámara y la IMU. La calidad y variedad de los datos de calibración determinan la confiabilidad de esta transformación. Por lo tanto, es esencial evaluar si la transformación estimada es válida y confiable para su uso en flujos de trabajo posteriores. Este ejemplo lo guía a través de los pasos para estimar y validar la transformación extrínseca. Esta figura visualiza la transformación de la cámara a IMU y proporciona una referencia visual para comprender el proceso de calibración extrínseca.

IMU_CAMERA_2.png

Requisitos previos

Este ejemplo supone que

  • Se recopilan datos de calibración de la cámara-IMU. Siempre que sea posible mover la configuración del sensor, siga las recomendaciones de recopilación de datos para recopilar datos. De lo contrario, mueva la configuración del sensor aleatoriamente para rotar y acelerar en las posibles direcciones. Sin rotaciones alrededor de todos los ejes de coordenadas de la IMU, la traducción estimada entre la cámara y la IMU puede ser errónea.

  • Las mediciones de IMU deben estar calibradas. Para obtener más información, consulte la función accelcal.

  • Se conocen los parámetros intrínsecos de la cámara. Para obtener más información sobre los parámetros intrínsecos de la cámara, consulte la sección Parámetros de calibración de la cámara de What Is Camera Calibration? (Computer Vision Toolbox).

  • Se conocen los parámetros de ruido de la IMU o hay datos estáticos de la IMU disponibles. En este ejemplo, se calculan los parámetros de ruido necesarios utilizando el análisis de varianza de Allan en 3 horas de datos estáticos de IMU. Para obtener mejores resultados, utilice secuencias IMU registradas al menos durante 3 horas. Para obtener más información sobre la estimación de parámetros de ruido, consulte Análisis de ruido del sensor inercial utilizando la varianza de Allan.

Cargue los datos del archivo CameraIMUCalibrationData.mat que se calcula previamente a partir de los archivos de bolsa ROS1 static_imu_data.bag (Descarga: 811 MB) y camera_imu_calibration_data.bag (Descarga: 443 MB) contenidos en el conjunto de datos SLAM visual Lidar de WPI [1]. Utilice helperProcessData para generar el archivo MAT. El archivo mat contiene detección de patrones en imágenes de calibración, mediciones IMU, marcas de tiempo correspondientes y parámetros intrínsecos de la cámara. Para leer datos sin procesar del sensor de la bolsa ROS1, utilice helperROSReadData.

outputFolder = fullfile(tempdir,'Calibration');

dataURL = ['https://ssd.mathworks.com/supportfiles/shared_nav_vision/data/' ...
            'camera_imu_calibration.zip'];

data = helperDownloadVICalibrationData(outputFolder,dataURL);

Inicialice los parámetros intrínsecos de la cámara conocidos específicos de este conjunto de sensores.

focalLength = data.CameraFocalLength;
principalPoint = data.CameraPrincipalPoint;
imageSize = data.ImageSize;
camIntrinsics = cameraIntrinsics(focalLength,principalPoint,imageSize);

Calcular la frecuencia de muestreo de la IMU a partir de las mediciones estáticas de la IMU.

imuSampleRate = ceil(1/mean(seconds(diff(data.StaticIMUMeasurements.Time))));

Utilice la función auxiliar helperComputeNoiseParamsUsingAllanVariance para calcular los parámetros de ruido IMU utilizando el método de varianza de Allan.

imuParams = helperComputeNoiseParamsUsingAllanVariance(data.StaticIMUMeasurements,imuSampleRate);

Ejecutar calibración

El primer paso en el proceso de calibración es detectar el patrón de tablero de ajedrez dentro de las imágenes de calibración. Este patrón permite que el algoritmo de calibración determine con precisión la trayectoria de la cámara. En este ejemplo, la detección del tablero de ajedrez está precalculada. Utilice la función detectCheckerboardPoints de Computer Vision Toolbox™ para detectar el patrón en las imágenes de calibración de entrada como se muestra a continuación.

[patternDetections,boardSize,imagesUsed] = detectCheckerboardPoints(...
     images,HighDistortion=false,ShowProgressBar=true, ...
     PartialDetections=false);
for k = 1:size(patternDetections,3)
    patternDetections(:,:,k) = undistortPoints(patternDetectionss(:,:,k), camIntrinsics);
end

Genere un patrón 2-D de los puntos del tablero de ajedrez en función del tamaño del tablero determinado y el tamaño del cuadrado de 0.04 metros. Se supone que el patrón es planar y existe en el plano XY del marco de coordenadas del mundo de la cámara. Este patrón es esencial ya que proporciona puntos de referencia fácilmente identificables en las imágenes. Estos puntos permiten que el algoritmo de calibración determine los parámetros extrínsecos de la cámara comparando estas posiciones 3D conocidas de las esquinas del tablero de ajedrez con sus proyecciones 2D en el plano de imagen de la cámara.

squareSize = data.CheckerBoardSquareSize; % in meters
boardSize = data.CheckerBoardSize;
patternPoints = patternWorldPoints("checkerboard",boardSize,squareSize);

Estime la trayectoria de la cámara, incluida la traslación 3D y la rotación 3D en el marco del mundo de la cámara utilizando los puntos de patrón de tablero de ajedrez generados y la detección de patrón de tablero de ajedrez.

ax = [];
numCameras = size(data.PatternDetections,3);
cameraPoses = repelem(rigidtform3d, numCameras, 1);
reprojectionErrors = nan(numCameras,1);
for imgId = 1:numCameras
    imagePoints = data.PatternDetections(:,:,imgId);
    valid = ~isnan(imagePoints(:,1));
    if length(find(valid)) >= 3
        % at least 3 valid points are needed for pose estimation
        imPoints = imagePoints(valid,1:2);
        Tr = estimateExtrinsics(imPoints,patternPoints(valid,1:2),camIntrinsics);
        T = extr2pose(Tr);
        worldPoints = [patternPoints(valid,1:2),zeros(length(find(valid)),1)];
        projectedPoints = world2img(worldPoints,Tr,camIntrinsics);
        reprojectionErrors(imgId) = mean(vecnorm(projectedPoints-imPoints,2,2));
        cameraPoses(imgId) = T;
        % plot camera pose estimates
        ax = helperPlotCameraPoses(ax,patternPoints,T);
    end
end

Figure contains an axes object. The axes object with title Camera pose estimates, xlabel Z (m), ylabel Y (m) contains 12 objects of type line, text, patch. One or more of the lines displays its values using only markers These objects represent Pattern points, Camera poses.

validImageIds = reprojectionErrors < 1;

Cree un objeto cameraIMUCalibrationOptions para definir las configuraciones que se utilizarán para la calibración extrínseca. Establezca UndistortPoints en false para no aplicar corrección de distorsión a los puntos del tablero de ajedrez detectados. Normalmente, se establece en false si las imágenes ya están desdistorsionadas o si la distorsión no es un problema. La opción ImageTime se configura con las marcas de tiempo de las imágenes, lo que es crucial para sincronizar las imágenes con los datos de la IMU. La opción CameraInformation está configurada para especificar un valor de información mayor de 100 en lugar del valor predeterminado de 1. Un mayor valor de información transmite una mayor confianza en la entrada de detección de patrones.

calibOptions = cameraIMUCalibrationOptions(UndistortPoints=false, ...
                                           ImageTime=data.ImageTime(validImageIds), ...
                                           CameraInformation=100*eye(2), ...
                                           CameraPoses=cameraPoses(validImageIds));

Ejecute la calibración extrínseca utilizando la función estimateCameraIMUTransform. Especifique los puntos de tablero de ajedrez detectados en las imágenes, los puntos del mundo 3D del patrón de tablero de ajedrez, las mediciones de IMU, los parámetros intrínsecos de la cámara conocidos, los parámetros de ruido de IMU y las opciones de calibración. La función estima la transformación espacial entre la cámara y la IMU y los parámetros de calibración que cuantifican la calidad de la calibración, como los errores de reproyección y las poses estimadas de la cámara.

[tform,params] = estimateCameraIMUTransform(data.PatternDetections(:,:,validImageIds), ...
                                            patternPoints, ...
                                            data.IMUMeasurements, ...
                                            camIntrinsics, ...
                                            imuParams, ...
                                            calibOptions);

Validar calibración

Visualice la transformación extrínseca estimada y confirme visualmente que la transformación está dentro de los límites físicos esperados. La precisión de las estimaciones de traducción entre la cámara y la IMU depende de los movimientos de rotación capturados durante la adquisición de datos. Para obtener una estimación de la traducción más precisa, gire la configuración combinada del sensor de la cámara y la IMU alrededor de cada uno de los ejes de la IMU mientras recopila datos. Tenga en cuenta que si la recopilación de datos implica movimientos predominantemente planares, la estimación de la traslación a lo largo de ciertos ejes de la IMU puede ser inexacta. Por ejemplo, si solo mueve la configuración de la cámara-IMU en el plano xy, las estimaciones de traducción que involucran el eje z pueden ser inexactas.

showTransform(params,ScaleFactor=0.005);

Figure contains an axes object. The axes object with title Camera in local IMU reference frame, xlabel X (m), ylabel Y (m) contains 11 objects of type line, text, patch. This object represents IMU.

Para garantizar que los resultados de la calibración sean precisos, evalúe el error de reproyección del punto de patrón por imagen y el error de predicción de IMU. Los valores bajos en ambas métricas sugieren que la transformación estimada alinea las trayectorias de la cámara y la IMU de manera efectiva. Los errores de reproyección y predicción proporcionan una indicación aproximada del rendimiento esperado al utilizar la transformación estimada en aplicaciones VIO. Debe seleccionar los umbrales de error en función de los requisitos específicos del sistema VIO en uso. Por ejemplo, en este ejemplo, establezca el umbral de error de reproyección en 0.5, el umbral de error de predicción de traducción en 1e-2 y el umbral de error de predicción de rotación en 1e-3. Estos valores generalmente se consideran aceptables para una amplia gama de tareas VIO.

reprojectionErrorThreshold = 0.5;
predictionErrorThreshold = [1e-2 1e-3];
[status,info] = validate(params,reprojectionErrorThreshold,predictionErrorThreshold);

Verifique el estado de calibración. Si el indicador de estado es cero, entonces la calibración fue exitosa. En este caso, como es cero, no hubo problemas con la calibración.

status
status = 
  CameraIMUCalibrationStatus enumeration

    Success

La calibración es exitosa. Observe los errores de reproyección y los errores de predicción de IMU están por debajo de los umbrales esperados.

Evaluar errores de reproyección

Utilice la función showReprojectionErrors para visualizar los errores de reproyección e identificar visualmente las imágenes que están por debajo del umbral de error de reproyección.

showReprojectionErrors(params,threshold=reprojectionErrorThreshold);

Figure contains an axes object. The axes object with title Mean Reprojection Error per image, xlabel Images, ylabel Mean Error in Pixels contains 3 objects of type line, bar. These objects represent Overall mean error: 0.10198 pixels, Threshold: 0.5 pixels.

Un error de reproyección menor que el umbral, como se ve en el gráfico, conduce a una calibración exitosa si no se encuentran otros problemas de validación. Un error de reproyección mayor da como resultado una calibración fallida. En tales casos, estos pasos pueden ayudar a abordar estos problemas:

  • Excluya las imágenes con errores de reproyección notablemente altos del conjunto de datos de calibración y vuelva a calibrar.

  • Si muchas imágenes presentan altos errores de reproyección tanto antes como después de la calibración, esto podría indicar una detección de patrones defectuosa, posiblemente causada por problemas como desenfoque de movimiento o visibilidad incompleta de la placa. En este caso, considere adquirir nuevos datos de calibración. Para obtener recomendaciones sobre la recopilación de datos, consulte la sección Recomendaciones sobre la recopilación de datos.

  • Si solo se presentan errores de reproyección altos después de la calibración, esto indica una falta de confiabilidad en la detección de puntos característicos de la cámara durante el proceso de calibración. Para mejorar la confiabilidad de la detección de puntos característicos, considere aumentar la propiedad CameraInformation dentro de cameraIMUCalibrationOptions.

Errores de predicción de acceso a IMU

Utilice la función showIMUPredictionErrors para visualizar errores de predicción de IMU e identificar visualmente cualquier error de predicción de traducción y predicción de rotación de IMU que esté por debajo de los umbrales especificados. Un error de predicción mayor puede indicar una desalineación entre las trayectorias de la cámara y la IMU. Si estos grandes errores de predicción están presentes pero se superan todas las demás comprobaciones, esto indica que el conjunto de datos de calibración carece de información suficiente para estimar con precisión la transformación entre la cámara y la IMU. En tales circunstancias, es posible que sea necesario recopilar un nuevo conjunto de datos de calibración, asegurándose de que capture una gama más amplia de movimientos y orientaciones para mejorar la solidez de la estimación de la transformación.

showIMUPredictionErrors(params,threshold=predictionErrorThreshold);

Figure contains 6 axes objects and another object of type uitabgroup. Axes object 1 with title IMU rotation prediction error along X, xlabel Successive Image pairs, ylabel Error in radians contains 3 objects of type line, bar. These objects represent Overall mean error: 7.5063e-05 radians, Threshold: 0.001 radians. Axes object 2 with title IMU rotation prediction error along Y, xlabel Successive Image pairs, ylabel Error in radians contains 3 objects of type line, bar. These objects represent Overall mean error: 9.2461e-05 radians, Threshold: 0.001 radians. Axes object 3 with title IMU rotation prediction error along Z, xlabel Successive Image pairs, ylabel Error in radians contains 3 objects of type line, bar. These objects represent Overall mean error: 4.6114e-05 radians, Threshold: 0.001 radians. Axes object 4 with title IMU translation prediction error along X, xlabel Successive Image pairs, ylabel Error in meters contains 3 objects of type line, bar. These objects represent Overall mean error: 9.1412e-05 meters, Threshold: 0.01 meters. Axes object 5 with title IMU translation prediction error along Y, xlabel Successive Image pairs, ylabel Error in meters contains 3 objects of type line, bar. These objects represent Overall mean error: 8.257e-05 meters, Threshold: 0.01 meters. Axes object 6 with title IMU translation prediction error along Z, xlabel Successive Image pairs, ylabel Error in meters contains 3 objects of type line, bar. These objects represent Overall mean error: 3.2259e-05 meters, Threshold: 0.01 meters.

Evaluar la estimación del sesgo de la UMI

Utilice la función showIMUBiasEstimates para visualizar las estimaciones de sesgo de IMU después de la calibración e identificar visualmente que las estimaciones de sesgo están dentro de los límites esperados que la calibración determinó a partir de los parámetros de ruido de IMU especificados. Si las estimaciones de sesgo superan estos límites, esta discrepancia puede deberse a parámetros de ruido de IMU inexactos o a un movimiento excesivamente rápido de la cámara durante la recopilación de datos. Para resolver estos problemas de calibración:

  • Si el sesgo de la IMU es la única preocupación, refine los parámetros de ruido de la IMU.

  • Si tanto la evaluación del error de reproyección como la verificación del valor de sesgo de la IMU fallan, considere volver a capturar los datos de calibración. Al recuperar datos, opere la configuración del sensor IMU de la cámara de manera más gradual. Para obtener más recomendaciones, consulte la sección Recomendaciones de recopilación de datos.

showIMUBiasEstimates(params);

Figure contains 6 axes objects and another object of type uitabgroup. Axes object 1 with title Gyroscope Bias along X, xlabel time (seconds), ylabel Bias in radians/s contains 3 objects of type line. These objects represent Bias, Bounds. Axes object 2 with title Gyroscope Bias along Y, xlabel time (seconds), ylabel Bias in radians/s contains 3 objects of type line. These objects represent Bias, Bounds. Axes object 3 with title Gyroscope Bias along Z, xlabel time (seconds), ylabel Bias in radians/s contains 3 objects of type line. These objects represent Bias, Bounds. Axes object 4 with title Accelerometer Bias along X, xlabel time (seconds), ylabel Bias in m/s^2 contains 3 objects of type line. These objects represent Bias, Bounds. Axes object 5 with title Accelerometer Bias along Y, xlabel time (seconds), ylabel Bias in m/s^2 contains 3 objects of type line. These objects represent Bias, Bounds. Axes object 6 with title Accelerometer Bias along Z, xlabel time (seconds), ylabel Bias in m/s^2 contains 3 objects of type line. These objects represent Bias, Bounds.

Más información sobre

Sistema de navegación visual-inercial

Los sensores de la cámara y la unidad de medición inercial (IMU) trabajan juntos en sistemas de navegación autónoma en vehículos aéreos no tripulados (UAV) y vehículos terrestres. El tamaño compacto, el menor coste y el consumo reducido de energía hacen que esta combinación de sensores sea una opción popular para la estimación de estado.

Estas imágenes muestran varias configuraciones de montaje para pares de sensores IMU y cámara en vehículos aéreos no tripulados y vehículos terrestres. Estas configuraciones son importantes para determinar el estado actual del vehículo, proporcionando información detallada sobre la traslación y orientación tridimensional con respecto al estado inicial.

UAV_With_IMU_CAMERA_1.png GROUND_With_IMU_CAMERA_1.png

Los pares de sensores de cámara e IMU funcionan muy bien entre sí en la estimación o localización del estado. Al fusionar las mediciones de ambos sensores, la cámara puede mitigar el impacto del ruido en los datos de la IMU, mientras que la IMU puede compensar las pérdidas de seguimiento que la cámara pueda experimentar. Para combinar eficazmente las mediciones de la cámara y la IMU en sistemas como los grafos de factores, es esencial tener una transformación precisa entre los sensores de la cámara y la IMU. Esta transformación permite el uso de mediciones de un marco de coordenadas a otro.

Recomendaciones para la recopilación de datos

Para lograr una calibración precisa entre una cámara y un sensor IMU, es importante seguir un conjunto de prácticas recomendadas durante el proceso de recopilación de datos. Estas prácticas garantizan que el algoritmo de calibración tenga datos suficientes para estimar las trayectorias de los sensores y alinear sus marcos de coordenadas. Utilice estos consejos para recopilar datos de calibración de calidad:

  • Utilice un tablero de ajedrez asimétrico que contenga un número par de cuadrados a lo largo de un borde y un número impar de cuadrados a lo largo del otro borde, con dos cuadrados de esquina negros a lo largo de un lado y dos cuadrados de esquina blancos en el lado opuesto. Esto ayuda a estimar la orientación de la cámara.

  • Coloque la configuración de la cámara-IMU frente a un objetivo de calibración visual, como un tablero de ajedrez. Asegúrese de que la configuración se mueva lo suficiente para registrar una aceleración y una velocidad angular distintas de cero, que son fundamentales para estimar la trayectoria de la IMU.

  • Mantenga una visibilidad constante del objetivo de calibración durante la recopilación de datos para permitir una estimación precisa de la trayectoria de la cámara.

  • Mueva la configuración a una velocidad moderada durante la recopilación de datos de calibración. Los movimientos extremadamente lentos pueden generar datos IMU insuficientes, mientras que los movimientos demasiado rápidos pueden provocar borrosidad de movimiento en las imágenes de la cámara.

  • Evite los movimientos rápidos para evitar el desenfoque de movimiento en los datos de imagen de la cámara, lo que puede comprometer la precisión de la estimación de la trayectoria de la pose de la cámara y la calibración extrínseca.

  • Gire la configuración alrededor de cada uno de los ejes de la IMU para determinar con precisión la posición relativa de la cámara con respecto a la IMU a lo largo de esos ejes.

  • Traslade la configuración a lo largo de cada uno de los ejes de la IMU para determinar con precisión la orientación relativa de la cámara con respecto a la IMU a lo largo de esos ejes.

  • Evite realizar giros de 180 grados cuando utilice objetivos de calibración con cuadrícula circular o de tablero de ajedrez, ya que dichos movimientos pueden introducir ambigüedades rotacionales.

Para obtener datos completos de rotación y traslación, siga un patrón de movimiento específico que cubra todos los ejes de la IMU. Suponiendo que el eje x apunta hacia adelante hacia el tablero de calibración y se encuentra paralelo al suelo, el eje y se extiende hacia la izquierda en el mismo plano y el eje z se eleva perpendicularmente al suelo, realice los siguientes movimientos:

  1. Traslade la configuración tres veces en cada uno de los ejes x, y y z, tanto en dirección positiva como negativa.

  2. Gire el montaje tres veces alrededor de cada uno de los ejes x, y y z tanto en sentido horario como antihorario.

  3. Incorporar traslaciones y rotaciones aleatorias en 3D para cubrir una variedad de movimientos.

  4. Mantenga la configuración estacionaria durante un par de segundos al inicio y al final de la recopilación de datos para ayudar a la estimación del sesgo de IMU.

Esta animación muestra un ejemplo de una rutina de recopilación de datos que muestra algunas de estas mejores prácticas.

HandMovementRecommondations.gif

Proceso de calibración extrínseca

Esta sección ilustra el flujo de trabajo para el proceso de calibración extrínseca de la cámara y la IMU, donde se utiliza el tablero de ajedrez como objetivo de calibración visual.

Process.png

  1. Detectar puntos de tablero de ajedrez a partir de las imágenes de calibración.

Detect_Checkerboard_Points.png

2. Calcule la trayectoria de la cámara (posición 3D + orientación) con precisión utilizando los puntos de tablero de ajedrez detectados.

Estimate_Camera_Trajectory.png

3. Predecir la trayectoria de la IMU utilizando la preintegración de mediciones de la IMU, el acelerómetro y el giroscopio. Puede utilizar la función predict para hacer esto.

Predict_IMU_Trajectory.png

4 Alinee las trayectorias de la cámara y la IMU para estimar la rotación y la traslación en 3D de la cámara a la IMU.

Align_Cam_IMU_Trajectories.png

Referencia

[1] Conjunto de datos SLAM visuales Lidar de WPI, repositorio de GitHub, https://github.com/WPI-APA-Lab/WPI-Lidar-Visual-SLAM-Dataset

Consulte también

|

Temas