我想解决以下问题: 点Pw在世界坐标系中。 C0坐标系和Co坐标中的Pw为Pc0。现在,我将C0坐标系转换为C1坐标系,问:如何将Pw转换为Pc0 = Pc1。 image显示了如何计算变换T。
不幸的是,下面用来确认结果的代码为Pc0!= Pc1。我不知道计算出了什么问题。你能提供一些建议吗?非常感谢。
int main() {
//Pw
Eigen::Vector3d Pw ( 1,0,0 );
//Tc0w
Eigen::AngleAxisd rotation_vector_c0w ( M_PI/2, Eigen::Vector3d ( 1,0,0 ) );
Eigen::Matrix3d Rc0w = rotation_vector_c0w.toRotationMatrix();
Eigen::Vector3d tc0w (1,2,3);
Eigen::Isometry3d Tc0w=Eigen::Isometry3d::Identity();
Tc0w.rotate ( rotation_vector_c0w );
Tc0w.pretranslate ( tc0w );
std::cout << "Transform matrix Tc0w= \n" << Tc0w.matrix() <<std::endl;
//Pc0
Eigen::Vector3d Pc0 = Tc0w*Pw;
std::cout<<"Pc0:"<<std::endl<<Pc0<<std::endl;
//Tc1c0
Eigen::AngleAxisd rotation_vector_c1c0 ( M_PI/4, Eigen::Vector3d ( 1,1,0 ) );
Eigen::Vector3d tc1c0 (1,2,3);
Eigen::Isometry3d Tc1c0=Eigen::Isometry3d::Identity();
Tc1c0.rotate ( rotation_vector_c1c0 );
Tc1c0.pretranslate ( tc1c0 );
std::cout << "Transform matrix Tc1c0= \n" << Tc1c0.matrix() <<std::endl;
std::cout << "Transform matrix Tc0c1= \n" << Tc1c0.inverse().matrix() <<std::endl;
//compute T
Eigen::Isometry3d T = Tc0w.inverse()* Tc1c0.inverse()*Tc0w;
std::cout << "Transform matrix T= \n" << T.matrix() <<std::endl;
//confirm Pc1
Eigen::Vector3d Pc1 = Tc1c0*Tc0w*T*Pw;
std::cout<<"Pc1 = "<<std::endl<<Pc1<<std::endl;
std::cout << "Hello, World!" << std::endl;
return 0;
}
答案 0 :(得分:1)
AngleAxis
需要归一化的旋转轴。试试这个:
Eigen::AngleAxisd rotation_vector_c1c0 ( M_PI/4, Eigen::Vector3d ( 1,1,0 ).normalized() );
相应的文档链接: http://eigen.tuxfamily.org/dox/classEigen_1_1AngleAxis.html#ab58bae23f0af86d66d8aa1dc5c1dbe39