Projet R3LIVE combat réel (3) - étalonnage conjoint de la caméra binoculaire et du lidar lidar_camera_calib

Table des matières

3.1 Présentation de lidar_camera_calib

3.2 Préparation de l'environnement

3.3 compiler

3.4 Exécution du jeu de données

(1) Étalonnage de scène unique

(2) Étalonnage multi-scènes

3.5 Utilisation de vos propres paramètres de capteur

3.5.1 Recueillir des images de caméra et des données de sac radar

3.5.2 Utilisation du calibrage multi-scènes

3.5.3 Acquisition des paramètres internes de la caméra

3.5.4 Exécution du programme d'étalonnage 

3.5.5 Résultats de la vérification


Adresse source : https://github.com/hku-mars/livox_camera_calib

Remarque :  lidar_camera_calib et livox_camera_lidar_calibration sont deux programmes d'étalonnage différents. Les deux codes d'étalonnage sont basés sur le lidar de livox. Le chevauchement des codes est relativement élevé et ils devraient être les résultats de la même équipe. Le processus d'auto-étalonnage de l'étalonnage lidar_camera_calib est relativement simple. , et la précision suivra plus bas. Cet article présente lidar_camera_calib, et s'appuie également sur livox_camera_lidar_calibration (projection du nuage de points sur la photo projectCloud.cpp et coloration du nuage de points color_lidar_display.cpp code)

3.1 Présentation de lidar_camera_calib

lidar_camera_calib est un outil pour un étalonnage extrinsèque précis entre des LiDAR haute résolution (tels que Livox) et des caméras dans des environnements sans cible. Notre algorithme peut fonctionner dans les scènes intérieures et extérieures et ne nécessite que des informations de bord dans la scène. Si la scène convient, nous pouvons atteindre une précision au niveau du pixel similaire ou même surpasser les méthodes basées sur les objets.

Nous colorons le nuage de points avec les paramètres extrinsèques calibrés et comparons avec l'image réelle. A et C sont des vues partiellement agrandies du nuage de points. B et D sont les parties de l'image de la caméra correspondant aux nuages ​​de points en A et C.

lidar_camera_calib prend en charge l'étalonnage multi-scènes (plus précis et stable)

3.2 Préparation de l'environnement

(1) Ubuntu et ROS

Nécessite Ubuntu 64 bits 16.04 ou 18.04. ROS cinétique ou mélodique. Installation de ROS et de ses packages ROS supplémentaires

sudo apt-get install ros-XXX-cv-bridge ros-xxx-pcl-conversions

(2) Propre

// 安装
cd eigen-git-mirror
mkdir build
cd build
cmake ..
sudo make install

// 安装后 头文件安装在/usr/local/include/eigen3/

// 移动头文件
sudo cp -r /usr/local/include/eigen3/Eigen /usr/local/include

Remarques : Dans de nombreux programmes, #include <Eigen/Dense> est souvent utilisé à la place de #include <eigen3/Eigen/Dense> lors de l'inclusion, faites donc le traitement suivant

(3) Solveur Cérès

(4) PCL

3.3 compiler

Clonez la base de code et exécutez catkin_make

​cd ~/catkin_ws/src 
git clone https://github.com/hku-mars/livox_camera_calib.git 
cd ../ 
catkin_make 
source ~/catkin_ws/devel/setup.bash

Erreur de compilation 1 : l'erreur suivante apparaîtra lors de la compilation. La raison de l'erreur est que la version de Ceres est trop élevée. Après avoir remplacé Ceres2.1.0 par Ceres2.2.0, il fonctionnera normalement.

/home/zjlab/perception/Calib/calib_ws/src/livox_camera_calib-master/src/lidar_camera_multi_calib.cpp:312:14: error: ‘LocalParameterization’ is not a member of ‘ceres’
  312 |       ceres::LocalParameterization *q_parameterization =
      |              ^~~~~~~~~~~~~~~~~~~~~
/home/zjlab/perception/Calib/calib_ws/src/livox_camera_calib-master/src/lidar_camera_multi_calib.cpp:312:37: error: ‘q_parameterization’ was not declared in this scope
  312 |       ceres::LocalParameterization *q_parameterization =
      |                                     ^~~~~~~~~~~~~~~~~~
/home/zjlab/perception/Calib/calib_ws/src/livox_camera_calib-master/src/lidar_camera_multi_calib.cpp:313:15: error: expected type-specifier
  313 |           new ceres::EigenQuaternionParameterization();
      |               ^~~~~
/home/zjlab/perception/Calib/calib_ws/src/livox_camera_calib-master/src/lidar_camera_calib.cpp: In function ‘int main(int, char**)’:
/home/zjlab/perception/Calib/calib_ws/src/livox_camera_calib-master/src/lidar_camera_calib.cpp:311:14: error: ‘LocalParameterization’ is not a member of ‘ceres’
  311 |       ceres::LocalParameterization *q_parameterization =
      |              ^~~~~~~~~~~~~~~~~~~~~
/home/zjlab/perception/Calib/calib_ws/src/livox_camera_calib-master/src/lidar_camera_calib.cpp:311:37: error: ‘q_parameterization’ was not declared in this scope
  311 |       ceres::LocalParameterization *q_parameterization =
      |                                     ^~~~~~~~~~~~~~~~~~
/home/zjlab/perception/Calib/calib_ws/src/livox_camera_calib-master/src/lidar_camera_calib.cpp:312:15: error: expected type-specifier
  312 |           new ceres::EigenQuaternionParameterization();

Erreur de compilation 2 : conflit de version opencv, opencv4.5.4 fourni avec le système est en conflit avec opencv4.2.0 sous ros.

/usr/bin/ld: warning: libopencv_features2d.so.4.2, needed by /usr/lib/aarch64-linux-gnu/libopencv_calib3d.so.4.2.0, may conflict with libopencv_features2d.so.4.5
/usr/bin/ld: warning: libopencv_imgproc.so.4.5, needed by /usr/lib/aarch64-linux-gnu/libopencv_imgcodecs.so.4.5.4, may conflict with libopencv_imgproc.so.4.2
[ 91%] Built target lidar_camera_calib
/usr/bin/ld: warning: libopencv_features2d.so.4.2, needed by /usr/lib/aarch64-linux-gnu/libopencv_calib3d.so.4.2.0, may conflict with libopencv_features2d.so.4.5
/usr/bin/ld: warning: libopencv_imgproc.so.4.5, needed by /usr/lib/aarch64-linux-gnu/libopencv_imgcodecs.so.4.5.4, may conflict with libopencv_imgproc.so.4.24

Modifiez la configuration cv_bridge :

Le chemin opencv installé par ros par défaut se trouve dans trois répertoires : /usr/include, /usr/lib et /usr/share. Après avoir compilé et installé à partir du code source du site officiel d'opencv, opencv sera installé dans les trois sous-répertoires correspondants sous usr/local par défaut.

#if(NOT "include;/usr/include/opencv4 " STREQUAL " ")
#  set(cv_bridge_INCLUDE_DIRS "")
#  set(_include_dirs "include;/usr/include/opencv4")
if(NOT "include;/usr/local/include;/usr/local/include/opencv4" STREQUAL " ")
  set(cv_bridge_INCLUDE_DIRS "")
  set(_include_dirs "include;/usr/local/include;/usr/local/include/opencv4;/usr/include") 

set(libraries "cv_bridge;/usr/lib/aarch64-linux-gnu/libopencv_calib3d.so.4.2.0;/usr/lib/aarch64-linux-gnu/libopencv_dnn.so.4.2.0;........)

3.4 Exécution du jeu de données

Les ensembles de données officiellement fournis peuvent être téléchargés depuis OneDrive et BaiduNetDisk (Baidu NetDisk).

Disque réseau Baidu : https://pan.baidu.com/s/1oz3unqsmDnFvBExY5fiBJQ?pwd=i964#list/path=%2F

(1) Étalonnage de scène unique

Téléchargez nos fichiers pcd et image dans un chemin local et remplacez le chemin du fichier dans le fichier calib.yaml par votre chemin de données. Ensuite lancez directement :

source ./devel/setup.bash
roslaunch livox_camera_calib calib.launch

obtiendra le résultat suivant.

make[2]: *** No rule to make target '/usr/lib/aarch64-linux-gnu/libopencv_aruco.so.4.5.4', needed by '/home/zjlab/perception/Calib/calib_ws/devel/lib/livox_camera_calib/bag_to_pcd'.  Stop.
make[1]: *** [CMakeFiles/Makefile2:2054: livox_camera_calib/CMakeFiles/bag_to_pcd.dir/all] Error 2
make[1]: *** Waiting for unfinished jobs....
make[2]: *** No rule to make target '/usr/lib/aarch64-linux-gnu/libopencv_aruco.so.4.5.4', needed by '/home/zjlab/perception/Calib/calib_ws/devel/lib/livox_camera_calib/lidar_camera_calib'.  Stop.
make[1]: *** [CMakeFiles/Makefile2:488: livox_camera_calib/CMakeFiles/lidar_camera_calib.dir/all] Error 2
make[2]: *** No rule to make target '/usr/lib/aarch64-linux-gnu/libopencv_aruco.so.4.5.4', needed by '/home/zjlab/perception/Calib/calib_ws/devel/lib/livox_camera_calib/lidar_camera_multi_calib'.  Stop.

Erreur d'exécution 1 : Impossible de charger l'image.

[ERROR] [1689831836.845248880]: Can not load image from /home/zjlab/perception/Calib/calib_ws/src/livox_camera_calib-master/data/calib_dataset/single_scene_calibratio/0.png
[lidar_camera_calib-1] process has died [pid 18393, exit code 255, cmd /home/zjlab/perception/Calib/calib_ws/devel/lib/livox_camera_calib/lidar_camera_calib __name:=lidar_camera_calib __log:=/home/zjlab/.ros/log/d53e9cfa-26ac-11ee-b53d-48b02d3db6e3/lidar_camera_calib-1.log].
log file: /home/zjlab/.ros/log/d53e9cfa-26ac-11ee-b53d-48b02d3db6e3/lidar_camera_calib-1*.log

Vérifiez si le chemin du fichier dans le fichier calib.yaml est modifié correctement et s'il fonctionne normalement après la modification.

Erreur d'exécution 2 : le processus est mort. L'opencv4.5.4 fourni avec le système est en conflit avec l'opencv4.2.0 sous ros

[lidar_camera_calib-1] process has died [pid 25608, exit code -11, cmd /home/zjlab/perception/Calib/calib_ws/devel/lib/livox_camera_calib/lidar_camera_calib __name:=lidar_camera_calib __log:=/home/zjlab/.ros/log/d53e9cfa-26ac-11ee-b53d-48b02d3db6e3/lidar_camera_calib-1.log].
log file: /home/zjlab/.ros/log/d53e9cfa-26ac-11ee-b53d-48b02d3db6e3/lidar_camera_calib-1*.log

init.png

 Les résultats d'étalonnage générés sous le répertoire de fichiers spécifié par le yaml spécifié sont les suivants :

-0.00261333,-0.999901,-0.0138569,0.014096
-0.00334576,0.0138656,-0.999898,0.0574687
0.999991,-0.0025667,-0.00338166,-0.0518364
0,0,0,1

(2) Étalonnage multi-scènes

Téléchargez nos fichiers pcd et image dans un chemin local et remplacez le chemin du fichier dans le fichier multi_calib.yaml par votre chemin de données. Ensuite lancez directement :

roslaunch livox_camera_calib multi_calib.launch

Image projetée obtenue à partir des paramètres extrinsèques initiaux. (Kit capteur : Livox Horizon + caméra MVS)

Exemple de calibrage multi-scènes.

résultats de visualisation résiduels

résultats de la visualisation rviz

Image de projection obtenue avec les extrinsèques initiales. (Kit capteur : Livox Horizon + caméra MVS)

Un exemple de calibrage multi-scènes. Image de projection obtenue avec les extrinsèques initiales .

L'étalonnage grossier est utilisé pour gérer les mauvais éléments extrinsèques.

Image de projection obtenue avec des paramètres extrinsèques obtenus après un étalonnage approximatif.

 Après optimisation finale, on se retrouve avec un paramètre extrinsèque exact.

Image de projection obtenue avec des extrinsèques obtenues après calibrage fin.

Les résultats d'étalonnage générés sous le répertoire de fichiers spécifié par le yaml spécifié sont les suivants :

0.00943777,-0.999902,-0.0103278,-0.0507875
-0.0434641,0.00990826,-0.999006,0.0851625
0.99901,0.00987727,-0.0433664,-0.0231513
0,0,0,1

3.5 Étalonnage avec les propres données du capteur

3.5.1 Recueillir des images de caméra et des données de sac radar

(1) Utilisez la touche 'T' pour capturer les images de la caméra et implémentez le script suivant, fourni avec la caméra ZED, et modifiez-le dans le répertoire /usr/local/zed/samples/tutorials/tutorial2_image_capture.

#include </usr/local/zed/include/sl/Camera.hpp>
#include <iostream>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace sl;

int main(int argc, char **argv) {

    // Create a ZED camera object
    Camera zed;

    // Set configuration parameters
    InitParameters init_parameters;
    init_parameters.camera_resolution = RESOLUTION::HD1080; // Use HD1080 video mode
    init_parameters.camera_fps = 30; // Set fps at 30

    // Open the camera
    auto returned_state = zed.open(init_parameters);
    if (returned_state != ERROR_CODE::SUCCESS) {
        cout << "Error " << returned_state << ", exit program." << endl;
        return EXIT_FAILURE;
    }

    // Capture 50 frames and stop
    // int i = 0;
    int i = 0;
    sl::Mat image;
    cout << "Please 'T' or 't' capture picture, 'E' or 'e' Exit!" << endl;

    while (true){
        
        // Grab an image
        returned_state = zed.grab();
        // A new image is available if grab() returns ERROR_CODE::SUCCESS
        if (returned_state == ERROR_CODE::SUCCESS) {
            
            char key;
            cin >> key;

            if(key == 'E' || key == 'e'){
                break;
            }
            if(key == 'T' || key == 't'){
                
                // Get the left image
                cout << "Capture picture" << to_string(i) << endl;           
                zed.retrieveImage(image, VIEW::LEFT);
                string savePath = "../data/image/" + to_string(i) + ".bmp" ;
                image.write(savePath.c_str());
                
                // Display the image resolution and its acquisition timestamp
                cout<<"Image resolution: "<< image.getWidth()<<"x"<<image.getHeight() <<" || Image timestamp: "<<image.timestamp.data_ns<< endl << endl;
                i++;
            }
            
        }
    }

    // while(i < 10){
    //     returned_state
    // }

    // Close the camera
    zed.close();
    return EXIT_SUCCESS;

(2) Pour collecter les données du sac radar, démarrez le radar via la commande roslaunch livox_ros_driver livox_lidar_msg.launch Le type du sac est livox_ros_driver2/CustomMsg, sinon le format du sac est sensor_msgs/PointCloud2, ce qui n'est pas pratique pour un traitement ultérieur.

roslaunch livox_ros_driver livox_lidar_msg.launch # 启动雷达
# 在根目录下逐级创建用于保存 bag 文件的文件夹
mkdir -p src/livox_camera_lidar_calibration/data/lidar
rosbag record -O src/livox_camera_lidar_calibration/data/lidar/0.bag /livox/lidar # 录制点云,输出到指定文件夹下,便于后续操作,文件名从序号 0 开始标

3.5.2 Utilisation du calibrage multi-scènes

Modifiez les paramètres dans multi_calib.yaml pour nommer les fichiers image et les fichiers pcd de 0 à (nombre total de données - 1).

[ INFO] [1690958506.262467995]: Loading the rosbag /home/zjlab/perception/Calib/calib_ws/src/livox_camera_calib/mydata/bag/0.bag
[ERROR] [1690958506.437747485]: LOADING BAG FAILED: Bag unindexed
[bag_to_pcd-2] process has died [pid 6316, exit code 255, cmd /home/zjlab/perception/Calib/calib_ws/devel/lib/livox_camera_calib/bag_to_pcd __name:=bag_to_pcd __log:=/home/zjlab/.ros/log/a4eaa69a-30ff-11ee-99c8-48b02d3db6e3/bag_to_pcd-2.log].
log file: /home/zjlab/.ros/log/a4eaa69a-30ff-11ee-99c8-48b02d3db6e3/bag_to_pcd-2*.log

Erreur : les informations spécifiques de l'erreur sont :

rosbag.bag.ROSBagUnindexedException: Unindexed bag

problème résolu:

 Lorsque nous rencontrons ce problème, nous devons jeter un œil au sac et utiliser la commande :

rosbag info 0.bag

À ce moment, une erreur sera signalée :

ERROR bag unindexed: 0.bag. Run rosbag reindex.

Exécutez le sac enregistré dans l'ordre :

rosbag reindex 0.bag

Attendez que l'exécution soit terminée, puis nous pourrons entrer. Si la sortie peut être normale, cela signifie que le sac peut être lu normalement.

zjlab@zjlab-zjrobot:~/perception/Calib/calib_ws/src/livox_camera_calib/mydata/bag$ rosbag info 0.bag 
ERROR bag unindexed: 0.bag.  Run rosbag reindex.
zjlab@zjlab-zjrobot:~/perception/Calib/calib_ws/src/livox_camera_calib/mydata/bag$ Run rosbag reindex
bash: Run: command not found
zjlab@zjlab-zjrobot:~/perception/Calib/calib_ws/src/livox_camera_calib/mydata/bag$ rosbag reindex 0.bag 
 0.bag                                       100%             44.1 MB 00:00    
zjlab@zjlab-zjrobot:~/perception/Calib/calib_ws/src/livox_camera_calib/mydata/bag$ rosbag info 0.bag 
path:        0.bag
version:     2.0
duration:    10.5s
start:       Jul 28 2023 16:37:17.00 (1690533438.00)
end:         Jul 28 2023 16:37:28.50 (1690533448.50)
size:        43.7 MB
messages:    106
compression: none [53/53 chunks]
types:       sensor_msgs/PointCloud2 [1158d486dd51d683ce2f1be655c3c181]
topics:      /livox/lidar   106 msgs    : sensor_msgs/PointCloud2

3.5.3 Acquisition des paramètres internes de la caméra

Le format de la matrice de référence interne est illustré dans la figure ci-dessous. Généralement, il existe des valeurs correspondantes dans les quatre positions (0,0);(0,2);(1,1);(1,2 ). 

 Obtenir les paramètres internes de la caméra dans le fichier répertoire /usr/local/zed/settings

[LEFT_CAM_2K]
fx=1055.98
fy=1054.75
cx=1109.22
cy=618.272
k1=-0.0436089
k2=0.0133655
p1=-0.000636837
p2=0.000189454
k3=-0.00610127

 Rapport d'erreur : les paramètres internes et externes de la caméra doivent répondre aux exigences de format, sinon l'erreur suivante sera signalée.

process[projectCloud-1]: started with pid [25817]
Get the parameters from the launch file
[ INFO] [1691026996.688365859]: Start to load the rosbag /home/zjlab/perception/Calib/calib_ws/src/livox_camera_calib/mydata/bag/0.bag

Can not convert a string to double
[projectCloud-1] process has finished cleanly

Solution : modifier les fichiers de référence internes et externes, les organiser en fonction des besoins, et il doit y avoir des espaces entre les numéros

报错: Échec du chargement du module "canberra-gtk-module" 

Gtk-Message: 11:34:35.337: Failed to load module "canberra-gtk-module"
[projectCloud-1] process has finished cleanly
log file: /home/zjlab/.ros/log/83ec06a2-311b-11ee-a1d3-024273a4022a/projectCloud-1*.log
all processes on machine have died, roslaunch will exit

Solution : réinstallez-le.

sudo apt-get install libcanberra-gtk-module

3.5.4 Exécution du programme d'étalonnage 

Après l'exécution, les résultats de référence externe seront enregistrés dans le répertoire spécifié

roslaunch  livox_camera_calib multi_calib.launch

3.5.5 Résultats de la vérification

Le nuage de points du projet à la photo et la coloration du nuage de points peuvent faire référence à livox_camera_lidar_calibration, il suffit de modifier le chemin sous le fichier de lancement pour vérifier.

(1) Projeter le nuage de points sur la photo

roslaunch livox_camera_calib projectCloud.launch

(2) Coloration du nuage de points :

roslaunch livox_camera_calib colorLidar.launch

Je suppose que tu aimes

Origine blog.csdn.net/qq_41921826/article/details/131781825
conseillé
Classement