(V) Método de depuración del cartógrafo (metodología de ajuste)

Desafortunadamente, Cartographer es un sistema muy complejo y varios parámetros pueden afectarse entre sí. Esta guía intenta explicar algunos métodos basados ​​en principios a través de varios ejemplos prácticos.

Viene con kit

[Para ser utilizado]Cartographer viene con algunos juegos de herramientas para ayudarlo a medir la calidad de SLAM local . Para esta parte, puede consultar el siguiente documento
Cartographer Lea el sitio de evaluación de documentos.
Antes de usar estas herramientas, suponga que ya sabe cómo guardar SLAM en .pbstream. Puede llamar assets_writer para guardar los resultados de SLAM en formato .pbstream.

Ejemplo: depuración de SLAM local (SLAM local)

El paquete de datos que probamos es b2-2016-04-27-12-31-41.bag, puede hacer clic en el comentario aba4575 y comentar 99c23b6 para ver algunos detalles.
Al pasar una pendiente en el Deutsches Museum (que viola la suposición de que el láser 2D nivela el suelo), descubrimos que el posicionamiento del tiempo de ejecución SLAM tiene cierto deslizamiento (desplazamiento), lo que obviamente muestra que el extremo frontal SLAM ha encontrado problemas. El resultado de la coincidencia con láser ignora el papel de otros sensores. Nuestro objetivo es mejorar este problema.
Solo miramos el gráfico secundario con el problema, porque este error está incluido en este gráfico secundario, también vemos que con el tiempo, el SLAM global encontró algunas excepciones e intentó corregirlo, pero una vez que este gráfico secundario contiene errores Siempre se incluye en la imagen secundaria, y el SLAM global no se puede corregir.
Debido a que este problema ocurre en la imagen secundaria, este es un problema local de SLAM, por lo que desactivamos el SLAM global para evitar que interfiera con nuestra depuración. El método de apagado es el siguiente:

POSE_GRAPH.optimize_every_n_nodes = 0
Corregir subimágenes de tamaño apropiado

A través de este parámetro, como se mencionó anteriormente, cuando verifica que no hay mucho error acumulado en cada imagen secundaria independiente, puede estar seguro de que no es demasiado grande o demasiado pequeño.

TRAJECTORY_BUILDER_2D.submaps.num_range_data
Depurar CeresScanMatcher

En nuestro ejemplo, la coincidencia con láser se puede hacer arbitrariamente antes, después o alrededor, sin afectar la puntuación. Queremos agregar una estrategia tal que cuando la coincidencia se desvía del valor inicial, tiene que pagar más. Cuanto mayor sea el valor, mayor será el puntaje de coincidencia si desea aceptar una coincidencia desde una distancia más larga. Puede ser depurado por estos dos parámetros

TRAJECTORY_BUILDER_2D.ceres_scan_matcher.translation_weight
TRAJECTORY_BUILDER_2D.ceres_scan_matcher.rotation_weight

Para ver claramente el peso de este efecto de castigo se puede establecer más importante, de la siguiente manera:

TRAJECTORY_BUILDER_2D.ceres_scan_matcher.translation_weight = 1e3

Los resultados experimentales muestran que el alto costo de 1e3 lo hace inconsistente con la detección por el sensor de profundidad, y obviamente se rompe. Cuando el peso de la traducción es 2e2, muestra buenos resultados.
Aquí, el uso de la rotación para la coincidencia de escaneo aún trae alguna interferencia. 4e2, se puede ver un resultado razonable.

Verificar

Para verificar que no hemos sobreajustado este problema en particular, verificamos los resultados de la depuración con otros conjuntos de datos. En este ejemplo (traducción_peso = 2e2, rotación_peso = 4e2), el paquete de datos verificado se ha deslizado (desplazado), por lo que Luego reduzca el peso de traducción a 1e2, este ajuste puede ser malo pero no se produce deslizamiento (desplazamiento). El peso es una cantidad sin unidades y se normalizará antes del uso porque solo tiene un concepto relativo.
[¿Por qué? ]¿Cómo resolver el problema del paseo marítimo? ¿Se puede resolver ajustando el peso de traducción y el peso de rotación aquí? La respuesta es no, ¿por qué no? Debido a que el peso de traducción y el peso de rotación solo pueden reducir la probabilidad de desajuste, para un entorno sin características como un corredor, los láseres puros no se pueden resolver haciendo coincidir, y se necesita agregar otra información, como agregar un código QR en el suelo o en la pared.

Caso especial

Los pasos de configuración y depuración predeterminados anteriores son para obtener mapas de alta calidad. Los siguientes casos son otros casos que deben considerarse después de obtener mapas de alta calidad.

Baja latencia

Baja latencia significa que obtenemos una pose optimizada poco después de recibir la entrada del sensor (generalmente dentro de un segundo), y no hay una acumulación de tareas en el hilo de optimización global. Por ejemplo, el posicionamiento del robot en tiempo real requiere baja latencia, ya que el SLAM local de front-end afecta directamente el retraso. Global SLAM establece una serie de tareas en segundo plano: cuando Global SLAM no puede mantenerse al día con la cola, la deriva (pose incorrecta) puede acumularse indefinidamente, por lo que Global SLAM debe ajustarse para que funcione en tiempo real.
Hay muchos parámetros puede ajustar la velocidad de los diferentes componentes, propusimos desde el simple, que se introducen los parámetros más profundas, se recomienda una vez al único cambio paramétrico de introducir más parámetros en una documentación cartógrafo .
Para depurar el SLAM global para lograr una baja latencia, reducimos la cantidad de cálculo hasta que la salida pueda mantenerse al día con la entrada de manera consistente , después de lo cual no la reduciremos, porque mantenemos la calidad del mapa de salida tanto como sea posible, para reducir el retraso global de SLAM , Podemos:

  • Inferior optimice_nodosdesnudos
  • Aumente MAP_BUILDER.num_background_threads a la cantidad de hilos lógicos disponibles
  • Baja global_sampling_ratio [Con la resolución de problemas]
  • 降低 restrictint_builder.sampling_ratio
  • Aumentar restrictint_builder.min_score
  • Para el filtrado de voxel adaptativo (muestreo), disminuya .min_num_points, .max_range y aumente .max_length
  • Aumente voxel_filter_size, submaps.resolution, disminuya submaps.num_range_data
  • Baje la ventana de búsqueda, .linear_xy_search_window, .linear_z_search_window, .angular_search_window.
  • 增加 global_constraint_search_after_n_seconds
  • Menor max_num_iterations

Para reducir el retraso de SLAM local , podemos:

  • Aumentar voxel_filter_size
  • Aumentar submapas.resolución
  • Para el filtrado de voxel adaptativo (muestreo), disminuya .min_num_points, .max_range y aumente .max_length
  • Reduzca max_range (especialmente si los datos son ruidosos)
  • Submapas inferiores.num_range_data

Nota: El efecto secundario de una cuadrícula grande es aumentar ligeramente la puntuación de coincidencia, por lo que el umbral de coincidencia también debe aumentarse en consecuencia.

Posicionamiento puro de mapas conocidos

El posicionamiento puro es diferente de la construcción de mapas. El primer punto es que queremos que SLAM global y SLAM local mantengan una baja latencia. El segundo punto es que SLAM global generalmente calcula una gran cantidad de restricciones internas entre mapas conocidos y mapas nuevos.
Para depurar el posicionamiento puro, primero activamos TRAJECTORY_BUILDER.pure_localization = true mientras reducimos en gran medida el número de POSE_GRAPH.optimize_every_n_nodes para recibir datos de frecuencia real. Cuando se configura de esta manera, el SLAM global generalmente se volverá muy lento, por lo que en el siguiente paso reduciremos en gran medida global_sampling_ratio y restrictint_builder.sampling_ratio para reducir la cantidad de restricciones que se calcularán. Luego, como se mencionó anteriormente, para reducir la latencia, ajustamos hasta que el sistema pueda funcionar de manera confiable en tiempo real.
Cuando se ejecuta un posicionamiento puro, la resolución de submaps.resolution debe ser la misma que la resolución del mapa cargado. No hemos verificado el caso en el que la resolución no corresponde, y puede que no funcione muy bien.

Optimización global y cuentakilómetros (codificador de engranajes)[Problema a resolver]

Si se pasa una fuente de datos de odómetro independiente como entrada al SLAM local (use_odometry = true), también podemos usar esta fuente de datos para depurar el SALM global .
En general, tenemos 4 pesos independientes que se pueden usar para depurar la optimización global de SLAM local y odómetro

POSE_GRAPH.optimization_problem.local_slam_pose_translation_weight
POSE_GRAPH.optimization_problem.local_slam_pose_rotation_weight
POSE_GRAPH.optimization_problem.odometry_translation_weight
POSE_GRAPH.optimization_problem.odometry_rotation_weight

Podemos establecer estos pesos dependiendo de nuestra confianza en el SLAM local y el odómetro . De forma predeterminada, el odómetro se pondera en la optimización global, que es similar a SLAM local . Sin embargo, los codificadores de engranajes generalmente tienen un alto grado de incertidumbre en la rotación. En este caso, el peso de rotación puede incluso reducirse a cero.

¿Aún tienes preguntas?

Puede hacer preguntas en Github, pero siga el formato de solicitud correcto. Asegúrese de enviarnos el archivo de configuración y el paquete de datos fuera de línea que utiliza.
Por supuesto, también puede hacer preguntas bajo este CSDN, me complace responder a sus preguntas.
[Problema a resolver]Todavía hay algunas cosas poco claras sobre mí, y las actualizaré después de entenderlas. No afecta tu lectura.

51 artículos originales publicados · Me gusta 13 · Visitantes más de 20,000

Supongo que te gusta

Origin blog.csdn.net/windxf/article/details/104391217
Recomendado
Clasificación