相機和激光雷達之間的時間戳同步問題一直是實時跑SLAM的先決條件。本文試圖以最清晰的思路去講明白這個事情。
01 相機特性-曝光和讀出
相機獲取一幀圖像分為曝光和讀出兩個階段。相機使用的傳感器不同,相機的曝光時間和讀出時間的重疊關系也有所不同,分為交疊曝光和非交疊曝光兩種。交疊曝光和非交疊曝光相比,交疊曝光可以減少曝光時間對出圖時間的影響。
非交疊曝光是指當前幀的曝光和讀出都完成后,再進行下一幀的曝光和讀出。非交疊曝光幀周期大于曝光時間與幀讀出時間的和。
內觸發模式非交疊曝光交疊曝光是指當前幀的曝光和前一幀的讀出過程有重疊,即前一幀讀出的同時,下一幀已經開始曝光。交疊曝光幀周期小于等于曝光時間與幀讀出時間的和。
內觸發模式交疊曝光對!上一段就是為了告訴你:后文敘述中無論當前幀曝光時間和上一幀的讀出時間是否重疊都不要驚訝。02 圖像采集:觸發模式(外部輸入)相機的觸發模式分為內觸發模式和外觸發模式 2 種。
內觸發模式:相機通過設備內部給出的信號采集圖像。
外觸發模式:相機通過外部給出的信號采集圖像。外部信號可以是軟件信號,也可以是硬件信號,主要包含軟觸發和硬件觸發。外觸發模式如圖:
外觸發模式軟觸發:觸發信號由軟件發出(也可以利用相機SDK提供的API接口進行軟觸發)。硬件觸發:外部設備通過相機的 I/O 接口與相機進行連接,觸發脈沖信號由外部設備給到相機進行采圖。其實是直接對相機內部寄存器進行讀寫。下圖是海康相機的電源IO的6-pin線纜:
海康相機電源及IO接口(6-pin Hirose)其中,海康相機有1個光耦隔離輸入Line0+,1個可配置輸入輸出Line2+,可選擇一個配置為輸入信號。03 觸發輸出相機觸發輸出信號為開關信號,可用于控制報警燈、光源、PLC等外部設備。觸發輸出信號可通過Strobe 信號實現。相機的曝光發生時,會立即輸出一個Strobe信號,該信號為高電平有效。后文我們主要使用該信號對Lidar等其他傳感器進行硬觸發。這里有一個Strobe的預輸出的概念。Strobe信號早于曝光生效。其工作原理為延遲曝光先進行Strobe輸出。該功能可應用于響應比較慢的外部設備。Strobe預輸出時序如圖所示。(后面會講為啥要延遲曝光)
Strobe信號預輸出時序現在我們回到正題吧,現在講起來就很快了。要同步相機和激光雷達的時間戳主要有三個方式,硬觸發、軟觸發、軟觸發+硬觸發。下面我以手繪示意圖的形式一一介紹。先說硬觸發吧。一個MCU產生脈沖信號對三個傳感器設備進行硬觸發。
對于軟觸發+硬觸發來說,可以先用相機SDK的API對一個相機進行軟觸發,然后利用相機的外觸發信號Strobe對雷達和相機等其他傳感器進行硬觸發。
這里需要注意一個問題,如果進行軟觸發的第一個相機在曝光的同時發出Strobe信號,其他被硬觸發的傳感器總歸是晚了一步,不能完全同步。因此引出了之前Strobe的預輸出的概念,即先進行Strobe輸出再延遲曝光。配置該模式時注意四點:1.上升沿or下降沿的觸發方式;2.有效電平寬度,電平幅值,你要知道能觸發Lidar的最低幅值;3.Strobe預輸出4.兩邊電平信號是否一樣,3v or 5v是否需要升壓。。.最后講講不被推薦的軟觸發。首先調用API操作相比于硬觸發(對傳感器內部寄存器直接進行讀寫操作)明顯是慢了,執行第二句命令API(2)前API(1)就已經花了些時間
//讀取lidar和image數據的線程1
while(1)
{
API(1); //軟觸發第一個sensor
API(2); //軟觸發第二個sensor
//假設脈沖周期為0.5s
}
//處理數據線程2
for(i=0;i
{
t1 = getTickCount();
//部分程序有互斥鎖
t2 = getTickCount();
Time = (t2 - t1) / getTickFrequency(); //當前幀處理時間
sleep(1/fps-Time);
}
如上圖示意,如果處理單幀數據的時間超過0.5s,線程1就會讀到下一幀數據,就會導致線程2數據混亂。因此線程2單幀處理時間需要小于0.5s,且每幀需要等待(1/fps-當前幀處理時間)。
審核編輯:郭婷
-
相機
+關注
關注
4文章
1350瀏覽量
53581 -
激光雷達
+關注
關注
968文章
3967瀏覽量
189825
原文標題:清晰講解激光雷達與相機標定的時間戳同步問題
文章出處:【微信號:3D視覺工坊,微信公眾號:3D視覺工坊】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論