HViktorTsoi / ACSC

Automatic Calibration for Non-repetitive Scanning Solid-State LiDAR and Camera Systems
GNU General Public License v3.0
287 stars 60 forks source link

目前使用过的针对livox激光雷达和相机联合标定最好最方便的方法! #36

Open xiehao-ai opened 6 months ago

xiehao-ai commented 6 months ago

感谢作者的开源代码!

曾经尝试过6种方法进行livox雷达和相机的联合标定,包括livox官方开源的那两个。从效果上看,还是基于标定板的方法靠谱,很多自动标定的方法对采集环境的要求太高,现实很难找到理想的场地去完成标定;matlab高版本中也有集成的激光雷达相机联合标定方法,但是使用起来稍微繁琐一点,而且标定效果也不稳定。

由于作者的开源代码标定的效果太好了,完美解决了我遇到的问题,欣喜之余分享一下我使用作者代码标定的一些经验。

使用多台设备多次标定,结果都是一次成功。 如果使用该方法标定结果稍有差异(很少出现),可以将代码中生成的标定板3d点和2d点存下来,使用livox官方提供的手工标定方法,直接替换那两个存储3d和2d点的txt文件,使用同时优化外参和内参的方法,可以达到理想的标定效果。

系统环境:ubuntu20.04,pothon3.8,ROS1-noetic 激光雷达: Livox-AVIA 相机:1200W/800W像素 高质量黑白棋盘格标定板及单杆立式固定支架

我配置的环境: pip install numpy==1.23 pip install scipy pip install scikit-learn pip install rospy pip install rospkg pip install pyyaml pip install transforms3d sudo apt-get install ros-noetic-ros-numpy

建立链接: ln -s /usr/bin/python3 /usr/bin/python

由于使用的为python3,相关源码需要进行修改: 我使用的相机没有对应的ROS驱动,因此图像采集使用cheese,代码中图像采集相关的代码被我注释掉了

cd /path/to/your/ACSC/ros/livox_calibration_ws/src/calibration_data_collection/scripts

打开文件夹下唯一的py文件,修改第11、40、41、310、328、344行

Line11: import thread 修改为 import _thread

Line40、41: 将第41行注释掉,并将第40行取消注释

Line 310: 将该行注释掉

Line328: thread.start_new_thread 修改为 _thread.start_new_thread

Line344: 将此行注释掉

修改ros中的launch文件 cd path/to/your/ACSC/ros/livox_calibration_ws/src/calibration_data_collection/launch/lidar_camera_calibration.launch 将config-path 设置为 data_collection.yaml 的路径

之后catkin_make编译,按照作者的教程就可以进行标定了,我采集了30组数据左右

最后放一张标定效果图像: ![Uploading 0.jpg…]()

xiehao-ai commented 6 months ago

0

QianZhao-xd commented 2 months ago

你好,我也是使用AVIA激光雷达进行的实验,但是效果不太好,从您这个结果图来看AVIA的视场角好像是不大的,是有什么调整的方式吗,我的Avia拍摄出来的标定板上的点云格子之间边界不清晰,大概能有1~2cm重合的绿线,不知道是不是这个原因我的结果误差很大,想请问一下您是否有这种情况呢

微信图片_20240423115430
xiehao-ai commented 2 months ago

你好,我也是使用AVIA激光雷达进行的实验,但是效果不太好,从您这个结果图来看AVIA的视场角好像是不大的,是有什么调整的方式吗,我的Avia拍摄出来的标定板上的点云格子之间边界不清晰,大概能有1~2cm重合的绿线,不知道是不是这个原因我的结果误差很大,想请问一下您是否有这种情况呢 微信图片_20240423115430

  1. “我的Avia拍摄出来的标定板上的点云格子之间边界不清晰,大概能有1~2cm重合的绿线,不知道是不是这个原因我的结果误差很大”,绿色细线有可能是不同的标定板材质的影响,而且Livox雷达本身采集到的点云也是有噪声的,获得的标定板点云并不是那么干净。
  2. “我也是使用AVIA激光雷达进行的实验,但是效果不太好”,有完整的点云投影图片吗,从你发的图片上看不出整体的标定效果。
  3. "AVIA的视场角好像是不大的,是有什么调整的方式吗”,雷达的视场角是固定的,雷达和相机需要考虑视野匹配,我用的相机的视野在水平方向上比雷达大,在垂直方向上比雷达小,在实际标定过程中我修改了config/data_collection.yaml中BOUND,改为: [2, 12, -8, 8, -2, 2],这个要根据自己使用的雷达和相机的视野进行设置
  4. 我在实际标定中也遇到过标定效果不理想的情况,可能的原因如下:a) 相机内参不够准确 b)图像没有进行去畸变处理 c)采集的标定数据不够理想(比如标定板的放置方式,可参照论文中的摆放要求)。
  5. 如果标定效果没有满足你的要求,可以修改config/sample.yaml中OPTIMIZE_TH值,我将其改为了80,利用该论文中的方法去检测标定板3D点和2D点,然后将这些点存下来,使用Livox官方的标定代码同时优化内参和外参,可以得到理想的标定效果。
xiehao-ai commented 2 months ago

你好,我也是使用AVIA激光雷达进行的实验,但是效果不太好,从您这个结果图来看AVIA的视场角好像是不大的,是有什么调整的方式吗,我的Avia拍摄出来的标定板上的点云格子之间边界不清晰,大概能有1~2cm重合的绿线,不知道是不是这个原因我的结果误差很大,想请问一下您是否有这种情况呢 微信图片_20240423115430

“我的Avia拍摄出来的标定板上的点云格子之间边界不清晰,大概能有1~2cm重合的绿线,不知道是不是这个原因我的结果误差很大,想请问一下您是否有这种情况呢”:从我的经验来看,这不是影响标定效果的根本原因,你可以看一下我的标定图像(其实当时应该上传一张去畸变的图像......),格子之间也有线存在。具体原因需要知道你更多的实验细节再进行分析

QianZhao-xd commented 2 months ago

非常感谢!! 1、我整体的标定结果如下,使用的相机视场角是比激光雷达小的,结果上看有的误差就非常大,可以看到重投影误差已经有2cm了。 image image image 2、我也尝试过使用官网的方法进行优化,但是效果也不太好,所以才在想会不会因为绿色的线导致点云角点检测这里误差较大。 image image

xiehao-ai commented 2 months ago

非常感谢!! 1、我整体的标定结果如下,使用的相机视场角是比激光雷达小的,结果上看有的误差就非常大,可以看到重投影误差已经有2cm了。 image image image 2、我也尝试过使用官网的方法进行优化,但是效果也不太好,所以才在想会不会因为绿色的线导致点云角点检测这里误差较大。 image image

  1. 我一般采集20-30组数据进行标定,建议多采集几组数据。
  2. 你的标定板底端到支腿的距离偏小,这个距离我不确定是否可以通过作者源码(计算垂直方向不同层级之间水平范围的变化)正确的提取出标定板点云。建议参照我图像中的标定板摆放方式,标定板底端到支腿之间的距离大一些。
  3. 从第二张图上看,我感觉标定板距离雷达和相机有点近(不清楚你的雷达和相机相对位置关系),我一般在距离雷达和相机3-9米的范围内进行采集,多次变换标定板位置,尽可能多的覆盖视野,设备左右两侧的拍摄数量最好保持平衡。
  4. 结合自己使用的标定板修改源码配置文件中每行每列棋盘格的个数。
  5. 在使用Livox官方的标定方法时,3D角点和2D角点是手工选取的吗,个人建议3D角点使用作者源码进行提取(写个脚本处理源码生成的pkl文件),2D角点使用opencv进行提取,然后运行Livox官方标定方法同时优化内参和外参。
  6. 如果需要进一步分析原因,最好可以给出你使用的标定板材质以及采集的点云和图像文件。