繼“如何用100美元和TensorFlow來(lái)造一個(gè)能‘看’東西的機(jī)器人” 之后,Lukas又一最新力作。
結(jié)合深度學(xué)習(xí)和便宜硬件的更多探奇。
在“造”出能進(jìn)行物體識(shí)別的機(jī)器人后,下一步就很清晰了,我要“造”一個(gè)能飛的東西!我決定搞一個(gè)能自主飛行的無(wú)人機(jī),并要它能識(shí)別人臉和響應(yīng)語(yǔ)音指令。
選擇一臺(tái)成品無(wú)人機(jī)
開始“黑入”一臺(tái)無(wú)人機(jī)的最難的部分就是如何開始。我最初的選擇是用零件組裝一臺(tái)無(wú)人機(jī)。但和我完成的大部分的DIY項(xiàng)目一樣,從零開始一般都耗費(fèi)了太多的時(shí)間,還不如直接買一個(gè)成品。實(shí)話實(shí)說(shuō),我自己組裝的無(wú)人機(jī)從來(lái)沒(méi)有正常的飛行過(guò)。而買一臺(tái)成品機(jī)就既省事又省錢。
絕大部分無(wú)人機(jī)廠商都宣稱提供API接口,但對(duì)于業(yè)余玩家來(lái)說(shuō)就沒(méi)有一個(gè)明確的最佳選擇。大部分能提供貌似可用的API接口的無(wú)人機(jī)都要超過(guò)1000美元。這對(duì)于入門級(jí)的玩家來(lái)說(shuō)就太貴了。
但經(jīng)過(guò)搜索,我發(fā)現(xiàn)Parrot AR 無(wú)人機(jī)2.0版(見圖1)是一個(gè)低端可“黑”入無(wú)人機(jī)的極佳選擇。新的售價(jià)是200美元,不過(guò)很多人在買了以后就不怎么再玩了,所以在eBay上花130美元或更少就能買到一個(gè)不錯(cuò)的二手貨。
圖1:我車庫(kù)里的無(wú)人機(jī)收藏。最左邊的就是Parrot AR無(wú)人機(jī)。圖片由Lukas Biewald授權(quán)使用
論飛行穩(wěn)定性,Parrot AR型不如更貴的Parrot Bebop 2型(550美元)。但是Parrot AR型所帶的叫node-ar-drone的node.js客戶端庫(kù)是非常好用的。
Parrot AR型的另外一個(gè)優(yōu)點(diǎn)是它非常皮實(shí)、耐摔。在測(cè)試自主飛行代碼的時(shí)候,我的無(wú)人機(jī)頻繁地撞到墻、家具、植物甚至是我們家的客人,并墜落。但它還是依舊能正常飛行。
比起“造”能在地上跑的機(jī)器人,“造”無(wú)人機(jī)最不爽的一點(diǎn)就是它的電池可用時(shí)間太短了?;旧鲜浅潆妿仔r(shí),飛行十幾分鐘。所以我建議多買兩塊電池,循環(huán)充電使用。
給我的無(wú)人機(jī)開發(fā)程序
我經(jīng)過(guò)實(shí)踐發(fā)現(xiàn),Javascript內(nèi)在的事件驅(qū)動(dòng)的特性使得它成為一種非常好的控制無(wú)人機(jī)的語(yǔ)言。請(qǐng)相信我,無(wú)人機(jī)飛行的時(shí)候,是有非常多的異步事件發(fā)生。我寫Node.JS的時(shí)間并不長(zhǎng),但在這個(gè)項(xiàng)目過(guò)程中,我對(duì)它的印象非常深刻。上一次我正兒八經(jīng)地為機(jī)器人寫程序用的是C語(yǔ)言。處理C語(yǔ)言的線程和異常是一件非常讓人頭疼的事,所以我盡量避免再使用它。我希望有人能為其他的機(jī)器人平臺(tái)開發(fā)出Javascript的接口,因?yàn)檫@會(huì)讓為機(jī)器人開發(fā)程序(完全無(wú)法預(yù)知會(huì)發(fā)生什么事)變得更簡(jiǎn)單更有趣。
架構(gòu)設(shè)計(jì)
我決定在我的筆記本上運(yùn)行控制邏輯,同時(shí)在云端運(yùn)行機(jī)器學(xué)習(xí)的部分。這種架構(gòu)設(shè)計(jì)比在樹莓派板上直接運(yùn)行神經(jīng)網(wǎng)絡(luò)的延遲要低。我認(rèn)為這種架構(gòu)對(duì)于業(yè)余無(wú)人機(jī)項(xiàng)目而言是合適的。
微軟、谷歌、IBM和亞馬遜都提供快速且便宜的機(jī)器學(xué)習(xí)API。最終我選擇了微軟的認(rèn)知服務(wù)API來(lái)完成這個(gè)項(xiàng)目,因?yàn)樗俏ㄒ惶峁┒ㄖ苹娜四樧R(shí)別功能的API。
圖2里展示了整個(gè)無(wú)人機(jī)項(xiàng)目的系統(tǒng)架構(gòu)。
圖2:智能無(wú)人機(jī)的系統(tǒng)架構(gòu)。圖片由Lukas Biewald授權(quán)使用
開始動(dòng)手
默認(rèn)地,Parrot AR無(wú)人機(jī)2.0版自己可以提供一個(gè)無(wú)線網(wǎng)絡(luò),供客戶端接入,但是這個(gè)功能卻極度煩人。每次你要實(shí)驗(yàn)點(diǎn)東西,你都需要從本地網(wǎng)絡(luò)斷開,再連到無(wú)人機(jī)的無(wú)線網(wǎng)里。好消息是,有一個(gè)叫ardrone-wpa2的項(xiàng)目,非常有用,用它你可以“黑”進(jìn)無(wú)人機(jī),并讓無(wú)人機(jī)連到你自己的無(wú)線網(wǎng)絡(luò)里。
Telnet到無(wú)人機(jī)操作系統(tǒng)上并游蕩一番是挺有趣的。Parrot無(wú)人機(jī)使用的是一個(gè)簡(jiǎn)化版的Linux操作系統(tǒng)。你上次Telnet到某個(gè)系統(tǒng)上是什么時(shí)間哪?下面的命令例子就演示了如何打開一個(gè)終端并直接登錄到無(wú)人機(jī)的操作系統(tǒng)上。
% script/connect “The Optics Lab” -p “particleorwave” -a 192.168.0.1 -d 192.168.7.43
% telnet 192.168.7.43
通過(guò)命令行來(lái)控制飛行
在安裝了node庫(kù)之后,下一步就是生成一個(gè)node.js的命令行運(yùn)行環(huán)境,然后就可以開始控制你的無(wú)人機(jī)了:
var arDrone = require(‘ar-drone’);
var client = arDrone.createClient({ip: ‘192.168.7.43’});
client.createRepl();
drone> takeoff()
true
drone> client.animate(‘yawDance, 1.0)
如果你按照我上面所說(shuō)的一步一步地實(shí)驗(yàn)到這里,你的無(wú)人機(jī)肯定已經(jīng)墜落過(guò)了——至少好幾次。我已經(jīng)無(wú)數(shù)次地把我的無(wú)人機(jī)的保護(hù)外殼給它粘回機(jī)身上,直到它徹底解體,隨后我只好再買了一個(gè)新的。我不得不說(shuō),其實(shí)Parrot AR型在沒(méi)有保護(hù)外殼的時(shí)候飛行得更好。但這種方式會(huì)使無(wú)人機(jī)變得很危險(xiǎn)。因?yàn)闆](méi)有保護(hù)外殼的話,一旦無(wú)人機(jī)撞到東西,它的螺旋槳就會(huì)直接打到物體上,并留下刮痕。