質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

4446閲覧

ジャイロセンサーから測定したquaternionによる姿勢推定を用いた加速度の回転方法について

yohehe

総合スコア48

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/07/01 10:48

編集2018/07/02 13:43

quaternionを用いた姿勢制御、それを用いた加速度への回転行列定義についてpythonのプログラムを作成使用としております。

ある動作における加速度とジャイロ動作を取得したとする。
30hz毎の測定時において
加速度a=(ax,ay,az)
ジャイロセンサーの値w=(wx,wy,wz)が取得できるとする。
座標系を用いて姿勢制御について検討する。

姿勢制御については、

python

1#quaternionを用いた姿勢推定においては 2q=np.array(qx,qy,qz,w) 3#quaternion微分値をdqとすると 初期位置を0,0,0として座標系における計算とする。 4dq=np.array([0,wz,-wy,wx],[-wz,0,wx,wy],[wy,-wx,0,wz],[-wx,-wy,-wz,0]).dot(q) 5 6#初期位置を四元数を用いて(0,0,0,1)とすると 7q_shoki=np.array(0,0,0,1) 8 9#初期位置からの次点でのQuaternion q(t+dt)をq2とすると、 10q2=q_shoki+dt 11 12#q2を正規化する。 13l=np.sqrt(q2[0]*q2[0]+q2[1]*q2[1]+q[2]*q[2]+q2[3]*q2[3]) 14q2_seiki=q2/l 15 16 17#以上を繰り返してクォータニオンによって姿勢制御を求めていく 18#角度での表記が必要であればオイラー角へq2をプログラムでオイラー角にする。 19

以上で座標系における角速度が求められる状態での表記が可能であるということがわかってきました。
この段階で間違えていたらすみませんが、アドバイスください。

このquarternionを用いた姿勢推定に加速度のベクトル成分を導入していくプログラムについてわからずにおります。
今の頭の中での考えでは、

python

1#この姿勢制御に加速度の要素を入れて位置を推定するプログラムを作成していくとすると、 2 3 4#Quaternionによる姿勢制御から座標系の回転を行う行列を定義 5#q2における(q0,q1,q2,q3)とすして回転行列を定義 6 7R=np.array([q0*q0-q1*q1-q2*q2+q3*q3,2(q1*q2+q3*q0),2(q3*q1-q2*q0)], 8[2(q1*q2-q3*q0),q2*q2-q3*q3-q1*q1+q0*q0,2(q2*q3+q1*q0)], 9[2(q3*q1+q2*q0),2(q2*q3-q1*q0),q3*q3-q1*q1-q2*q2+q0*q0]) 10 11#q2における加速度をa2とすると 12a2=R.dot(a2) 13#となると思われる。すみません、この方法で加速度を導入していくことが間違っているのかわからないでおります。 14#以上の考え方が正しかったとすると、n次点での加速度a_nは 15a_n=a1+a2+a3+,,,,,,an 16#以上で計算することが可能??なのでしょうか。 17コード

以上のコードの流れを作成しているのですが、以下の点がわかりません。

  1. 次点次点での姿勢における加速度の回転の導入方法の考え方がそもそもあっておりますでしょうか。
  2. 取得できる加速度データは位置ベクトルと考えると、姿勢制御で得られたqを加速度を位置ベクトルとして処理すべきなのか。色々考えているのですが、わからないでおります。

すみませんが、よろしくお願いいたします。


7/2追記いたしました。

クォータニオン便利ノートより抜粋させていただいております。

イメージ説明

以上をみて考えたのですが、

クォータニオンの回転を行なったr=(x,y,z)をクォータニオンBで回転させたとする。

r'=Brが成立するのであれば、
Bの逆行列をB_1とすると両辺に左からB_1をかけて
B_1*r'=rが成り立つ。

ここでいうB_1が"加速度におけるセンサー座標系から基準状態に戻すクォータニオンである",との理解はあっていますでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

持っているもの
センサーの座標系での加速度
基準状態の座標系から現在のセンサー座標系への回転クォータニオン

欲しいもの
基準状態の座標系での加速度

やること
現在のセンサー座標系から基準状態に戻すクォータニオンを求めて
センサー座標系での加速度に作用させる

投稿2018/07/01 11:25

ozwk

総合スコア13521

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yohehe

2018/07/01 12:40

ozwk様、いつもすみません。本当にありがとうございます。 加速度へのクォータニオンについて頭のなかでの整理ができました。 センサー座標系から基準系にも戻すクォータニオンとは、 各次点におけるクォータニオンq(x,y,z,w)における逆quaternion(単純quaternionにおいては逆クォータニオンと共役クォータニオンはイコールだとすると共役でもいい)ということだと自分では考えたのですが、、あってますでしょうか。
yohehe

2018/07/01 12:54

q(t+dt)=q(t)+q(dt)、wを座標系の角速度だとしてセンサー座標系へのクォータニオンを求めるとする。その場合において、 q(dt)=0.5*q*wとしているとすると、 qに戻すような 2*w^-1(wの逆行列の意味)が基準系に戻す式が基準座標系に戻すという式になる?とは間違っておりますよね。
ozwk

2018/07/01 13:01

普通に共役で
yohehe

2018/07/01 13:03

ありがとうございます。共役quaternionで進めてみます。
yohehe

2018/07/01 14:44

今すすめているのですが、あと一つ質問させてください。 加速度に共役クォータニオンを作用をさせるとは、加速度をquaternionの4元数表記にして加速度のquaternionとジャイロから得られているquaternionの積を取るということでよかったですか?
ozwk

2018/07/02 00:05 編集

(ある意味あってるけど)違います クォータニオン計算便利ノートに書いてあります とりあえずX軸に90度回転させるクォータニオンでも作って適当なベクトル相手に検算すればいいです。 なんか対象が加速度だから難しく考えているのかもしれませんが そもそものやりたいことは、 「センサー座標系でとれたこのベクトルは、基準座標系でいくつになるんだろう」ってだけです。(ですよね?) もし回転行列で扱っていたら回転行列かけて終わる話です
yohehe

2018/07/02 11:12

返信がおそくなり申し訳ありませんが、ozwk様ありがとうございます。 基準座標系におけるベクトルがいくつになるか測定したいだけです。なかなか理解が追いつかずすみません。確かに加速度のために複雑に考えているのかもしれません。 クォータニオン計算便利ノートにのクォータニオン表現による変換行列の(ii)だと思われるのでやってみます。ありがとうございます。
yohehe

2018/07/02 13:47

すみません、悩み悩んで追記させていただきました。 ozwk様、本文に追記したのですが、Bの逆行列が求めるべき基準状態での加速度を求めるために使用するクォータニオンでこれを各次点での加速度にかけていくという判断で大丈夫でしょうか? 何度も質問すみません。
ozwk

2018/07/02 14:11

用語はともかく大丈夫です 適当に状況を設定して検算してみてください
yohehe

2018/07/02 14:24

ozwk様、ありがとうございます。プログラムを設定して検算してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問