关于关于高博3d2d程序报错的改动

想直接改动,在《还是g2o初始化一些》那篇,这篇比较啰嗦,主要是记录自己思考的步骤。
首先说明主题:没文化真可怕
好了,说干货。之前高博的代码。只要涉及g2o的部分,一律跑不通,没重装之前,只是报一个段错误,就没了。也排查不出来问题。
今日2017年9月24日重装系统,重新搭建环境,除了opencv外,其他一律重新下载安装的。g2o从github下载安装的。

先贴一下g2o初始化的代码:

// 初始化g2o
    typedef g2o::BlockSolver< g2o::BlockSolverTraits<6,3> > Block;  // pose 维度为 6, landmark 维度为 3

    Block::LinearSolverType* linearSolver = new g2o::LinearSolverCSparse<Block::PoseMatrixType>(); // 线性方程求解器
    //std::unique_ptr<Block::LinearSolverType> linearSolver ( new g2o::LinearSolverCSparse<Block::PoseMatrixType>());

    Block* solver_ptr = new Block ( linearSolver );
    //std::unique_ptr<Block> solver_ptr ( new Block ( std::move(linearSolver)));     // 矩阵块求解器

    g2o::OptimizationAlgorithmLevenberg* solver = new g2o::OptimizationAlgorithmLevenberg ( solver_ptr);
    //g2o::OptimizationAlgorithmLevenberg* solver = new g2o::OptimizationAlgorithmLevenberg ( std::move(solver_ptr));

    g2o::SparseOptimizer optimizer;

    optimizer.setAlgorithm ( solver );

安装好之后,运行第七章的3d2d程序,还是跑不通:
报错:

/home/robin/CLionProjects/slambook-robin/ch7/pose_estimation_3d2d/main.cpp:217:50: error: no matching function for call to ‘g2o::BlockSolver<g2o::BlockSolverTraits<6, 3> >::BlockSolver(g2o::BlockSolver<g2o::BlockSolverTraits<6, 3> >::LinearSolverType*&)’
     Block* solver_ptr = new Block ( linearSolver );

点开位置发现是g2o初始化中的Block构造的时候报错:

Block* solver_ptr = new Block ( linearSolver );

继续点下面的错误信息:

In file included from /usr/local/include/g2o/core/block_solver.h:199:0,
                 from /home/robin/CLionProjects/slambook-robin/ch7/pose_estimation_3d2d/main.cpp:11:
/u
<think>好的,我需要帮助用户解决《自动驾驶与机器人中的SLAM技术》一书的编译问题。首先,用户提到的错误信息是关于XnSensorDepthGenerator抽象类的实例化失败。根据引用[2],错误出现在/usr/include/ni/XnOS.h的第327行,使用了XN_NEW宏尝试创建抽象类的实例。抽象类不能被直接实例化,必须通过具体子类实现。 接下来,我需要考虑可能的解决方案。用户可能在编译过程中依赖了OpenNI或其他传感器库,而这些库的版本或配置有问题。首先建议用户检查代码中是否确实需要实例化XnSensorDepthGenerator,或者是否存在误用的情况。如果是第三方库的问题,可能需要更新库或查找补丁。 另外,用户提到的引用[1]中提到了使用临时变量或noalias()函数来处理矩阵运算,这可能与SLAM中的数学运算有关,但当前错误更可能是与传感器库的抽象类相关。因此,需要将注意力集中在解决抽象类实例化的问题上。 可能的步骤包括:确认依赖库的版本是否正确,检查是否有缺失的库实现,查看编译日志中是否有其他相关错误,尝试使用不同的OpenNI版本或寻找社区解决方案。此外,用户可能需要联系书籍作者或查阅相关论坛获取特定于该书的编译指南。 最后,生成相关问题需要考虑用户可能遇到的类似编译问题、依赖管理、以及SLAM技术中的其他常见挑战。</think>### 编译问题解决方案 针对《自动驾驶与机器人中的SLAM技术》编译问题,结合错误信息分析如下: **错误原因分析** 错误`cannot allocate an object of abstract type 'XnSensorDepthGenerator'`表明代码尝试实例化一个抽象类[^2]。抽象类需通过具体子类实现,常见原因包括: 1. 依赖库版本不兼容(如OpenNI) 2. 代码调用了未实现的纯虚函数 3. 第三方库头文件与实现不匹配 **解决步骤** 1. **检查依赖版本** 确认使用的OpenNI版本与书中要求一致。可通过以下命令查看版本: ```bash pkg-config --modversion openni ``` 2. **补充实现文件** 若书中示例代码直接实例化抽象类,需替换为具体子类实现: ```cpp // 错误示例 XnSensorDepthGenerator* pGen = new XnSensorDepthGenerator(); // 修正示例(需根据库文档选择具体子类) Context context; DepthGenerator depthGen; context.CreateAnyProductionTree(XN_NODE_TYPE_DEPTH, NULL, depthGen); ``` 3. **添加缺失依赖** 安装必要的开发包: ```bash sudo apt-get install libopenni-dev libopenni-sensor-primesense-dev ``` 4. **启用编译优化标志** 在CMakeLists.txt中添加C++11支持: ```cmake set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2 -march=native") ``` **SLAM编译通用建议** - 使用隔离编译环境(如Docker容器) - 优先选择作者提供的Docker镜像或虚拟机镜像 - 对Eigen等数学库的矩阵运算,遵循引用[1]的noalias优化建议: ```cpp c.noalias() += a * b; // 避免中间变量拷贝 ```
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值