Robotics System Toolbox で得た同次変換行列を、rigid3dオブジェクトに変換するにはどうすればよいですか?
7 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
MathWorks Support Team
el 28 de Abr. de 2022
Editada: MathWorks Support Team
el 27 de Mayo de 2022
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);
Respuesta aceptada
MathWorks Support Team
el 27 de Mayo de 2022
Editada: MathWorks Support Team
el 27 de Mayo de 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に一致します。
0 comentarios
Más respuestas (0)
Ver también
Categorías
Más información sobre LIDAR および点群の処理 en Help Center y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!