Udacity机器人软件工程师课程笔记(十九) - 3D感知介绍 - 主动/被动式传感器、RGB-D相机、点云
3D感知介紹
目錄
- 傳感器
- RGB-D相機
- 點云
1.傳感器
主動式傳感器是指向目標發射電磁波,然后收集從目標反射回來的電磁波信息的傳感器,如合成孔徑雷達等。
被動式傳感器指只能收集地而目標反時來自太陽光的能量或目標自身輻射的電進波能量的傳感器,如攝影相機和多光諧掃描儀等。探測器指接收地物電磁輻射的物理元件,是傳感器中最重要的部分,其功能是實現能量轉換,測量和記錄接收到的電磁鍋射能。常用的探測元件有感光股片、光電敏感元件、固體敏感元件和波導。
(1)主動傳感器
主動式傳感器是指向目標發射電磁波,然后收集從目標反射回來的電磁波信息的傳感器,如合成孔徑雷達等。
1)激光測距儀(激光雷達)
三維激光測距儀或三維激光掃描儀是基于光探測和測距(激光雷達)方法開發的主動傳感器。也就是說,這些傳感器用脈沖激光照射目標并測量反射的脈沖。
由于激光頻率是一個已知的穩定量,所以通過測量從脈沖發送到接收的時間來計算到視場中物體的距離。
激光雷達的優點
與普通微波雷達相比,激光雷達由于使用的是激光束,工作頻率較微波高了許多,因此帶來了很多優點,主要有:
- 分辨率高
- 隱蔽性好、抗有源干擾能力強
- 低空探測性能好
- 體積小、質量輕
激光雷達的缺點
- 工作時受天氣和大氣影響大
- 價格較高
- 尺寸較大
2)ToF相機(飛行時間相機)
3DToF相機(飛行時間相機)是一種主動傳感器,它通過用紅外光源照射一個區域并觀察到達現場和返回現場所花費的時間來執行深度測量。
但是,與激光測距儀不同的是,ToF攝像機可以捕獲每個光脈沖的整個視場,而沒有任何移動部件。這樣可以快速采集數據。
根據其工作原理,ToF傳感器可分為兩類:脈沖運行時間和相移連續波。
脈沖運行時間傳感器
脈沖運行時間傳感器發出光脈沖并啟動計時器,然后等待直到檢測到反射并停止計時器,從而直接測量光的飛行時間。
盡管從概念上講是直觀且簡單的,但此技術需要非常精確的硬件來進行計時。
相移連續波傳感器
與脈沖運行時間傳感器不同,相移連續波傳感器發出連續的調制光波流。在此,通過測量反射波的相移來計算深度,從而創建場景的3D深度圖。
3)超聲波傳感器
就像激光掃描儀使用激光脈沖進行距離測量一樣,超聲波傳感器使用高頻聲音脈沖。
超聲波傳感器發出高頻聲音脈沖,然后測量聲音回聲反射回去所花費的時間。
傳感器通常由兩個壓電晶體組成,一個充當發射器(如揚聲器),另一個充當接收器(如麥克風)。
由于空氣中的聲速是已知的(每秒約343米),因此超聲波傳感器會通過計時反射脈沖到達接收器所需的時間來計算與目標的距離。
(2)被動式傳感器
1)單目相機
一個簡單的單目彩色攝像機可以用來推斷給定場景的深度數據。雖然不簡單,但可以使用軟件技術從多個2D圖像計算深度。
其中一種技術是“運動結構”。
在這種方法中,一個給定的物體或場景的多個圖像從一個移動的攝像機中獲取,以從產生的視頻流中重建一個3D模型。深度是通過三角測量技術計算出來的,這就要求在整個運動過程中對相機的姿態進行精確測量。
結果表明,將這些三角剖分技術與單幅圖像的深度推斷相結合,可以從運動結果中改進結構。
2)立體相機
立體攝像機系統由兩個單眼攝像機組成,它們之間有精確的已知距離。深度信息是通過比較兩個攝像頭觀察同一物體或場景的圖像幀來獲得的。
兩個攝像頭感知到的場景中給定物體位置的差異稱為視差。立體聲攝像機,很像人眼,利用這種差異來計算與給定對象相關的深度數據。
2.RGB-D相機
RGB-D相機結合了主動和被動傳感器的優點,它由被動RGB相機和主動深度傳感器組成。與傳統相機不同,RGB-D相機除了提供RGB圖像外,還提供每個像素的深度信息。
傳統上,主動深度傳感器是紅外(IR)投影儀和接收器。就像連續波飛行時間傳感器一樣,RGB-D攝像機通過在場景中發射光信號并分析反射光來計算深度,但是入射波調制是在空間而非時間上執行的。
這是通過以預定模式將光從IR發射器投射出并通過解釋該模式中由目標物體表面引起的變形來計算深度來完成的。這些圖案的范圍從簡單的條紋到獨特而復雜的斑點圖案。
使用RGB-D相機進行3D感知的優勢在于,與立體相機不同,它們通過直接提供每個像素的深度值而不是從原始圖像幀中推斷深度信息來節省大量計算資源。
此外,這些傳感器價格便宜,并且具有簡單的USB即插即用接口。RGB-D攝像機可用于從映射到復雜對象識別的各種應用。
RGB-D 相機工作原理
RGB-D相機具有兩個主要功能部分,即RGB相機和深度傳感器。
(1)圖像的獲取
RGB圖像傳感器通過測量光和密度來工作。可以使用紅色,綠色和藍色這三種顏色范圍。它通過使用通常稱為感測器的傳感器元件來實現。每個感測器設計為僅允許特定波長范圍的光的波長,對應于特定的顏色范圍,并且濾除所有其他波長。入射在每個傳感器上的光子會產生電荷,每次曝光完成后,相機的處理器就會讀取這些電荷。這些傳感器上的信息會映射到圖像上,因此只有三種顏色中的一種是使用彩色濾光片陣列或CFA以交替的模式捕獲每個像素的圖像。使用CFA,我們可以同時測量同一傳感器上所有三個顏色通道的強度。以Bryce Bayer命名的拜耳濾光片是如圖所示。
CFA是使用最廣泛的,它交替使用藍綠色和綠色紅色的行。如果對它們進行計數,您會發現綠色感官的數量是藍色或紅色的兩倍。以這種方式設計的濾鏡,以模仿人眼的成像質量。由于每個像素僅包含有關單一顏色的信息,因此使用稱為去馬賽克的技術來推斷相鄰像素剩下的兩個顏色通道的強度。
讓我們看一個簡單的去馬賽克的例子。
拜耳算法已將藍色分配給突出顯示的像素,這意味著它將直接從傳感器接收藍色通道的強度信息。
同時,通過平均對角相鄰像素的強度來計算該像素的紅色強度。類似地,綠色通道的強度通過平均拱形和像素的強度來計算。
通過鏈接可以找到有關數字成像,濾色器陣列和去馬賽克的更多信息。
(2)添加深度
大多數RGB-D相機都使用一種稱為“結構化光”的技術來從場景中獲取深度信息。
此設置的功能與立體相機的設置非常相似,但有兩個主要區別。
在立體相機中,我們通過比較左右攝像機捕獲的圖像之間的差異或差異來計算深度。與此相反,結構化的燈光設置包含一臺投影儀和一臺攝像機。
我們可以看到如何從RGB-D相機生成深度圖:
投影機在場景上投射出已知的圖案。該圖案可以像一系列條紋或復雜的斑點圖案一樣簡單。
然后,攝像機捕獲場景中物體反射出的光圖案。場景中物體的形狀會使感知的模式失真。通過比較已知的投影圖案(保存在傳感器硬件上)和反射圖案,可以生成深度圖,就像立體相機一樣。
3.點云
點云是三維物體的數字表示。在實際實現中,它們還可以包含每個點的附加元數據,以及許多在點云上操作的有用方法。
其他元數據的示例可能包括
- 每個點的RGB值
- 強度值
- 當前的曲率信息
提供的其他方法可能包括
- 空間遍歷點的迭代器
- 基于特定屬性過濾云的方法
- 在云上執行統計分析的操作符
幾乎所有3D掃描儀或激光雷達都將數據輸出為高精度點云。來自立體攝像機和RGB-D攝像機的數據也可以輕松轉換為點云。點云用于眾多應用中,其中3D空間信息是數據的關鍵組成部分。一些示例應用程序包括:
- 深度傳感器測量
- 真實物體的模型
- 機器人工作區的范圍
- 環境圖
至于如何通過計算表示點云,以下是與來自RGB-D攝像機的每個數據點關聯的數據類型的示例:
| 屬性 | 常用數據類型 |
|---|---|
| x軸 | float |
| y軸 | float |
| z軸 | float |
| 紅色值 | Unsigned 8-bit int |
| 藍色值 | Unsigned 8-bit int |
| 綠色值 | Unsigned 8-bit int |
從RGB-D數據創建點云
以蘋果作為示例,這是RGB圖像:
這是深度圖:
程序如下:
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
from time import time
from matplotlib.axes._axes import _log as matplotlib_axes_logger# 關閉報錯
matplotlib_axes_logger.setLevel('ERROR')# 讀取圖像和深度圖
image_location = '1.png'
depth_map_location = '2.png'# 載入圖像
depth_map = mpimg.imread(depth_map_location)
image = mpimg.imread(image_location)# 初始化和建立圖像
start_time = time()
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')# 讀取圖片行列
rows = depth_map.shape[0]
cols = depth_map.shape[1]# 發送沒有正確映射的像素
max_val = depth_map.max() * 1.1# 循環計數器置零
count = 0# 為了節省時間,減少像素,計算需要在30秒以內
pixel_cut = 4
point_num = int(rows/pixel_cut+1) * int(cols/pixel_cut+1)# 遍歷所有像素
for x in range(cols):for y in range(rows):if (x % pixel_cut == 0 and y % pixel_cut == 0):count += 1# 獲取像素點顏色pixel_color = ([image[y, x, 0], image[y, x, 1], image[y, x, 2]])# pixel_color = image[y, x, 0]print("\r", "進度百分比:{0}%".format(round(count*100/point_num)), end="", flush=True)# 獲取每個粒子的點深度depth = depth_map[y, x]# 發送點沒有正確映射kif depth == []:depth = max_valax.scatter(x, depth, y, c=pixel_color, marker='o')# Axis Labels
ax.set_xlabel('Width')
ax.set_ylabel('Depth')
ax.set_zlabel('Height')plt.gca().invert_zaxis()# 變視角旋轉
elevation = 40 # Up/Down
azimuth = 320 # Left/Rightax.view_init(elevation, azimuth)plt.show()
print("\n", "Outputted {} of the {} points".format(count, 6552))
print("Results produced in {:04.2f} seconds".format(time() - start_time))
以下為輸出:
總結
以上是生活随笔為你收集整理的Udacity机器人软件工程师课程笔记(十九) - 3D感知介绍 - 主动/被动式传感器、RGB-D相机、点云的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Udacity机器人软件工程师课程笔记(
- 下一篇: Udacity机器人软件工程师课程笔记(