ORB-SLAM3 v1.0 编译问题解决(搬运自github issue)

以下解决方案搬运自oscar1780,github issue #442

系统环境 ubuntu 18.04 , melodic, opencv4.0(本地编译 仅make 未make install,考虑兼容性问题未安装)
解决办法:
1、编译ros版本,需要将Examples_old文件夹下ROS文件夹复制到Examples文件夹下。将CMakeLists中用到OpenCV4的地方,连接到你的库位置。
2、将路径添加至~/.bashrc,这部分参考官方文档,运行./build.sh ./build_ros.sh
3、提示找不到sophus库,修改CMAKELISTS, include_directories中添加 ${PROJECT_SOURCE_DIR}/…/…/…/Thirdparty/Sophus
4、Sophus::SE3f, cv::MAT,Eigen::Vector3f类型转换报错,应该是不能直接转换,不过可以换个办法,
【2022.01.11】补充:以下解决方法会引入cv中的eigen2cv方法,需要在每个修改文件的顶部包含以下文件头文件: 参考这里

#include <Eigen/Dense>
#include <opencv2/core/eigen.hpp>
  • 解决 cv::Mat Tcw = mpSLAM->TrackMonocular(cv_ptr->image,cv_ptr->header.stamp.toSec()); 报错
    引入上述两个头文件,然后删除ROS/ORB_SLAM3/src/AR/ros_mono_ar.cc151行,由下面内容替换
cv::Mat Tcw;
Sophus::SE3f Tcw_SE3f = mpSLAM->TrackMonocular(cv_ptr->image,cv_ptr->header.stamp.toSec());
Eigen::Matrix4f Tcw_Matrix = Tcw_SE3f.matrix();
cv::eigen2cv(Tcw_Matrix, Tcw);
  • 解决 vPoints.push_back(pMP->GetWorldPos()); 报错
    引入上述两个头文件,然后删除ROS/ORB_SLAM3/src/AR/ViewerAR.cc409行,由以下内容替换
cv::Mat WorldPos;
cv::eigen2cv(pMP->GetWorldPos(), WorldPos);
vPoints.push_back(WorldPos);
  • 解决 cv::Mat Xw = pMP->GetWorldPos();报错
    引入上述两个头文件,然后删除ROS/ORB_SLAM3/src/AR/ViewerAR.cc530行,由以下内容替换
cv::Mat Xw;
cv::eigen2cv(pMP->GetWorldPos(), Xw);

再编译,没有其他问题的话正常编译通过。
5、回到 workspace目录下面 ,source下环境,rosrun ORB_SLAM3 Stereo_Inertial ./src/ORB_SLAM3/Vocabulary/ORBvoc.txt ./src/ORB_SLAM3/Examples_old/Stereo-Inertial/EuRoC.yaml true,就可以正常运行,新版本的yaml文件不知道为啥运行会报错,暂时未研究。

2022.01.11补充

编译好ORB-SLAM3(v1.0)之后一运行就直接报段错误(核心已存储),最后搞明白是Pangolin的版本太低,应该用0.6的版本,我之前用的0.5,困扰了我两天,在这里补充下。
在这里插入图片描述

### 如何将 Sophus::SE3f 转换为 OpenCV 的 cv::Mat 类型 在 C++ 中实现从 `Sophus::SE3f` 到 `cv::Mat` 的转换,可以通过以下方法完成。以下是详细的解释以及代码示例。 #### 方法概述 1. 使用 Sophus 库中的 `.matrix()` 函数获取 `Sophus::SE3f` 对象对应的齐次变换矩阵(`Eigen::Matrix4f` 类型)[^1]。 2. 借助 OpenCV 提供的工具函数 `cv::eigen2cv` 将 `Eigen::Matrix4f` 转换为 `cv::Mat` 类型[^2]。 #### 实现代码 下面是一个完整的代码片段,展示如何执行上述操作: ```cpp #include <Eigen/Core> #include <Eigen/Dense> #include <opencv2/opencv.hpp> #include <opencv2/core/eigen.hpp> // 定义变量并初始化 Sophus::SE3f Sophus::SE3f Tcw_SE3f = mpSLAM->TrackMonocular(cv_ptr->image, cv_ptr->header.stamp.toSec()); // 获取 Sophus::SE3f 对应的 4x4 齐次变换矩阵 Eigen::Matrix4f Tcw_Matrix = Tcw_SE3f.matrix(); // 将 Eigen::Matrix4f 转换为 cv::Mat cv::Mat Tcw; cv::eigen2cv(Tcw_Matrix, Tcw); ``` #### 关键点解析 - **`.matrix()` 函数的作用** `Sophus::SE3f` 是一种表示三维空间刚体运动的方式,其内部存储旋转和平移信息。调用 `.matrix()` 可以返回一个 `Eigen::Matrix4f` 类型的对象,该对象包含了完整的齐次变换矩阵。 - **`cv::eigen2cv` 工具函数** 这是 OpenCV 提供的一个便捷函数,用于将 Eigen 矩阵类型转换为 OpenCV 的矩阵类型 `cv::Mat`。此函数支持多种数据类型的自动匹配和转换。 - **头文件依赖** 上述代码需要引入必要的头文件 `<Eigen/Core>`、`<Eigen/Dense>` 和 `<opencv2/core/eigen.hpp>` 来支持 Eigen 和 OpenCV 的交互功能。 #### 错误排查建议 如果遇到转换失败的情况,请检查以下几点: 1. 是否正确安装了 Sophus、Eigen 和 OpenCV 库,并配置好编译环境。 2. 确认 `mpSLAM->TrackMonocular(...)` 返回的结果是否有效。 3. 如果目标平台不支持浮点数精度计算,则可能需要调整为双精度版本(即使用 `Sophus::SE3d` 替代 `Sophus::SE3f`),并相应修改其他部分的数据类型。 --- ###
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值