測定した加速度とジャイロのデータを回転行列で分解するプログラムを作成しております。
動作データと測定データの誤差が大きいのですが、何が課題かわからず困っております。
python
1 2#取得した加速度データをそれぞれacX,acY,acZとする 3取得したジャイロデータをそれぞれradX,radY,radZとする。 4#加速度はG表示のため、取得時にm/s*2へ変換 5 6#角速度から角度へ 単位はradに 7kakudoX=[] 8kakudoY=[] 9kakudoZ=[] 10for i in range(len(radX)): 11 radsecX=radX[i]+radX[i+1]*0.1 12 kakudoX.append(radsecX) 13 radsecY=radY[i]+radY[i+1]*0.1 14 kakudoY.append(radsecY) 15 radsecZ=radZ[i]+radZ[i+1]*0.1 16 kakudoZ.append(radsecZ) 17 18#acgyのリストを作成 19acgy_list=[] 20def kaiten(rx,ry,rz): 21 #回転行列を定義 22 Rx=np.array([[1,0,0],[0,np.cos(rx),-np.sin(rx)],[0,np.sin(rx),np.cos(rx)]]) 23 Ry=np.array([[np.cos(ry),0,np.sin(ry)],[0,1,0],[-np.sin(ry),0,np.cos(ry)]]) 24 Rz=np.array([[np.cos(rz),-np.sin(rz),0],[np.sin(rz),np.cos(rz),0],[0,0,1]]) 25 #基準座標系からみた座標の方向余弦行列.オイラー角z:ヨー角>x:ピッチ角>y:ロール角 26 R=Rz.dot(Ry).dot(Rx) 27 return R 28accelgyro=kaiten(np.radians(x),np.radians(y),np.radians(z)).dot([[acX[i]],[acY[i]],[acZ[i]]]) 29 acgy_list.append(accelgyro) 30 31#ノイズ除去のためにフィルタリングを行う。 32# ローパスフィルターでフィルタリング 33#1に近づけるほど平滑化の度合いは大きくなっていく 34lowpass_acX=[] 35lowpass_acY=[] 36lowpass_acZ=[] 37for i in range(len(acX)): 38 a=0.3 39 low=a*dataX[i]+(1-a)*dataX[i] 40 lowpass_acX.append(low) 41 low=a*dataY[i]+(1-a)*dataY[i] 42 lowpass_acY.append(low) 43 low=a*dataZ[i]+(1-a)*dataZ[i] 44 lowpass_acZ.append(low) 45highpass_X=[] 46highpass_Y=[] 47highpass_Z=[] 48#次にハイパスフィルターでフィルタリング 49for i in range(len(acX)): 50 #ローパスフィルター:現在の値=係数*一つ前の値+(1-係数)センサーの値 51 #ハイパスフィルター:センサーの値ーローパスフィルター 52 a=0.4 53 lowX=a*lowpass_X+rdataX[i]*(1-a) 54 highX=rdataX[i]-lowX 55 lowY=a*lowpass_Y+rdataY[i]*(1-a) 56 highY=rdataY[i]-lowY 57 lowZ=a*lowpass_Z+rdataZ[i]*(1-a) 58 highZ=rdataZ[i]-lowZ 59 highpass_X.append(highX) 60 highpass_Y.append(highY) 61 highpass_Z.append(highZ) 62 63 64コード
以上の方法で加速度とジャイロデータを回転行列として計算しております。このaccel*gyroデータをもとに速度、距離(台形積分法なども試しました)を求めていくと誤差が拡大し困っています。
何が問題かアドバイスをいただけますと幸いです。
よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー