咨詢電話
021-80392549
該項(xiàng)目旨在讓機(jī)器人在預(yù)先定義的路徑上精確移動(dòng),無需使用GPS或WiFi或藍(lán)牙進(jìn)行定位,甚至無需地圖或建筑布局規(guī)劃。并實(shí)時(shí)繪制其實(shí)際路徑(按比例)。藍(lán)牙可以代替有線,用于傳輸實(shí)時(shí)位置信息。
poYBAGKexECAQkEsAAXk1Nr4yXA055.png
背景
我們一直在為基于Arduino的機(jī)器人的室內(nèi)導(dǎo)航尋找強(qiáng)大的解決方案。在為此應(yīng)用選擇正確的運(yùn)動(dòng)傳感解決方案時(shí),我們考慮了Oblu(一種開源IMU)。它的低成本和開源性質(zhì)使其成為可能的候選者。這里棘手的部分是oblu的開源程序適用于腳踏式室內(nèi)行人航位推算(PDR)或行人導(dǎo)航,簡而言之。Oblu作為一款腳裝式IMU在室內(nèi)的PDR性能令人印象深刻。一個(gè)很大的優(yōu)點(diǎn)是免費(fèi)的Android應(yīng)用程序(Xblu)的實(shí)時(shí)位置跟蹤。但是,我們不確定如何利用其現(xiàn)有的基于人類步行模型的行人導(dǎo)航算法。
Oblu的內(nèi)部計(jì)算基于人類行走。Oblu給出兩個(gè)連續(xù)步驟之間的位移和航向變化。當(dāng)腳與地面接觸時(shí),鞋底的速度為零,即鞋底處于靜止?fàn)顟B(tài)。這樣,Oblu可以檢測“步驟”并糾正一些內(nèi)部錯(cuò)誤。這種頻繁的錯(cuò)誤糾正會帶來出色的跟蹤性能。所以我們的機(jī)器人也以同樣的方式行走——移動(dòng)、停止、移動(dòng)、停止。
我們選擇了Oblu,很快我們就可以組裝我們的機(jī)器人和跟蹤系統(tǒng)。
它是如何工作的:
機(jī)器人以預(yù)先編程的路徑移動(dòng),并將其實(shí)際移動(dòng)信息(通過藍(lán)牙)傳輸?shù)绞謾C(jī)以進(jìn)行實(shí)時(shí)跟蹤。
Arduino預(yù)編程了路徑,oblu用于感知機(jī)器人的運(yùn)動(dòng)。oblu定期向Arduino傳輸運(yùn)動(dòng)信息。在此基礎(chǔ)上,Arduino控制輪子的運(yùn)動(dòng),讓機(jī)器人遵循預(yù)定義的路徑。
poYBAGKexDuASJyDAAJpqB8UR64588.png
機(jī)器人的路徑被編程為一組直線段。每個(gè)線段由其長度和相對于前一個(gè)線段的方向定義。機(jī)器人的運(yùn)動(dòng)保持謹(jǐn)慎,即它以直線運(yùn)動(dòng),但在較小的部分(為簡單起見,我們稱之為“步幅”)。在每一步結(jié)束時(shí),oblu將步長和偏離程度(方向變化)從直線傳輸?shù)紸rduino。如果Arduino發(fā)現(xiàn)與預(yù)定義的直線有偏差,則Arduino在收到此類信息的每一步都會糾正機(jī)器人的對齊方式。
根據(jù)程序,機(jī)器人總是應(yīng)該直線移動(dòng)。但是,由于表面不平整、機(jī)器人裝配質(zhì)量不平衡、直流電機(jī)的結(jié)構(gòu)或電氣不平衡或前自由運(yùn)轉(zhuǎn)輪的隨機(jī)方向等非理想情況,它可能會偏離直線,并可能以一定的角度或傾斜的路徑行走。
邁出一步→糾正你的前進(jìn)方向→前進(jìn)
如果機(jī)器人的行程超過該特定線段的編程長度,它也會向后移動(dòng)。
下一個(gè)步長取決于該特定直線段要覆蓋的剩余距離。當(dāng)要行進(jìn)的距離較大時(shí),機(jī)器人會大步走,而在接近目的地(即每個(gè)直線段的末端)時(shí),機(jī)器人會小步走。
IMUOblu同時(shí)將數(shù)據(jù)傳輸?shù)紸rduino和手機(jī)(通過藍(lán)牙)。Xblu(Android應(yīng)用程序)根據(jù)從機(jī)器人接收到的運(yùn)動(dòng)信息執(zhí)行一些簡單的計(jì)算來構(gòu)建路徑,用于在手機(jī)上進(jìn)行實(shí)時(shí)跟蹤。使用Xblu構(gòu)建路徑如下所示:
pYYBAGKexDeAHOhuAAHx8ZAHyO4347.png
總而言之,Obl可以感知運(yùn)動(dòng)并定期將運(yùn)動(dòng)信息傳達(dá)給Arduino和手機(jī)。根據(jù)編程路徑和運(yùn)動(dòng)信息(由oblu發(fā)送),Arduino控制車輪的運(yùn)動(dòng)。除啟動(dòng)/停止命令外,機(jī)器人的運(yùn)動(dòng)不受遠(yuǎn)程控制。
路徑建模:
如果機(jī)器人只在直線段上行走,它可能會最容易控制。因此,必須首先將路徑建模為一組直線段。下面的圖片包含幾個(gè)示例路徑及其在位移和方向方面的表示。這就是在Arduino中對路徑進(jìn)行編程的方式。
pYYBAGKexDKAbP5lAAEH5tQ_73E653.png
同樣,任何作為一組直線段的路徑都可以在Arduino中定義和編程。
通訊協(xié)議:
第1步:Xoblu向oblu發(fā)送START命令
第2步:oblu通過向Xblu發(fā)送適當(dāng)?shù)腁CK來確認(rèn)接收命令
第3步:oblu在每一步向Xoblu發(fā)送包含每個(gè)步幅的位移和方向信息的DATA包。(步驟=每當(dāng)檢測到零運(yùn)動(dòng)或檢測到靜止時(shí))。
第4步:Xblu通過向oblu發(fā)送適當(dāng)?shù)腁CK來確認(rèn)接收到最后一個(gè)DATA數(shù)據(jù)包。(重復(fù)第3步和第4步的循環(huán),直到Xblu發(fā)送STOP。收到STOP命令后,oblu執(zhí)行第5步)
第5步:停止-(i)在oblu中停止處理(ii)在oblu中停止所有輸出