項目要標定雷達和相機,這裏記錄下我標定過程,用的速騰 Robosense - 16 線雷達和 ZED 雙目相機。
一、編譯安裝 Autoware-1.10.0
我沒有安裝最新版本的 Autoware,因爲新版本不帶雷達和相機的標定工具,我安裝的是 1.10.0 版本!
1.1 下載 Autoware-1.10.0 源碼
不建議官方的 git check 安裝方式,因爲不熟悉 git 可能會遇到問題,直接在GitLab 倉庫選擇 1.10.0 版本下載即可:
1.2 編譯 Autoware-1.10.0
編譯過程比較容易,我也沒遇到編譯錯誤,解壓下載的 autoware-1.10.0,在該目錄下執行以下命令:
# 1. 進入 autoware 的 ros 目錄下
cd autoware-1.10.0/ros
# 2. rosdep 安裝依賴
rosdep update
rosdep install -y --from-paths src --ignore-src --rosdistro $ROS_DISTRO
# 3. 編譯
./catkin_make_release
我的臺式機配置比較低,大概編譯了 1 個小時,好的配置應該編譯的更快。
1.3 啓動 Autoware-1.10.0
首先還是要進入 ros 目錄下,然後 source 環境,之後執行 run
程序即可啓動主界面:
# 1. 進入 autoware 的 ros 目錄下
cd autoware-1.10.0/ros
# 2. source 環境,zsh 或 bash
source devel/setup.zsh[.bash]
# 3. 啓動主界面
./run
可能需要輸入 root 密碼,然後啓動的主界面如下:
至此 Autoware 就安裝好了,後面我們需要用它提供的標定工具包來進行內參和外參的標定,以及標定結果的融合效果測試。
二、標定 ZED 相機內參
2.1 內參標定準備
內參標定需要準備標定板,我用的是我們實驗室自己購買的 12x9,棋盤格爲 2.5cm 的專業標定板,比較精準,如下:
然後錄製一個相機左右話題的 Bag:
rosbag record -O zed_calibration.bag /camera/left/image_raw /camera/right/image_raw
爲了得到好的標定結果,錄製過程中需要在相機視野裏面移動標定板,建議位置如下:
- X 軸標定:移動到視野的最左邊,最右邊
- Y 軸標定:移動到視野的最上方,最底部
- 傾斜標定:改變標定板的角度,斜着拿
- Size 標定:移動標定板充滿整個相機視野
- X,Y 和 Size 一起標定:保持標定板傾斜啓動到視野的最左,最右,最上,最下
然後我拷貝 Bag 到臺式機上回放,但是有問題提示需要 rogbag reindex
:
rosbag reindex zed_calibration.bag
執行修復下就 OK,速度很快,不過後面的數據會少一些,可能是拷貝過程中的錯誤導致的,無傷大雅。
1.2 內參標定過程
內參標定比較簡單,基本都是自動執行,先 source Autoware 環境以使用標定工具:
cd autoware-1.10.0/ros/
source devel/setup.zsh
啓動 roscore:
roscore
啓動標定工具 autoware_camera_lidar_calibrator
,但是這個工具同時標定雙目得到的標定 YAML 文件不能直接作爲後面外參標定的輸入,因爲文件格式有些不同,我也是做實驗發現的,因此我單獨標定左右相機,這樣就會生成可用的 Autoware 格式的 YAML 文件:
rosrun autoware_camera_lidar_calibrator cameracalibrator.py --square 0.025 --size 11x8 image:=/camera/left/image_raw
參數如下:
--square
:標定板單元格的邊長(m),我的標定板是 2.5cm,也就是 0.025m--size
:標定板長x寬的格子數減一,我的標定板是 12x9,所以填 11x8image
:要標定的相機話題,左或者右
啓動後就是一個黑窗口:
然後開始回放內參標定 Bag,默認暫停啓動,按空格繼續:
rosbag play --pause zed_calibration.bag
標定過程如下,標定工具會根據棋盤格位置自動檢測角點:
當右上角的 X、Y、Size、Skew 變爲綠色時,標定按鈕「CALIBRATE」可用,點擊即可計算內參矩陣:
結果在 Shell 中打印出來,點擊「SAVE」可保存到 home 目錄下:
注意這裏會多保存一個 Autoware 類型的 YAML 文件格式,也就是後面外參標定要導入的文件!內容如下:
下面開始標定雷達和相機的外參!
三、ZED 相機和 Robosense-16 線雷達聯合標定外參
3.1 聯合標定準備
聯合標定也要準備標定板和錄製 bag 包,標定板用的也是內參標定的棋盤格,另外因爲我是在電腦上安裝的 Autoware,所以需要在小車上錄製雷達和相機的 Bag 數據包,然後再拷貝到我的電腦上回放用於標定工具的話題輸入。
我錄製 bag 包的命令如下,錄製的是ZED 左右相機話題、雷達話題:
rosbag record -O zed_lidar_calibration.bag /camera/left/image_raw /camera/right/image_raw /rslidar_point
錄製的時候,因爲我是 16 線雷達,所以我拿標定板的時候離雷達不能太遠,不然就不能清楚地看到標定板了,錄製時建議的站位如下:
- 近處左邊,近處中間,近處右邊
- 中間左邊,中間中間,中間右邊
- 遠處左邊,遠處中間,遠處右邊
每個位置移動改變標定板的姿態,每個姿勢停留 1 - 2 秒左右,防止模糊:
- 上仰,下俯
- 左偏,中間不動,右偏
我錄了挺多次的,也是自己摸索的,因爲有的錄製的不好,我也沒有每個位置都錄很久,有時候覺得差不多夠了就停了,建議你第一次可以錄久些,每個位置停留久一點,保證標定板不會因爲移動而模糊!我總結的錄製標定包的關鍵就是:
- 錄製多個位置
- 改變拿標定板的姿勢
- 必須保證能清楚的看到標定板!
錄製完後,我拷貝到臺式機上,還是提示我要 reindex
一下,我估計是小車系統的問題:
rosbag reindex zed_lidar_calibration.bag
修復完查看下 info,沒有問題:
rosbag info
回放 Bag 使用如下命令,加上 --pause
意思是啓動即暫停,防止跑掉數據,按空格繼續回放:
rosbag play --pause zed_lidar_calibration.bag
下面我們開始使用 autoware_camera_lidar_calibrator
工具標定雷達和相機。
3.2 標定過程
首先啓動 roscore,也可以不用啓動,後面 roslaunch 會自動啓動:
roscore
接着初始化 Autoware 環境:
cd autoware-1.10.0/ros/
source devel/setup.zsh
然後啓動標定工具,這裏我標定 ZED 左相機圖像和雷達,使用右相機同理:
roslaunch autoware_camera_lidar_calibrator camera_lidar_calibration.launch intrinsics_file:=xxx.yaml image_src:=/camera/left/image_raw
intrinsics_file
:前面標定 ZED 的 YAML 內參文件路徑image_src
:要標定的相機話題,這裏用的 left image,有需要也可以用 right image
遇到的第一個錯誤,啓動失敗提示找不到 image-view2
:
直接 apt 安裝即可:
sudo apt-get install ros-kinetic-jsk-common
遇到的第二個錯誤,提示找不到 libopencv_core3.so.3.3
:
我在系統中查找 libopencv_core3.so
這個庫:
locate libopencv_core3.so
發現它在如下位置:
/opt/ros/kinetic/lib/x86_64-linux-gnu/libopencv_core3.so
然後我這個目錄下的所有 opencv 庫複製一份到上一級 lib 目錄下,解決了這個問題:
sudo cp /opt/ros/kinetic/lib/x86_64-linux-gnu/libopencv_* /opt/ros/kinetic/lib
之後我就可以啓動這個標定工具了,界面如下就是一個圖片查看器:
然後開始回放 Bag 數據,記得按空格開始回放:
rosbag play --pause zed_lidar_calibration.bag
上面的 image-view2 就會出現相機畫面,然後我們按空格暫停回放,準備標定:
標定還需要啓動 rviz:
rosrun rviz rviz
點擊 Add 添加要訂閱的 Image 和 PontCloud2 話題:
分別設置每個訂閱話題的 topic、FixedFrame 設置爲 rslidar 不然會沒有點雲顯示、切換點雲查看視角,用鼠標滑輪調整點雲距離,確保能看到我這樣的標定板:
然後我們同時切換出 image-view2 的界面,點擊工具欄放大圖像,然後按照如下步驟手動選擇一個像素點和點雲進行單次標定:
- 觀察圖像和點雲,並在 image-view2 中用鼠標選擇一個像素點
- 點擊 rviz 工具欄的 Publish Point
- 然後在 rviz 中選擇一個對應的點雲數據點(要儘量選擇準確),當你的鼠標右下角出現一個淺紅色的路標記號時即可點擊該數據點
- 觀察 image-view2 的窗口是否出現 points 的提示信息
重複以上步驟,選擇 9 個不同的像素-點雲對,因爲需要足夠的數據才能計算外參矩陣,當第 9 個點選擇完後,該工具會自動計算外參標定矩陣:
最終的標定文件保存在 home 目錄下,以下是外參文件內容,第一個就是 4x4 的外參矩陣:
四、標定結果測試
標定矩陣有了之後,我們來利用 autoware 提供的融合工具來看下標定的效果如何,先來回放數據:
rosbag play --pause zed_lidar_calibration.bag /rslidar_points:=/points_raw
這裏要把雷達的話題換成 points_raw
,因爲 autoware 訂閱的話題名是這個!然後啓動 Autoware 主界面,啓動方法跟前面一樣,切換到 Sensing 標籤頁,配置如下:
- Camera ID:我選擇的是 left 圖像
- target_frame:默認 velodyne 即可,因爲我們已經將雷達話題名改爲 velodyne 訂閱的名字
- Ref:選擇上一步的外參標定文件
- image topic source:因爲 Camera ID 已經指定了,所以這裏只需要填 topic 名即可
點擊 OK 關閉窗口(查看終端是否會輸出紅色錯誤信息,一般不會),然後再點擊 Points Image 選擇相機 ID 爲 left,點擊 OK 確定(此時終端再輸出一些信息,但不會報紅色錯誤),如果你的終端出現紅色錯誤信息,就要查看配置是否正確了:
再點擊下面的 Rviz 啓動 rviz,注意不要單獨在終端中 rosrun 啓動 rviz,單獨啓動沒有 image-view2 的插件,在 autoware 中啓動提供融合的插件 ImageViewerPlugin:
進行如下選擇:
- Image Topic:
/camera/left
- Point Topic:
/points_image
然後切換到回放 Bag 終端,按空格繼續回放數據,即可出現融合效果,我這裏效果一般般,後面打算再重新標定:
五、可能遇到的問題
5.1 Autoware 編譯失敗
我的編譯過程比較順利,如果你遇到的編譯錯誤,可以先閱讀報錯信息,看看是否是缺少某個依賴庫,然後在網上搜索安裝方法,最好用英文 + Google!如果是一些看不懂的錯誤,可以直接複製報錯信息到搜索引擎,有時也能找到答案。
5.2 Rviz 不顯示點雲
檢查 FixedFrame 是否設置爲雷達的 frame_id。
5.3 標定結果不準
選點的時候仔細點,多標定幾次。
以上就是我的雷達相機內外參標定總結,希望能幫助要標定雷達和相機的朋友,後面我會再寫一篇用 Autoware 的 Calibration Tool Kit 工具來標定的博客,可以持續關注我!