Cainiao College: crea tu propio sistema SLAM de principio a fin (reproducido, creo que es bueno escribir un SLAM por mí mismo)

Reimpreso de: https://blog.csdn.net/qq_29797957/article/details/98661883?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-0&spm=1001.2101.3001.4242

Cainiao College: crea tu propio sistema SLAM de principio a fin

Proyecto de aplicación RobotSlam dos: pequeño sistema SLAM

Antecedentes de la investigación: Como solía ser más impetuoso, siempre me gusta estudiar las bibliotecas de otras personas y luego probar para ejecutarlas. Si el efecto es bueno, lo usaré para modificar y modificar, y luego lo usaré para probar. Realmente no me concentré en escribir un sistema antes. Esta vez escribí un sistema SLAM de principio a fin. El proceso de escritura no es realmente fácil y me siento mucho más cómodo después de escribir. .

I. Introducción

Ventajas y desventajas de la cámara RGB-D (cámara de profundidad de luz estructurada)

ventaja:

  1. Adecuado para su uso en escenas con iluminación insuficiente y falta de textura;
  2. Se puede lograr una alta precisión de medición dentro de un cierto rango;
  3. La tecnología es madura y la imagen de profundidad puede alcanzar una resolución más alta;

Desventajas:

  1. Básicamente, no se puede utilizar en entornos al aire libre;
  2. La distancia de medición es relativamente cercana;
  3. Se ve afectado fácilmente por los reflejos de las superficies lisas.

En segundo lugar, la estimación de pose de la cámara.

Obtenga la transformación entre diferentes fotogramas de imágenes basándose en el método de punto de característica ORB (este método ha sido discutido por muchos expertos, así que no diré más aquí), que involucra principalmente las siguientes partes:

1. Extracción y coincidencia de puntos característicos:

En el proceso de adquisición de datos de imagen en tiempo real, este enlace debe prestar atención a la adquisición de cuadros de imagen. Los cuadros aquí incluyen el cuadro actual y el cuadro de referencia (es decir, el cuadro de la imagen en el momento anterior). Para calcular la coincidencia de la imagen, necesitamos distinguir entre diferentes marcos en el momento para calcular la transformación de la imagen entre marcos adyacentes.

Es decir, en el momento inicial, el fotograma actual se asigna al fotograma de referencia, y luego, en el proceso de seguimiento de movimiento de la cámara, después de que se realiza cada coincidencia y seguimiento de imágenes, el fotograma actual debe convertirse y asignarse al fotograma de referencia para lograr Actualización de "frame".

		case INITIALIZING:
	    {
			state_ = OK;
			curr_frame = ref_frame = frame;
			....
			break;
	    }
	    case OK:
	    {
			curr_frame = frame;
			....
			if ( CameraPoses is OK ... )
			{
			    curr_frame->T_c_w_ = T * ref_frame->T_c_w_; 
			    ref_frame = curr_frame;
				....
			}
			else 
			{
				.....
			}
		}

2. Estimación de la pose de la cámara;

También hay muchas formas de estimar la pose de la cámara: 2d-2d (calculado y resuelto por matriz esencial y matriz de homografía), 3d-2d (resuelto por PnP), 3d-3d (resuelto por SVD + BA).
Entre estos métodos, el método PnP se usa con más frecuencia y la solución PnP es relativamente simple, y puede llamar directamente al método OpenCV.

	bool solvePnPRansac( InputArray objectPoints, InputArray imagePoints,
		                          InputArray cameraMatrix, InputArray distCoeffs,
		                          OutputArray rvec, OutputArray tvec,
		                          bool useExtrinsicGuess = false, int iterationsCount = 100,
		                          float reprojectionError = 8.0, double confidence = 0.99,
		                          OutputArray inliers = noArray(), int flags = SOLVEPNP_ITERATIVE );
		                          
	bool solvePnP( InputArray objectPoints, InputArray imagePoints,
		                    InputArray cameraMatrix, InputArray distCoeffs,
		                    OutputArray rvec, OutputArray tvec,
		                    bool useExtrinsicGuess = false, int flags = SOLVEPNP_ITERATIVE );

Probé el conjunto de prueba de tum para obtener la trayectoria de movimiento de la cámara (odómetro visual: VO) como se muestra a continuación:

Inserte la descripción de la imagen aquí

Tres, creación de mapas 1

Después de completar el módulo de odometría visual, el siguiente paso es crear y actualizar el mapa. Debido a limitaciones de tiempo, quiero completar todo el sistema SLAM, por lo que no hay una depuración en profundidad para la parte de optimización del mapa. En la actualidad , solo se ha completado la creación y actualización del mapa preliminar. El primer paso es construir un mapa de nube de puntos de la siguiente manera:

Inserte la descripción de la imagen aquí
¿Es una locura ver un mapa como este? . .



No se preocupe, después de una cuidadosa comparación y depuración, se encuentra que la matriz de transformación entre el marco actual y el marco de referencia no se corresponde bien, lo que resulta en un error en la proyección del punto del mapa. Después de que la matriz de transformación es modificado, se obtiene lo siguiente:

Inserte la descripción de la imagen aquí
¿No es mucho más atractivo ~~~?

Cuarto, creación de mapas 2

Después de los pasos anteriores, se completó la función básica de actualización del mapa en tiempo real, pero el mapa no se ha optimizado y la parte de detección de bucle correspondiente no se ha optimizado. Esto continuará mejorando en el futuro, pero antes de eso, Todavía quiero probarlo Creación en tiempo real de mapas octomap. . Bueno, comencé a hacerlo cuando lo pensé, así que obtuve el siguiente mapa otomap:

Inserte la descripción de la imagen aquí
De acuerdo, completó con éxito la prueba de escritura del pequeño SLAM.

Cinco, experiencia

Después de completar la redacción y la prueba del sistema anterior, puede comprender de forma clara y precisa todos los enlaces del proceso SLAM, lo que es muy importante para los estudiantes que recién están comenzando a empezar con SLAM. No solo eso, también puedo aprender mucho del proceso general de SLAM. A continuación, me centraré en la parte de optimización de back-end. La detección de bucles es muy importante.

Además, después de pasar por el proceso SLAM, comencé a ingresar a la aplicación y mejora del aprendizaje profundo en SLAM desde estas partes importantes, sigue adelante ~~

referencias

[1]. Principio de la cámara de profundidad

Proyecto de aplicación RobotSlam dos: pequeño sistema SLAM

Antecedentes de la investigación: Como solía ser más impetuoso, siempre me gusta estudiar las bibliotecas de otras personas y luego probar para ejecutarlas. Si el efecto es bueno, lo usaré para modificar y modificar, y luego lo usaré para probar. Realmente no me concentré en escribir un sistema antes. Esta vez escribí un sistema SLAM de principio a fin. El proceso de escritura no es realmente fácil y me siento mucho más cómodo después de escribir. .

I. Introducción

Ventajas y desventajas de la cámara RGB-D (cámara de profundidad de luz estructurada)

ventaja:

  1. Adecuado para su uso en escenas con iluminación insuficiente y falta de textura;
  2. Se puede lograr una alta precisión de medición dentro de un cierto rango;
  3. La tecnología es madura y la imagen de profundidad puede alcanzar una resolución más alta;

Desventajas:

  1. Básicamente, no se puede utilizar en entornos al aire libre;
  2. La distancia de medición es relativamente cercana;
  3. Se ve afectado fácilmente por los reflejos de las superficies lisas.

En segundo lugar, la estimación de pose de la cámara.

Obtenga la transformación entre diferentes fotogramas de imágenes basándose en el método de punto de característica ORB (este método ha sido discutido por muchos expertos, así que no diré más aquí), que involucra principalmente las siguientes partes:

1. Extracción y coincidencia de puntos característicos:

En el proceso de adquisición de datos de imagen en tiempo real, este enlace debe prestar atención a la adquisición de cuadros de imagen. Los cuadros aquí incluyen el cuadro actual y el cuadro de referencia (es decir, el cuadro de la imagen en el momento anterior). Para calcular la coincidencia de la imagen, necesitamos distinguir entre diferentes marcos en el momento para calcular la transformación de la imagen entre marcos adyacentes.

Es decir, en el momento inicial, el fotograma actual se asigna al fotograma de referencia, y luego, en el proceso de seguimiento de movimiento de la cámara, después de que se realiza cada coincidencia y seguimiento de imágenes, el fotograma actual debe convertirse y asignarse al fotograma de referencia para lograr Actualización de "frame".

		case INITIALIZING:
	    {
			state_ = OK;
			curr_frame = ref_frame = frame;
			....
			break;
	    }
	    case OK:
	    {
			curr_frame = frame;
			....
			if ( CameraPoses is OK ... )
			{
			    curr_frame->T_c_w_ = T * ref_frame->T_c_w_; 
			    ref_frame = curr_frame;
				....
			}
			else 
			{
				.....
			}
		}

2. Estimación de la pose de la cámara;

También hay muchas formas de estimar la pose de la cámara: 2d-2d (calculado y resuelto por matriz esencial y matriz de homografía), 3d-2d (resuelto por PnP), 3d-3d (resuelto por SVD + BA).
Entre estos métodos, el método PnP se usa con más frecuencia y la solución PnP es relativamente simple, y puede llamar directamente al método OpenCV.

	bool solvePnPRansac( InputArray objectPoints, InputArray imagePoints,
		                          InputArray cameraMatrix, InputArray distCoeffs,
		                          OutputArray rvec, OutputArray tvec,
		                          bool useExtrinsicGuess = false, int iterationsCount = 100,
		                          float reprojectionError = 8.0, double confidence = 0.99,
		                          OutputArray inliers = noArray(), int flags = SOLVEPNP_ITERATIVE );
		                          
	bool solvePnP( InputArray objectPoints, InputArray imagePoints,
		                    InputArray cameraMatrix, InputArray distCoeffs,
		                    OutputArray rvec, OutputArray tvec,
		                    bool useExtrinsicGuess = false, int flags = SOLVEPNP_ITERATIVE );

Probé el conjunto de prueba de tum para obtener la trayectoria de movimiento de la cámara (odómetro visual: VO) como se muestra a continuación:

Inserte la descripción de la imagen aquí

Tres, creación de mapas 1

Después de completar el módulo de odometría visual, el siguiente paso es crear y actualizar el mapa. Debido a limitaciones de tiempo, quiero completar todo el sistema SLAM, por lo que no hay una depuración en profundidad para la parte de optimización del mapa. En la actualidad , solo se ha completado la creación y actualización del mapa preliminar. El primer paso es construir un mapa de nube de puntos de la siguiente manera:

Inserte la descripción de la imagen aquí
¿Es una locura ver un mapa como este? . .



No se preocupe, después de una cuidadosa comparación y depuración, se encuentra que la matriz de transformación entre el marco actual y el marco de referencia no se corresponde bien, lo que resulta en un error en la proyección del punto del mapa. Después de que la matriz de transformación es modificado, se obtiene lo siguiente:

Inserte la descripción de la imagen aquí
¿No es mucho más atractivo ~~~?

Cuarto, creación de mapas 2

Después de los pasos anteriores, se completó la función básica de actualización del mapa en tiempo real, pero el mapa no se ha optimizado y la parte de detección de bucle correspondiente no se ha optimizado. Esto continuará mejorando en el futuro, pero antes de eso, Todavía quiero probarlo Creación en tiempo real de mapas octomap. . Bueno, comencé a hacerlo cuando lo pensé, así que obtuve el siguiente mapa otomap:

Inserte la descripción de la imagen aquí
De acuerdo, completó con éxito la prueba de escritura del pequeño SLAM.

Cinco, experiencia

Después de completar la redacción y la prueba del sistema anterior, puede comprender de forma clara y precisa todos los enlaces del proceso SLAM, lo que es muy importante para los estudiantes que recién están comenzando a empezar con SLAM. No solo eso, también puedo aprender mucho del proceso general de SLAM. A continuación, me centraré en la parte de optimización de back-end. La detección de bucles es muy importante.

Además, después de pasar por el proceso SLAM, comencé a ingresar a la aplicación y mejora del aprendizaje profundo en SLAM desde estas partes importantes, sigue adelante ~~

referencias

[1]. Principio de la cámara de profundidad

Supongo que te gusta

Origin blog.csdn.net/sinat_16643223/article/details/115258072
Recomendado
Clasificación