Robotics System Toolbox で得た同次変換行列を、rigid3dオブジェクトに変換するにはどうすればよいですか?
7 ビュー (過去 30 日間)
古いコメントを表示
MathWorks Support Team
2022 年 4 月 28 日
編集済み: MathWorks Support Team
2022 年 5 月 27 日
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);
採用された回答
MathWorks Support Team
2022 年 5 月 27 日
編集済み: MathWorks Support Team
2022 年 5 月 27 日
コードの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に一致します。
0 件のコメント
その他の回答 (0 件)
参考
カテゴリ
Help Center および File Exchange で LIDAR および点群の処理 についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!