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