Bootstrap

一、direct_visual_lidar_calib环境部署及应用

目录

参考

安装依赖

安装GTSM

安装Ceres

安装Iridescence

安装SuperGlue [可选]

安装direct_visual_lidar_calibration

开始标定


1.参考

官网:https://github.com/koide3/direct_visual_lidar_calibration?tab=readme-ov-file

官方安装文档:Installation - direct_visual_lidar_calibration

部署整体参考:相机雷达标定direct_visual_lidar_calibration部署_direct lidar camera calibration-CSDN博客

gtsm编译:ubuntu20.04 install gtsam && eigen 版本设置 注意事项_the "debug" argument must be followed by a library-CSDN博客

fmt:ubuntu20.04 install gtsam && eigen 版本设置 注意事项_the "debug" argument must be followed by a library-CSDN博客

基础环境:ubuntu20.04_ros1

2.安装依赖

# Install dependencies

sudo apt install libomp-dev libboost-all-dev libglm-dev libglfw3-dev libpng-dev libjpeg-dev

3.安装GTSM

最好使用官网推荐版本4.2a9

# Install GTSAM

git clone https://github.com/borglab/gtsam

cd gtsam && git checkout 4.2a9

mkdir build && cd build

# For Ubuntu 22.04, add -DGTSAM_USE_SYSTEM_EIGEN=ON

cmake .. -DGTSAM_BUILD_EXAMPLES_ALWAYS=OFF \

         -DGTSAM_BUILD_TESTS=OFF \

         -DGTSAM_WITH_TBB=OFF \

         -DGTSAM_BUILD_WITH_MARCH_NATIVE=OFF

make -j$(nproc)

sudo make install

GTSAM安装成功后,在使用catkin_make编译direct_visual_lidar_calib项目时,出现下面报错:

报错1:error: static assertion failed: Error: GTSAM was built against different version of Eigen

GTSAM_EIGEN_VERSION_WORLD==EIGEN_WORLD_VERSION

解决方法:这是因为GTSAM使用了自带的eigen,与计算机本地的冲突了。

打开gtsam/cmake/HandleEigen.cmake文件,在

if(GTSAM_USE_SYSTEM_EIGEN)

的上面添加

set(GTSAM_USE_SYSTEM_EIGEN ON),

修改如下:

报错2:fatal error: fmt/format.h: 或 /usr/bin/ld: could not found -lfmt

解决方法:需下8.8.1版本的fmt,不然报错error: static assertion failed: Cannot format an argument.

报错3:error while loading shared libraries: libmetis-gtsam.so:

解决方法:sudo apt-get install libparmetis-dev

4.安装Ceres

推荐安装ceres2.1及其以后的版本

# Install Ceres

git clone https://github.com/ceres-solver/ceres-solver

mkdir ceres-solver/build && cd ceres-solver/build

cmake .. -DBUILD_EXAMPLES=OFF -DBUILD_TESTING=OFF -DUSE_CUDA=OFF

make -j$(nproc)

sudo make install

Ceres安装成功后,在使用catkin_make编译direct_visual_lidar_calib项目时,出现下面报错:

报错1:fatal error: ceres/manifold.h: 

解决方法:安装ceres2.1及其以后的版本,才有mainfold.h模块

5.安装Iridescence

不能直接在网页下载库,再进行编译,一定要进行子模块初始化

*--recursive,初始化和更新子模块。使用子模块可以将一个 Git 仓库嵌套在另一个 Git 仓库中,而且每个仓库可以独立进行版本控制和管理。

# Install Iridescence for visualization

git clone https://github.com/koide3/iridescence --recursive

mkdir iridescence/build && cd iridescence/build

cmake .. -DCMAKE_BUILD_TYPE=Release

make -j$(nproc)

sudo make install

没有进行子模块初始化,会在编译direct_visual_lidar_calib时出现以下错误:

报错1:could not find Iridescence

分析:在iridescence/cmake/FindIridescence.cmake中LIBRARIES重命名,由于最开始安装的库是直接从githu网页上下载的,没有经历子模块初始化,导致找不到对应的gl_imgui_lib.

6.安装SuperGlue [可选]

注意:

matplotlib>=3.1.3

torch>=1.1.0

opencv-python>=4.1.2.30

numpy>=1.18.1

pip3 install numpy opencv-python torch matplotlib

git clone https://github.com/magicleap/SuperGluePretrainedNetwork.git



echo 'export PYTHONPATH=$PYTHONPATH:/path/to/SuperGluePretrainedNetwork' >> ~/.bashrc

source ~/.bashrc

报错1:[W NNPACK.cpp:61] Could not initialize NNPACK! Reason: Unsupported hardware.

分析:这个警告是由于NNPACK无法初始化,原因是硬件不支持。NNPACK是一个用于神经网络推理加速的库,但它需要特定的硬件支持来执行优化的计算。如果你的硬件不支持NNPACK所需的指令集或功能,它就无法正常工作。

实际上不用管,也可以成功继续运行。

报错2:MatplotlibDeprecationWarning: The get_cmap function was deprecated in Matplotlib 3.7 and will be removed two minor releases later. Use ``matplotlib.colormaps[name]`` or ``matplotlib.colormaps.get_cmap(obj)`` instead.

  cmap = matplotlib.cm.get_cmap('turbo')

解决方法:更新Matplotlib版本,并按照报错修改cmap = matplotlib.cm.get_cmap('turbo')为matplotlib.colormaps.get_cmap(obj).

7.安装direct_visual_lidar_calibration

# ROS1

cd ~/catkin_ws/src

git clone https://github.com/koide3/direct_visual_lidar_calibration.git --recursive

cd .. && catkin_make



# ROS2

cd ~/ros2_ws/src

git clone https://github.com/koide3/direct_visual_lidar_calibration.git --recursive

cd .. && colcon build

8.开始标定

此处使用的是官方给出的livox_ros1数据。

该项目里提供了ros1和ros2的数据读取,但由于 ROS2-ROS1 包转换问题,示例 ROS1 包文件中的 CameraInfo 消息显示的 MD5 校验和与标准 sensor_msgs/CameraInfo 消息的校验和不同。由于这会影响自动提取相机信息,因此需要手动指定相机参数进行预处理。

camera_info msg 必须是 plumb_bob 或 fisheye,否则也需手动指定相机参数。

若不指定相机参数,则会报错:不存在camera_info

所以首先需要提取出rosbag中camera_info内容:

# rostopic filter 提取主题内容

rosbag filter  livox_ros1/rosbag2_2023_03_09-13_42_46.bag livox_ros1/extracted.bag "topic == '/camera_info'"

# rostopic echo 转换格式

rostopic echo -p -b livox_ros1/extracted.bag /camera_info > livox_ros1/camera_info.txt

得到distortion_coeffs:

和intrinsic:

查看代码可知:

最后得到我们要手动指定的相机外参为:

开始标定

Process

rosrun direct_visual_lidar_calibration preprocess livox_ros1  -av --camera_model=plumb_bob --camera_intrinsics=1452.71176245628,1455.87753161946,1265.25895179213,1045.8185936641 --camera_distortion_coeffs=-0.042035649,0.087317098,0.002386382,0.005629701,-0.042511493 livox_preprocessed

通过Iridescence可视化库的相机控件,鼠标左键控制yaw和pitch角围绕球心旋转,按住鼠标滚轮控制前后左右平移。可以调整视角得到下图:

Initial guess (Automatic)

rosrun direct_visual_lidar_calibration find_matches_superglue.py livox_preprocessed --rotate_camera 90

rosrun direct_visual_lidar_calibration initial_guess_auto livox_preprocessed

Initial guess (Manual)

rosrun direct_visual_lidar_calibration initial_guess_manual livox_preprocessed

Calibration result inspection

rosrun direct_visual_lidar_calibration calibrate livox_preprocessed

;