mysql录入foreigen错误_eigen库四元数转化错误

使用eigen库将四元数转换为旋转矩阵时,发现有一个地方的转换是错误的,而且有时出错有时没错,代码如下

double x0 = 7203.5308;

double y0 = 2389.2666;

double z0 = 2505.2303;

double a0 = 0.71953;

double b0 = -0.0154782;

double c0 = 0.0109039;

double d0 = 0.00181833;

Quaterniond r0(-a0,b0,c0,d0);

Vector3d p0(x0,y0,z0);

Isometry3d t0 = Isometry3d::Identity();

Eigen::Matrix3d R;

R = Matrix3d(r0);

t0.rotate(r0);

t0.pretranslate(p0);

对应的结果为

使用matlab做验证,代码如下

p0 = [7203.53082389.26662505.2303]';

r0 = [0.71953-0.01547820.01090390.00181833];

R0 = quat2dcm(r0)

T0 = [R0 p0];

T0 = [T0; [0 0 0 1]]

结果如下

R0 =

0.9995 0.0044 -0.0304

-0.0057 0.9991 -0.0429

0.0302 0.0431 0.9986

可以发现,二者结果并不相等,eigen求出的结果中,非对角元素约为matlab结果中对应元素的一半,且eigen求出的结果并不归一。

问题在于:输入的四元数没有归一化,在matlab中,可能将四元数的虚数部分自动进行了归一化处理,但是eigen库没有进行,直接进行了相关求解,使得结果不一致。

解决方案:在使用四元数前,先校核四元数的正确性

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Eigen是一个C++的线性代数,它提供了对四元数的支持。在Eigen中,四元数是以Quaternion类的形式表示的。下面是使用Eigen进行四元数操作的示例代码: ```c++ #include <Eigen/Dense> #include <iostream> using namespace Eigen; int main() { // 创建一个四元数对象 Quaterniond q(1, 0, 0, 0); // w, x, y, z // 输出四元数对象的实部和虚部 std::cout << "Real part: " << q.w() << std::endl; std::cout << "Imaginary part: " << q.vec().transpose() << std::endl; // 旋转一个向量 Vector3d v(1, 0, 0); Vector3d v_rotated = q * v * q.inverse(); std::cout << "Rotated vector: " << v_rotated.transpose() << std::endl; // 将旋转轴和旋转角度转换为四元数 Vector3d axis(0, 0, 1); double angle = M_PI / 2; Quaterniond q_axis_angle(cos(angle / 2), sin(angle / 2) * axis.x(), sin(angle / 2) * axis.y(), sin(angle / 2) * axis.z()); // 两个四元数的乘积等于它们对应的旋转的复合 Quaterniond q_combined = q * q_axis_angle; std::cout << "Combined quaternion: " << q_combined.w() << " " << q_combined.vec().transpose() << std::endl; // 将四元数转换为旋转矩阵 Matrix3d R = q.toRotationMatrix(); std::cout << "Rotation matrix: " << std::endl << R << std::endl; return 0; } ``` 这个示例代码中,我们创建了一个四元数对象q,并输出了它的实部和虚部。然后我们将一个向量v绕q旋转,并输出旋转后的向量。接着我们将一个旋转轴和一个旋转角度转换为一个四元数对象q_axis_angle,并将两个四元数的乘积q_combined输出。最后,我们将四元数对象q转换为一个旋转矩阵R,并输出这个矩阵。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值