• ベストアンサー

回転した座標系を基準とし、再回転したときの回転行列について

x軸、y軸、z軸が互いに直角に交わる座標系を考えます。(これを座標系Aとします) 座標系Aを、原点を中心とし、各軸ごとにθxa,θya,θzaだけ回転させた座標系を座標系Bとします。 さらに、座標系Bを基準とし、各軸ごとにθxb,θyb,θzbだけ回転させた座標系を座標系Cとします。 このとき、座標系Aから見た座標系Cの回転角は、どのように計算すればよろしいでしょうか? 座標系Aを基準とした回転角で座標系Bを計算し、さらに座標系Aを基準とした回転角で座標系Cを計算し……という問題であれば、単純に回転行列を掛けていけばいいと思うのですが、 「1つ前の座標を基準とした回転角を与えられたとき、全体でどれだけ回転したか?」 を表現する方法がわからなかったので、ご教示いただければ幸いです。 何卒よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • stomachman
  • ベストアンサー率57% (1014/1775)
回答No.3

[1] 回転を組み合わせることについて > 座標系Aを、原点を中心とし、各軸ごとにθxa,θya,θzaだけ回転させた座標系を座標系Bとします。  ご質問では、どうも、これを一度の回転とお考えのように見受けられます。(違ったら失礼。)  しかし、正しくはそうではない。x軸のまわり、y軸のまわり、z軸のまわりと3回の回転を組み合わせたんです。つまり、「さらに、座標系Bを基準とし、…」を持ち出すまでもなく、もうすでに、複数回の回転を組み合わせたものをお考えなのです。  そのうえ、この文章だけではどんな回転をしたのかさっぱり分からない。というのは、第一に、いろんな回転を何度も繰り返す場合、(ご承知の通り)やる順番を変えれば結果も変わるからです。 (1) これら三回の回転はこの順番でやったのかどうか。  ま、仮にこの順番でやったのだとしましょう。で、最初にやったx軸のまわりでの角度θxaの回転は良いとして、次にやった回転は、 (2)「座標系Aのy軸」のまわりでの回転なのか、それとも、「最初にやった(x軸のまわりでの角度θxaの)回転の結果得られた座標系のy軸」のまわりでの回転なのか。  これがはっきりしません。三番目の回転についても同様です。 [2] 回転の表現について  上記[1]の曖昧さについては補足を求めません。なぜなら、「座標系Aから座標系B、および座標系Bから座標系Cへの変換を(曖昧な文章ではなく)行列で表現したらどうなるか」について、質問者は先刻ご承知のようだからです。では、そのご承知の内容を確認しましょう。  原点を通る直線を中心軸とする回転は、関係  R' R = I  (「'」は転置) を満たす3x3の行列(直交行列)で表現されることはご存知の通り。逆に、この関係を満たす行列Rは、「原点通る直線を中心軸とする回転を行う操作」か、あるいは、「鏡に映すように反転してから原点通る直線を中心軸とする回転を行う操作」かのどちらかを表しています。  さて、このような回転を幾つ組み合わせようとも、 > 単純に回転行列を掛けていけばいい と仰る通りで、「直交行列R1,R2,…,Rnで表される回転を、この順番で適用する操作」をRとすると、  R = Rn … R2 R1 となる。確かに  R' R = (Rn … R2 R1)' Rn … R2 R1 = R1' R2'…Rn' Rn … R2 R1 = I を満たします。  ところで、Rは、「原点通る直線を中心軸とする回転」ですから、その直線の方向を表す単位ベクトルxがある。つまり、Rは単位ベクトルxのまわりでの回転を表しているわけです。回転変換を表す行列Rを与えた時、このベクトルxは回転によって変化しないのだから、  R x = x を満たします。このxをRの固有ベクトルと言います。  Rを与えた時にxを知るにはこの方程式を解けば良い。これで(座標系Aにおける)回転軸の向きが分かります。一方、角度θは何かというと、「xと直交する適当なベクトルvと、それが回転Rによって移ったものRvのなす角度」のことですから、両者の内積を取って   v' R v = cosθ から計算できます。  逆に、xとθが与えられたときにRを構成するには、「直交行列Rであって、R x = x を満たし、かつ、x' v = 0 となるような単位ベクトルvについて v' R v = cosθ を満たすもの」を考えればよい。  (うるさいことを言うと、回転の中心軸の方向を表すベクトルは当然2つある。つまり互いに逆向きの単位ベクトルです。一方、回転角についても、どっちまわりをプラスとみなすか、のやりかたが2通りある。ですが、ま、そういう細かいことは教科書に任せます。) [3] ご質問に戻って > 「1つ前の座標を基準とした回転角を与えられたとき、全体でどれだけ回転したか?」 > を表現する方法 を文字通り(とは言っても不足の部分は補って)解釈すれば、「あるベクトルxと、そのまわりで回転した角度θを与えた時、xとθは?」という問いに他なりませんから、答は初めからそこにある。これじゃ質問になってない訳です。  一方、(おそらく)ご質問の意図は、Rを「各軸ごとにθxa,θya,θzaだけ回転させ」る、という形式で表現したいということなのでしょう。そういうことを考えるためには、まず[1]で申し上げた曖昧さをきちんと整理する必要がある。その上で、Rを三つの回転の積で表すことを考えれば良い。  しかし、そんな面倒な表現を使わねばならない場合は滅多にない。単にR、もしくはxとθで表した方が単純明快だからです。

yellmarch
質問者

お礼

ご回答ありがとうございます。 仰るとおり、3軸を中心としたA→Bのの時点で、 すでに3回分の回転が必要であることを失念しておりました。 お恥ずかしい……。 頂いたご回答をもとに、もう一度整理してみます。 今回の疑問は、3軸の角速度センサを用い、 一定時間ごとに吐き出されるxyz軸それぞれの速度情報をもとに、 どの方角を向いているかを計算するにはどうすればいいかを 検討している最中に生じたものです。 センサがどういう値を出すのかも含めて、再検討いたします。 ありがとうございました。

その他の回答 (3)

  • stomachman
  • ベストアンサー率57% (1014/1775)
回答No.4

ANo.3のコメントについてです。 >3軸の角速度センサを用い、 >一定時間ごとに吐き出されるxyz軸それぞれの速度情報をもとに、 >どの方角を向いているかを計算するにはどうすればいいか  なるほど、そういう応用でしたか。  角速度センサがどこに付いているのかによって、話が変わりますね。固定された座標系に対して何か回転する物があって、その回転する物にセンサが付いているのだとすると、センサの向きがどんどん変化する。ANo.3[1](2)で申し上げた「それとも」の方に該当する訳です。  また、測定しているのは「各軸ごとにθxa,θya,θzaだけ回転させた」なんてもんじゃなくて、時々刻々変化する回転の角速度を測っている。つまり、ある時刻tにおける、微小時間Δtにおける微小回転ΔRについて、 (ΔR/Δt)を見ている訳です。時刻tにおける(ΔR/Δt)をW(t)と書くことにすると、 (W(t)Δt)(W(t-Δt)Δt)(W(t-2Δt)Δt)… という積を作って行かねば、今どっちを向いているかが分からない。ただ、このやり方ではだんだん誤差が蓄積して、しばらくするとトンチンカンなことになってしまうでしょうけれど。  ところで、(数学とは関係ない話ですが、)角速度計というものがあるのかどうかstomachmanは知りません。角度を直接測るロータリーエンコーダを使ったり、あるいは、加速度計、これは安価で超小型で高精度で強靭なので最近よく使われますね。  回転する物に幾つか加速度計がついていて、しかも回転が重力場の中(人工衛星軌道上なんかじゃない、普通の場所)で行われているのであれば、加速度計は回転による加速度と重力加速度のベクトル和を測定します。ですから、データ処理で測定データから重力場による成分を分離してやれば、「重力場の方向(つまり上下方向)に対してどれだけ傾いているか」が測れる。もちろん、東西南北の方角については情報が得られません。けれども、上記のように微小回転を積み重ねて行くと誤差が溜まって行くのを、上下方向に対する角度が合うように補正するのに利用できます。ま、それでもいずれは誤差のせいで方角を見失うことになるでしょう。  長時間に渡って精度を出すには、ビデオカメラや光学トラッキングシステムなどを使って、回転する物の向きを外部からじかに測るのが一番確か。また、回転する物の中だけで情報処理を完結させる必要がある場合には、航空機やミサイルと同様、光ジャイロを使うという手もあります。ですけど、これらはコスト的に無理、ということもあるでしょう。  もう一つの方法は、外部から重力場とは別の場、たとえば磁場だとか、光の放射だとかを与えて、上下方向の他に南北方向も教えてやる、というやり方です。たとえば地磁気を利用すれば、文字通り南北が分かる訳です。回転する物には、だから、加速度計の他に、この場を測るセンサを幾つか取り付けることになります。

yellmarch
質問者

お礼

ありがとうございます。(お返事遅れてすいません) 今回のテーマは、外部になにも設置せずに姿勢を検出したいというものですので、しばらく色々苦労してみます。 ご回答ありがとうございました!

  • info22
  • ベストアンサー率55% (2225/4034)
回答No.2

3次元アフィン変換で使う4行4列の行列を使って、各座標系間の回転行列の積を撮ればいいと思います。積の逆行列をかければ、最初の座標系に戻る事は言うまでもありません。 回転移動の原点が全部一致しているなら、3行3列の行列で扱えると思います。回転移動要素を全部ゼロとした4行4列のアフィン変換の特別な場合にあたります。 質問のケースでは平行移動及び拡大・縮小も伴わない回転だけのアフィン変換といえますね。しかし、実際の角度を求めるのは、連立三角方程式を解かないといけませんので一般論は困難ですね。実際の回転角度を与えての数値計算でなら、比較的求めやすいでしょうね。 アフィン変換の参考URLをご覧になって少し勉強して下さい。 http://ft-lab.ne.jp/cgi-bin/wiki.cgi?page=%A5%A2%A5%D5%A5%A3%A5%F3%CA%D1%B4%B9_3DCG http://homepage1.nifty.com/open-prog/java/tip001.html 行列の積で座標系Aの点座標PAから座標系Cへの移動後の座標点PBの座標が出せますね。 計算は数式処理ソフトのMapleやMathematica,その他の類似ソフトを使えば比較的簡単にできるかと思います。 あなたがどこかの大学に所属する学生であれば、大学で導入しているライセンスソフトがただで使えると思います。

yellmarch
質問者

お礼

ご回答ありがとうございます。 数式処理ソフト、具体的に挙げていただいてありがとうございます。 頂いたURLも参考にさせていただきます。

回答No.1

A→Bの回転行列とB→Cの回転行列を掛け合わせたものが、 A→Cの回転行列になると思うのですが。 何か勘違いしてるでしょうか・・・

yellmarch
質問者

お礼

ご解答ありがとうございます。 今回の質問では、A→Bの回転角と、 B→Cの回転角で、基準となる座標が異なるため 回転行列内のθをどう定義するのかで混乱しておりました。 頂いた回答を元に、もう少し整理してみます。 ご解答ありがとうございました。

関連するQ&A