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.

stereovslam

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

Desde R2025a

    Descripción

    Utilice el objeto stereovslam para realizar localización y mapeo visual simultáneo (vSLAM) con datos de cámara estéreo. Para obtener más información sobre SLAM visual, consulte Implement Visual SLAM in MATLAB (Computer Vision Toolbox).

    El objeto stereovslam 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 = stereovslam(intrinsics,baseline) crea un objeto SLAM visual estéreo, vslam, utilizando los parámetros intrínsecos de la cámara estéreo rectificada intrinsics y la distancia baseline entre las cámaras izquierda y derecha rectificadas.

    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 stereovslam 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 = stereovslam(reprojectionMatrix,imageSize) crea un objeto SLAM visual estéreo vslam utilizando la matriz de reproyección de cámara estéreo, reprojectionMatrix, y el tamaño de la imagen, imageSize.

    vslam = stereovslam(___,imuParameters) realiza un SLAM visual-inercial estéreo basado en el imuParameters especificado. Al utilizar este argumento con datos IMU, se requiere Navigation Toolbox™

    vslam = stereovslam(___,PropertyName=Value) establece propiedades utilizando uno o más argumentos de nombre-valor además de cualquier combinación de argumentos de entrada de sintaxis anteriores. Por ejemplo, MaxNumPoints=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 estéreo rectificados, especificados como un objeto cameraIntrinsics (Computer Vision Toolbox).

    Este argumento establece la propiedad Intrinsics.

    Distancia entre las cámaras izquierda y derecha rectificadas, especificada como un escalar no negativo. Los algoritmos vSLAM estéreo generalmente rastrean la cámara principal (o izquierda), en cuyo caso la línea de base es mayor que cero. Un valor de base negativo indica un rango de disparidad negativo y el algoritmo vSLAM rastrea la cámara secundaria (o derecha).

    Este argumento establece la propiedad Baseline.

    Matriz de reproyección, especificada como una matriz de 4 por 4 con la forma:

    donde f y (cx, cy) son la distancia focal y el punto principal de la cámara primaria rectificada, respectivamente. b es la línea base de la cámara estéreo rectificada virtual.

    Puede obtener la matriz de reproyección utilizando la función rectifyStereoImages (Computer Vision Toolbox).

    Tamaño de la imagen producida por la cámara, en píxeles, especificado como un vector de dos elementos con la forma [nrows ncols]. Los elementos nrows y ncols representan el número de filas y columnas, respectivamente.

    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.

    Distancia entre las cámaras izquierda y derecha rectificadas, almacenada como un escalar no negativo. Los algoritmos vSLAM estéreo generalmente rastrean la cámara principal (o izquierda), en cuyo caso la línea de base es mayor que cero. Un valor de base negativo indica un rango de disparidad negativo y el algoritmo vSLAM rastrea la cámara secundaria (o derecha).

    Utilice el argumento baseline para establecer esta propiedad.

    Esta propiedad o parámetro es de solo lectura.

    Rango de disparidad, especificado como un vector de dos elementos de números enteros con la forma [min max]. Los elementos especifican la disparidad mínima y máxima, respectivamente. El rango debe estar dentro del ancho de la imagen y la diferencia entre el mínimo y el máximo debe ser divisible por 16.

    Valor mínimo de unicidad, especificado como un entero no negativo.

    La función marca el valor de disparidad estimado K para un píxel como no confiable si:

    v < V×(1 + 0.01×UniquenessThreshold),

    donde V es la suma de la diferencia absoluta (SAD) correspondiente al valor de disparidad K, y v es el valor SAD más pequeño en todo el rango de disparidad, excluyendo K, K –1 y K+1.

    Aumentar el valor de UniquenessThreshold da como resultado que la función marque valores de disparidad para más píxeles como no confiables. Para desactivar el umbral de unicidad, establezca este valor en 0.

    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 estéreo
    checkStatusComprobar el estado del objeto SLAM visual estéreo
    hasNewKeyFrameCompruebe si se agregó un nuevo fotograma clave en el objeto SLAM visual estéreo
    isDoneEstado de fin de procesamiento para el objeto SLAM visual estéreo
    mapPointsConstruya un mapa 3D de puntos del mundo a partir de un objeto vSLAM estéreo
    plotGraficar puntos de mapa 3D y trayectoria estimada de la cámara en SLAM visual estéreo
    posesPoses absolutas de cámara de fotogramas clave estéreo
    resetRestablecer el objeto SLAM visual estéreo

    Ejemplos

    contraer todo

    Realice la localización y el mapeo visual simultáneo estereoscópico (vSLAM) utilizando los datos del Conjunto de datos de localización y mapeo a largo plazo UTIAS proporcionado por el Instituto de Estudios Aeroespaciales de la Universidad de Toronto. Puede descargar los datos a un directorio mediante un navegador web o ejecutando este código:

    ftpObj = ftp("asrl3.utias.utoronto.ca");
    tempFolder = fullfile(tempdir);
    dataFolder = [tempFolder,'2020-vtr-dataset\UTIAS-In-The-Dark\'];
    zipFileName = [dataFolder,'run_000005.zip'];
    folderExists = exist(dataFolder,"dir");

    Crea una carpeta en un directorio temporal para guardar el archivo descargado y extraer su contenido.

    if ~folderExists  
        mkdir(dataFolder) 
        disp("Downloading run_000005.zip (818 MB). This download can take a few minutes.") 
        mget(ftpObj,"/2020-vtr-dataset/UTIAS-In-The-Dark/run_000005.zip",tempFolder);
    
        disp("Extracting run_000005.zip (818 MB) ...") 
        unzip(zipFileName,dataFolder); 
    end

    Crea dos objetos imageDatastore para almacenar las imágenes estéreo.

    imgFolderLeft = [dataFolder,'\images\left\'];
    imgFolderRight = [dataFolder,'\images\right\'];
    imdsLeft = imageDatastore(imgFolderLeft);
    imdsRight = imageDatastore(imgFolderRight);

    Especifique los parámetros intrínsecos y la línea base de la cámara estéreo, y utilícelos para crear un objeto SLAM visual estéreo. La distancia focal, el punto principal y el tamaño de la imagen están en píxeles, y la línea de base está en metros.

    focalLength = [387.777 387.777];  
    principalPoint = [257.446 197.718];  
    imageSize = [384 512];            
    intrinsics = cameraIntrinsics(focalLength,principalPoint,imageSize);
    baseline = 0.239965; 
    
    vslam = stereovslam(intrinsics,baseline,MaxNumPoints=600, ...
        TrackFeatureRange=[30 120],SkipMaxFrames=5);

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

    for i = 1:numel(imdsLeft.Files)
        leftImage = readimage(imdsLeft,i);
        rightImage = readimage(imdsRight,i);
        addFrame(vslam,leftImage,rightImage);
    
        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 

    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)

    Sugerencias

    • El objeto stereovslam:

      • No tiene en cuenta la distorsión de la lente. Puedes desdistorsionar las imágenes utilizando la función undistortImage (Computer Vision Toolbox) antes de agregarlas.

      • Se supone que las imágenes han sido rectificadas. Puede rectificar imágenes estéreo no distorsionadas utilizando la función rectifyStereoImages (Computer Vision Toolbox) antes de agregar imágenes.

      • 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 más recientemente.

    • Las poses de la cámara son las poses de la cámara principal, que corresponde a la imagen de entrada I1 agregada por la función de objeto addFrame.

    • 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).

    Referencias

    [1] Mur-Artal and J. D. Tardós, "ORB-SLAM2: An Open-Source SLAM System for Monocular, Stereo, and RGB-D Cameras," in IEEE Transactions on Robotics, vol. 33, no. 5, pp. 1255-1262, Oct. 2017, doi: 10.1109/TRO.2017.2705103.

    Capacidades ampliadas

    expandir todo

    Historial de versiones

    Introducido en R2025a

    expandir todo

    Consulte también

    Objetos

    Funciones