问题描述:
Ubuntu14.04运行正常。Ubuntu 16.04下运行时,检测到闭环后有时会段错误,定位发现断错误出现在CorrectLoop()的红色代码处:
void LoopClosing::CorrectLoop()
{
...
KeyFrameAndPose CorrectedSim3, NonCorrectedSim3;
CorrectedSim3[mpCurrentKF]=mg2oScw;
cv::Mat Twc = mpCurrentKF->GetPoseInverse();
...
}
问题原因:
在CorrectLoop()中使用了一个叫KeyFrameAndPose的数据类型,这个数据结构中会创建Eigen对象,根据Eigen文档,调用Eigen对象的数据结构需要使用Eigen的字节对齐,在LoopCloing中加入字节对齐后问题消失。至于为什么没对齐会报错,我也不知道...
解决方法:
include/LoopClosing.h,加入红色部分(使用Eigen中的方式进行字节对齐):
class LoopClosing
{
public:
EIGEN_MAKE_ALIGNED_OPERATOR_NEW
typedef pair<set<KeyFrame*>,int> ConsistentGroup;
...
};