论ORBSLAM_with_pointcloud_map段错误(核心已转储)的另一种解决方法


一、常见思路:更换EIGEN版本到3.2以下

操作方式一:

删除原有系统的eigen库,安装合适版本
见此文章评论区

操作方式二:

在CMAKELISTS里面更改EIGEN库链接位置
我的文章

二、另一种思路:在CMAKELISTS中取消编译器的一些设置

此方法来自ORBSLAM_with_pointcloud_map讨论区
在CMAKELISTS中删除-march=native

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}  -Wall  -O3 -march=native ")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall   -O3 -march=native")

在Thirdparty/g2o/CMakeLists.txt中删除-march=native

# Compiler specific options for gcc
SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3 -march=native") 
SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -O3 -march=native") 

重新编译包括g2o在内的所有文件

三、我的系统环境

ubuntu18.04
系统中为eigen3.3.4
自行下载的
eigen3.1.4
eigen3.2.10
eigen3版本查看:

pkg-config --modversion eigen3

四、此错误的核心问题讨论

本人不是计算机专业的,没有学过编译原理。从方法二可以看出,这个段错误和编译器编译时的优化操作有关。具体为啥本人实在无能为力。
我自己定位段错误发生的代码位置是
src/pointcloudmapping.cc

void PointCloudMapping::viewer()
{
    pcl::visualization::CloudViewer viewer("viewer");
    while(1)
    {
        {
            unique_lock<mutex> lck_shutdown( shutDownMutex );
            if (shutDownFlag)
            {
                break;
            }
        }
        {
            unique_lock<mutex> lck_keyframeUpdated( keyFrameUpdateMutex );
            keyFrameUpdated.wait( lck_keyframeUpdated );
        }

        // keyframe is updated
        size_t N=0;
        {
            unique_lock<mutex> lck( keyframeMutex );
            N = keyframes.size();
        }

        for ( size_t i=lastKeyframeSize; i<N ; i++ )
        {
            PointCloud::Ptr p = generatePointCloud( keyframes[i], colorImgs[i], depthImgs[i] );
            *globalMap +=*p;
        }
        PointCloud::Ptr tmp(new PointCloud());
        voxel.setInputCloud( globalMap );
        voxel.filter( *tmp );
        globalMap->swap( *tmp );
        viewer.showCloud( globalMap );
        cout << "show global map, size=" << globalMap->points.size() << endl;
        lastKeyframeSize = N;
    }
}

中*globalMap +=*p;
而且是第二次有关键帧时,累加出错。
有大佬来解惑吗?不胜感激。

### YOLO与ORB_SLAM3的集成方式 YOLO_ORB_SLAM3 是一种将 YOLO 物体检测算法与 ORB-SLAM3 集成的方式,旨在增强 SLAM 系统在动态环境中的鲁棒性和准确性。这种结合主要体现在以下几个方面: #### 1. **YOLO的作用** YOLO(You Only Look Once)是一种高效的实时物体检测框架,能够快速识别图像中的目标并标注其位置。在 YOLO_ORB_SLAM3 中,YOLO 被用来检测场景中的动态对象,并将其排除或标记以便后续处理[^2]。 #### 2. **ORB-SLAM3的功能扩展** ORB-SLAM3 是一款先进的视觉里程计和建图系统,支持单目、双目以及 RGB-D 输入模式。然而,在面对动态障碍物时,传统的 ORB-SLAM 可能会受到干扰,导致定位失败或地图质量下降。通过引入 YOLO,可以有效过滤掉动态目标的影响,提升系统的稳定性。 #### 3. **具体实现方法** 为了将 YOLO 与 ORB-SLAM3 结合使用,通常需要完成以下操作: - 修改 ORB-SLAM3 的前端模块,使其能够接收来自 YOLO 的检测结果。 - 对于被 YOLO 标记为动态的目标区域,忽略这些像素点上的特征提取和匹配过程。 - 在回环检测阶段,进一步利用静态部分的地图数据来提高全局一致性。 实际运行过程中,可以通过 ROS 提供的消息传递机制连接两者。例如,在启动节点时分别加载相机驱动程序、YOLO 检测器以及 ORB-SLAM3 主进程[^1]。 --- ### YOLO与ORB_SLAM3的性能对比分析 尽管两者的应用场景有所不同,但从技术角度出发仍可对其特性进行简单比较: | 方面 | YOLO | ORB-SLAM3 | |--------------|-------------------------------|------------------------------| | 功能领域 | 实时物体检测 | 同步定位与建图 | | 数据依赖 | 单帧图片 | 连续视频流 | | 输出形式 | 边界框坐标及类别概率 | 姿态估计、稀疏三维重建 | | 计算复杂度 | 较低 | 较高 | 值得注意的是,当二者联合部署时,不仅保留了各自的优势还弥补了一些局限性。比如,借助深度学习模型的强大表征能力,即使存在遮挡或者光照变化较大的情况也能保持较好的跟踪效果;而反过来讲,SLAM 所构建的空间结构又可以帮助优化目标追踪轨迹预测等问题。 以下是用于测试该组合的一个典型脚本实例: ```bash # 终端一:启动核心服务管理工具 roscore # 终端二:初始化SLAM引擎并指定参数路径 rosrun YOLO_ORB_SLAM3 RGBD \ Vocabulary/ORBvoc.txt Examples/RGB-D/TUM3.yaml # 终端三:播放预录制的数据包作为输入源模拟真实采集流程 rosbag play rgbd_dataset_freiburg3_walking_xyz.bag ``` 上述命令展示了如何配置多窗口协作以验证最终成果的有效性[^3]。 ---
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值