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.

monovslam

Localización y mapeo visual simultáneo (vSLAM) y fusión de sensores visuales-inerciales con cámara monocular

Desde R2025a

    Descripción

    Utilice el objeto monovslam para realizar localización y mapeo visual simultáneo (vSLAM) y SLAM inercial visual (viSLAM) con una cámara monocular. El objeto 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. Para obtener más información sobre SLAM visual, consulte Implement Visual SLAM in MATLAB (Computer Vision Toolbox).

    Creación

    Descripción

    vslam = monovslam(intrinsics) crea un objeto SLAM visual monocular, vslam, utilizando los parámetros intrínsecos de la cámara.

    El objeto monovslam no tiene en cuenta la distorsión de la lente. Puede utilizar la función undistortImage (Computer Vision Toolbox) especificada para desdistorsionar las imágenes antes de agregarlas al objeto.

    El objeto representa puntos de mapas 3D y poses de cámara en coordenadas mundiales. El objeto 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 monovslam 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.

    ejemplo

    vslam = monovslam(intrinsics,imuParameters) crea un objeto SLAM visual monocular, vslam, al fusionar las características intrínsecas de entrada de la cámara con las lecturas de la unidad de medición inercial (IMU).

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

    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.

    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.

    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 la 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

    addFrameAgregar marco de imagen al objeto SLAM visual
    hasNewKeyFrameComprobar si se agregó un nuevo fotograma clave en el objeto SLAM visual
    checkStatusComprobar el estado del objeto SLAM visual
    isDoneEstado de fin de procesamiento para el objeto SLAM visual
    mapPointsConstruir un mapa 3D de puntos del mundo
    posesPoses absolutas de cámara de fotogramas clave
    plotGraficar puntos de mapa 3D y trayectoria estimada de la cámara en SLAM visual
    resetRestablecer objeto SLAM visual

    Ejemplos

    contraer todo

    Realice la localización y el mapeo visual simultáneo monocular (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://cvg.cit.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 un objeto imageDatastore para almacenar todas las imágenes RGB.

    imageFolder = dataFolder+"rgbd_dataset_freiburg3_long_office_household/rgb/";
    imds = imageDatastore(imageFolder);

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

    intrinsics = cameraIntrinsics([535.4 539.2],[320.1 247.6],[480 640]);
    vslam = monovslam(intrinsics,TrackFeatureRange=[30,120]);

    Procese cada fotograma de la imagen y visualice las poses de la cámara y los puntos del mapa 3D. Tenga en cuenta que el objeto monovslam ejecuta varias partes del algoritmo en subprocesos separados, lo que puede introducir una latencia en el procesamiento de un cuadro de imagen agregado mediante la función addFrame.

    for i = 1:numel(imds.Files)
        addFrame(vslam,readimage(imds,i))
    
        if hasNewKeyFrame(vslam)
            % Display 3-D map points and camera trajectory
            plot(vslam);
        end
    
        % Get current status of system
        status = checkStatus(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.

    Grafique los resultados intermedios y espere hasta que se procesen todas las imágenes.

    while ~isDone(vslam)
        if hasNewKeyFrame(vslam)
            plot(vslam);
        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 procesadas todas las imágenes, puedes recopilar los puntos del mapa 3D finales y las poses de la cámara para un análisis posterior.

    xyzPoints = mapPoints(vslam);
    [camPoses,addedFramesIdx] = poses(vslam);
    
    % Reset the system
    reset(vslam)

    Compare la trayectoria estimada de la cámara con la ground-truth para evaluar la precisión.

    % Load ground truth
    gTruthData = load("orbslamGroundTruth.mat");
    gTruth     = gTruthData.gTruth;
    
    % Evaluate tracking accuracy
    mtrics = compareTrajectories(camPoses, gTruth(addedFramesIdx), AlignmentType="similarity");
    disp(['Absolute RMSE for key frame location (m): ', num2str(mtrics.AbsoluteRMSE(2))]);
    Absolute RMSE for key frame location (m): 0.20043
    
    % Plot the absolute translation error at each key frame
    figure
    ax = plot(mtrics, "absolute-translation");
    view(ax, [2.70 -49.20]); 

    Figure contains an axes object. The axes object with title Absolute Translation Error, xlabel X, ylabel Y contains 2 objects of type patch, line. These objects represent Estimated Trajectory, Ground Truth Trajectory.

    Realice un SLAM visual-inercial monocular utilizando los datos del conjunto de datos Blackbird (NYC Subway Winter). Descargue el archivo MAT que contiene las imágenes, las características intrínsecas de la cámara y las mediciones IMU.

    uavDataTarFile =  matlab.internal.examples.downloadSupportFile('shared_nav_vision/data','BlackbirdVIOData.tar');  
    
    % Extract the file.
    outputFolder = fileparts(uavDataTarFile);
    if (~exist(fullfile(outputFolder,"BlackbirdVIOData"),"dir"))
        untar(uavDataTarFile,outputFolder);
    end
    
    uavData = load(fullfile(outputFolder,"BlackbirdVIOData","data.mat"));
    
    images     = uavData.images;
    timeStamps = uavData.timeStamps;

    Configure los parámetros de ruido de la IMU, los intrínsecos de la cámara y la transformación extrínseca de la cámara-IMU.

    imuParams = factorIMUParameters(SampleRate=100,GyroscopeNoise=0.1, ...
                GyroscopeBiasNoise=3e-3,AccelerometerNoise=0.3, ...
                AccelerometerBiasNoise=1e-3,ReferenceFrame="ENU");
    intrinsics = uavData.intrinsics;
    camera2IMU = rigidtform3d(tform(uavData.camToIMUTransform));

    Configurar el objeto SLAM visual-inercial monocular.

    vslam = monovslam(intrinsics,imuParams,MaxNumPoints=2000,SkipMaxFrames=2,TrackFeatureRange=[20,100], ...
            CameraToIMUTransform=camera2IMU,NumPosesThreshold=40,AlignmentFraction=0.9, ...
            CustomBagOfFeatures=bagOfFeaturesDBoW('BlackBirdBoW.bin.gz'),LoopClosureThreshold=100);

    Procese todos los fotogramas de imágenes y las mediciones IMU disponibles y visualice las poses de la cámara y los puntos del mapa 3D. La secuencia no contiene ningún movimiento antes del fotograma 150.

    startFrameIdx = 150;
    
    for i = startFrameIdx:length(images)
    
        if(i>startFrameIdx)
            imuMesurements = helperExtractIMUMeasurements(uavData, i-1, i);
        else
            imuMesurements.gyro=[];
            imuMesurements.accel=[];
        end
    
        addFrame(vslam, images{i}, imuMesurements.gyro, imuMesurements.accel);
    
        if hasNewKeyFrame(vslam)
            plot(vslam);
        end
    end

    Tenga en cuenta que el objeto monovslam ejecuta varias partes del algoritmo en subprocesos separados, lo que puede introducir una latencia en el procesamiento de un cuadro de imagen agregado mediante la función addFrame.

    % Plot intermediate results and wait until all images are processed
    while ~isDone(vslam)
        if hasNewKeyFrame(vslam)
            plot(vslam);
        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.

    La función auxiliar a continuación se utiliza para extraer las mediciones de IMU, según las marcas de tiempo de la cámara.

    function imuMesurements = helperExtractIMUMeasurements(data, startFrameIdx, currFrameIdx)
    
        timeStamps = data.timeStamps;
        
        startTimeStamp = timeStamps.imageTimeStamps(startFrameIdx);
        currTimeStamp  = timeStamps.imageTimeStamps(currFrameIdx);
        
        [~,startIMUIdx] = min(abs(timeStamps.imuTimeStamps - startTimeStamp));
        [~,currIMUIdx]  = min(abs(timeStamps.imuTimeStamps - currTimeStamp));
        
        imuMesurements.accel = data.accelReadings(startIMUIdx:(currIMUIdx-1),:);
        imuMesurements.gyro  = data.gyroReadings(startIMUIdx:(currIMUIdx-1),:);
    
    end

    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.

    [2] Galvez-López, D., and J. D. Tardos. “Bags of Binary Words for Fast Place Recognition in Image Sequences.” IEEE Transactions on Robotics, vol. 28, no. 5, Oct. 2012, pp. 1188–97. DOI.org (Crossref), https://doi.org/10.1109/TRO.2012.2197158.

    Capacidades ampliadas

    expandir todo

    Historial de versiones

    Introducido en R2025a

    expandir todo

    Consulte también

    Objetos

    Temas