作者:Stephen Evanczuk
3D 飛行時(shí)間 (ToF)成像為視頻成像提供了一種有效的替代方法,可用于包括工業(yè)安全、機(jī)器人導(dǎo)航、手勢控制界面等在內(nèi)的廣泛應(yīng)用。但是,這種方法需要慎重整合光學(xué)設(shè)計(jì)、精密定時(shí)電路和信號處理功能,常常會讓開發(fā)人員難以實(shí)現(xiàn)有效的3D ToF 平臺。
本文將說明 ToF 技術(shù)的微妙之處,然后展示兩個(gè)現(xiàn)成的 3D ToF 套件——Analog Devices 的 AD-96TOF1-EBZ 開發(fā)平臺和ESPROS Photonics 的 EPC660 評估套件,介紹它們?nèi)绾螏椭_發(fā)人員快速設(shè)計(jì) 3D ToF 應(yīng)用原型,并獲得所需的經(jīng)驗(yàn)來實(shí)現(xiàn) 3D ToF設(shè)計(jì)以滿足開發(fā)人員的獨(dú)特要求。
什么是 ToF 技術(shù)?
ToF 技術(shù)基于一個(gè)大家熟悉的原理,即物體與某個(gè)源點(diǎn)之間的距離可以通過測量源點(diǎn)發(fā)射能量的時(shí)間與源點(diǎn)收到反射信號的時(shí)間之差來得出(圖 1)。
盡管基本原理相同,ToF 解決方案卻千差萬別,并且因?yàn)椴捎貌煌幕A(chǔ)技術(shù)——包括超聲波、光檢測和測距 (LiDAR)、相機(jī)、毫米波 (mmWave)射頻信號——而具有一些固有的能力和局限性:
超聲波 ToF 解決方案成本低,但物體的范圍和空間分辨率有限
光學(xué) ToF 解決方案可以實(shí)現(xiàn)比超聲波系統(tǒng)更高的范圍和空間分辨率,但會受到濃霧或煙霧的影響
基于毫米波技術(shù)的解決方案通常更為復(fù)雜和昂貴,但不受煙、霧或雨的影響,能在較大范圍內(nèi)工作,并提供有關(guān)目標(biāo)物體的速度和航向的信息
制造商可以根據(jù)需要利用不同技術(shù)的能力來滿足特定需求。例如,超聲波傳感器非常適合檢測障礙物,可以幫助機(jī)器人越過道路,或幫助駕駛員停車。相比之下,毫米波技術(shù)可為車輛提供長距離感測能力,從而在其他傳感器因?yàn)閻毫犹鞖鉅顩r而無法工作的情況下,也能檢測到正在接近的道路危險(xiǎn)。
ToF 設(shè)計(jì)可以圍繞一對發(fā)射器/接收器來構(gòu)建。例如,簡單的光學(xué) ToF 設(shè)計(jì)在概念上僅需一個(gè) LED來照亮某個(gè)目標(biāo)區(qū)域,以及一個(gè)光電二極管來檢測該目標(biāo)區(qū)域內(nèi)物體的反射。盡管如此,這種看似簡單的設(shè)計(jì)仍需要精確的定時(shí)和同步電路來測量延遲。另外,可能需要調(diào)制和解調(diào)電路來將照明信號與背景源區(qū)分開來,或支持更復(fù)雜的連續(xù)波方法。
隨著開發(fā)人員努力提高信噪比 (SNR) 并消除 ToF系統(tǒng)中的偽影,設(shè)計(jì)復(fù)雜度迅速攀升。讓復(fù)雜性進(jìn)一步加劇的是,更先進(jìn)的檢測解決方案會采用多個(gè)發(fā)射器和接收器來跟蹤多個(gè)物體,或支持更復(fù)雜的運(yùn)動(dòng)跟蹤算法。例如,毫米波系統(tǒng)常常會運(yùn)用多個(gè)接收器來跟蹤多個(gè)獨(dú)立物體的航向和速度。(請參閱“使用毫米波雷達(dá)套件快速開發(fā)精密目標(biāo)檢測設(shè)計(jì)”。)
3D 光學(xué) ToF 系統(tǒng)
3D 光學(xué) ToF 系統(tǒng)擴(kuò)展了使用更多接收器的理念,即采用通常基于電荷耦合器件 (CCD) 陣列的成像傳感器。當(dāng)一組透鏡將某個(gè)目標(biāo)區(qū)域聚焦到 CCD陣列上時(shí),該區(qū)域中的相應(yīng)點(diǎn)會反射光線,返回的光線會為 CCD 陣列中的每個(gè)電荷儲存器件充電。到達(dá) CCD陣列的反射光與脈沖或連續(xù)波照明同步后,基本上分別在一系列窗口或相位中得到捕獲。此類數(shù)據(jù)會經(jīng)過進(jìn)一步處理,可創(chuàng)建一個(gè)由體素 (VOlume piXEL) 組成的3D 深度圖,其值表示到目標(biāo)區(qū)域中相應(yīng)點(diǎn)的距離。
像視頻中的幀一樣,可以依次捕獲各個(gè)深度圖,以提供具有時(shí)間分辨率(僅受圖像捕獲系統(tǒng)的幀率限制)和空間分辨率(僅受 CCD陣列和光學(xué)系統(tǒng)限制)的測量結(jié)果。隨著更大的 320 x 240 CCD 成像儀的出現(xiàn),更高分辨率的 3D 光學(xué) ToF系統(tǒng)能應(yīng)用于更廣泛的領(lǐng)域,包括工業(yè)自動(dòng)化和無人機(jī) (UAV),甚至手勢界面(圖 2)。
與大多數(shù)基于相機(jī)的方法不同,3D ToF 系統(tǒng)可以在陰影或光照不斷變化的條件下提供精確結(jié)果。這些系統(tǒng)會提供自己的照明,通常使用激光器或大功率紅外LED(例如 Lumileds 的 Luxeon IR LED),這些 LED 能以此類系統(tǒng)使用的兆赫茲 (MHz) 開關(guān)速率工作。與立體攝像機(jī)等方法不同,3DToF 系統(tǒng)提供了一種緊湊型解決方案來生成詳細(xì)的距離信息。
預(yù)置解決方案
然而,為了實(shí)現(xiàn) 3D ToF系統(tǒng),開發(fā)人員面臨多項(xiàng)設(shè)計(jì)挑戰(zhàn)。除了前面提到的定時(shí)電路之外,這些系統(tǒng)還依賴于精心設(shè)計(jì)的信號處理流水線,該流水線須進(jìn)行優(yōu)化,以便針對每個(gè)窗口或相位測量快速讀取CCD 陣列中的結(jié)果,然后完成所需的處理,將原始數(shù)據(jù)轉(zhuǎn)換為深度圖。先進(jìn)的 3D ToF 成像儀如 ESPROS Photonics 的EPC660-CSP68-007 ToF 成像儀,集 320 x 240 CCD 陣列與所需的全部配套定時(shí)和信號處理能力于一體,可執(zhí)行 3D ToF測量并提供每像素 12 位距離數(shù)據(jù)(圖 3)。
ESPROS Photonics 的 EPC660-007 卡邊緣連接器芯片載板將 epc650 成像儀安裝在 37.25 x 36.00 毫米 (mm)的印刷電路板(PC 板)上,并配有去耦電容器和卡邊緣連接器。盡管此芯片載板解決了 3D ToF
系統(tǒng)設(shè)計(jì)中的基本硬件接口問題,但開發(fā)人員要負(fù)責(zé)在前端完成適當(dāng)光學(xué)設(shè)計(jì),并在后端提供處理資源。ESPROS Photonics 的 epc660評估套件提供完整的 3D ToF 應(yīng)用開發(fā)環(huán)境,其中包括預(yù)置 3D ToF 成像系統(tǒng)和相關(guān)軟件,無需開發(fā)人員完成上述任務(wù)(圖 4)。
ESPROS 套件設(shè)計(jì)用于評估和快速原型開發(fā),提供了一個(gè)預(yù)裝配好的相機(jī)系統(tǒng),其中整合了 epc660 CC 芯片載板、光學(xué)透鏡組件和一組八個(gè)LED。除相機(jī)系統(tǒng)外,BeagleBone Black 處理器板具有 512 MB RAM 和 4 GB 閃存,可用作主機(jī)控制器和應(yīng)用處理資源。
ESPROS 還提供了 epc660評估套件支持軟件,該軟件可從其網(wǎng)站下載。該軟件需要密碼才能打開,密碼可從該公司的當(dāng)?shù)劁N售辦事處索取。獲得該軟件的使用權(quán)后,開發(fā)人員只需使用所提供的配置文件之一運(yùn)行一個(gè)圖形用戶界面(GUI) 應(yīng)用程序,即可開始操作相機(jī)系統(tǒng)。此外,GUI應(yīng)用程序還提供了控制和顯示窗口,可用于設(shè)置其他參數(shù),包括空間和時(shí)間濾波器設(shè)置,以及用于查看結(jié)果。開發(fā)人員可以毫不費(fèi)力地使用該套件實(shí)時(shí)捕獲深度圖,并將其用作自己的應(yīng)用軟件輸入。
增強(qiáng)分辨率的 3D ToF 系統(tǒng)
諸如 ESPROS epc660 之類的 320 x 240成像儀可以服務(wù)于許多應(yīng)用,但分辨率可能不足以檢測手勢界面中的微小移動(dòng),或在不嚴(yán)格限制目標(biāo)范圍的情況下區(qū)分微小物體。對于這些應(yīng)用,基于 640 x 480 ToF傳感器的現(xiàn)成開發(fā)套件的出現(xiàn),能夠讓開發(fā)人員快速開發(fā)高分辨率應(yīng)用原型。
Seeed Technology 的 DepthEye Turbo 深度相機(jī)將 640 x 480 ToF 傳感器、四個(gè) 850 納米 (nm)
垂直腔表面發(fā)射激光器 (VCSEL) 二極管、照明和感測操作電路、電源及 USB 接口支持集成在一個(gè)尺寸為 57 x 57 x 51 mm的自足式立方體中。軟件支持通過開源的 libPointCloud SDK github 存儲庫提供,并支持 Linux、Windows、Mac OS 和Android 平臺。
除了 C++ 驅(qū)動(dòng)程序、庫和示例代碼之外,libPointCloud SDK 發(fā)行版還包括用于快速開發(fā)原型的 Python API和可視化工具。在主機(jī)開發(fā)平臺上安裝發(fā)行包之后,開發(fā)人員可以通過 USB將相機(jī)連接到計(jì)算機(jī),然后即可開始使用可視化工具顯示相位、幅度或點(diǎn)云圖;這些圖本質(zhì)上是使用紋理表面渲染的增強(qiáng)深度圖,可提供更平滑的 3D 圖像(圖 5)。
Analog Devices 的 AD-96TOF1-EBZ 3D ToF 評估套件提供了一個(gè)更為開放的硬件設(shè)計(jì),它由一對板構(gòu)建,專門使用Raspberry Pi 的 Raspberry Pi 3 Model B+ 或 Raspberry Pi 4 作為主機(jī)控制器和本地處理資源(圖 6)。
該套件的模擬前端 (AFE) 板容納了光學(xué)組件、CCD陣列和緩沖器、固件存儲以及一個(gè)處理器;該處理器管理相機(jī)的整體操作,包括照明定時(shí)、傳感器同步和深度圖生成。第二塊板容納了四個(gè) 850 nm VCSEL激光二極管和驅(qū)動(dòng)器,能連接到 AFE 板,以使激光二極管環(huán)繞光學(xué)組件,如上圖所示。
Analog Devices 通過開源的 3D ToF 軟件套件來支持 AD-96TOF1-EBZ 套件,軟件套件含有 3D ToF SDK 以及C/C++、Python、Matlab 的示例代碼和包封。為了在網(wǎng)絡(luò)環(huán)境中同時(shí)支持主機(jī)應(yīng)用和底層硬件交互,Analog Devices 將 SDK劃分為兩部分:一個(gè)是針對 USB 和網(wǎng)絡(luò)連接優(yōu)化的主機(jī)部分,一個(gè)是在嵌入式 Linux 上運(yùn)行并基于 Video4Linux2 (V4L2)驅(qū)動(dòng)程序的底層部分(圖 7)。
這個(gè)支持網(wǎng)絡(luò)的 SDK 允許聯(lián)網(wǎng)主機(jī)上運(yùn)行的應(yīng)用程序與 ToF 硬件系統(tǒng)遠(yuǎn)程協(xié)作,以訪問相機(jī)并捕獲深度數(shù)據(jù)。此外,用戶程序也可以在嵌入式 Linux部分中運(yùn)行,并充分利用該層級提供的高級選項(xiàng)。
作為軟件分發(fā)的一部分,Analog Devices 提供了示例代碼來展示關(guān)鍵的底層操作功能,例如在主機(jī)上以及在本地使用嵌入式 Linux進(jìn)行相機(jī)初始化、基本幀捕獲、遠(yuǎn)程訪問和跨平臺捕獲。其他示例應(yīng)用程序基于這些基本操作而構(gòu)建,用以說明如何在更高級別的應(yīng)用(如點(diǎn)云生成)中使用捕獲的數(shù)據(jù)。事實(shí)上,有一個(gè)示例應(yīng)用程序展示了如何使用深度神經(jīng)網(wǎng)絡(luò)(DNN) 推理模型對相機(jī)系統(tǒng)生成的數(shù)據(jù)進(jìn)行分類。該 DNN 示例應(yīng)用程序 (dnn.py) 用 Python編寫,逐步展示了獲取數(shù)據(jù)和通過推理模型準(zhǔn)備數(shù)據(jù)分類的過程(清單 1)。
import aditofpython as tof
import numpy as np
import cv2 as cv
。。. try:
net = cv.dnn.readNetFromCaffe(args.prototxt, args.weights)
except:
print(“Error: Please give the correct location of the prototxt and
caffemodel”)
sys.exit(1)
swapRB = False
classNames = {0: ‘background’,
1: ‘a(chǎn)eroplane’, 2: ‘bicycle’, 3: ‘bird’, 4: ‘boat’,
5: ‘bottle’, 6: ‘bus’, 7: ‘car’, 8: ‘cat’, 9: ‘chair’,
10: ‘cow’, 11: ‘diningtable’, 12: ‘dog’, 13: ‘horse’,
14: ‘motorbike’, 15: ‘person’, 16: ‘pottedplant’,
17: ‘sheep’, 18: ‘sofa’, 19: ‘train’, 20: ‘tvmonitor’}
system = tof.System()
status = system.initialize()
if not status:
print(“system.initialize() failed with status: ”, status)
cameras = []
status = system.getCameraList(cameras)
。。. while True:
Capture frame-by-frame
status = cameras[0].requestFrame(frame)
if not status:
print(“cameras[0].requestFrame() failed with status: ”, status)
depth_map = np.array(frame.getData(tof.FrameDataType.Depth), dtype=“uint16”,
copy=False)
ir_map = np.array(frame.getData(tof.FrameDataType.IR), dtype=“uint16”,
copy=False)
Creation of the IR image
ir_map = ir_map[0: int(ir_map.shape[0] / 2), :]
ir_map = np.float32(ir_map)
distance_scale_ir = 255.0 / camera_range
ir_map = distance_scale_ir * ir_map
ir_map = np.uint8(ir_map)
ir_map = cv.cvtColor(ir_map, cv.COLOR_GRAY2RGB)
Creation of the Depth image
new_shape = (int(depth_map.shape[0] / 2), depth_map.shape[1])
depth_map = np.resize(depth_map, new_shape)
distance_map = depth_map
depth_map = np.float32(depth_map)
distance_scale = 255.0 / camera_range
depth_map = distance_scale * depth_map
depth_map = np.uint8(depth_map)
depth_map = cv.applyColorMap(depth_map, cv.COLORMAP_RAINBOW)
Combine depth and IR for more accurate results
result = cv.addWeighted(ir_map, 0.4, depth_map, 0.6, 0)
Start the computations for object detection using DNN
blob = cv.dnn.blobFromImage(result, inScaleFactor, (inWidth, inHeight),
(meanVal, meanVal, meanVal), swapRB)
net.setInput(blob)
detections = net.forward()
。。. for i in range(detections.shape[2]):
confidence = detections[0, 0, i, 2]
if confidence 》 thr:
class_id = int(detections[0, 0, i, 1])
。。. if class_id in classNames:
value_x = int(center[0])
value_y = int(center[1])
label = classNames[class_id] + “: ” +
“{0:.3f}”.format(distance_map[value_x, value_y] / 1000.0 * 0.3) + “ ” +
“meters”
。。. # Show image with object detection
cv.namedWindow(WINDOW_NAME, cv.WINDOW_AUTOSIZE)
cv.imshow(WINDOW_NAME, result)
Show Depth map
cv.namedWindow(WINDOW_NAME_DEPTH, cv.WINDOW_AUTOSIZE)
cv.imshow(WINDOW_NAME_DEPTH, depth_map)
清單 1:摘自 Analog Devices 的 3D ToF SDK 發(fā)行版中示例應(yīng)用程序的代碼片段,展示了獲取深度和 IR
圖像并通過推理模型進(jìn)行分類所需的幾個(gè)步驟。(代碼來源:Analog Devices)
該過程首先使用 OpenCV 的 DNN 方法 (cv.dnn.readNetFromCaffe) 讀取現(xiàn)有推理模型的網(wǎng)絡(luò)和相關(guān)權(quán)重。本例中的模型是Google MobileNet Single Shot Detector (SSD) 檢測網(wǎng)絡(luò)的 Caffe實(shí)現(xiàn),該網(wǎng)絡(luò)以使用相對較小的模型大小實(shí)現(xiàn)高精度而聞名。在使用支持的類標(biāo)識符和類標(biāo)簽加載類名稱之后,該示例應(yīng)用程序識別可用的相機(jī)并執(zhí)行一系列初始化例程(未顯示在清單1 中)。
示例代碼的大部分內(nèi)容是準(zhǔn)備深度圖 (depth_map) 和 IR 圖 (ir_map),然后將其 (cv.addWeighted)合并成單個(gè)數(shù)組以提高精度。最后,代碼調(diào)用另一個(gè) OpenCV DNN 方法 (cv.dnn.blobFromImage),該方法將合并的圖像轉(zhuǎn)換為推理所需的四維blob 數(shù)據(jù)類型。下一行代碼將得到的 blob 設(shè)置為推理模型的輸入 (net.setInput(blob))。對 net.forward()的調(diào)用將激活返回分類結(jié)果的推理模型。示例應(yīng)用程序的其余部分識別超過預(yù)設(shè)閾值的分類結(jié)果,并為這些結(jié)果生成標(biāo)簽和邊框,來顯示捕獲的圖像數(shù)據(jù)、由推理模型識別的標(biāo)簽及其與相機(jī)的距離(圖 8)。
正如 Analog Devices 的 DNN 示例應(yīng)用程序所示,開發(fā)人員可以結(jié)合使用 3D ToF深度圖與機(jī)器學(xué)習(xí)方法,來創(chuàng)建更復(fù)雜的應(yīng)用功能。雖然要求低延遲響應(yīng)的應(yīng)用程序更有可能使用 C/C++ 來構(gòu)建這些功能,但基本步驟是一樣的。
通過使用 3D ToF數(shù)據(jù)和高性能推理模型,工業(yè)機(jī)器人系統(tǒng)可以更安全地將其動(dòng)作與其他設(shè)備同步,甚至在人與機(jī)器人緊密協(xié)作的“協(xié)作機(jī)器人”環(huán)境中與人同步。借助不同的推理模型,另一個(gè)應(yīng)用程序可以使用高分辨率3D ToF 相機(jī),對手勢界面涉及的精細(xì)動(dòng)作進(jìn)行分類。在汽車應(yīng)用中,這種方法可以幫助提高高級輔助駕駛系統(tǒng) (ADAS) 的精度,同時(shí)能充分利用 3D ToF系統(tǒng)提供的高時(shí)空分辨率。
總結(jié)
在幾乎所有依賴系統(tǒng)與其他物體之間距離精確測量的系統(tǒng)中,ToF 技術(shù)都起著關(guān)鍵作用。在諸多 ToF 技術(shù)中,光學(xué) 3D ToF可以同時(shí)提供高空間分辨率和高時(shí)間分辨率,因而能夠更精細(xì)地區(qū)分更小的物體,并對其相對距離進(jìn)行更精確的監(jiān)測。
但是,要利用這項(xiàng)技術(shù),開發(fā)人員需要應(yīng)對與這些系統(tǒng)的光學(xué)設(shè)計(jì)、精確定時(shí)和同步信號采集相關(guān)的多種挑戰(zhàn)。如本文所述,諸如 Analog Devices 的AD-96TOF1-EBZ 開發(fā)平臺和 ESPROS Photonics 的 EPC660 評估套件之類預(yù)置 3D ToF系統(tǒng)的推出,消除了將該技術(shù)應(yīng)用于工業(yè)系統(tǒng)、手勢界面、汽車安全系統(tǒng)等領(lǐng)域的上述障礙。
-
CCD
+關(guān)注
關(guān)注
32文章
881瀏覽量
142324 -
接收器
+關(guān)注
關(guān)注
14文章
2472瀏覽量
71950 -
3D
+關(guān)注
關(guān)注
9文章
2885瀏覽量
107610 -
TOF
+關(guān)注
關(guān)注
9文章
484瀏覽量
36373 -
視頻成像
+關(guān)注
關(guān)注
0文章
3瀏覽量
6258
發(fā)布評論請先 登錄
相關(guān)推薦
評論