1. 系統框架概述
本方案采用"三層標定框架",整體架構如下圖所示:
系統組成:
- 感知層:Velodyne VLP-16激光雷達、Stereo ZED2攝像頭、Xsens MTi-30 IMU、Ublox F9P GPS
- 計算層:Intel NUC with Ubuntu 20.04 + ROS Noetic
- 融合層:基于Kalman Filter的緊耦合融合架構
2. 傳感器間標定(外參標定)
傳感器的內參標定可以看我之前的文章:【傳感器標定(一):張正友相機標定法原理與實現詳解】、【傳感器標定(二):IMU標定原理與實現詳解】、【傳感器標定(三):激光雷達標定原理與實現詳解】。
2.1 激光雷達-相機標定
標定原理:
通過棋盤格建立兩種傳感器觀測的幾何約束,目標函數為:
T^camlidar=arg?min?T∑i=1N∥π(T?Pilidar)?picam∥2\hat{T}_{cam}^{lidar} = \argmin_{T} \sum_{i=1}^{N} \| \pi(T \cdot P_i^{lidar}) - p_i^{cam} \|^2 T^camlidar?=Targmin?i=1∑N?∥π(T?Pilidar?)?picam?∥2
其中:
- T∈SE(3)T \in SE(3)T∈SE(3)為待求變換矩陣
- PilidarP_i^{lidar}Pilidar?為激光點云中的棋盤格角點
- picamp_i^{cam}picam?為圖像中的對應角點
- π(?)\pi(\cdot)π(?)為相機投影模型
實施步驟:
- 采集同步的棋盤格圖像和點云數據(至少15組不同姿態)
- 使用OpenCV的
findChessboardCorners
檢測圖像角點 - 使用基于平面擬合的算法提取點云角點
- 采用Levenberg-Marquardt算法優化目標函數
2.2 IMU-激光雷達標定
旋轉軸激勵法:
通過主動旋轉激勵激發IMU的角速度響應:
ωimu=Rlidarimu?ωlidar\omega_{imu} = R_{lidar}^{imu} \cdot \omega_{lidar} ωimu?=Rlidarimu??ωlidar?
其中ωlidar\omega_{lidar}ωlidar?通過連續兩幀點云的ICP獲得。
平移標定:
利用運動過程中IMU加速度積分與激光雷達觀測的約束:
t^=arg?min?t∑∥(vk+1lidar?vklidar)?Rimulidar∫tktk+1(aimu?ba)dt∥2\hat{t} = \argmin_{t} \sum \| (v_{k+1}^{lidar} - v_k^{lidar}) - R_{imu}^{lidar} \int_{t_k}^{t_{k+1}} (a_{imu} - b_a)dt \|^2 t^=targmin?∑∥(vk+1lidar??vklidar?)?Rimulidar?∫tk?tk+1??(aimu??ba?)dt∥2
2.3 GPS-IMU標定
桿臂效應補償:
GPS天線相位中心與IMU中心的偏移向量lbl^blb滿足:
pGPSw=pIMUw+Rwblbp_{GPS}^w = p_{IMU}^w + R_w^b l^b pGPSw?=pIMUw?+Rwb?lb
通過靜態多位置觀測建立方程組求解。
3. 時間同步方案
3.1 硬件同步
采用PTP (IEEE 1588)協議實現μs級同步:
時鐘偏移計算:
θ=(t2?t1)?(t4?t3)2\theta = \frac{(t2 - t1) - (t4 - t3)}{2} θ=2(t2?t1)?(t4?t3)?
3.2 軟件同步
對于無法硬件同步的傳感器(如相機),采用基于雙緩沖的插值算法:
m(t)=αm(ti)+(1?α)m(ti+1),α=ti+1?tti+1?tim(t) = \alpha m(t_i) + (1-\alpha)m(t_{i+1}), \ \alpha = \frac{t_{i+1}-t}{t_{i+1}-t_i} m(t)=αm(ti?)+(1?α)m(ti+1?),?α=ti+1??ti?ti+1??t?
3.3 運動補償
對于激光雷達的掃描式采集,采用IMU輔助的運動補償:
Pkw=Tt0tk?PklidarP_k^w = T_{t_0}^{t_k} \cdot P_k^{lidar} Pkw?=Tt0?tk???Pklidar?
其中Tt0tkT_{t_0}^{t_k}Tt0?tk??由IMU積分得到。
4. 在線標定與誤差補償
4.1 基于EKF的在線標定
狀態向量包含標定參數:
x=[p,v,q?狀態,ba,bg?IMU偏置,tlidar,θcam?標定參數]x = [\underbrace{p,v,q}_{狀態}, \underbrace{b_a,b_g}_{IMU偏置}, \underbrace{t_{lidar},\theta_{cam}}_{標定參數}] x=[狀態p,v,q??,IMU偏置ba?,bg???,標定參數tlidar?,θcam???]
系統模型:
x˙=f(x,u)+w,u=[aimu,ωimu]\dot{x} = f(x,u) + w, \ \ u=[a_{imu},\omega_{imu}] x˙=f(x,u)+w,??u=[aimu?,ωimu?]
觀測模型:
z=h(x)+v,z=[GPS,Lidar_Feature,Cam_Feature]z = h(x) + v, \ \ z=[GPS, Lidar\_Feature, Cam\_Feature] z=h(x)+v,??z=[GPS,Lidar_Feature,Cam_Feature]
4.2 標定質量評估
采用Mahalanobis距離檢測標定退化:
DM=(z?h(x))TS?1(z?h(x))D_M = \sqrt{(z-h(x))^T S^{-1} (z-h(x))} DM?=(z?h(x))TS?1(z?h(x))?
當DM>χdf,0.952D_M > \chi^2_{df,0.95}DM?>χdf,0.952?時觸發重新標定。
5. 完整實施流程
階段1:離線標定
- 單傳感器標定(參見前文)
- 傳感器對間標定(2.1-2.3節)
- 時間同步校準(3.1節)
階段2:在線維護
- 啟動時驗證標定參數
- 運行時監控標定狀態
- 動態更新標定參數(4.1節)
6. 實驗驗證方案
定量評估指標:
-
重投影誤差(激光-相機):
?reproj=1N∑i=1N∥π(T?Pi)?pi∥\epsilon_{reproj} = \frac{1}{N}\sum_{i=1}^N \|\pi(T\cdot P_i) - p_i \| ?reproj?=N1?i=1∑N?∥π(T?Pi?)?pi?∥ -
軌跡對齊誤差(GPS-激光):
?align=RMSE(trajlidar,trajGPS)\epsilon_{align} = \text{RMSE}(traj_{lidar}, traj_{GPS}) ?align?=RMSE(trajlidar?,trajGPS?) -
時間同步精度:
?sync=max?∣ttrigger?tactual∣\epsilon_{sync} = \max |t_{trigger} - t_{actual}| ?sync?=max∣ttrigger??tactual?∣
7. 關鍵實現細節
標定工具推薦:
- 激光-相機:Autoware的
calibration_camera_lidar
工具 - IMU-激光:Kalibr工具箱的
imu_lidar_calibration
- 時間同步:ROS的
message_filters
包
代碼片段示例(時間對齊):
class TimeAligner:def __init__(self, max_delay=0.1):self.buffer = {}self.max_delay = max_delaydef add_msg(self, topic, msg):self.buffer.setdefault(topic, []).append((msg.header.stamp, msg))def get_synced_msgs(self, sync_topic):sync_msgs = {}for topic in self.buffer:idx = bisect.bisect_left([ts for ts,_ in self.buffer[topic]], self.buffer[sync_topic][0][0])if idx > 0 and abs(self.buffer[topic][idx-1][0] - self.buffer[sync_topic][0][0]) < self.max_delay:sync_msgs[topic] = self.buffer[topic][idx-1][1]return sync_msgs
8. 常見問題解決方案
標定失敗排查:
- 特征提取不足:確保標定板在兩種傳感器中均清晰可見
- 運動激勵不足:IMU標定需充分激勵所有軸
- 時間戳異常:檢查ROS的
/use_sim_time
參數設置
精度提升技巧:
- 在標定期間保持環境光照穩定
- 對GPS標定選擇開闊場地
- 標定溫度接近實際工作溫度