2014-10-16 47 views
3

我需要跟蹤3D空間中槍的位置和方向。我購買了10自由度IMU傳感器(GY-87),以正確學習如何實施我的問題的解決方案。由於缺乏電子和傳感器領域的知識,我無法找到適當的指導。 我找到了一些很好的例子,但無法在arduino中實現它。使用10自由度IMU跟蹤3D空間中的位置

3d Tracking with IMU

Gait-Tracking-With-x-IMU

我目前能夠從傳感器,從中我能察覺我的槍的正確方向檢測偏航,俯仰和橫滾。但我找不到一種方法來計算位置(x,y,z)。

如果有人能在這方面幫助我,我將不勝感激。

謝謝

P.S:我不能找到太多資源,GY-87,可它已經過時了。但由於我國資源的不足,我不得不使用這種傳感器。我是一名計算機科學專業的學生,​​對電子學有新意,如果我沒有使用任何適當的術語,請糾正我的錯誤。

回答

3

一個加速度計永遠不會給你一個位置,它會給你......加速度。
但加速度與位置相關的速度有關。
如果你看單位,你會看到這種關係。加速度以米每秒平方米(m /s²)表示,速度以米/秒(m/s)爲單位,位置以米(m)爲單位。
所以如果
t爲
一個你從傳感器讀取的加速度,
一箇舊速度,S'的新速度,
經過自上次計算的位置(例如循環)的時間, p中的老大地位和對 '新位置,

S'= S + A * T
p'= p + S'* T

你需要做同樣的計算中3軸(x,y,z)。 假設您知道起始位置並且開始速度爲零,您可以實時追蹤您的對象。

+0

您必須收集一段時間內的加速度數據並將其整合兩次以獲得位移,即位移​​距離初始位置的距離。弗蘭克提到,當然有3個位移必須爲每個軸計算,以便計算3D空間中的合成位移 – 2015-06-05 14:59:51

0

積分就像計算曲線下方的面積。我們只考慮一個方向X.如果您想象一張隨時間變化的加速度圖表,您將有橫座標(水平)和縱座標(垂直)的加速度。

如果您有兩個標量值a1和a2表示時間t1和t2處的加速度,並且想象中間兩者之間存在線性轉換(時間(t1+t2)/2加速度爲(a1+a2)/2 ...),則可以用此曲線繪製形狀是基礎a1和a2以及長度爲t2-t1(也就是高度)的一側(具有矩形角)的直角梯形。

面積(base1+base2)*height/2 = (a1+a2)*(t2-t1)/2(a1+a2)/2 * delta_t

其中delta_t是,(T2-T1),傳感器讀數 和之間的時間間隔(A1 + A2)/ 2是最後兩個讀數值的平均值。

這樣做(如果你開始還是你可以假設爲零),你可能會得到近似的速度差從初始速度S0開始

s(n) = (a(n-1)+a(n))/2 * delta_t + s0

以同樣的方式,你可以得到重新整合從起始點X0

x(n) = (s(n-1)+s(n))/2 * delta_t + s0x + x0

如果您從0點開始仍然是 「空間」 x或距離,你可以放心地假設S0 = 0,X0 = 0

s(n) = (a(n-1)+a(n))/2 * delta_t x(n) = (s(n-1)+s(n))/2 * delta_t

或程序,僅保存最後的值:

old_a=a; 
old_s=s; 
a=getAccelerationX(); 

s = (old_a+a) * delta_t/2.0; 
x = (old_s+s) * delta_t/2.0; 

請考慮,這裏假設固定不動(速度= 0)知(X = 0)開始位置,跟蹤加速度的一個組成部分的能力(無論傳感器如何在空間旋轉),並且一段時間後不可避免地會出現越來越多的錯誤,因爲最小的錯誤會加起來,所以它是理想的位置,可以經過一段時間後用其他方法進行測試。

P.S.如果你在C中的微控制器(Arduino)上執行操作,請注意如何表達公式:如果old_a和a是整數,則/ 2將截斷捨棄小數的分頻結果(壞主意),而/2.0將生成一個浮點數。 (old_a + a)/ 2 * delta_t比(old_a + a)* delta_t/2差。最後一個錯誤較少,但要小心它不會溢出。只是說每個錯誤都會總結出來,所以要小心如何計算它。