硬件設(shè)備
激光雷達:DJI Livox Avia混合固態(tài)激光雷達
相機:Intel Realsense D435i深度相機
外參標定
外參標定是進行多傳感器融合的必要前提。
標定流程
livox_camera_calib是香港大學(xué)MaRS 實驗室開發(fā)的一款的激光雷達和相機標定的算法。算法分為分為單場景標定(Single scene calibration)和多場景標定(Multi scenes calibration),本文只探討單場景標定。配置過程參考livox_camera_calib官網(wǎng)的流程即可。
cd ~/catkin_ws/src
git clone https://github.com/hku-mars/livox_camera_calib.git
cd ../
catkin_make
source ~/catkin_ws/devel/setup.bash
配置好環(huán)境后運行標定launch文件。過程如下:
(1)修改config/calib.yaml文件路徑
# Data path. adjust them!
common:
image_file: "/home/ggh/workdir/catkin_ws/src/livox_camera_calib/data/2.png" #你自己存放相機影像png的路徑
pcd_file: "/home/test/lidarimu/catkin_ws/src/livox_camera_calib/data/2.pcd" #你自己存放點云pcd的路徑
result_file: "/home/test/lidarimu/catkin_ws/src/livox_camera_calib/result/extrinsic.txt" #存放標定結(jié)果的路徑
# Camera Parameters. Adjust them!
# 你自己相機的內(nèi)參數(shù)和鏡頭畸變參數(shù)
camera:
camera_matrix: [1364.45, 0.0, 958.327,
0.0, 1366.46, 535.074,
0.0, 0.0, 1.0 ]
dist_coeffs: [0.0958277, -0.198233, -0.000147133, -0.000430056, 0.000000]
# Calibration Parameters.!
calib:
calib_config_file: "/home/test/lidarimu/catkin_ws/src/livox_camera_calib/config/config_indoor.yaml" #連接的另外一個yaml的文件,視你的標定場景而定,這個會直接影響標定結(jié)果,一定要記得修改
use_rough_calib: true # set true if your initial_extrinsic is bad
(2)運行單場景標定roslaunch文件
roslaunch livox_camera_calib calib.launch
經(jīng)過一系列迭代優(yōu)化得到標定結(jié)果,如下數(shù)圖所示。
問題解決
問題一:運行calib.launch報錯:[lidar_camera_calib-2] process has died [pid 26108, exit code -11, cmd
NODES
/
lidar_camera_calib (livox_camera_calib/lidar_camera_calib)
rviz (rviz/rviz)
auto-starting new master
process[master]: started with pid [26093]
ROS_MASTER_URI=http://localhost:11311
setting /run_id to 8bfc51c8-dc14-11ed-9ebe-0cc47a6c9e2b
process[rosout-1]: started with pid [26104]
started core service [/rosout]
process[lidar_camera_calib-2]: started with pid [26108]
process[rviz-3]: started with pid [26112]
pcd_file path:/home/lk/catkin_ws/src/livox_camera_calib/data/single_scene_calibration/0.pcd
[lidar_camera_calib-2] process has died [pid 26108, exit code -11, cmd /home/lk/catkin_ws/devel/lib/livox_camera_calib/lidar_camera_calib __name:=lidar_camera_calib __log:=/home/lk/.ros/log/8bfc51c8-dc14-11ed-9ebe-0cc47a6c9e2b/lidar_camera_calib-2.log].
log file: /home/lk/.ros/log/8bfc51c8-dc14-11ed-9ebe-0cc47a6c9e2b/lidar_camera_calib-2*.log”
從這段報錯中除了能得到是在加載pcd文件時出錯以外,看不出來任何有用信息。這時rviz被打開,發(fā)現(xiàn)在rviz軟件界面顯示未接收到任何點云或圖片數(shù)據(jù),大膽猜測是pcd數(shù)據(jù)沒有加載失敗,
忘了截圖了,這里引用來自livox_camera_calib主頁#85 Issue的圖,在Issue中沒有解決這個問題。
圖源:livox_camera_calib主頁#85 Issue
經(jīng)分析,直接問題斷定為加載pcd點云文件失敗,猜測問題本源在于opencv版本沖突。為了確定這一猜測,基于vscode配置ros代碼調(diào)式,
紅框處為報錯的地方(調(diào)試時忘記截圖,在此處用紅框標記之),由此猜測是 cv_bridge 與 opencv4版本沖突問題,因為我的系統(tǒng)是ubuntu 18.04,ROS版本為melodic,而 melodic 版本的 cv_bridge 功能包中所用 opencv 版本為 opencv3,我安裝的是opencv4。考慮到noetic 版本的 cv_bridge 功能包使用的是 opencv4,所以提出
【解決方法】:通過安裝noetic 版本的 cv_bridge ,將新的 cv_bridge 和 我自己功能包的依賴設(shè)為同一版本的 opencv,同時保留 melodic 版本的 cv_bridge 功能包(后面會說到為什么要同時保留)。具體安裝過程參考這篇文章。
退回catkin工作空間,重新catkin_make,然后再次運行
roslaunch livox_camera_calib calib.launch
加載成功!
問題二:運行自己的標定數(shù)據(jù)報錯:[pcl::KdTreeFLANN::setInputCloud] Cannot create a KDTree with an empty input cloud!
[ INFO] [1691133251.022876409]: Sucessfully load calib config file
[ INFO] [1691133251.636212259]: Sucessfully load image!
[ INFO] [1691133251.640953018]: Sucessfully extract edge from image, edge size:15957
[ INFO] [1691133251.640971292]: Loading point cloud from pcd file.
[ INFO] [1691133281.547540320]: Sucessfully load pcd, pointcloud size: 9936000
[ INFO] [1691133281.547566909]: Building Voxel
[ INFO] [1691133285.886021869]: Extracting Lidar Edge
[ INFO] [1691133292.414024597]: Finish prepare!
Initial rotation matrix:
0 -1 0
0 0 -1
1 0 0
Initial translation:0 0 0
[pcl::KdTreeFLANN::setInputCloud] Cannot create a KDTree with an empty input cloud!
Rough calibration min cost:1
[pcl::KdTreeFLANN::setInputCloud] Cannot create a KDTree with an empty input cloud!
[pcl::KdTreeFLANN::setInputCloud] Cannot create a KDTree with an empty input cloud!
[pcl::KdTreeFLANN::setInputCloud] Cannot create a KDTree with an empty input cloud!
[pcl::KdTreeFLANN::setInputCloud] Cannot create a KDTree with an empty input cloud!
[pcl::KdTreeFLANN::setInputCloud] Cannot create a KDTree with an empty input cloud!
[pcl::KdTreeFLANN::setInputCloud] Cannot create a KDTree with an empty input cloud!
[pcl::KdTreeFLANN::setInputCloud] Cannot create a KDTree with an empty input cloud!
導(dǎo)致無法進入優(yōu)化程序,具體表現(xiàn)為沒有輸出點云-圖像殘差圖以及沒有點云疊加的優(yōu)化窗口,如下圖所示。
排除了點云路徑錯誤、點云話題名稱錯誤以及點云密度過于稀疏等livox_camera_calib項目網(wǎng)站上#19 Issue和#84 Issue中提到的可能的錯誤,即能讀取并在rviz上顯示就說明點云路徑和話題名稱沒錯,能提取到足夠多的線特征(紅色的線條)就說明點云密度達到標定要求(為此我還對比了項目demo中3.pcd的點云密度,我采集的點云數(shù)量遠高于demo中的點云數(shù)量),如下圖所示。但是問題依然沒有得到解決。
那么問題該如何解決呢?需要說明的是,我采集的標定數(shù)據(jù)設(shè)置的分辨率為640480,項目demo中給的影像分辨率是19201080。于是,我將我的D435i的RGB影像分辨率設(shè)置為與demo一致的1920*1080,并且將影像話題發(fā)布頻率降低為30Hz(否則會硬件報錯),該操作在realsense_camera包的rs_camera.launch中進行,如圖所示:
重新錄制ros包,從中提取png格式影像,重新運行calib.launch,pcd加載完成后,進入優(yōu)化模式,問題解決!
相機內(nèi)參標定
在標定激光雷達和相機外部參數(shù)之前,我們必須盡可能地知道相機準確的焦距、像主點偏移以及鏡頭畸變等相機內(nèi)部參數(shù)。最直接的,我們在修改config/calib.yaml文件時,相機內(nèi)參是必須由我們自己給定。因此,在開始外參標定前,我們首先要標定相機內(nèi)參。
標定流程
對于Intel Realsense D435i相機的標定,我們可以參考這篇文章,即使用ETHZ出品的Kalibr工具包來標定。由于這篇文章已經(jīng)寫得非常詳細,在此我就不過多贅述了。使用Intel Realsense D435i的同學(xué)可以無腦照著這篇文章操作,使用別的系列或者別的品牌的同學(xué)注意要在有些關(guān)鍵地方需要根據(jù)自身設(shè)備作出修改。
需要注意的一點是,文章中運行標定ros功能包時有一個小錯誤,即文章中給的運行命令是
kalibr_calibrate_cameras --target ~/kalibr_ws/src/Kalibr/data/checkerboard.yaml --bag ~/kalibr_ws/src/Kalibr/data/camd435i.bag --models pinhole-equi --topics /color --show-extractio
如果同學(xué)們按照這個命令輸入會發(fā)現(xiàn)會報錯:找不到kalibr_calibrate_cameras包,這時不要慌張,在前面加上rosrun等操作即可文章來源:http://www.zghlxwxcb.cn/news/detail-761651.html
rosrun kalibr kalibr_calibrate_cameras --target ~/kalibr_ws/src/Kalibr/data/checkerboard.yaml --bag ~/kalibr_ws/src/Kalibr/data/camd435i.bag --models pinhole-equi --topics /color --show-extractio
問題解決
問題一:運行kalibr_calibrate_cameras報錯:UnicodedecodeError:‘a(chǎn)scii’ codec can’t decode byte oxco in position 0: ordinalnot in range(128)
這紅框中可知,這是因為當前的python版本(我裝的是python2.7)與noetic版本的cv_bridge沖突所致,這是不要慌,在這個包里用回原來的melodic版本的cv_bridge就OK了,這也就是為何我在上文中說要同時保留這兩個版本的cv_bridge的原因。具體操作如下:
找到catkin工作空間下python文件夾下cv_bridge下的_init_.py
文件,一般路徑是:~/workdir/catkin ws/devel/lib/python2.7/dist-packages/cv bridge/init .py
,修改擴展路徑_extended_path
為melodic版本的cv_bridge的python路徑即可
重新運行ROS功能包,問題解決!文章來源地址http://www.zghlxwxcb.cn/news/detail-761651.html
到了這里,關(guān)于【筆記&問題解決】激光雷達和相機外部參數(shù)標定全流程(livox_camera_calib加載數(shù)據(jù)問題解決 [#85 Issue] & PCL無法創(chuàng)建KDTree問題解決 [#19 Issue])的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!