如果点云关键位姿是空的,则返回真。

将上一帧位姿转为仿射变换。

将当前帧的位姿转为仿射变换。

计算位姿变换增量。

获取上一帧相对于当前帧的位姿中的旋转和平移量。

如果旋转和平移量都较小且当前帧到上一帧的距离小于一定阈值,则当前帧不设为关键帧,返回假,否则返回真。

bool saveFrame()

    if (cloudKeyPoses3D->points.empty())
        return true;

    // 前一帧位姿
    Eigen::Affine3f transStart = pclPointToAffine3f(cloudKeyPoses6D->back());
    // 当前帧位姿
    Eigen::Affine3f transFinal = trans2Affine3f(transformTobeMapped);
    // Eigen::Affine3f transFinal = pcl::getTransformation(transformTobeMapped[3], transformTobeMapped[4], transformTobeMapped[5],
    //                                                     transformTobeMapped[0], transformTobeMapped[1], transformTobeMapped[2]);

    // 位姿变换增量
    Eigen::Affine3f transBetween = transStart.inverse() * transFinal;
    float x, y, z, roll, pitch, yaw;
    pcl::getTranslationAndEulerAngles(transBetween, x, y, z, roll, pitch, yaw); //  获取上一帧 相对 当前帧的 位姿

    // 旋转和平移量都较小,当前帧不设为关键帧
    if (abs(roll) < surroundingkeyframeAddingAngleThreshold &&
        abs(pitch) < surroundingkeyframeAddingAngleThreshold &&
        abs(yaw) < surroundingkeyframeAddingAngleThreshold &&
        sqrt(x * x + y * y + z * z) < surroundingkeyframeAddingDistThreshold)
        return false;
    return true;
}```
C++ 代码生成伪代码:关键帧判断逻辑

原文地址: https://www.cveoy.top/t/topic/oIvz 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录