首页 > 编程知识 正文

矩阵坐标变换公式,opencv mat 转 eigen

时间:2023-05-06 18:21:35 阅读:136902 作者:1334

(《视觉SLAM十四讲》第三次演习问题7 )萝卜1号和2号设置在世界坐标系中。 1号姿势Q1=[ 0.35,0.2,0.3,0.1 ],t1=[ 0.3,0.1,0.1 ]。 2号姿势Q2=[-0.5,0.4,- 0.1,0.2 ],T2=[-0.1,0.5,0.3 ] .某点在1号坐标系中的坐标为p=[ 0.5,0,0.2 ] . 求出p在2号坐标系中的坐标

设世界坐标系中p点的坐标为p。

四元数用于旋转时如下所示。 在Eigen中四元数旋转为qv,在数学中为qvq^-1 )。

q1 P t1=p1

q2 P t2=p2

分别由上2式计算出:

p=Q1^-1(P1-T1 ) ) ) ) ) )。

p=Q2^-1(P2-T2 ) ) )

解除二式联立后如下。

P2=Q2Q1^-1(P1-T1 ) t2

使用欧拉矩阵(设第1个欧拉矩阵为T1,第2个欧拉矩阵为T2 ),如下所示。

p1=T1 P

p2=T2 P

求p :

P=T1^-1 p1

P=T2^-1 p2

解除联合的话如下。

p2=T2 T1^-1 p1

以下是用Eigen实现的代码。

#包含

using namespace std;

#包含

#包含

int main () )

{

//四元数

eigen :3360 quaternion dq1=eigen :3360 quaternion d (0.35,0.2,0.3,0.1 ).normalized );

eigen :3360 quaternion dq2=eigen : quaternion d (-0.5,0.4,- 0.1,0.2 ).normalized );

//平移向量

eigen :3360 vector 3d t1=eigen :3360 vector 3d (0.3、0.1、0.1 );

eigen :3360 vector 3d T2=eigen :3360 vector 3d (-0.1、0.5、0.3 );

//目标矢量

eigen :3360 vector 3d P1=eigen :3360 vector 3d (0.5,0,0.2 );

Eigen:Vector3d p2;

//打印输出

//cout q1.coeffs () () ) (n )。

//q2.coeffs () ) (n ) )。

//t1.transpose (() ) (n ) )。

//t2.transpose () endl;

//四元数解决

p2=q2 * q1.inverse () * ) P1-T1 ) t2;

cout p2.transpose () endl;

//欧拉矩阵

eigen :3360 isometry 3d t1=eigen : isometry 3d 33603360 identity (;

eigen :3360 isometry 3d T2=eigen : isometry 3d 33603360 identity (;

T1.rotate(Q1.torotationmatrix ) );

t1 .预转换(t1;

T2 .旋转(Q2.torotationmatrix ) );

T2 .预转换(T2;

//cout T1.matrix () endl;

//cout T2.matrix () endl;

//用欧拉矩阵求解

p2=T2 * T1.inverse () * p1;

cout p2.transpose () endl;

}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。