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