【问题标题】:Euler to quaternion conversion PCL + Eigen欧拉到四元数的转换 PCL + Eigen
【发布时间】:2015-11-26 09:34:25
【问题描述】:

我正在使用点云库并尝试将两个点云匹配在一起 ICP(迭代最近点)算法。我收到的数据集带有来自 IMU 传感器的 X Y Z 方向值。

我将这些附加到点云对象的 sensor_orientation_ 属性以帮助匹配过程。查看 PCL 文档,它被指定为:传感器采集姿势(云数据坐标系中的旋转)。 注意:数据以(w, x, y, z)格式存储。

那么,从IMU数据转换我正在使用下面的这个函数,我想问它是否正确?

Eigen::Quaterniond euler2Quaternion(const double roll, const double pitch, const double yaw)
{
    Eigen::AngleAxisd rollAngle(roll, Eigen::Vector3d::UnitZ());
    Eigen::AngleAxisd yawAngle(yaw, Eigen::Vector3d::UnitY());
    Eigen::AngleAxisd pitchAngle(pitch, Eigen::Vector3d::UnitX());

    Eigen::Quaterniond q = rollAngle * yawAngle * pitchAngle;

    return q;
}

然后方法被调用:

inCloud->sensor_orientation_ = Eigen::Quaternionf(euler2Quaternion(orientX, orientY, orientZ));

【问题讨论】:

  • 顺便说一句,你为什么这样做,我的意思是:roll UnitZ() , yaw UnitY() & pitch UnitX()?不应该是roll UnitX(), pitch UnitY(), & yaw UnitZ()吗?在我的应用程序中,我有旋转 w.r.t. x、y 和 z 轴并在addCubepcl::visualization::PCLVisualizer 方法中使用这些角度,我必须将它们转换为四元数。所以,如果我像你一样关联我的旋转,那么我不会得到正确的结果!

标签: c++ math rotation eigen point-cloud-library


【解决方案1】:

嗯,我发现了代码的问题。我在官方文档中找不到的是 Eigen::AngleAxisd 将输入作为 radians 而不是 degrees >,所以一旦你将数据从 IMU 传感器转换为弧度,一切似乎都很好:)

函数现在看起来像这样:

Eigen::Quaterniond euler2Quaternion(const double roll, const double pitch, const double yaw)
{
        Eigen::AngleAxisd rollAngle((roll*M_PI) / 180, Eigen::Vector3d::UnitZ());
        Eigen::AngleAxisd yawAngle((yaw*M_PI) / 180, Eigen::Vector3d::UnitY());
        Eigen::AngleAxisd pitchAngle((pitch*M_PI) / 180, Eigen::Vector3d::UnitX());

        Eigen::Quaterniond q = rollAngle * yawAngle * pitchAngle;
        return q;
}

显然,俯仰、偏航和滚动的使用顺序取决于用途,但在我的情况下,这很有效:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-28
    • 2012-06-21
    • 1970-01-01
    • 1970-01-01
    • 2019-10-27
    • 1970-01-01
    • 2013-06-07
    相关资源
    最近更新 更多