設(shè)計一個設(shè)備:使用一個安裝在云臺上的距離傳感器來測量墻壁,并用可見激光在墻上顯示用戶自定義的一組點(diǎn)
用手在墻上測量和布置點(diǎn)是很困難的,這是我們大多數(shù)人都曾在某些時候掙扎過的事情。一個人可能不得不使用梯子從天花板開始測量,或者他們可能需要在墻壁的整個寬度上創(chuàng)造均勻間隔的洞。由于結(jié)構(gòu)的不對準(zhǔn),氣泡水準(zhǔn)儀和鉛錘等基于重力的調(diào)平工具可能不準(zhǔn)確。目前可用的計算機(jī)化激光調(diào)平裝置非常昂貴。我在這個項目中的目標(biāo)是創(chuàng)造一個輕量、低成本的設(shè)備,可以放置在墻前,計算墻上的點(diǎn),而不管設(shè)備相對于結(jié)構(gòu)的方向如何。這是CNM Ingenuity提供的物聯(lián)網(wǎng)/快速原型訓(xùn)練營的頂點(diǎn)項目。
功能
五個組件是該設(shè)備功能的關(guān)鍵(除了粒子光子2微控制器)-步進(jìn)電機(jī),2軸模擬操縱桿,OLED顯示器,可見激光二極管和ST微電子的VL53L1X飛行時間距離傳感器。云臺由兩個步進(jìn)電機(jī)驅(qū)動(每個軸一個)。馬達(dá)采取的每一步都以一個已知的角度旋轉(zhuǎn)萬向節(jié),這是用于布置點(diǎn)的三角函數(shù)的關(guān)鍵之一。另一個是法向量到壁的長度,由VL53測量。操縱桿允許用戶將萬向節(jié)驅(qū)動到墻的角落,消除了計劃的角落檢測方法,這與項目組件固有的精度水平是不可能的。激光二極管直觀地表示萬向節(jié)指向的位置。操作過程中指令顯示在OLED顯示屏上。
VL53L1X飛行時間距離傳感器
這種傳感器使用一種叫做“飛行時間”(ToF)的原理來測量光子發(fā)射、反射和探測所需的時間。接收器有一個可配置的視場(通過與API交互,從默認(rèn)的27°降至15°)。它提供相當(dāng)精確的點(diǎn)距離測量(在傳感器的最大范圍內(nèi)誤差約為5cm,約為4米)。它通過I2C進(jìn)行通信,允許無縫集成到物聯(lián)網(wǎng)設(shè)備中。它的低成本和小占地面積使其成為輕量級應(yīng)用的理想選擇。
28BYJ-48步進(jìn)電機(jī)
本項目采用的低成本步進(jìn)電機(jī)有32個內(nèi)部位置。為了減少每一步的角度旋轉(zhuǎn),1/64的傳動比是內(nèi)置的。完成一個完整的旋轉(zhuǎn)需要2048步,這意味著每一步將電機(jī)旋轉(zhuǎn)約0.176°。這對于這個應(yīng)用程序來說是相當(dāng)準(zhǔn)確的。然而,這些電機(jī)有一個問題,導(dǎo)致這個項目的重大問題(下面討論)。
2軸模擬操縱桿
這些操縱桿通常在游戲主機(jī)控制器中被用作拇指控制。我把我的安裝在一個由切特·約翰斯頓設(shè)計的3d打印的房子里(在Thingiverse上可以找到——非常感謝切特的偉大設(shè)計!)操縱桿包含一個按鈕和2個電位器(每個軸一個),返回0-4095的模擬值,這取決于他們在運(yùn)動范圍的哪一邊。操縱桿是這個設(shè)備的唯一控制裝置。它允許用戶手動驅(qū)動萬向節(jié),點(diǎn)擊操縱桿允許用戶通過程序流程進(jìn)行操作。我還編寫了允許用戶在布局模式設(shè)置期間選擇和輸入值的代碼。
OLED顯示器
這個128x64顯示器通過I2C進(jìn)行通信。有限的屏幕尺寸需要簡明的說明。Switch/case語句控制在程序運(yùn)行的任何給定點(diǎn)顯示哪些指令。
可見激光二極管
這個小的激光二極管從Adafruit運(yùn)行在3V3電源,可以很容易地打開或關(guān)閉使用數(shù)字輸入通過TIP120晶體管。它的小尺寸,低價格,和體面的光束質(zhì)量使它非常適合這種應(yīng)用。
程序流
歸一化
打開設(shè)備后,萬向節(jié)開始一個正?;倪^程。首先,它掃過x軸,尋找ToF傳感器測量到的最短距離。一旦找到這個點(diǎn),在x最小值上下的y軸上重復(fù)這個過程。X和Y距離最短的點(diǎn)表示從云臺到墻壁的法向量(垂直向量)。這個點(diǎn)是云臺坐標(biāo)系的原點(diǎn)。測量的距離被儲存起來供計算。
Manualdrive
找到法向量后,用戶必須使用操縱桿將萬向節(jié)驅(qū)動到房間的左下角、左上角和右上角。因?yàn)樵c(diǎn)(0,0)在法線點(diǎn)上,所以到達(dá)X和Y上每個角的步數(shù)是已知的(因此到達(dá)這些角的角度也是已知的)。
Wallcalculations
在確定了墻上的點(diǎn)之后,計算就開始了。要更全面地了解這個項目背后的數(shù)學(xué)原理,請查看GitHub的repo。
模式選擇和用戶輸入
系統(tǒng)提示用戶選擇一種模式并使用拇指桿輸入值。目前只支持Free Grid模式。該模式允許用戶輸入X和Y偏移量、行和列的數(shù)量以及行和列之間的間隙。
點(diǎn)計算
然后,該設(shè)備使用歸一化向量計算這些點(diǎn)在墻上的位置。然后用可見激光一次顯示一個這些點(diǎn)。用戶點(diǎn)擊操縱桿進(jìn)入下一個點(diǎn)。完成后,最后的點(diǎn)擊驅(qū)動萬向節(jié)回到法向量。
限制和潛在的解決方案
步進(jìn)電機(jī)坡度
當(dāng)旋轉(zhuǎn)方向改變時,齒輪齒之間的小空間導(dǎo)致運(yùn)動損失。這就是所謂的反彈,發(fā)揮,或傾斜。
我使用的馬達(dá)有正常的斜率,我用橡皮筋把x軸拉向一個方向。對于y軸,懸掛在云臺上的金屬絲的重量通常會使y軸向上拉。
然而,在這些電機(jī)中存在第二個“斜坡”或死區(qū),通常發(fā)生在電機(jī)方向改變后的20°或更多。由于傳動系統(tǒng)的進(jìn)動,這個死區(qū)可能會延遲。正常的斜坡不是什么大問題,但死區(qū)給這個設(shè)備帶來了嚴(yán)重的問題。處理污水的方法有很多,但大多數(shù)都假定污水會立即被處理掉。事實(shí)上,它在我的馬達(dá)運(yùn)動的不同點(diǎn)上占用,使得上面描述的規(guī)范化過程變得困難。
VL53L1X準(zhǔn)確性
盡管VL53L1X在規(guī)模、精度和成本方面令人印象深刻,但它并不完美。Adafruit創(chuàng)建了一個輕量級的庫,它從ST創(chuàng)建的API中暴露了一些基本的測量函數(shù)。ST API包含許多方法,可用于提高某些應(yīng)用程序的精度。不幸的是,我缺乏必要的C經(jīng)驗(yàn),無法深入研究SPAD/ROI配置和其他校準(zhǔn)功能等API。這是在不使用更昂貴的激光雷達(dá)傳感器的情況下提高該項目精度的主要方法之一。
當(dāng)使用這些傳感器時,環(huán)境光條件和表面反射率是重要的考慮因素。房間可能暴露在陽光下,這會對準(zhǔn)確性產(chǎn)生負(fù)面影響。表面反射率和紋理也有影響。傳感器返回的值在某種程度上是可變的,所以我對多次測量進(jìn)行了一些平均,以減少誤差。平均后,傳感器在我用于測試的尺度(高、寬約1米的模擬墻)上的精度在1-2mm以內(nèi)。這種差異使得歸一化變得困難,因?yàn)閭鞲衅骺赡軙趲讉€度的弧度上讀取相同的值。由于時間限制,我實(shí)現(xiàn)了一個臨時解決方案,導(dǎo)致在尋找法向量時誤差約2cm。這種方法檢查至少兩個連續(xù)的距離讀數(shù)大于或等于前一個,然后將電機(jī)步進(jìn)到類似值范圍的中間點(diǎn)。
線拖
因?yàn)檫@個設(shè)備是一個原型,我有幾個星期的時間來完成,電線布線不是一個考慮因素。6根電線連接到云臺- 4用于ToF傳感器和2用于可見激光器。目前,這些電線從萬向架的背面搖擺,是相當(dāng)僵硬的,因?yàn)槲覜]有獲得非常小規(guī)格的電線。由于馬達(dá)很快,如果我的步進(jìn)代碼出錯,很容易把萬向架包裹在電線中。在開發(fā)過程中,設(shè)備甚至在我拔掉插頭之前就把自己的電線拔掉了。
對于萬向節(jié)來說,沒有電線的解決方案是最好的,但它不適合這樣的項目。在這個設(shè)備的未來迭代中,我將使用滑環(huán)通過萬向節(jié)傳輸能量和數(shù)據(jù)。這將允許它自由旋轉(zhuǎn),給它一個完整的運(yùn)動范圍,使像房間掃描模式成為可能。
激光/傳感器校準(zhǔn)
我遇到的另一個困難是確??梢娂す獾奈恢脤?shí)際上是指向萬向節(jié)“看”的地方。我設(shè)計了這樣的框架,激光和傳感器安裝是平行的。傳感器安裝在由Adafruit創(chuàng)建的分?jǐn)喟迳?,所以我?chuàng)建了一個平面來安裝它。我把橡膠管周圍的螺絲,我用來連接它,并收緊了管板下來。油管的反彈將木板推到螺絲的背面,使我能夠?qū)战沁M(jìn)行微調(diào)。由于傳感器的紅外激光在沒有紅外相機(jī)的情況下是看不見的,因此不可能獲得真正的對齊。相反,我使用參考曲面使其接近真正的平行線。
我用固定螺絲把可見激光器安裝在一個掛在傳感器下面的桶里。激光和傳感器的光束彼此相距約1厘米,這是我在不可能在傳感器的斷線板上鉆洞的情況下盡可能接近它們的距離。我接受這個偏移量作為項目的一個怪癖,如果這真的是一個精確的應(yīng)用程序,我會在我的計算中使用偏移量每當(dāng)激光點(diǎn)的位置重要(手動驅(qū)動和點(diǎn)顯示)。
三維投影
這是我第一次使用萬向節(jié)。在我看來,只需要幾個已知的值就可以完全描述墻與傳感器的關(guān)系。不幸的是,事實(shí)并非如此。當(dāng)接近法向量時,云臺的行為正常,但當(dāng)它遠(yuǎn)離時,相對于云臺的觀點(diǎn),墻壁的傾斜變得明顯。當(dāng)激光沿著壁面頂部的x軸直線驅(qū)動時,所描述的直線是一個圓錐截面。因此,計算出的點(diǎn)也相對于墻的傾斜度發(fā)生了傾斜。
為了獲得一條真正的直線(物理上和計算上),需要在傳感器坐標(biāo)和墻壁坐標(biāo)之間進(jìn)行3D投影/轉(zhuǎn)換。這超出了我的能力范圍(目前)。這個問題是我在設(shè)計和構(gòu)建這個項目的后期才發(fā)現(xiàn)的,所以我不能完全解釋清楚。我能夠通過繪制接近法向量的點(diǎn)得到一個不錯的結(jié)果,這證明我至少能夠計算相對于墻的角落的點(diǎn)。
未來的改進(jìn)
?正確的3D投影
如果我弄清楚了這一點(diǎn),這個項目就會運(yùn)行得非常好(考慮到所有其他挑戰(zhàn))。
?更好的組件
移除中距離盲區(qū)將大大改善功能。
更好的距離傳感器(如激光雷達(dá))。
由于誤差范圍較小,準(zhǔn)確測量正常值將更容易,我還可以使用提高的精度來獲得點(diǎn)測量,完全消除了手動駕駛的需要?;h(huán)可以消除電線的阻力,并允許不受限制的運(yùn)動。
使它自導(dǎo)向——幾種可能的方法:
?使用霍爾傳感器檢測萬向節(jié)位置
?用陀螺儀測量螺距,使y軸水平
?使用EEPROM存儲并返回到一組已知步驟(從最后一個位置,它是在被關(guān)閉之前)
更多的模式
螺柱模式:找到一個螺柱,驅(qū)動到它,并用激光線二極管顯示所有其他螺柱。
邊緣/角落檢測-用于房間映射和其他類似的應(yīng)用。
多房間模式-用于確定房間之間的連續(xù)性。房間尺寸和相對位置(通過加速度計收集)可以存儲在內(nèi)存中,以創(chuàng)建連接內(nèi)部空間的工作模型。
本文編譯自hackster.io