基于Eigen库:求满足a*c=b的旋转矩阵c
解决方法
首先纠正你代码里的一个错误:定义矩阵b时,你误写为对a赋值,正确代码应该是:
Eigen::Matrix3d b; b = Eigen::AngleAxisd(0.25*M_PI, Eigen::Vector3d::UnitX()) * Eigen::AngleAxisd(0.0, Eigen::Vector3d::UnitY()) * Eigen::AngleAxisd(0.25*M_PI, Eigen::Vector3d::UnitZ());
方法一:直接用矩阵运算(推荐)
因为旋转矩阵是正交矩阵,其逆矩阵等于自身的转置,所以从公式a*c = b可以直接推导出:c = a.inverse() * b
等价于更高效的写法(利用正交矩阵性质):c = a.transpose() * b
直接实现的代码如下:
Eigen::Matrix3d c = a.transpose() * b;
得到的c自然是满足条件的旋转矩阵,因为旋转矩阵的乘积仍然是旋转矩阵。
方法二:基于角轴形式计算(仅作原理参考)
如果你一定要通过角轴推导c,步骤如下:
- 求矩阵
a的逆对应的角轴:由于a是旋转矩阵,其逆等于转置,先计算a_inv = a.transpose(),再转成角轴Eigen::AngleAxisd angleAxisAInv(a_inv)。 - 角轴的乘法顺序与矩阵乘法一致,所以
c的角轴可通过angleAxisAInv * angleAxisB得到。 - 将得到的角轴转换为矩阵形式。
代码示例:
Eigen::AngleAxisd angleAxisAInv(a.transpose()); Eigen::AngleAxisd angleAxisC = angleAxisAInv * angleAxisB; Eigen::Matrix3d c = angleAxisC.toRotationMatrix();
这种方法本质和直接矩阵运算一致,但多了类型转换步骤,效率更低,因此更推荐第一种方法。
内容的提问来源于stack exchange,提问作者user22132012
相关产品推荐
相关产品推荐

