2011-08-02 125 views
14

我正在開發Android應用程序,我需要從加速計讀數中移除重力。我已經閱讀了關於這個問題的多個討論,我還發現了一個算法here,但我並不是很瞭解它。Android從加速計讀數中移除重力

我想過濾來自每個軸的重力,而不是來自總加速度。

能否請你幫我嗎?我的代碼應該是這樣的:

public void onSensorChanged(SensorEvent sensorEvent) { 
    float vals[] = sensorEvent.values; 
    float accelerationX = filterGravity(vals[0]); 
    float accelerationY = filterGravity(vals[1]); 
    float accelerationZ = filterGravity(vals[2]); 
} 

我應該在filterGravity()方法中放置什麼代碼?

回答

20

對於基本的解決方案,您需要一個low pass filter其他方法,如卡爾曼濾波器,對於背後的數學來說非常困難。一個簡單的Android例子是從您的鏈接點擊一下http://developer.android.com/reference/android/hardware/SensorEvent.html#values

簡而言之,低通濾波器會根據您的所有歷史值建立加權平均值。例如,如果過濾因子爲0.1,則意味着當前值的10%會添加到先前的平均值中:newMeanValue = currentValue的10%+ oldMeanValue的90%。這意味着即使有一個突然的高峯,它也只會緩慢推動你的平均值,因爲10%。

+0

謝謝。這很有幫助。 – Gabriel

+0

@Kay對不起,我想UPvote你的答案。請在最後一句話中加點(或做一些編輯),以便我的downvote變成upvote。對不起... – Ali

+0

@Ali:加點,沒問題:-) – Kay

11

線性加速度是您所需要的。檢查傳感器.TYPE_LINEAR_ACCELERATION here

+0

非常感謝。這將完成我的問題。但是,僅在API級別9以後才支持此方法。是否有方法在早期的API版本中實現此目的? – Gabriel

+0

@加布裏埃爾我不害怕。這背後有一些沉重的數學,融合加速度計,陀螺儀和指南針數據。這是一個關於傳感器融合的有趣視頻:http://www.youtube.com/watch?v=C7JQ7Rpwn2k – Ali

-1

不太清楚你想什麼acomplish但如果你認準幅度(這將給0之間的結果,並且1),然後你要做的就是通過劃分結果10

public void onSensorChanged(SensorEvent sensorEvent) { 
float vals[] = sensorEvent.values; 
float accelerationX = (vals[0]/10); 
float accelerationY = (vals[1]/10); 
float accelerationZ = (vals[2]/10); 

}

在遊戲環境,當傳感器處於全速你的對象將是其最大速度

7

如果沒有與TYPE_LINEAR_ACCELERATION一個電話,你被卡住TYPE_ACCELERATION,這不能將重力(傾斜)與線性加速度分開。

一種選擇是應用低通濾波器。如果陀螺儀可用,另一種方法是使用傳感器融合。這兩種方法都有其優點和缺點。

我在開源項目Acceleration Explorer中有很多工作示例。

+0

嗨Kaleb,我目前正在研究類似於你的FusedLinearAcceleration android應用程序的java應用程序,我不能使用android虛擬傳感器來計算重力。我從sensorManager移植了一些方法,但是我找不到算法來獲取重力矢量。我發現這可以使用四元數來實現,並且改變/寫下了這樣的內容:https://gist.github.com/Bresiu/c0a69552881b8df34a2e。但是它會帶來不好的結果 - 引力只能從z軸補償(其餘代碼基於您的應用程序)。你有什麼提示,有什麼可能是錯的?我的代碼:http://goo.gl/5jmlvY – Bresiu

+0

@Bresiu:FusedLinearAcceleration使用的唯一虛擬傳感器是Sensor.TYPE_GRAVITY,您可以將其更改爲Sensor.TYPE_ACCELERATION。但是,如果您有帶陀螺儀的設備,則應實施Sensor.TYPE_GRAVITY。你可以看看這篇博客文章(http://www.kircherelectronics.com/blog/index.php/11-android/sensors/17-gyroscope-linear-acceleration),它詳細闡述了你發佈的代碼(和我的代碼)。它可以幫助它覆蓋重力矢量。請記住,如果您在動態加速期間嘗試測量任何事物(如汽車),則需要進行修改。 – Kaleb

+0

我有一個陀螺儀,加速度計和磁力計的設備,所以我正在尋找一些傳感器融合,以獲得最佳結果。我看到你的其他應用程序,FusedLinear看起來最準確。我會繼續搜索... – Bresiu

相關問題