鍍金池/ 教程/ iOS/ 項(xiàng)目介紹
與四軸無(wú)人機(jī)的通訊
在沙盒中編寫(xiě)腳本
結(jié)構(gòu)體和值類(lèi)型
深入理解 CocoaPods
UICollectionView + UIKit 力學(xué)
NSString 與 Unicode
代碼簽名探析
測(cè)試
架構(gòu)
第二期-并發(fā)編程
Metal
自定義控件
iOS 中的行為
行為驅(qū)動(dòng)開(kāi)發(fā)
Collection View 動(dòng)畫(huà)
截圖測(cè)試
MVVM 介紹
使 Mac 應(yīng)用數(shù)據(jù)腳本化
一個(gè)完整的 Core Data 應(yīng)用
插件
字符串
為 iOS 建立 Travis CI
先進(jìn)的自動(dòng)布局工具箱
動(dòng)畫(huà)
為 iOS 7 重新設(shè)計(jì) App
XPC
從 NSURLConnection 到 NSURLSession
Core Data 網(wǎng)絡(luò)應(yīng)用實(shí)例
GPU 加速下的圖像處理
自定義 Core Data 遷移
子類(lèi)
與調(diào)試器共舞 - LLDB 的華爾茲
圖片格式
并發(fā)編程:API 及挑戰(zhàn)
IP,TCP 和 HTTP
動(dòng)畫(huà)解釋
響應(yīng)式 Android 應(yīng)用
初識(shí) TextKit
客戶(hù)端
View-Layer 協(xié)作
回到 Mac
Android
Core Image 介紹
自定義 Formatters
Scene Kit
調(diào)試
項(xiàng)目介紹
Swift 的強(qiáng)大之處
測(cè)試并發(fā)程序
Android 通知中心
調(diào)試:案例學(xué)習(xí)
從 UIKit 到 AppKit
iOS 7 : 隱藏技巧和變通之道
安全
底層并發(fā) API
消息傳遞機(jī)制
更輕量的 View Controllers
用 SQLite 和 FMDB 替代 Core Data
字符串解析
終身學(xué)習(xí)的一代人
視頻
Playground 快速原型制作
Omni 內(nèi)部
同步數(shù)據(jù)
設(shè)計(jì)優(yōu)雅的移動(dòng)游戲
繪制像素到屏幕上
相機(jī)與照片
音頻 API 一覽
交互式動(dòng)畫(huà)
常見(jiàn)的后臺(tái)實(shí)踐
糟糕的測(cè)試
避免濫用單例
數(shù)據(jù)模型和模型對(duì)象
Core Data
字符串本地化
View Controller 轉(zhuǎn)場(chǎng)
照片框架
響應(yīng)式視圖
Square Register 中的擴(kuò)張
DTrace
基礎(chǔ)集合類(lèi)
視頻工具箱和硬件加速
字符串渲染
讓東西變得不那么糟
游戲中的多點(diǎn)互聯(lián)
iCloud 和 Core Data
Views
虛擬音域 - 聲音設(shè)計(jì)的藝術(shù)
導(dǎo)航應(yīng)用
線(xiàn)程安全類(lèi)的設(shè)計(jì)
置換測(cè)試: Mock, Stub 和其他
Build 工具
KVC 和 KVO
Core Image 和視頻
Android Intents
在 iOS 上捕獲視頻
四軸無(wú)人機(jī)項(xiàng)目
Mach-O 可執(zhí)行文件
UI 測(cè)試
值對(duì)象
活動(dòng)追蹤
依賴(lài)注入
Swift
項(xiàng)目管理
整潔的 Table View 代碼
Swift 方法的多面性
為什么今天安全仍然重要
Core Data 概述
Foundation
Swift 的函數(shù)式 API
iOS 7 的多任務(wù)
自定義 Collection View 布局
測(cè)試 View Controllers
訪談
收據(jù)驗(yàn)證
數(shù)據(jù)同步
自定義 ViewController 容器轉(zhuǎn)場(chǎng)
游戲
調(diào)試核對(duì)清單
View Controller 容器
學(xué)無(wú)止境
XCTest 測(cè)試實(shí)戰(zhàn)
iOS 7
Layer 中自定義屬性的動(dòng)畫(huà)
第一期-更輕量的 View Controllers
精通 iCloud 文檔存儲(chǔ)
代碼審查的藝術(shù):Dropbox 的故事
GPU 加速下的圖像視覺(jué)
Artsy
照片擴(kuò)展
理解 Scroll Views
使用 VIPER 構(gòu)建 iOS 應(yīng)用
Android 中的 SQLite 數(shù)據(jù)庫(kù)支持
Fetch 請(qǐng)求
導(dǎo)入大數(shù)據(jù)集
iOS 開(kāi)發(fā)者的 Android 第一課
iOS 上的相機(jī)捕捉
語(yǔ)言標(biāo)簽
同步案例學(xué)習(xí)
依賴(lài)注入和注解,為什么 Java 比你想象的要好
編譯器
基于 OpenCV 的人臉識(shí)別
玩轉(zhuǎn)字符串
相機(jī)工作原理
Build 過(guò)程

項(xiàng)目介紹

初始計(jì)劃

我們第一個(gè)想法是利用藍(lán)牙信號(hào)在室內(nèi)去操控飛行器。在這個(gè)飛機(jī)器上搭載 iPhone,這樣可以通過(guò)獲取從室內(nèi)發(fā)送來(lái)的一些信號(hào)轉(zhuǎn)化為三維坐標(biāo)來(lái)獲取它的當(dāng)前位置。

然而,我們第一實(shí)驗(yàn)是用信號(hào)的強(qiáng)弱來(lái)測(cè)量信標(biāo)和 iPhone 之間的距離,但是結(jié)果令人失望。當(dāng)測(cè)量到兩到三米多的距離(大約 6 到 10 英尺)的時(shí)候發(fā)現(xiàn)信號(hào)和正常準(zhǔn)確的信號(hào)相差太遠(yuǎn)。

最后放棄了這個(gè)想法,轉(zhuǎn)而開(kāi)始尋找替代的方案。

修訂計(jì)劃

因?yàn)槲覀儾幌肫x讓飛行器搭載 iPhone 自己導(dǎo)航的這個(gè)想法,所以我們決定試一下老的 GPS 設(shè)備。顯然這個(gè)需要我們移動(dòng)到戶(hù)外這樣才能更好的獲取到 GPS 信號(hào)。事實(shí)證明。冬天在柏林的測(cè)試非常的寒冷,甚至有微風(fēng)也影響了飛行器的飛行。

總體的計(jì)劃就是有一個(gè) iPhone 可以搭載在飛行器上,然后通過(guò) WiFi 連接它,通過(guò) Core Location 可以知道當(dāng)前位置和方向然后控制飛行器飛往它的目的地坐標(biāo)。

為了讓這個(gè)項(xiàng)目更有趣,我們又添加了一個(gè) iPhone,讓這個(gè) iPhone 通過(guò)使用新的 multipeer APIs 與搭載在飛行器上的 iPhone 建立聯(lián)系,并且發(fā)送它自己的位置作為飛行器的目的地坐標(biāo)。搭載 iPhone 的飛行器會(huì)朝著另外一個(gè) iPhone 移動(dòng),另外通過(guò)連接上這個(gè)飛行器也可以發(fā)送起飛和降落的命令。

制定一個(gè)軌道通往 Chris 家,并且讓飛行器在這個(gè)軌道上飛行,這個(gè)讓飛行器能夠受我們控制的想法很誘人。不幸的是,事情和預(yù)期還是有區(qū)別的,寒冷的溫度和外面的風(fēng)同樣影響了飛行器,以及電池的壽命和我們要在很短時(shí)間按下正確的方向。(但是對(duì)于 Chris 來(lái)說(shuō)這還不是糟糕的,我們把他的iPhone綁到了飛行器,所以通常我們測(cè)試的時(shí)候他都追著飛行器,生怕看不到他的 iPhone。)

飛行器

在我們的項(xiàng)目中我們使用了標(biāo)準(zhǔn)的 AR Drone 2.0,為了把 iPhone 安裝到飛行器上,我們用了一些泡沫塑料裹著 iPhone 然后用膠帶綁到飛行器上,最初我們是想把它綁在飛行器的頂部,但是這個(gè)不是很穩(wěn)定。這個(gè)飛行器幾乎不能搭載任何東西,以至于很輕的 iPhone 的都會(huì)很顯著的影響飛行的穩(wěn)定。

http://wiki.jikexueyuan.com/project/objc/images/8-1.jpg" alt="" />

但是飛行器起飛后搖晃的很,所以我們決定把iPhone綁在飛行器的底部來(lái)降低重心,事實(shí)證明,這表現(xiàn)的很好,由于現(xiàn)在飛行器的最下面是 iPhone,我們使用大量的拉鏈領(lǐng)帶來(lái)保護(hù) iPhone,讓這個(gè)飛行器不容易突然墜落。(這也是一種來(lái)方法來(lái)緩解 Chris 的顧慮)

http://wiki.jikexueyuan.com/project/objc/images/8-2.jpg" alt="" />

導(dǎo)航應(yīng)用

就像上面提到的那樣,搭載在飛行器上的iPhone的通過(guò) WiFi 連接另外一個(gè) iPhone,通過(guò)這個(gè)連接我們可以通過(guò) UDP API 來(lái)發(fā)送導(dǎo)航命令,雖然這一切看上去比較的晦澀,但是一旦我們搞清楚這個(gè)原理基礎(chǔ),就會(huì)工作的很好。Daniel 在這篇文章中詳細(xì)的介紹了 Core Foundation networking 這個(gè)類(lèi)如何使用才能讓它工作。

通過(guò)使用 iPhone 和飛行器之前的通訊,導(dǎo)航應(yīng)用也需要處理導(dǎo)航部分內(nèi)容,這個(gè)應(yīng)用通過(guò) Core Location 來(lái)處理它當(dāng)前位置和方向然后計(jì)算它與目的地的距離,你可以通過(guò)這篇文章了解它是如何工作的。

客戶(hù)端應(yīng)用

這個(gè)客戶(hù)端應(yīng)用唯一的工作就是發(fā)送目的地坐標(biāo)給搭載飛行器的 iPhone 和一些基礎(chǔ)的命令例如起飛和降落。它會(huì)通過(guò) multipeer connection 來(lái)通知它自己和簡(jiǎn)單的廣播它的位置給所有連接的 peers。

http://wiki.jikexueyuan.com/project/objc/images/8-3.jpg" alt="" />

因?yàn)槲覀兿胗幸环N方法不用飛行很多次就可以測(cè)試整個(gè)配置,而且我們也想待在室內(nèi),所以我們給這個(gè)應(yīng)用添加了兩種模式。第一種模式就是簡(jiǎn)單的發(fā)送地圖上的中心位置作為它當(dāng)前的位置。這種方法我們可以平移地圖,模擬改變目的地坐標(biāo),另一種模式是通過(guò) Core Location 發(fā)送真實(shí)的iPhone的位置。

在我們短暫的測(cè)試中由于時(shí)間的原因我們只使用第一種模式,并且由于惡劣的天氣,我們某人追逐飛行器的不能夠?qū)崿F(xiàn)了。

其實(shí)這是一個(gè)非常有趣的項(xiàng)目,我們實(shí)驗(yàn)了很多有趣的APIs。您可以查看后續(xù)的關(guān)于 Core Foundation networking,導(dǎo)航應(yīng)用客戶(hù)端的文章的具體細(xì)節(jié)。