Os1  1
OrbSlam2 documentado y modificado
ORB-SLAM2 comentado y modificado, fork personal os1

Introducción a ORB-SLAM2

ORB-SLAM2 es la versión 2 de ORB-SLAM, publicada al año siguiente del original por los mismos autores. Se trata de una prueba de concepto, una aplicación que demuestra el funcionamiento de ORB-SLAM. La aplicación tiene una interfaz de usuario mínima y opcional. ORB-SLAM2 está pensado para ser usado como parte de un proyecto mayor, conectado por ROS.

Configuración para el primer uso

Para poder compilar este código con Eclipse CDT, se requiere tener instalado OpenCV 2.4.3 o superior, incluyendo 3.1, Pangolin, Blas, Lapack, Eigen3. Consultar https://github.com/raulmur/ORB_SLAM2 2.Prerequisites. En Eclipse se deben cargar estas librerías (Properties for os1, Settings, g++ Linker Libraries):

  • opencv_core, usada para Mat
  • pangolin, para la visualización del mapa
  • opencv_features2d, para FAST
  • opencv_highgui, para visualizar el cuadro de la cámara
  • pthread, para disparar hilos
  • opencv_videoio, para obtener imágenes de la webcam o de archivo
  • opencv_imgcodecs, para obtener imágenes de archivo de video
  • opencv_imgproc
  • opencv_calib3d
  • GL
  • GLU

Carpeta de Eigen en Properties for os1, c/c++ General Settings, Path and Symbols, Includes: /usr/local/include/eigen3

Carpeta de Eigen en Properties for os1, c/c++ General Settings, Path and Symbols, Symbols, G++:

  • _cplusplus 201103L
  • COMPILEDWITHC11

Secuencia inicial del algoritmo ORB-SLAM2

Como es habitual, la ejecución inicia por main, que:

  • lee los parámetros de la línea de comando de ejecución
  • crea el objeto SLAM, única instancia de la clase System, cuyo constructor
    • carga el vocabulario BoW
    • carga el archivo de configuración y lo parsea
    • crea hilos para los cuatro procesos principales y paralelos:
      • LoopClosing
      • LocalMapping
      • Viewer
      • Tracking (que se ejecuta en el hilo de main).
  • entra en el bucle principal while(true) que ejecutará el proceso entero por cada cuadro de la cámara

    Este bucle principal es un algoritmo largo, separado en métodos por prolijidad, la mayoría de los cuales se invocan desde un único lugar. La secuencia de invocaciones es:

    1. System::TrackMonocular, pasando la imagen a color de la cámara
    2. Tracking::GrabImageMonocular, pasando la imagen Mat en escala de grises, crea el currentFrame a partir de la imagen
    3. Tracking::Track, autómata finito que despacha métodos de acuerdo al estado.
    4. Tracking::TrackWithMotionModel, invocado en el estado OK

Clasificación de las clases

ORB-SLAM2 tiene un archivo .h y otro .cc para cada clase, todas declaradas en el espacio de nombres ORB-SLAM2. Adopta los siguientes sufijos para nombrar las propiedades miembros de clases, explicitando su tipo:

  • m: miembro. Todas las propiedades comienzan con m.
  • p: puntero
  • v: vector
  • b: booleano
  • n: entero
  • f: float Hay excepciones, probablemente por error.

Ejemplos:

  • mvpMapPoints es un miembro vector de punteros.
  • mnId es un miembro entero Id.

Hay varios tipos de clase:

  • Clases que se instancian repetidas veces y perduran:
    • Frame: hay 3 instancias: Tracking::mCurrentFrame, Tracking::mLastFrame y Tracking::mInitialFrame.
    • KeyFrame: varias instancias registradas en Map::mspKeyFrames
    • MapPoint: varias instancias registradas en Map::mspMapPoints
  • Clases efímeras que se instancias repetidas veces y se destruyen:
    • ExtractorNode: varios nodos creados en ORBextractor.
    • Initializer
    • ORBextractor: creado para la extracción de puntos singulares y descriptores, y luego destruído.
    • ORBmatcher
  • Clases que se instancian una única vez y se asocian a un thread:
    • Tracking
    • LocalMapping
    • Viewer
    • LoopClosing
  • Clases que se instancian una única vez y perduran:
    • System
    • Map
    • KeyFrameDatabase
    • MapDrawer
    • FrameDrawer
  • Clases que no se instancian, no tienen propiedades, son repositorios de métodos de clase:
    • Converter
    • Optimizer

Cada clase se define en su propio archivo .h homónimo, excepto ORBExtractor.h define también ExtractorNode. El único archivo include/ *.h que no define una clase es ORBVocabulary.h, que contiene un simple typedef.

La carpeta Thirparty contiene versiones podadas de DBoW2 y g2o con estilos propios.

Conceptos de ORB-SLAM y sus clases

Frame

A partir de cada imagen de la cámara se crea un objeto Frame efímero.

Usualmente perduran el cuadro actual y el anterior solamente, habiendo sólo dos instancias de esta clase simultáneamente en el sistema.

El objeto Frame tiene los puntos singulares detectados, su versión antidistorsionada, sus descriptores y los puntos del mapa asociados.

La clase proporciona los métodos para su construcción a partir de la imagen.

Hay sólo tres instancias de esta clase:

  • Tracking::mCurrentFrame con el cuadro más reciente
  • Tracking::mLastFrame con el cuadro inmediato anterior al más reciente
  • Tracking::mInitialFrame con el cuadro inicial, que participó en la inicialización del mapa

Mientras las instancias mCurrentFrame y mLastFrame perduran, su contenido no lo hace, sino que rota. Cada nueva imagen se vuelca sobre mCurrentFrame, reemplazando a la anterior.

KeyFrame

Los KeyFrame se crean a partir de un Frame cuando el sistema entiende que éste aporta información al mapa.

Un KeyFrame es de larga vida, es la manera en que un Frame se convierte en parte del mapa.

Cuando se crea un KeyFrame, copia la información principal del Frame actual, y computa más datos, como por ejemplo los BoW de cada descriptor.

Los keyframes se registran en Map::mspKeyFrames.

La documentación de KeyFrame explica la notación de matrices de pose utilizadas en KeyFrame y en Frame.

MapPoint

Punto 3D del mapa del mundo. No sólo tiene las coordenadas del punto, sino también la lista de KeyFrames que lo observan, la lista de descriptores asociados al punto (un descriptor por cada KeyFrame que lo observa), entre otros.

Los mapPoints se registran en Map::mspMapPoints.

Map

Mapa del mundo. Tiene una lista de MapPoints, una lista de KeyFrames, y métodos para la administración del mapa.

System

KeyFrameDatabase

Descripción de los hilos

ORB-SLAM tiene cuatro hilos paralelos, cada uno con su propio bucle.

  • Tracking es el objeto preponderante del hilo principal, que se encarga de procesar cada imagen que llega, detectando puntos singulares, calculando descriptores, macheando con el cuadro anterior tratando de identificar los puntos conocidos del mapa. Decide cuándo agregar un nuevo Keyframe. No agrega nuevos puntos al mapa.
  • LocalMapping procura agregar puntos al mapa cada vez que se agrega un KeyFrame. Agrega puntos por triangulación con KeyFrames vecinos. También optimiza el mapa quitando keyframes redundantes.
  • LoopClosing se aboca a comparar la observación actual con el mapa, procurando alguna pose que explique la observación actual, detectando así bucles. En ese caso procede con el cierre del bucle. -Viewer maneja las dos visualizaciones: la del mapa y la de la imagen procesada.