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