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.

rgbdvslam

Localización y mapeo visual simultáneo basado en características (vSLAM) y fusión de sensores visuales-inerciales con cámara RGB-D

Desde R2025a

    Descripción

    Utilice el objeto rgbdvslam para realizar localización y mapeo visual simultáneo (vSLAM) con datos de cámara RGB-D. RGB-D vSLAM combina información de profundidad de sensores, como cámaras RGB-D o sensores de profundidad, con imágenes RGB para estimar simultáneamente la posición de la cámara y crear un mapa del entorno. Para obtener más información sobre SLAM visual, consulte Implement Visual SLAM in MATLAB (Computer Vision Toolbox).

    El objeto rgbdvslam extrae características Oriented FAST y Rotated BRIEF (ORB) de imágenes leídas incrementalmente y luego rastrea esas características para estimar poses de cámara, identificar fotogramas clave y reconstruir un entorno 3D. El algoritmo vSLAM también busca cierres de bucle utilizando el algoritmo de bolsa de características y luego optimiza las poses de la cámara utilizando la optimización del gráfico de poses. Puede mejorar la precisión y la robustez del SLAM integrando este objeto con datos IMU para realizar una fusión de sensores visuales-inerciales.

    Creación

    Descripción

    vslam = rgbdvslam(intrinsics) crea un objeto SLAM visual RGB-D, vslam, utilizando los parámetros intrínsecos de la cámara especificados.

    El objeto rgbdvslam asume que las imágenes de color y profundidad han sido preregistradas con correspondencia uno a uno.

    El objeto representa puntos de mapas 3D y poses de cámara en coordenadas mundiales, y asume que la pose de la cámara del primer fotograma clave es una transformación de identidad rigidtform3d (Image Processing Toolbox).

    Nota

    El objeto rgbdvslam se ejecuta en varios subprocesos internamente, lo que puede retrasar el procesamiento de un cuadro de imagen agregado mediante la función addFrame. Además, el objeto que se ejecuta en varios subprocesos significa que el cuadro actual que el objeto está procesando puede ser diferente del cuadro agregado recientemente.

    vslam = rgbdvslam(intrinsics,depthScaleFactor) especifica el factor de corrección de profundidad de la cámara RGB-D, que normalmente proporciona el fabricante de la cámara. Utilice esta sintaxis cuando el factor de escala de profundidad del sensor no sea igual a 1.

    vslam = rgbdvslam(___,imuParameters) realiza SLAM visual-inercial RGB-D basado en el imuParameters especificado.

    vslam = rgbdvslam(intrinsics,PropertyName=Value) establece propiedades utilizando uno o más argumentos de nombre-valor. Por ejemplo, MaxNumPoints=850 establece el número máximo de puntos de características ORB para extraer de cada imagen en 850.

    ejemplo

    Argumentos de entrada

    expandir todo

    Parámetros intrínsecos de la cámara, especificados como un objeto cameraIntrinsics (Computer Vision Toolbox).

    Este argumento establece la propiedad Intrinsics.

    Factor de escala de profundidad, especificado como un escalar en unidades del mundo real, como metros. El factor de escala de profundidad es el factor de conversión que relaciona los valores de profundidad del sensor de profundidad con distancias del mundo real y normalmente se expresa en las mismas unidades que las mediciones de profundidad proporcionadas por el sensor, como milímetros, centímetros o metros. Este valor proporciona la información necesaria para transformar las medidas de profundidad a la escala métrica. Utilice el argumento depthScaleFactor cuando el valor del sensor que está utilizando no sea igual a 1.

    Para las coordenadas 3D del mundo (X, Y, Z), donde Z es la profundidad en cualquier coordenada de píxel (u, v), Z = P/depthScaleFactor, donde P representa el valor de intensidad de la imagen de profundidad en el píxel (u, v).

    Este argumento establece la propiedad DepthScaleFactor.

    Parámetros IMU, especificados como un objeto factorIMUParameters. El objeto contiene información de ruido, sesgo y frecuencia de muestreo sobre la unidad de medición inercial (IMU).

    Propiedades

    expandir todo

    Parámetros de la cámara

    Esta propiedad o parámetro es de solo lectura.

    Parámetros intrínsecos de la cámara, almacenados como un objeto cameraIntrinsics (Computer Vision Toolbox).

    Utilice el argumento intrinsics para establecer esta propiedad.

    Esta propiedad es de sólo lectura después de la creación del objeto.

    Factor de escala de profundidad, especificado como un escalar en unidades del mundo real (por ejemplo, metros). El factor de escala de profundidad depende del sensor de profundidad y normalmente se expresa en la misma unidad que las medidas de profundidad proporcionadas por el sensor (por ejemplo, milímetros, centímetros o metros). Es el factor de conversión que relaciona los valores de profundidad con las distancias del mundo real. En otras palabras, proporciona la información necesaria para transformar las medidas de profundidad a escala métrica.

    Para las coordenadas 3-D del mundo (X,Y,Z), donde Z representa la profundidad en cualquier coordenada de píxel (u,v), Z se calcularía como Z = P/depthScaleFactor, donde P representa el valor de intensidad de la imagen de profundidad en el píxel (u,v).

    Utilice el argumento depthScaleFactor para establecer esta propiedad.

    Esta propiedad es de sólo lectura después de la creación del objeto.

    Rango de profundidad de la cámara RGB-D, especificado como un vector de dos elementos, en unidades mundiales. El rango especifica los valores de profundidad mínimo y máximo de la cámara, que puede utilizar para filtrar valores de profundidad no válidos en las imágenes de profundidad.

    Extracción de características

    Esta propiedad es de sólo lectura después de la creación del objeto.

    Factor de escala para la descomposición de la imagen, almacenado como un escalar mayor que 1. El factor de escala también se conoce como índice de diezmado de la pirámide. Aumentar el valor de ScaleFactor reduce el número de niveles de pirámide, pero reduce el tiempo de cálculo. Al disminuir este valor (a poco más de 1), aumenta el número de niveles de pirámide, lo que puede mejorar el rendimiento del seguimiento, a costa de la velocidad de cálculo. El valor de la escala en cada nivel de descomposición es ScaleFactor(level-1), donde level es cualquier valor en el rango [0, Numlevels-1]. Dada la imagen de entrada de tamaño M-por-N, el tamaño de la imagen en cada nivel de composición es Mlevel-por-Nlevel, donde:

    Mlevel=MScaleFactor(level1)Nlevel=NScaleFactor(level1)

    Esta propiedad es de sólo lectura después de la creación del objeto.

    Número de niveles de descomposición, especificado como un entero mayor o igual a 1. Aumente este valor para extraer puntos clave de la imagen en más niveles de descomposición. Junto con el valor ScaleFactor, NumLevels controla la cantidad de niveles de pirámide en los que el objeto evalúa los puntos característicos.

    El tamaño de la imagen en cada nivel de descomposición limita la cantidad de niveles en los que se pueden extraer puntos clave. El tamaño de la imagen en un nivel de descomposición debe ser de al menos 63 x 63 para la detección de puntos clave. El nivel máximo de descomposición se calcula como

    levelmax = floor(log(min(M,N))log(63)log(ScaleFactor))+1

    . Si el valor predeterminado o el valor especificado de NumLevels es mayor que levelmax, el objeto modifica NumLevels a levelmax y devuelve una advertencia.

    Esta propiedad es de sólo lectura después de la creación del objeto.

    Número máximo de puntos característicos ORB extraídos uniformemente de cada imagen, especificado como un entero positivo. Los valores suelen estar en el rango de [800, 2000], dependiendo de la resolución de la imagen. Cuando el número de características extraídas es menor que el valor de MaxNumPoints, entonces el objeto utiliza todos los puntos de característica.

    Seguimiento

    Esta propiedad es de sólo lectura después de la creación del objeto.

    Rango de puntos característicos del fotograma clave, almacenado como un vector de dos elementos de números enteros positivos en el formato [lowerLimit upperLimit]. Esta propiedad especifica el número mínimo y máximo de puntos de características rastreadas que debe contener un cuadro para que el objeto lo identifique como un cuadro clave. Las propiedades TrackFeatureRange y SkipMaxFrames le permiten controlar la frecuencia con la que los fotogramas del proceso de seguimiento se convierten en fotogramas clave.

    El éxito del seguimiento depende de la cantidad de puntos rastreados en el cuadro actual, con uno de estos resultados:

    • Se pierde el seguimiento: la cantidad de puntos de características rastreados en el cuadro actual es menor que el lowerLimit establecido por el argumento TrackFeatureRange. Esto indica que la imagen no contiene suficientes características o que la cámara se está moviendo demasiado rápido. Para mejorar el seguimiento, puede aumentar el valor upperLimit de la propiedad TrackFeatureRange y disminuir la propiedad SkipMaxFrames para agregar fotogramas clave con mayor frecuencia.

    • El seguimiento es exitoso: el objeto identifica el fotograma actual como un fotograma clave. La cantidad de puntos característicos rastreados en el cuadro actual está dentro del rango establecido por TrackFeatureRange.

    • El seguimiento agrega fotogramas clave con demasiada frecuencia: la cantidad de puntos de características rastreados en el fotograma actual es mayor que el upperLimit establecido por la propiedad TrackFeatureRange. Esto indica que la cámara se mueve muy lentamente, lo que produce una cantidad innecesaria de fotogramas clave. Para mejorar el seguimiento, puede reducir la frecuencia de adición de fotogramas clave aumentando el valor de la propiedad SkipMaxFrames.

    Para obtener más detalles, consulte la función del objeto addFrame.

    Esta propiedad es de sólo lectura después de la creación del objeto.

    Número máximo de fotogramas omitidos, almacenado como un entero positivo. Cuando el número de características rastreadas es sistemáticamente mayor que el upperLimit establecido por la propiedad TrackFeatureRange, utilice la propiedad SkipMaxFrames para controlar la frecuencia con la que el objeto agrega nuevos fotogramas clave. El objeto identifica el fotograma actual como un fotograma clave cuando la cantidad de fotogramas omitidos desde el fotograma clave agregado más recientemente es igual al valor de SkipMaxFrames.

    Esta propiedad es de sólo lectura después de la creación del objeto.

    Número mínimo de puntos característicos coincidentes entre fotogramas clave de cierre de bucle, almacenados como un entero positivo.

    Esta propiedad es de sólo lectura después de la creación del objeto.

    Bolsa personalizada de características para la detección de bucles, especificada como un objeto bagOfFeaturesDBoW (Computer Vision Toolbox). bagOfFeaturesDBoW (Computer Vision Toolbox) le permite crear una bolsa de palabras personalizada (BoW) a partir de descriptores de características, junto con opciones para utilizar un vocabulario integrado o cargar uno personalizado desde un archivo específico.

    Esta propiedad es de sólo lectura después de la creación del objeto.

    Visualización de información de progreso, especificada como [], 1, 2 o 3. Las rutas a la ubicación de los archivos de registro, cuando se crean, se muestran en la línea de comandos.

    Valor verbosoDescripción de la pantallaUbicación de la pantalla
    [] o falseLa pantalla está apagada
    1 o trueEtapas de la ejecución de vSLAMVentana de comandos
    2Etapas de ejecución de vSLAM, con detalles sobre cómo se procesa el marco, como los artefactos utilizados para inicializar el mapa. Archivo de registro en una carpeta temporal
    3Etapas de vSLAM, artefactos utilizados para inicializar el mapa, poses y puntos del mapa antes y después del ajuste del paquete y datos de optimización del cierre de bucle.Archivo de registro en una carpeta temporal

    Fusión de IMU

    Esta propiedad es de sólo lectura después de la creación del objeto.

    Transformación del sensor IMU, especificada como un objeto rigidtform3d (Image Processing Toolbox). La transformación describe la rotación y traslación de la cámara en el sistema de coordenadas del sensor IMU.

    Esta propiedad es de sólo lectura después de la creación del objeto.

    Número de poses de cámara estimadas para activar la alineación de cámara-IMU, especificado como un número entero igual o mayor que 2. El proceso de alineación de los datos de la cámara y la IMU se inicia después de que se haya estimado un número específico de poses de cámara. Esta alineación tiene dos propósitos principales: primero, estimar un factor de escala que traduce los resultados a escala de una cámara monocular a unidades del mundo real (metros) y segundo, sincronizar la IMU y los cuadros de la cámara, eliminando efectivamente la influencia de la gravedad en los datos del acelerómetro. El momento adecuado para esta alineación, determinado por un umbral para el número de poses de la cámara, es clave para su éxito. Un umbral configurado demasiado bajo puede no brindar suficientes datos para una calibración precisa, mientras que un umbral configurado demasiado alto corre el riesgo de incorporar ruido proveniente de la deriva de la medición en la calibración. Para una comprensión más profunda de esta técnica de calibración, consulte la función estimateGravityRotationAndPoseScale.

    Esta propiedad es de sólo lectura después de la creación del objeto.

    Subconjunto de estimaciones de pose, especificado como un escalar en el rango de (0,1]. Este valor especifica una fracción del número de estimaciones de pose recientes, calculadas como round(NumPosesThreshold*AlignmentFraction), para su uso en el proceso de alineación de la cámara-IMU. Filtra eficazmente las estimaciones de pose iniciales y potencialmente ruidosas, garantizando que solo los datos más relevantes contribuyan a la alineación para una mayor precisión.

    Funciones del objeto

    addFrameAgregue un par de imágenes de color y profundidad al objeto SLAM visual RGB-D
    hasNewKeyFrameCompruebe si se agregó un nuevo fotograma clave en el objeto SLAM visual RGB-D
    checkStatusComprobar el estado del objeto SLAM RGB-D visual
    isDoneEstado de fin de procesamiento para el objeto SLAM visual RGB-D
    mapPointsConstruya un mapa 3D de puntos del mundo a partir de un objeto vSLAM RGB-D
    posesPoses absolutas de cámara de fotogramas clave RGB-D vSLAM
    plotGraficar puntos de mapa 3D y trayectoria estimada de la cámara en SLAM visual RGB-D
    resetRestablecer el objeto SLAM visual RGB-D

    Ejemplos

    contraer todo

    Realice la localización y el mapeo visual simultáneos RGB-D (vSLAM) utilizando los datos del TUM RGB-D Benchmark. Puede descargar los datos a un directorio temporal utilizando un navegador web o ejecutando este código:

    baseDownloadURL = "https://vision.in.tum.de/rgbd/dataset/freiburg3/rgbd_dataset_freiburg3_long_office_household.tgz"; 
    dataFolder = fullfile(tempdir,"tum_rgbd_dataset",filesep); 
    options = weboptions(Timeout=Inf);
    tgzFileName = dataFolder+"fr3_office.tgz";
    folderExists = exist(dataFolder,"dir");
    
    % Create a folder in a temporary directory to save the downloaded file
    if ~folderExists  
        mkdir(dataFolder) 
        disp("Downloading fr3_office.tgz (1.38 GB). This download can take a few minutes.") 
        websave(tgzFileName,baseDownloadURL,options); 
        
        % Extract contents of the downloaded file
        disp("Extracting fr3_office.tgz (1.38 GB) ...") 
        untar(tgzFileName,dataFolder); 
    end

    Crea dos objetos imageDatastore. Uno para almacenar las imágenes en color y el otro para almacenar las imágenes de profundidad.

    colorImageFolder = dataFolder+"rgbd_dataset_freiburg3_long_office_household/rgb/";
    depthImageFolder = dataFolder+"rgbd_dataset_freiburg3_long_office_household/depth/";
    
    imdsColor = imageDatastore(colorImageFolder);
    imdsDepth = imageDatastore(depthImageFolder);

    Seleccione el par sincronizado de imágenes de color y profundidad.

    data = load("rgbDepthPairs.mat");
    imdsColor=subset(imdsColor, data.indexPairs(:, 1));
    imdsDepth=subset(imdsDepth, data.indexPairs(:, 2));

    Especifique los parámetros intrínsecos de su cámara y utilícelos para crear un objeto SLAM visual RGB-D.

    intrinsics = cameraIntrinsics([535.4 539.2],[320.1 247.6],[480 640]);
    depthScaleFactor = 5000;
    vslam = rgbdvslam(intrinsics,depthScaleFactor);

    Procese cada par de imágenes de color y profundidad y visualice las poses de la cámara y los puntos del mapa 3D.

    for i = 1:numel(imdsColor.Files)
        colorImage = readimage(imdsColor,i);
        depthImage = readimage(imdsDepth,i);
        addFrame(vslam,colorImage,depthImage);
    
        if hasNewKeyFrame(vslam)
            % Query 3-D map points and camera poses
            xyzPoints = mapPoints(vslam);
            [camPoses,viewIds] = poses(vslam);
    
            % Display 3-D map points and camera trajectory
            plot(vslam);
        end
    
        % Get current status of system
        status = checkStatus(vslam);
        
        % Stop adding frames when tracking is lost
        if status == uint8(0)
            break
        end
    end 

    Figure contains an axes object. The axes object with xlabel X, ylabel Y contains 12 objects of type line, text, patch, scatter. This object represents Camera trajectory.

    Una vez procesados todos los fotogramas, reinicie el sistema.

    while ~isDone(vslam)
        plot(vslam);
    end

    Figure contains an axes object. The axes object with xlabel X, ylabel Y contains 12 objects of type line, text, patch, scatter. This object represents Camera trajectory.

    reset(vslam);

    Realice SLAM visual-inercial RGB-D utilizando los datos del OpenLORIS-Scene Dataset. Descargue los datos a un directorio temporal usando un navegador web o ejecutando este código:

    dataFolder  = fullfile(tempdir,"OpenLORIS-Scene",filesep); 
    downloadURL = "https://ssd.mathworks.com/supportfiles/shared_nav_vision/data/OpenLORIS-Scene_corridor1-4.zip";
    zipFileName = dataFolder+"corridor1-4.zip";
    
    if ~isfolder(dataFolder)
        mkdir(dataFolder);
        disp("Downloading corridor1-4.zip (1.13 GB). This download can take a few minutes.");
        options = weboptions('Timeout', Inf);
        websave(zipFileName, downloadURL, options); 
        unzip(zipFileName, dataFolder);
    end

    Crea dos objetos imageDatastore. Uno para almacenar las imágenes en color y el otro para almacenar las imágenes de profundidad.

    imageFolder = fullfile(dataFolder,"OpenLORIS-Scene_corridor1-4");
    imdsColor = imageDatastore(fullfile(imageFolder,"color"));
    imdsDepth = imageDatastore(fullfile(imageFolder,"aligned_depth"));

    Cargue los datos de mediciones de IMU y la transformación de cámara a IMU.

    data    = load("corridor4_IMU_data.mat");
    gyro    = data.gyroDataCell;
    accel   = data.accelDataCell;
    cam2IMU = data.cam2IMU;

    Especifique las características intrínsecas de la cámara, los parámetros IMU y utilícelos para crear un objeto SLAM visual-inercial RGB-D.

    % Camera intrinsic and IMU parameters can be found in the downloaded  
    % sensors.yaml file
    intrinsics = cameraIntrinsics([6.1145098876953125e+02, 6.1148571777343750e+02],...
        [4.3320397949218750e+02, 2.4947302246093750e+02], [480, 848]);
    
    imuParams = factorIMUParameters(AccelerometerBiasNoise=2.499999936844688e-05*eye(3),...
           AccelerometerNoise=0.00026780980988405645*eye(3),...
           GyroscopeNoise=1.0296060281689279e-05*eye(3),...
           GyroscopeBiasNoise=2.499999993688107e-07*eye(3),...
           SampleRate=250);
    
    depthScaleFactor = 1000;
    vslam = rgbdvslam(intrinsics, depthScaleFactor, imuParams, SkipMaxFrames=10,...
        CameraToIMUTransform=cam2IMU, TrackFeatureRange = [30, 150], DepthRange= [0.1, 6.5], ...
        NumPosesThreshold=20, MaxNumPoints=1.2e3);

    Procesar datos de imágenes y datos IMU y visualizar las poses de la cámara y los puntos del mapa 3D.

    for i = 1:numel(imdsColor.Files)
        colorImage  = readimage(imdsColor,i);
        depthImage  = readimage(imdsDepth,i);
        addFrame(vslam, colorImage, depthImage, gyro{i}, accel{i});
    
        if hasNewKeyFrame(vslam)
            plot(vslam);
        end
    end

    Una vez procesados todos los fotogramas, reinicie el sistema.

    while ~isDone(vslam)
        if hasNewKeyFrame(vslam)
            ax = plot(vslam);
        end
    end
    view(ax, 0, 90)

    Figure contains an axes object. The axes object with xlabel X, ylabel Y contains 12 objects of type line, text, patch, scatter. This object represents Camera trajectory.

    reset(vslam);

    Referencias

    [1] Mur-Artal, Raul, J. M. M. Montiel, and Juan D. Tardos. “ORB-SLAM: A Versatile and Accurate Monocular SLAM System.” IEEE Transactions on Robotics 31, no. 5 (October 2015): 1147–63. https://doi.org/10.1109/TRO.2015.2463671.

    Capacidades ampliadas

    expandir todo

    Historial de versiones

    Introducido en R2025a

    expandir todo

    Consulte también

    Objetos

    Funciones