欧拉到四元数转换PCL +本征

时间:2015-11-26 09:34:25

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

我正在使用点云库并尝试将两个点云匹配在一起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));

谢谢:)

1 个答案:

答案 0 :(得分:2)

我发现代码存在问题。我在官方文档中找不到的是 Eigen :: AngleAxisd 将输入视为弧度而不是度< / strong>,所以一旦你将数据从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;
}

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