Sobre la instalación y uso de cam_lidar_calibration (2021)
1. Introducción
Entre los muchos programas de código abierto para la calibración de cámaras y lidar, cam_lidar_calibration funciona relativamente bien. El resto de los programas de código abierto son complicados en el proceso de calibración o tienen demasiados errores. El paquete de código abierto ha sufrido algunas revisiones. Los siguientes son algoritmos de código abierto de la serie cam_lidar_calibration
tiempo | papel correspondiente | Análisis de algoritmos | Dirección de algoritmo de código abierto |
---|---|---|---|
2019 (versión más original) | Calibración extrínseca automática entre una cámara y un Lidar 3D usando correspondencias de punto y plano 3D | Usando el tablero de ajedrez como objetivo, usando la forma geométrica del tablero de calibración, calcule el punto de la línea media y el vector normal en la nube de puntos LIDAR, y obtenga su punto de la línea media y el vector normal debajo de la cámara, y complete la calibración después de la optimización. | https://gitlab.acfr.usyd.edu.au/sverma/cam_lidar_calibration |
2020 | ídem | Igual que arriba (se hizo una pequeña modificación de acuerdo con el código de 2019, pero la documentación debe pagarse en CSDN) | https://github.com/AbangLZU/cam_lidar_calibration |
2021 | Optimización de la selección de muestras para una calibración robusta de cámaras lidar 中文 |
También es el laboratorio ACFR de la Universidad de Sydney, basado en la versión mejorada en 2019, adopta la variabilidad de la calidad (VOQ) para reducir el error de los datos de selección del usuario, supera el problema de sobreajuste y es más robusto que el proceso de calibración de la versión 2019. | https://github.com/acfr/cam_lidar_calibration |
2. Prueba de instalación de código
La documentación oficial es muy detallada y proporciona instalación local e instalación de Docker.
Solo se prueba la instalación local de Ubuntu20.04, tome la instalación local como ejemplo.
El autor del código en Github es Ubuntu18.04, y algunos códigos y comandos deben modificarse de acuerdo con el método del sitio web oficial. Aquí están los pasos de instalación:
-
instalar dependencias
sudo apt update && sudo apt-get install -y ros-noetic-pcl-conversions ros-noetic-pcl-ros ros-noetic-tf2-sensor-msgs # Ubuntu20.04默认为python3 sudo apt install python3-pip pip3 install pandas scipy
-
Descargar código compilar e instalar
mkdir -p cam_lidar_calibration_ws/src cd cam_lidar_calibration_ws/src git clone https://github.com/acfr/cam_lidar_calibration.git cd .. catkin build source devel/setup.bash
Si encuentra un error sobre optimizar.h al compilar #include <opencv/cv.hpp> no existe, modifíquelo a #include <opencv2/opencv.hpp>
-
Prueba: en el código fuente, el autor debe producir el conjunto de datos de calibración para la prueba e ingresar el comando para realizar la calibración de la prueba:
roslaunch cam_lidar_calibration run_optimiser.launch import_samples:=true
El programa se calibra de acuerdo con pose.csv en la carpeta am_lidar_calibration_ws/src/cam_lidar_calibration/data/vlp/, y genera una cámara de calibración y un archivo de parámetros externos lidar en esta carpeta, y cada línea es el resultado de la iteración.
Luego obtenga los resultados de la calibración de evaluación
roslaunch cam_lidar_calibration assess_results.launch csv:="$(rospack find cam_lidar_calibration)/data/vlp/calibration_quickstart.csv" visualise:=true
-
Corre para calibrar los parámetros externos de tu propia cámara y lidar.
-
Hacer el tablero de calibración: el tablero de calibración debe ser lo más grande posible, el archivo de calibración se descarga en PDF , con el tamaño establecido, el autor usó A1 - cuadrados de 95 mm - vértices de 7x5, cuadrados de 8x6 . Fije el papel de tablero de ajedrez en un tablero para que sus centros estén alineados tanto como sea posible y los bordes se mantengan paralelos. Debe configurar los parámetros más tarde. La siguiente imagen muestra vértices internos de tamaño A1 de 7*5 y un cuadrado de 95 mm.
-
Configuración de parámetros: modificaciones importantes
cam_lidar_calibration/cfg/camera_info.yaml
yparams.yaml
-
camera_info.yaml
: establece si se trata de una cámara de ojo de pez, ancho y alto de píxel, matriz de referencia interna y coeficiente de distorsión. Autocalibración de los parámetros de la cámara, tutorial de calibración oficial de ROSdistortion_model: "non-fisheye" width: 640 height: 480 D: [0,0,0,0] K: [617.68,0.0,325.963,0.0,617.875,242.513,0.0,0.0,1]
-
params.yaml
# Topics camera_topic: "/camera/color/image_raw" camera_info: "/camera/color/camera_info" lidar_topic: "/velodyne_points" #Dynamic rqt_reconfigure default bounds,点云的选取范围 feature_extraction: x_min: -10.0 x_max: 10.0 y_min: -8.0 y_max: 8.0 z_min: -5.0 z_max: 5.0 # Properties of chessboard calibration target chessboard: pattern_size: #棋盘的内部顶点7*5 height: 7 width: 5 square_length: 95 #棋盘格的长度mm board_dimension: # 安装棋盘打印的背板的宽度和高度。 width: 594 height: 897 translation_error: #棋盘中心与背板中心的偏移量(见下图)。 x: 0 y: 0
El desplazamiento entre el centro del tablero de ajedrez y el centro del backplane
-
-
Comienza oficialmente la calibración:
-
Inicie el programa para recopilar datos de la tabla y ejecute el comando:
roslaunch cam_lidar_calibration run_optimiser.launch import_samples:=false
Aparecerán las ventanas RVIZ y rqt_reconfigure En RVIZ, paneles->display modifica el tema de la cámara y el frame_id correspondiente a la nube de puntos lidar.
-
Recopilación de datos: segmente la nube de puntos de la placa de calibración.
Ajuste los valores máximo y mínimo de xyz de rqt_reconfigure/feature_extraction para separar la nube de puntos de la placa de calibración del entorno circundante para que solo se muestre el tablero de ajedrez. Si el tablero de ajedrez no está completamente aislado, puede afectar el ajuste plano del tablero de ajedrez y también causar un gran error en el tamaño del tablero de ajedrez. La siguiente figura es el efecto antes y después de filtrar la nube de puntos:
Después de filtrar la nube de puntos del entorno circundante, haga clic en Capturar muestra para recolectar muestras en rviz, y aparecerá el cuadro verde para representar el plano de la placa de calibración ajustado de acuerdo con la nube de puntos, como se muestra en la figura: Si el rectángulo verde ajustado no aparece, debe reajustar el rango XYZ de la nube de puntos y luego capturar muestras para recolectar muestras
. Se requieren al menos 7 anillos para que la nube de puntos láser se imprima en la placa de calibración. -
Calibración:
Recopile al menos 3 muestras para ejecutar la calibración. Cuantas más muestras, mejor, es mejor recopilar más de 10 muestras y luego hacer clic en optimizar en rviz para calibrar. Durante el proceso de optimización, se generará una carpeta con la fecha y la hora actuales en cam_lidar_calibration/data para almacenar las imágenes recopiladas, la nube de puntos pcd, la pose y los archivos de referencia externa de la cámara y lidar después de la calibración. -
Evaluar parámetros y error de reproyección:
roslaunch cam_lidar_calibration assess_results.launch csv:="$(rospack find cam_lidar_calibration)/data/2022-02-10_13-48-12/calibration_2022-02-10_14-13-41.csv" visualise:=true
Aparece una imagen de efecto de reproyección:
Los parámetros de calibración y los errores de reproyección aparecen en el terminal:---- Calculating average reprojection error on 12 samples ---- 1/ 12 | dist= 4.069m, dimerr= 39.768mm | error: 2.948pix --> 20.033mm 2/ 12 | dist= 3.759m, dimerr= 43.992mm | error: 2.358pix --> 14.689mm 3/ 12 | dist= 3.038m, dimerr= 61.650mm | error: 0.240pix --> 1.213mm 4/ 12 | dist= 2.951m, dimerr= 52.597mm | error: 0.129pix --> 0.628mm 5/ 12 | dist= 2.913m, dimerr= 120.838mm | error: 0.782pix --> 3.798mm 6/ 12 | dist= 2.665m, dimerr= 76.147mm | error: 3.219pix --> 14.106mm 7/ 12 | dist= 2.482m, dimerr= 69.678mm | error: 2.728pix --> 11.332mm 8/ 12 | dist= 2.307m, dimerr= 36.923mm | error: 2.659pix --> 10.284mm 9/ 12 | dist= 2.118m, dimerr= 110.454mm | error: 6.066pix --> 21.332mm 10/ 12 | dist= 2.504m, dimerr= 66.145mm | error: 1.402pix --> 5.853mm 11/ 12 | dist= 2.845m, dimerr= 11.296mm | error: 1.408pix --> 6.616mm 12/ 12 | dist= 2.828m, dimerr= 98.653mm | error: 0.719pix --> 3.536mm Calibration params (roll,pitch,yaw,x,y,z): -1.5416,-0.0047,-1.4423,0.0059,-0.0062,0.0149 Mean reprojection error across 12 samples - Error (pix) = 2.055 pix, stdev = 1.663 - Error (mm) = 9.452 mm , stdev = 7.007
-
-
Basado en el código anterior, lo cambié un poco, la calibración conjunta de la cámara lidar en esto será más precisa https://github.com/Xujianhong123Allen/sensor_calibration/tree/master/cam_lidar_calibration