項目通過線激光發(fā)射器和樹莓派攝像頭來實現(xiàn)計算機視覺數(shù)據(jù)采集。激光定位的角度與激光成 45 度傾斜,同時在物體的垂直切片上投射出一條明亮的紅線。
攝像頭檢測切片到中心的距離并給出網(wǎng)格切片。物體在旋轉(zhuǎn)托盤上慢慢的旋轉(zhuǎn),通過重復(fù)這個過程,直到掃描完整個物體。
最后生成的obj文件可以自動通過郵件的形式發(fā)送到使用者的收件箱中。
創(chuàng)作靈感
開始制作前,我做了一些基礎(chǔ)研究。發(fā)現(xiàn)許多 3D 掃描儀都利用到了旋轉(zhuǎn)平臺,然后使用各種不同的傳感器來測量距中心的距離,建立旋轉(zhuǎn)模型。其中很多都使用了類似于 Kinect 的雙攝像頭。
偶然的機會,我發(fā)現(xiàn)了Yscanner,這是一種使用激光的低分辨率掃描儀??紤]到簡單性和可行性,在這種激光技術(shù)中,激光相對于相機偏置照射來測量與中心的距離,看起來似乎還不錯。
材料清單
樹莓派 × 1
樹莓派攝像頭V2 × 1
LED × 1
電阻 × 1
電線 × 若干
3D 打印燈絲 × 若干
木板 × 1
M3 硬件 × 若干
步進(jìn)電機 × 1
線激光發(fā)射器 × 1
LN298 步進(jìn)電機驅(qū)動器 × 1
金屬按鈕 × 1
烙鐵 × 1
激光切割機 × 1
3D 打印機 × 1
螺絲刀 × 1
鉗子 × 1
設(shè)計原理
該項目設(shè)計的核心組件就是能夠垂直投射在物體上的線激光發(fā)射器。通過樹莓派攝像頭來抓取投影,對它透視進(jìn)行校正,然后在進(jìn)行圖像處理前過濾。在圖像處理中,收集線的每個部分到物體中心的距離。
在徑向坐標(biāo)中,此圖片將同時產(chǎn)生 r 和 z 的分量,然后通過將物體旋轉(zhuǎn)得到新的切片來實現(xiàn)三維效果。
為了達(dá)到預(yù)想的效果,我使用樹莓派作為中央計算單元。
首先,將樹莓派與步進(jìn)電機和電機驅(qū)動器連接。由外部 5V 電源供電并由樹莓派的 GPIO 引腳控制。
然后,將線激光發(fā)射器連接到樹莓派的 3.3V 線上,并將樹莓派攝像頭連接到攝像頭的輸入上。
最后,安裝一個簡單的下拉按鈕和一個用來顯示狀態(tài)的 LED 來向用戶展示系統(tǒng)當(dāng)前所處的狀態(tài)。具體如圖二所示。
需要注意的地方:
1、將電子設(shè)備安裝到由 T 型槽和 M3 硬件搭建的激光切割盒中。
將電子設(shè)備安裝在激光切割盒中,并與T形槽和M3硬件結(jié)合在一起。
2、將電子設(shè)備隱藏在底部隔間中,蓋子上放置旋轉(zhuǎn)托盤,便于放置物品。這個蓋子可以最大程度地減少外部光照射到系統(tǒng)中。(外部光可能在最終的掃描中產(chǎn)生干擾)
硬件部分
在開始3D打印之前,先用了 Autodesk Fusion 360 設(shè)計出 3D 外殼模型??偟膩碚f,外殼設(shè)計很簡單,一個盒子和帶活頁的蓋子。
設(shè)備主要分為兩層:電子設(shè)備層和主體層,兩層之間有孔可供電線通過。
使用 Epilog Zing 40 W 激光切割機進(jìn)行切割。如上圖所示,外殼主要由主體層、電子設(shè)備層、兩個蓋子部件、前片、后片以及兩個側(cè)片組成。
在主體層上,有三個切口:一個用于安裝步進(jìn)電機,一個用于放置激光器的電線,另一個用于放置樹莓派攝像頭的軟排線。
底座有安裝孔,用來固定樹莓派、面包板,還有一個較大的切口和電機驅(qū)動器的安裝孔,以及用于放入步進(jìn)電機的較大切口。外殼的蓋子可以簡單地卡在一起,形成一個類似三角形狀的蓋子,合頁寬度為側(cè)板孔的直徑。
背板和其中一個側(cè)板在側(cè)面都有插槽,便于可以輕松訪問樹莓派的端口(HDMI、USB、以太網(wǎng)以及電源)。前板是一個簡單的部分,可以利用手動鉆孔,然后安裝上按鈕和 LED。
所有的零件通過M3硬件、T型接頭和插槽連接在一起。這種方法非常牢固。組拼時可以使用M3螺釘將零件固定在一起。
因為速度和便捷性的優(yōu)勢,我們使用激光切割機來處理大部分組件。但是,由于3D幾何形狀在裁紙器上非常難創(chuàng)建,仍然不得不對其進(jìn)行3D打印。
第一個組件是線激光發(fā)射器的支架。它將被安裝在與攝像頭視線成 45 度角的主體層上,并有一個孔,可將激光器牢牢固定住。
另外還需一個馬達(dá)支架,因為馬達(dá)的軸太長了。支架產(chǎn)生的摩擦力不妨礙激光切割的組件,并降低了電機連接的平面,使旋轉(zhuǎn)平臺與主體層齊平。
電子部分
該項目的硬件接線非常簡單,只需要將電機、按鈕、LED、激光器以及攝像頭連接到樹莓派。如上圖所示。
首先,將電阻與每個引腳串聯(lián),以保護(hù)引腳。GPIO 的一個引腳專用于控制 LED,當(dāng)設(shè)備準(zhǔn)備好后,LED 會亮起,當(dāng)設(shè)備運行時,它會使用 PWM 進(jìn)行脈沖控制。
其次,將 GPIO 的另一個引腳連接到上拉按鈕上,未按下按鈕時為高電平,按下按鈕時為低電平。
最后,用GPIO的四個引腳用來驅(qū)動步進(jìn)電機。
由于項目中的電動機只需要一定程度上的步進(jìn)而無需控制速度,我們選用了一款很簡單的步進(jìn)電動機驅(qū)動器(L298N)。該驅(qū)動器只是將控制線升壓以饋入電動機的輸入。
為了了解步進(jìn)電機如何在非常低的水平上操作,我們同時參考了L298N數(shù)據(jù)表和Arduino庫。步進(jìn)電機有一個磁芯,磁芯上有交替極性的磁極。
使用四根線纏繞去控制兩個電磁鐵,這兩個電磁鐵分別為電動機中的每個相對的軸供電。通過切換軸的極性,就可以推動步進(jìn)器。
了解完步進(jìn)電機的工作原理,就能夠更容易地控制步進(jìn)電機。由于步進(jìn)電機的最大電流約為 0.8A,超出了樹莓派的供電能力,我們最后選用了5V電源而不是樹莓派為步進(jìn)電機供電。
軟件部分
該項目的軟件部分由四塊組成:圖像處理、電機控制、網(wǎng)格創(chuàng)建和嵌入式功能。
1、如圖所示,隨著系統(tǒng)啟動 .bashrc 自動登錄到樹莓派并開始運行 python 代碼。系統(tǒng)點亮狀態(tài)燈,告知用戶它已正確啟動,并等待按下按鈕。
2、用戶可以放置要掃描的物品并合上蓋子。按下按鈕后,LED 會閃爍,告知用戶設(shè)備正在工作。
設(shè)備將在圖像處理和電機控制之間循環(huán),直到旋轉(zhuǎn)收集完物品的所有數(shù)據(jù)。最后,創(chuàng)建網(wǎng)格模型文件并通過電子郵件將文件發(fā)送到預(yù)設(shè)的電子郵箱。
3、設(shè)備可以重新啟動循環(huán),只需按一下按鈕就可以執(zhí)行另一次掃描。
圖像處理
第一步是處理獲取的圖像,以便將存儲在圖像中的信息提取為可用于創(chuàng)建空間點陣列的形式。
首先拍攝了平臺上物體的照片,以及由激光照射到盒子背面并分散后產(chǎn)生的所有背景噪點。
該圖片的原始形式存在兩個主要問題。一是拍攝物體的角度較高,二是背景噪點很大。視角的問題是第一個要考慮的,因為按原樣使用照片將無法確定的物體一致高度。
如圖二所示,倒置的 “L” 形的高度是一致的。但是,由于一側(cè)比另一側(cè)長,它們在最靠近觀察者的邊緣處的高度似乎不同。
為了解決此問題,我必須將圖像中的工作空間從之前的梯形形狀轉(zhuǎn)換為矩形。為此,我使用了鏈接中提供的代碼。
https://www.pyimagesearch.com/2014/08/25/4-point-opencv-getperspective-transform-example/
當(dāng)給定一個圖像和四個點時,該代碼將在四個點之間裁剪圖像并補償轉(zhuǎn)換裁剪后的圖像。使用四個點來創(chuàng)建矩形,而不是之前的梯形形狀。
下一個需要解決的問題是外部光形成的背景噪點和激光本身反射的光。我使用 OpenCV 的 inRange() 函數(shù)過濾光。我將閾值設(shè)置為僅在特定水平上拾取紅光。
為了獲得正確的值,設(shè)置了一個比較寬的閾值區(qū)間,在區(qū)間內(nèi)不斷提高閾值水平,直到唯一被拾取的光是來自掃描物體上的激光。
獲得此圖像后,我找到了每行中最亮的像素,得到了一條每行一個像素的線,它與激光線的最左側(cè)相接。最后,將每個像素轉(zhuǎn)換為 3D 空間中的頂點并存儲在數(shù)組中,如網(wǎng)格創(chuàng)建部分所述。
電機控制
在成功處理單個圖像以獲取物體的切片之后,我還需要旋轉(zhuǎn)物體獲得不同角度的新照片。為此要控制好掃描物體平臺下的步進(jìn)電機。
我通過創(chuàng)建一個變量來跟蹤電機的狀態(tài)和細(xì)分控制四個電機的輸入,這些是實現(xiàn)步進(jìn)機功能的基礎(chǔ)。
網(wǎng)格創(chuàng)建
要從所有處理的圖像創(chuàng)建網(wǎng)格,我必須首先將處理的圖像中的每個白色像素轉(zhuǎn)換為 3D 空間中的頂點。我要收集具有圓柱對稱性的單個對象切片,所以要收集圓柱的坐標(biāo)。
圖片的高度可以用 z 軸表示,到旋轉(zhuǎn)臺中心的距離可以用 R 軸表示,步進(jìn)電機的旋轉(zhuǎn)可以用 theta 軸表示。由于我將數(shù)據(jù)存儲在圓柱坐標(biāo)中,因此必須將每個頂點轉(zhuǎn)換為笛卡爾坐標(biāo)。
頂點創(chuàng)建好后,將它們存儲在一個列表中。然后再將所述列表存儲在另一個列表中,該列表包含為獲取的每個圖像創(chuàng)建的頂點列表。處理完所有圖像并將其轉(zhuǎn)換為頂點后,在最終網(wǎng)格中顯示頂點。
其中,最好包含頂部頂點和底部頂點,然后根據(jù)分辨率,我選擇了均勻分布的頂點數(shù)以用于每個圖像。因為并非所有頂點列表的長度都相同,所以我不得不通過找到頂點數(shù)量最少的列表并將所有其他列表中的頂點移除,直到它們均等為止。
創(chuàng)建頂點列表后就可以創(chuàng)建網(wǎng)格。我使用 .obj 文件標(biāo)準(zhǔn)設(shè)置網(wǎng)格格式,因為它很簡單并且支持 3D 打印。
嵌入式功能
當(dāng)設(shè)備正常運行后,我通過添加完整的嵌入式功能對其進(jìn)行了完善。這意味著移除鍵盤,鼠標(biāo)和顯示器,處理完成后以無線方式將.obj文件發(fā)送過去。
1、將.bashrc代碼更改為自動登錄并在啟動時啟動 python 主程序。執(zhí)行sudo raspi-config命令,設(shè)置 “Console Autologin”,并將sudo python /home/pi/finalProject/FINAL.py行添加到/home/pi/.bashrc。
2、添加一個按鈕和 LED 狀態(tài)顯示,用于用戶輸入和輸出。按鈕將會告知用戶設(shè)備何時開始掃描,LED 將告訴用戶機器的狀態(tài)。
如果 LED 點亮,則表明設(shè)備已準(zhǔn)備好開始掃描。如果 LED 閃爍,則表明設(shè)備當(dāng)前正在掃描。如果 LED 報錯,則表明軟件錯誤,要求重啟系統(tǒng)。
最后,我通過電子郵件向設(shè)備發(fā)送 .obj 文件。使用 smtplib 和 email 庫來完成。這種無線的發(fā)送方式很方便,將生成的文件傳送給用戶,以便在許多不同的平臺上訪問。
組裝
完成以上步驟后,現(xiàn)在可以將組件組合在一起。
在制造出設(shè)備的各種零件之后,我們可以把它們組裝在一起。如上圖所示:
1、組裝外殼箱體。
2、將攝像頭和激光器安裝到盒子里。
3、安裝其他電子設(shè)備。
4、樹莓派的背面,可使用樹莓派端口和 5V 電動機輸入。
5、安裝好設(shè)備正面以及帶有 LED 狀態(tài)指示燈的按鈕。
完工!
激光 3D 掃描儀能夠高精度地掃描物體。物體的特征清晰可變,并且使用切片軟件(例如Repetier)可以很容易地對零件進(jìn)行 3D 打印。
通過測試最大的驚喜是設(shè)備的一致性很好。在對同一物品進(jìn)行多次試驗中,即使稍微改了物品的位置,掃描程序也都能生成非常相似的 .obj 文件。
如上圖所示,三次掃描的結(jié)果都非常的相似,能夠獲取到同樣多的細(xì)節(jié)。系統(tǒng)的一致性非常不錯。
可以調(diào)整的地方
可調(diào)整的變量之一是掃描的分辨率。因為步進(jìn)器有 400 步,所以我可以選擇每個 ΔΘ 來決定角度分辨率。在默認(rèn)情況下,我將角度分辨率設(shè)置為 20 次迭代,這意味著電機每幀旋轉(zhuǎn) 20 步(400/20=20)。
選擇此項主要是為了節(jié)省時間,以這種方式完成掃描大約需要 45 秒。但是如果想要更高質(zhì)量的掃描,就需要將迭代次數(shù)增加到 400。這為 3D 構(gòu)造模型提供了更多的點,從而可以進(jìn)行更詳細(xì)的掃描。
除了角分辨率外,還可以調(diào)整垂直分辨率,或選擇沿激光切片掃描多少個不同的點。為了節(jié)省時間,我將默認(rèn)值設(shè)置為 20,如果你想得到更好的效果可以增加數(shù)值。
如圖所示,通過改變角分辨率和空間分辨率的參數(shù),可以顯示出不同的掃描結(jié)果。每個標(biāo)簽的格式設(shè)置為角度分辨率x空間分辨率。從默認(rèn)的掃描設(shè)置中可以看出鴨子的功能是可識別的,但并不明顯。
但是,隨著分辨率的提高,精確的功能開始顯現(xiàn)出來,包括眼睛、嘴巴、尾巴和鴨子的翅膀。最高分辨率的圖像大約需要 5 分鐘掃描。高分辨率的效果是非常成功的。
不足的地方
盡管該項目取得了成功,但在設(shè)計和實施方面仍然存在一些局限性。隨著激光的使用,光的散射帶來了許多問題。我掃描的物體要么是半透明,很亮或者很暗的物體,它們在表面的反射就存在缺陷。如果物體是半透明的,光線就會被吸收并散射,從而使切片的讀數(shù)非常不準(zhǔn)確。在發(fā)亮和黑暗的物體中,光線要么被反射,要么被吸收,以至于難以收集。
此外,我使用攝像頭獲取物體的特征,就能感受到視線遮擋的限制,凹面的物體和銳角通常會被物體的其他部分阻擋。像示例中小黃鴨的尾巴在掃描中就失去曲率了。攝像頭只能檢測物體表面結(jié)構(gòu),無法獲取孔或者內(nèi)部為幾何形狀的物體。這一常見問題也在其他掃描機中存在。
可以優(yōu)化的地方
雖然項目整體效果還不錯,但還有可以優(yōu)化的地方:
1、在當(dāng)前狀態(tài)下,只能通過更改代碼中的硬編碼分辨率變量來更改掃描分辨率。為了使項目更具嵌入式性,可以添加一個分辨率電位計,以便用戶可以更改分辨率,而不用將監(jiān)視器和鍵盤插入掃描儀。
2、掃描儀在創(chuàng)建時的圖像效果不是很好。為了解決這個問題,可以使用網(wǎng)格平滑技術(shù)來平滑不規(guī)則和粗糙的拐角。
3、像素坐標(biāo)不能很好地縮放到實際環(huán)境中。我創(chuàng)建的網(wǎng)格比實際物品大六到七倍。
-
激光掃描
+關(guān)注
關(guān)注
0文章
115瀏覽量
11440 -
樹莓派
+關(guān)注
關(guān)注
116文章
1707瀏覽量
105620
原文標(biāo)題:用樹莓派做一個激光掃描建模儀
文章出處:【微信號:vision263com,微信公眾號:新機器視覺】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論