2013-08-26 43 views
0

我正在使用實時加速計數據(來自手機)來檢測一些基本的移動手勢。我的問題是我需要一些「旋轉不變」的東西。使用加速計進行運動跟蹤的算法建議

我的意思是,如果用戶把手機顛倒過來,然後做一個手勢,它不會是相同的信號。鑑於特定的方向,我知道如何將實時acc數據與手勢的給定「模板」進行比較。

但是對於其他方向呢?例如。用戶拿着手機倒過來(好吧,這很容易,因爲我可以做同樣的基本比較治療一個軸另一個)或更難,但在中間的某個地方?

感謝您的任何幫助,將很樂意提供更多的細節。

回答

1

只要加速度值在一段時間內(例如1秒)沒有改變(或保持在定義的範圍內),您就可以假定用戶處於穩定位置並存儲這些值。如果值超出該範圍,則可以從新值中減去以前存儲的值。這是假設你的問題是重力,而你的意思是「定向不變」......對吧?

對於一個非常簡單的例子,在這裏你只需要z軸的加速度有一個高峯:

x_wanted = 0 
y_wanted = 0 
z_wanted = 10 

你在一個穩定的位置的用戶,在45度的傾斜裝置:

x_rest = 0 
y_rest = sin(45) g 
z_rest = -cos(45) g 

並隨後使該電話向他的,即z軸(電話參考)爲10:

x_phone = x_measured - x_rest = (0) - 0     = 0 
y_phone = y_measured - y_rest = (sin(45)*g) - sin(45)*g = 0 
x_phone = z_measured - x_rest = (-cos(45)*g + 10) - (-cos(45)*g) = 10 
1

它如此喜歡你的問題是座標的基本變換。我要做的第一件事就是吹掉笛卡爾座標而轉向spherical coordinates。這樣做的最大優點是球面半徑(或矢量幅度,以笛卡爾的形式表示),無論軸的方向如何,它都是相同的。計算半徑

r = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2) + Math.pow(z, 2)) 

標準化兩個座標系的一種非常簡單的方法是將每個半徑作爲兩個時間序列進行比較。這應該至少可以消除很多問題,並且在運動識別方面可能表現得很好。

現在,如果您真的想比較各個方向的動作,也許在您已經找到基於半徑時間序列的候選人後,請查看​​。您必須做一些多元迴歸,但是有三個數據通道,三個控制方程,三個未知數(alpha,beta和gamma)以及線性代數,您可以將未知方向的所有三個通道標準化回模板方向,並分別比較每個通道。