C++ 代码生成伪代码:关键帧判断逻辑
如果点云关键位姿是空的,则返回真。
将上一帧位姿转为仿射变换。
将当前帧的位姿转为仿射变换。
计算位姿变换增量。
获取上一帧相对于当前帧的位姿中的旋转和平移量。
如果旋转和平移量都较小且当前帧到上一帧的距离小于一定阈值,则当前帧不设为关键帧,返回假,否则返回真。
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;
}```
原文地址: https://www.cveoy.top/t/topic/oIvz 著作权归作者所有。请勿转载和采集!