问题描述
我正在研究如何在android上运行ORB_SLAM2。
目前,我可以通过ORB_SLAM2扫描地图并将其保存在Android版本上。
我也确定可以将地图重新加载到Android版本的ORB_SLAM2。
但是我使用PC版本重新加载由Android设备保存的地图,它会崩溃,反之亦然。
其错误日志与boost / save_object_data有关。
RaiseException
CxxThrowException
cv::error
cv::error
cv::Mat::setDefaultAllocator
cv::Mat::create
RegisterDebugCallback
boost::archive::detail::oserializer<boost::archive::binary_oarchive,std::map<ORB_SLAM2::KeyFrame * __ptr64,unsigned __int64,std::less<ORB_SLAM2::KeyFrame * __ptr64>,std::allocator<std::pair<ORB_SLAM2::KeyFrame * __ptr64 const,unsigned __int64> > > >::save_object_data
boost::archive::detail::oserializer<boost::archive::binary_oarchive,std::set<ORB_SLAM2::MapPoint * __ptr64,std::less<ORB_SLAM2::MapPoint * __ptr64>,std::allocator<ORB_SLAM2::MapPoint * __ptr64> > >::save_object_data
boost::archive::detail::oserializer<boost::archive::binary_oarchive,std::vector<std::list<ORB_SLAM2::KeyFrame * __ptr64,std::allocator<ORB_SLAM2::KeyFrame * __ptr64> >,std::allocator<std::list<ORB_SLAM2::KeyFrame * __ptr64,std::allocator<ORB_SLAM2::KeyFrame * __ptr64> > > > >::save_object_data
boost::archive::detail::oserializer<boost::archive::binary_oarchive,unsigned __int64> > > >::save_object_data
boost::serialization::singleton_module::get_lock
InitSlamObject
有人知道如何解决这个问题。 谢谢!!!
解决方法
默认二进制归档文件不可移植。在不同的体系结构或编译器配置上读取它们会导致未定义的行为
例如参见boost binary_oarchive works differently for different compilers用于便携式替代品
除此之外,版本控制可能是一个问题。可以实现版本控制(类版本控制和Boost库版本控制),但是如果支持不正确,则可能会失败。
此外,检查序列化代码是否正确。值得注意的是,错误似乎源自setDefaultAllocator
,它是静态的:
static void cv::Mat::setDefaultAllocator ( MatAllocator * allocator )
每次都调用它似乎很奇怪,尤其是在 save 操作中。