Robotics System Toolbox で得た同次変換行列を​、rigid3dオブ​ジェクトに変換するに​はどうすればよいです​か?

7 views (last 30 days)
Robotics System Toolboxの getTransform 関数から取得した同次変換行列を使用して、pctransform 関数を実行し、ロボットアームの手先の座標系で表現された点群座標をベースフレームでの座標に変換しようとしました。(R2022aを使用。)
以下のように同次変換行列をrigid3dオブジェクトに変換し、 pctransform 関数に入力しましたが、変換後の座標が期待した通りになりません。
transform = getTransform( robot, confg, 'sourcebody', 'targetbody');
rot=tform2rotm(transform);
trvec=tform2trvec(transform);
tform=rigid3d(rot,trvec);
pcOut=pctransform(pcIn,tform);

Accepted Answer

MathWorks Support Team
MathWorks Support Team on 27 May 2022
Edited: MathWorks Support Team on 27 May 2022
コードの4行目で、回転行列 'rot' を次のように転置することで期待した結果が得られます。
>>tform=rigid3d(rot', trvec);
転置が必要になる理由は、getTransform 関数と rigid3d オブジェクトが同次変換行列を異なる方法で実装しているためです。
getTransform (および多くの工学分野)では、同次座標は列ベクトル形式([x; y; z; 1])で表されており、同次変換行列 G は G = [Rot Tran(3x1); 0 0 0 1] と定義され、q = G*p (から乗算) として使用されます。
一方、 rigid3dでは
行ベクトル
形式の座標([x y z 1])および変換行列T = [Rot [0;0;0]; Tran(1x3) 1] が用いられ、使用時は s = r*T (
から乗算)で変換を計算します。
直観的には、後者の方程式全体を転置すると前者と同じ形式(s' = T' * r')であることから、T'が前者の形式で得られた変換行列Gと一致していればよいことが分かります。
Gから抽出した回転成分を転置して「rigid3d」オブジェクトを作成することで、T' = [Rot' [0;0;0];Tran(1x3) 1]' = [Rot Tran(3x1); 0 0 0 1]となり、Gに一致します。

More Answers (0)

Products


Release

R2020b

Community Treasure Hunt

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

Start Hunting!