2010-04-20 44 views
13

我正在嘗試製作一個應用程序,該應用程序可以檢測出使用加速度計的iPhone使用何種形狀。例如,如果您用手拿着iPhone畫一個圓圈,應用程序就可以在屏幕上重新繪製它。 這也適用於正方形,甚至更復雜的形狀。 我見過做這樣的事情的唯一例子是AirPaint(http://vimeo.com/2276713),但它似乎無法實時做到。如何使用加速計檢測iPhone在空間中的移動?

我的第一個嘗試是對來自加速度計的X和Y參數應用低通濾波器,並使指針向這些值移動,與屏幕大小成比例。 但是這顯然不夠,我的準確度非常低,如果我搖動設備,它也會使指針移動...

有關於此的任何想法? 你認爲加速度計數據足夠嗎?或者我應該考慮使用其他數據,例如指南針?

在此先感謝!

回答

2

您需要查看加速度與速度和速度之間的關係。我的想法是現在有一個小屁,但我相信它是不可或缺的......你想在時間上加速整合。維基百科應該幫助你解決數學問題,我相信有一個好的圖書館可以幫助你。

只要記住加速度計不夠完美也不夠快。真正的突然動作可能沒有被很好地拾取。但要輕柔地在空中畫,它應該工作得很好。

+0

好的,我正在研究這個。謝謝 ! – 2010-04-20 12:13:53

+0

您需要整合*兩次*才能從加速到位移。 – 2010-04-20 12:19:39

10

好的我發現了一些似乎可行的東西,但我仍然有一些問題。 這裏是我如何繼續(承認設備垂直):

1 - 我有我的默認x,y和z值。
2-我使用低通濾波器從這些數據中提取重力矢量。
3 - 我從每個x,y和z減去標準化的重力矢量,並獲得運動加速度。
4 - 然後,我將這個加速度值與時間相結合,所以我得到速度。
5 - 我再次將這個速度與時間相結合,並找到一個位置。

以下所有代碼都加入到我的控制器的加速度計:didAccelerate:delegate中。 我想根據我找到的位置來移動球。 這裏是我的代碼:

NSTimeInterval interval = 0; 
NSDate *now = [NSDate date]; 
if (previousDate != nil) 
{ 
    interval = [now timeIntervalSinceDate:previousDate]; 
} 
previousDate = now; 

//Isolating gravity vector 
gravity.x = currentAcceleration.x * kFileringFactor + gravity.x * (1.0 - kFileringFactor); 
gravity.y = currentAcceleration.y * kFileringFactor + gravity.y * (1.0 - kFileringFactor); 
gravity.z = currentAcceleration.z * kFileringFactor + gravity.z * (1.0 - kFileringFactor); 
float gravityNorm = sqrt(gravity.x * gravity.x + gravity.y * gravity.y + gravity.z * gravity.z); 

//Removing gravity vector from initial acceleration 
filteredAcceleration.x = acceleration.x - gravity.x/gravityNorm; 
filteredAcceleration.y = acceleration.y - gravity.y/gravityNorm; 
filteredAcceleration.z = acceleration.z - gravity.z/gravityNorm; 

//Calculating velocity related to time interval 
velocity.x = velocity.x + filteredAcceleration.x * interval; 
velocity.y = velocity.y + filteredAcceleration.y * interval; 
velocity.z = velocity.z + filteredAcceleration.z * interval; 

//Finding position 
position.x = position.x + velocity.x * interval * 160; 
position.y = position.y + velocity.y * interval * 230; 

如果我執行此,我得到相當不錯的價值,我的意思是,我可以看到加速進入正值或負值,根據我做動作。 但是,當我嘗試將這個位置應用於我的球視圖時,我可以看到它正在移動,但是具有向另一個方向移動更多的傾向。這意味着,例如,如果我用我的設備畫圓圈,我會看到描述曲線的球在屏幕的左上角。 類似的東西:http://img685.imageshack.us/i/capturedcran20100422133.png/

你對發生了什麼有什麼想法嗎? 在此先感謝!

7

問題是你不能整合兩次加速來獲取位置。不知道初始位置和速度。記住學習集成時添加的+ C術語?那麼當你定位它是一個ct + k的術語。這是重要的。那是在您考慮您獲得的加速度數據量化和平均之前,因此您實際上沒有整合設備的實際加速度。這些錯誤最終會在整合兩次時變得很大。

仔細觀察AirPaint演示,您會看到這種情況發生,呈現的形狀與移動的形狀顯着不同。即使是具有一些位置和速度感應的設備(例如Wiimote)也難以進行手勢識別。這是一個棘手的問題,人們付出高昂的代價(例如像AILive這樣的公司)爲他們解決問題。儘管如此,如果大型特徵不同,您可能很容易區分特定類型的手勢。如果設備在六個角度範圍中的每個角度範圍內都收到加速度,則可以檢測到一個圓圈。你可以通過空氣掃描iphone和晃動它之間檢測。

要說出一個圓和一個正方形之間的區別會更困難。

+0

在開始集成加速度計值之前,我需要知道設備的初始位置和速度?該設備以近似的速度和位置0開始。這可能不是一個好主意,但即使我讓我的iPhone躺在桌子上,我仍然可以獲得一些移動信息。通過這個微積分,我大致瞭解了用戶繪製了什麼形狀,這對我正在嘗試做的事情已經足夠了。我只是想知道如何過濾加速度計值,以便擺脫這種「默認移動行爲」,並始終將我找到的位置居中。 – 2010-04-26 12:55:46

+0

這就是我的意思。你不能過濾掉擺脫加速度計的'默認運動',因爲你無法知道可能是什麼。 AirPaint假定運動將在其開始點結束,因此它可以通過這種方式進行一些糾錯。但是對於這個問題的一般解決方案根本不可能用於加速數據。 當設備靜止時您獲得的動作也由加速度計中的不準確性引起。當你整合兩次時,這些不準確性非常大。 – Ian 2010-04-27 19:04:57

+0

您在移動過程中會因電話輕微扭曲而導致錯誤。由於您認爲低頻加速度是重力,所以傾斜度的變化會記錄爲加速度的劇烈變化。如果我傾斜,然後向後傾斜,它將相當於一個大擺動。 – Ian 2010-04-27 19:10:00

2

似乎你正在使用瞬時加速度進行減法之前對重力矢量進行歸一化處理。這將保持相對的方向,但刪除任何相對的比例。我測試的最新設備(當然不是Idevice)在大約-9.8度的重力下可能會校準到m/s。假設沒有其他的加速度,如果你要規範化,然後從過濾的通道中減去它,你最終將得到-8.8的當前加速度而不是0.0f;

2個選擇: - 可以只減去重力向量的濾波器由加速度和重力的點通過後 - 捕獲的初始加速度向量的長度,規格化加速度和重力矢量,縮放加速度矢量法線。

同樣值得記住的是要考慮設備的方向。

相關問題