Escribir VIO desde cero (1)


Escribir a mano VIO desde cero la primera tarea de la conferencia
Este es mi propio resumen del mapa mental de la primera conferencia: Escribir a mano VIO desde cero el primer mapa mental de la conferencia


La mayoría de las preguntas de revisión anteriores se refieren al blog del tipo grande https://blog.csdn.net/learning_tortosie/article/details/102408738, (cáncer perezoso cometido nuevamente), este blog está listo para ser reimpreso como un respeto.
La parte de la derivación de la fórmula es ligeramente diferente del blog de los grandes. Si hay un error, espero corregirlo.

1. ¿Cuáles son las ventajas de la integración de visión e IMU?

Para hablar sobre las ventajas de la integración de la visión y la IMU, primero debemos entender las limitaciones de la visión y la IMU:

(1) Aunque la IMU puede medir la aceleración y la velocidad angular, hay desviaciones obvias en estas cantidades, lo que hace que los datos de pose obtenidos por integración dos veces sean muy poco fiables. Por ejemplo, si colocamos la IMU sobre la mesa sin movernos, la postura obtenida al integrar sus lecturas se desviará de la distancia. Sin embargo, para movimientos rápidos en un corto período de tiempo, IMU puede proporcionar algunas estimaciones mejores. Ésta es la debilidad de la cámara. Cuando el movimiento es demasiado rápido, la cámara (obturador rodante) tendrá desenfoque de movimiento, o el área de superposición entre los dos cuadros es demasiado pequeña para la coincidencia de funciones, por lo que el SLAM visual puro tiene mucho miedo al movimiento rápido. Con IMU, incluso durante el período de tiempo en el que los datos de la cámara no son válidos, podemos mantener una buena estimación de pose, lo que es imposible para SLAM visual puro.

(2) En comparación con la IMU, los datos de la cámara básicamente no se desvían. Si la cámara se coloca en su lugar y se fija, entonces (en una escena estática) la estimación de pose de SLAM visual también se fija. Por lo tanto, los datos de la cámara pueden estimar y corregir eficazmente la desviación en la lectura de la IMU, de modo que la estimación de la pose después de la cámara lenta siga siendo válida.

(3) Cuando la imagen cambia, esencialmente no podemos saber si la cámara en sí se ha movido o las condiciones externas han cambiado, por lo que el SLAM visual puro es difícil de lidiar con obstáculos dinámicos. La IMU puede sentir su propia información de movimiento, hasta cierto punto, reducir el impacto de los objetos dinámicos.

(4) Para SLAM de visión monocular, hay incertidumbre de escala y la escala se puede restaurar después de fusionar la IMU.

(5) SLAM visual puro es susceptible a escenas de textura débil y cambios de iluminación. Cuando el posicionamiento falla, IMU se puede utilizar para posicionamiento a corto plazo.

En resumen, la fusión de la visión y la IMU compensará sus respectivas desventajas. La información de posicionamiento visual se puede utilizar para estimar la compensación cero de la IMU y reducir la divergencia y el error acumulativo causado por la compensación cero de la IMU; la IMU puede proporcionar visión para posicionamiento en movimiento rápido, y cuando el posicionamiento falla debido a algunos factores (menos puntos característicos en la escena, mayores cambios de iluminación, etc.).

2. ¿Cuáles son las soluciones de fusión Common Vision + IMU? ¿Existen ejemplos de aplicaciones industriales?

(1) Esquema de fusión Common Vision + IMU

MSCKF
OKVIS
ROVIO
VIORB
VINS-Mono, VINS-Mobile y VINS-Fusion
son básicamente de código abierto en Github.

(2) Aplicaciones industriales

Google : Tango , ARCore
Apple : ARKit
Microsoft : HoloLens
: : DuMix AR

3. En el ámbito académico, ¿cuáles son los nuevos avances en la investigación de VIO? ¿Hay ejemplos de cómo aplicar métodos de aprendizaje a VIO?

Para encontrar nuevos avances en la investigación académica, puede ir a Google Scholar para buscar palabras clave (VIO, Odometría visual-inercial) y un tiempo limitado (como desde 2019). También puede buscar en robótica, visión por computadora y otras conferencias importantes (como IROS, ICRA), CVPR). La recuperación es el primer paso, el siguiente paso es leer el título y el resumen, seleccionar una investigación significativa y luego leer selectivamente el artículo.

En la actualidad, presto menos atención a los artículos académicos. Hoy, acabo de ver a alguien publicar el nuevo progreso de VIO en Zhihu, así que simplemente lo trasladé aquí.

(1) Nuevos avances en los métodos tradicionales

[1] Usenko V, Demmel N, Schubert D y col. Mapeo visual-inercial con recuperación de factor no lineal [J]. 2019.
[2] Shao W, Vijayarangan S, Li C, et al. Localización y mapeo simultáneos de LiDAR inercial visual estéreo [J]. 2019.

(2) Ejemplos basados ​​en métodos de aprendizaje

[1] Clark R, Wang S, Wen H y col. VINet: Odometría visual-inercial como problema de aprendizaje secuencia-a-secuencia [C] // AAAI. 2017: 3995-4001.
[2] Chen, Changhao y col. "Fusión selectiva de sensores para odometría neuronal visual-inercial". preimpresión de arXiv arXiv: 1903.01534 (2019).
[3] Shamwell, E. Jared y col. “Odometría visual-inercial profunda sin supervisión con corrección de errores en línea para imágenes RGB-D”. Transacciones IEEE sobre análisis de patrones e inteligencia de máquinas (2019).
[4] Lee, Hongyun, Matthew McCrink y James W. Gregory. "Odometría visual-inercial para vehículos aéreos no tripulados mediante aprendizaje profundo". Foro AIAA Scitech 2019. 2019.
[5] Wang, Chengze, Yuan Yuan y Qi Wang. "Aprendizaje por inercia: Odometría visual monocular autodirigida para vehículos de carretera". ICASSP 2019-2019 IEEE International Conference on Acustics, Speech and Signal Processing (ICASSP). IEEE, 2019.

4. Actualización de Cuaternión y Álgebra de Lie

Inserte la descripción de la imagen aquí

  1. Código:
#include <iostream>

#include <Eigen/Core>
#include <Eigen/Geometry>

#include "sophus/so3.h"
#include "sophus/se3.h"

using namespace std; 

int main( int argc, char** argv )
{
    
    
    // 沿Z轴转90度的旋转矩阵
    Eigen::Matrix3d R = Eigen::AngleAxisd(M_PI/2, Eigen::Vector3d(0,0,1)).toRotationMatrix();
    
    cout << "R * R^t ?= I"<< endl << R * R.transpose() <<endl;

    Sophus::SO3 SO3_R(R);               // 从旋转矩阵构造Sophus::SO(3)
    Eigen::Quaterniond q(R);            // 从旋转矩阵构造四元数

    // 李代数更新
    Eigen::Vector3d update_so3(0.01, 0.02, 0.03); //更新量
    Sophus::SO3 SO3_updated = SO3_R * Sophus::SO3::exp(update_so3);
    cout<<"SO3 updated = "<< endl << SO3_updated.matrix() <<endl;
    
    //四元数更新
    Eigen::Quaterniond q_update(1, update_so3(0)/2, update_so3(1)/2, update_so3(2)/2); 
    Eigen::Quaterniond q_updated = (q * q_update).normalized(); //四元数归一化
    cout<<"q2R = "<< endl << q_updated.toRotationMatrix() <<endl;

    return 0;
}

CMakeLists.txt:

cmake_minimum_required(VERSION 2.8)
project(class1)

set(CMAKE_BUILD_TYPE "Release")
set(CMAKE_CXX_FLAGS "-std=c++11")

# 添加eigen
include_directories("/usr/include/eigen3/")

# 添加sophus
find_package(Sophus REQUIRED)
include_directories(${
    
    Sophus_INCLUDE_DIRS})

# 添加可执行程序
add_executable(question2 question2.cpp)
target_link_libraries(question2
    ${
    
    Sophus_LIBRARIES}
    )
  1. Resultado de salida
    Inserte la descripción de la imagen aquí
    A partir del resultado, el efecto de actualizar a través del álgebra de Lie y actualizar a través del cuaternión no es muy grande.

5. Derivación

Inserte la descripción de la imagen aquí
Derivación 1:
Inserte la descripción de la imagen aquí
Derivación 2:
Inserte la descripción de la imagen aquí
Esto es ligeramente diferente del resultado del jefe al que se hace referencia, pero el resultado no debería ser incorrecto.

Supongo que te gusta

Origin blog.csdn.net/weixin_44456692/article/details/106780865
Recomendado
Clasificación