simscape multibodyにおける角度検出方法

matlabのsimscape multibody のライブラリにあるtransform sensorに関する質問です。
シミュレーション中の物体のロール角、ピッチ角、ヨー角をそれぞれ個別に調べようと思いました。そこで、transform sensorによって調べようと思ったところtransform sensorのrotationの中のangleが1種類しかありません。
ロール角、ピッチ角、ヨー角の三種類を調べるにはどのようにすればよいのでしょうか?

Answers (3)

Toshinobu Shintai
Toshinobu Shintai on 9 Oct 2020

0 votes

3次元の回転姿勢の情報を出力させたい場合は、「Quaternion」または「Transform」にチェックを入れてください。それぞれクオータニオン(4要素のベクトル)、回転行列(3x3の行列)が出力されます。
ロール角、ピッチ角、ヨー角というのは、3次元の回転を正確に表す表現ではありません。ただし、クオータニオンまたは回転行列からロール角、ピッチ角、ヨー角を求めることはできます。「Coordinate Transformation Conversion」ブロックを用いて変換できます。
Okamoto Sakumi
Okamoto Sakumi on 9 Oct 2020

0 votes

丁寧なご返答ありがとうございます。
重ねて質問なのですが、matlabのsimscape multibody内のライブラリにおいて「Coordinate Transformation Conversion」ブロックがありません。
どのブロックを用いて変換すればいいでしょうか。

1 Comment

説明が不足しておりまして申し訳ありません。「Coordinate Transformation Conversion」ブロックを使うには、Robotics System Toolbox, Navigation Toolbox, ROS Toolboxのどれかをインストールする必要があります。
ちなみに、変換するブロックを自作する場合は、添付ファイルをご参照ください。
私が以前に作成した、クオータニオンの回転状態を把握するライブスクリプトです。クオータニオンからロールピッチヨー角へ変換する計算式も記載しています。ライブスクリプトはR2019aで作成しています。

Sign in to comment.

Okamoto Sakumi
Okamoto Sakumi on 9 Oct 2020

0 votes

度重なる質問失礼いたします。
ライブスクリプトをダウンロードさせていただきました。
ライブスクリプトの中のクオータニオンを入力するというところはどのような変数を入力すればよいのでしょうか。

8 Comments

クオータニオン値を入れます。クオータニオンが何か、ご存じないようですので、以下のリンク先を確認していただけますでしょうか。
リンク先に書かれている、a+bi+cj+dk のa, b, c, dの四つを入力します。ライブスクリプト中では、aがq0, bがq1, cがq2, dがq3です。
好きな数字を入れてよいですが、3次元の姿勢を表すクオータニオンは、必ず大きさ1のクオータニオンになります。
Okamoto Sakumi
Okamoto Sakumi on 10 Oct 2020
ご丁寧な説明ありがとうございます。
クオータニオンが何か理解できていないので、送っていただいたリンクを見ながら勉強したいと思います。
別アプローチとして示していただいたNavigation ToolboxをインストールしてみたところCoordinate Transformation Conversionブロックを使うことができ、ロール、ピッチ、ヨー角を導出することができました。
ただ、ロール、ピッチ、ヨー角をグラフに表してみたところ、一つのグラフに3つの角度がまとめて表示されており、どれがどれに当たるのかがグラフから判別できません。
3本の線がロール、ピッチ、ヨー角のどれに当たるのか判別する方法はありますでしょうか。
Okamoto Sakumi
Okamoto Sakumi on 10 Oct 2020
先ほどの質問に少し訂正させていただきます。
Coordinate Transformation Conversionブロックを用いてクオータニオンからAxis-angleに変換しました。
するとグラフには3つではなく、4つの線がプロットされました。
その4つにおいて先日送っていただいたCoordinate Transformation Conversionブロックに関するリンク先を見てみたところ、それぞれ x y z thetaを表していると書かれていました。4つの線がどれを表しているかを判別する方法を教えていただきたいです。
また、x y z theta はxがロール角、yがピッチ角、zがヨー角を表しているとした場合にtheta は何を表しているのでしょうか。
Toshinobu Shintai
Toshinobu Shintai on 10 Oct 2020
Edited: Toshinobu Shintai on 10 Oct 2020
まずはドキュメント(Help)を読んでいただけましたでしょうか。確かに、ドキュメントもかなり分かりにくいので、説明させていただきます。
以下のようにブロックパラメータを設定すると、ロール角、ピッチ角、ヨー角の順番でベクトル化された数値が出力されます。XYZがそれぞれロールピッチヨーに相当することになります。
軸角度の設定をした場合、x, y, z ,thetaの4変数が出力されますが、このときの[x, y, z]は回転軸ベクトルを表し、thetaはその軸の周りに回転させた回転角を表します。
Okamoto Sakumi
Okamoto Sakumi on 10 Oct 2020
丁寧なご説明ありがとうございます。
説明の通りに行いましたところロール、ピッチ、ヨー角をグラフで表すことができました。
ロール、ピッチ、ヨー角は現状1つのグラフであらわされているのですが、3つのグラフに分離することは可能でしょうか。
信号線は三つの要素を含むベクトルでであるため、要素ごとに線を分離したい場合は「demux」ブロックを使うことができます。
信号を分離しなくても、ベクトルをログして要素ごとにグラフ化することはできます。その場合、シミュレーションデータインスペクターを使うのをお勧めします。
Okamoto Sakumi
Okamoto Sakumi on 12 Oct 2020
丁寧なご説明ありがとうございます。
「demux」を用いて信号の分割をすることができました。
別件なのですが、現在走行時の車輪にかかる垂直抗力の分析を行っています。
下図のような障害物のある平板をローバが走行するシチュエーションに関して右前車輪の垂直抗力を測定するために右前車輪と平板をつなぐ「spatial contact force」ブロックのsensing の欄にあるnormal force magnitudeを用いて測定を行いました。
するとグラフのようになり、障害物の付近での垂直抗力は大変大きく出ているのですが、通常走行時の垂直抗力がほぼ0になってしまいます。
僕のイメージですと平板走行時の垂直抗力は0ではなく、ある程度の値があると思っています。また障害物を乗り越えた後に垂直抗力が一瞬大きくなるもののここまで大きくなることは考えにくいです。
車輪やボディなどの重さや重力変えると平板走行時、障害物通過後の垂直抗力は共に大きくなりますが、互いの大きさの比は変わらず、このようなグラフになってしまいます。
障害物が図のように小さいので、ここまで大きさの変化があることを疑問に感じています。
また、速度を変えても結果は同じになります。
垂直抗力を求めるにはブロックが足りない、spatial contact forceブロックでは求められないなど何か思い当たる原因がもしありましたらご連絡いただきたいです。
重ねてのご質問大変申し訳ございません。
返事が遅れまして申し訳ないです。
別種の質問であれば、新規に質問を立て直してください。

Sign in to comment.

Asked:

on 9 Oct 2020

Commented:

on 15 Oct 2020

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!