【SLAM】ORB_SLAM3 初步调试运行详细记录
前言
orbslam3 官方源码地址:https://github.com/UZ-SLAMLab/ORB_SLAM3
️ 注意如果是ROS编译请见issue:https://github.com/UZ-SLAMLab/ORB_SLAM3/issues/442 或直接使用fork版本下的 https://gitee.com/kin_zhang/ORB_SLAM3/tree/fix%2Fros_build/
此记录仅为小白式探索记录,主要是用自己的数据集跑一下orbslam3,之前对此并不了解,所以整篇内容会较为小白式,所有的参考解析均在前言部分给出 或途中给出,主要就是运行一下 在自己设备上跑一跑 看看效果 【然后发现emmm IMU是个坑 】
0. 编译部分
在18.04 Docker和 20.04本机 下均进行了尝试,因为Docker内部无法把 Pangolin 显示给映射过来,只能走ros master节点,所以 最后又在本机上进行了尝试
如果是走ROS的话,安装完ROS 基本只需要装一个pangolin进行显示用
安装方法见 ‣,或如下
# Clone Pangolin along with it's submodules
git clone --recursive https://github.com/stevenlovegrove/Pangolin.git
cd Pangolin
# Install dependencies (as described above, or your preferred method)
./scripts/install_prerequisites.sh recommended
# Configure and build
cmake -B build
cmake --build build
# GIVEME THE PYTHON STUFF!!!! (Check the output to verify selected python version)
cmake --build build -t pypangolin_pip_install
然后ubuntu 20.04 需要进行一些修改建议直接clone fork版本:
git clone -b feat/20.04 https://github.com/kin-zhang/ORB_SLAM3.git
cd ORB_SLAM3
chmod +x build.sh
./build.sh
# ---- 记得换PATH哦!!!
export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:PATH/ORB_SLAM3/Examples/ROS
chmod +x build_ros.sh
./build_ros.sh
# ---- examples
export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:/home/kin/workspace/ORB_SLAM3/Examples_old/ROS
chmod +x build_ros.sh
./build_ros.sh
相关修改:
- opencv 版本需要修改一下
- C++ 14的标准进行编译
- sophus需要进行make install 或者是在cmakelist里 include
之后就ok了,可以直接测试提供的数据集 ,或者 阿里盘链接 (好像不可分享 emmm)
然后运行即可 【需要开三个终端】
roscore
rosrun ORB_SLAM3 Stereo_Inertial Vocabulary/ORBvoc.txt Examples_old/Stereo-Inertial/EuRoC.yaml true
rosbag play --pause V1_02_medium.bag /cam0/image_raw:=/camera/left/image_raw /cam1/image_raw:=/camera/right/image_raw /imu0:=/imu
运行示意:
后续部分主要针对 如果想跑自己的数据集的相关记录
1. 相机标定
因为是自己的数据集,所以需要 自己进行标定,其实原repo里有个pdf写的挺好的,以下为单目 不带IMU为例(因为这样简单...)
内参
Examples
下有各个对应相机(单目、单目+IMU、深度、深度+IMU、双目、双目+IMU)一些示例的yaml脚本,我们打开 Examples_old/Monocular/EuRoC.yaml
对于单目来说,只需要标定以下内参即可:
# Camera calibration and distortion parameters (OpenCV)
Camera.fx: 458.654
Camera.fy: 457.296
Camera.cx: 367.215
Camera.cy: 248.375
Camera.k1: -0.28340811
Camera.k2: 0.07395907
Camera.p1: 0.00019359
Camera.p2: 1.76187114e-05
Camera.width: 752
Camera.height: 480
# Camera frames per second
Camera.fps: 20.0
内参为 focal length (fx, fy) 和 central point (cx, cy) ,还有就是distortion model (k1, k2, (k3,k4) p1, p2, (p3,p4))
-
rosrun camera_calibration cameracalibrator.py --size 7x10 --square 0.5 image:=/camera/image_raw --no-service-check
一般情况下会得到这样一组 intrinsic matrix,相关原理及介绍
\]
可以注意到两边矩阵有时候需要转置一下(一般opencv遵循上面公式所对应的)
比如自己的数据集给出的矩阵是这样的,然后读取了bag包知道 fps也是20hz
image_width: 1024
image_height: 768
camera_name: stereo_right_Flir_BFSU3
camera_matrix: !!opencv-matrix
rows: 3
cols: 3
dt: f
data: [ 6.04964966e+02, 0., 5.17844666e+02,
0., 6.04625610e+02, 3.89209320e+02,
0., 0., 1. ]
distortion_model: plumb_bob
distortion_coefficients: !!opencv-matrix
rows: 1
cols: 4
dt: f
data: [ -9.58003029e-02, 8.74120295e-02, 2.08094658e-04, -1.08567670e-04 ]
rectification_matrix: !!opencv-matrix
rows: 3
cols: 3
dt: f
data: [ 9.99987543e-01, 4.83056623e-03, 1.24577642e-03,
-4.83735651e-03, 9.99973118e-01, 5.50653692e-03,
-1.21914328e-03, -5.51249459e-03, 9.99984086e-01 ]
对照起来复制一个 EuRoC.yaml
修改一下 KIN.yaml
:
# Camera calibration and distortion parameters (OpenCV)
Camera.fx: 604.964
Camera.fy: 604.625
Camera.cx: 517.844
Camera.cy: 389.2093
Camera.k1: -0.0958
Camera.k2: 0.08741
Camera.p1: 2.08094658e-04
Camera.p2: -1.08567670e-04
Camera.width: 1024
Camera.height: 768
# Camera frames per second
Camera.fps: 20.0
外参
主要是双目相机/双相机情况下,需要修改外参
比如这里给出了 左右相机 到 IMU的(有时间也可直接标定c1_c2的转换 不通过body)
# 左相机 c1
# extrinsics from the sensor (reference) to bodyimu (target)
quaternion_sensor_bodyimu: !!opencv-matrix
rows: 1
cols: 4
dt: f
data: [0.501677, 0.491365, -0.508060, 0.498754]
translation_sensor_bodyimu: !!opencv-matrix
rows: 1
cols: 3
dt: f
data: [0.066447, -0.019381, -0.077907]
# 右相机 c2
# extrinsics from the sensor (reference) to bodyimu (target)
quaternion_sensor_bodyimu: !!opencv-matrix
rows: 1
cols: 4
dt: f
data: [0.495420, 0.501199, -0.503827, 0.499516]
translation_sensor_bodyimu: !!opencv-matrix
rows: 1
cols: 3
dt: f
data: [-0.093388, -0.017886, -0.078768]
然后我们直接复制到matlab得到T_c1_c2 (从坐标c1到c2)
T_c1_b = trvec2tform([0.066447, -0.019381, -0.077907])*quat2tform([0.501677, 0.491365, -0.508060, 0.498754])
T_c2_b = trvec2tform([-0.093388, -0.017886, -0.078768])*quat2tform([0.495420, 0.501199, -0.503827, 0.499516])
disp(T_c1_b*inv(T_c2_b))
然后得到一个4x4的矩阵 复制到 Stereo 文件夹下替换即可(当然两个内参也需要换一下)
Stereo.ThDepth: 60.0
Stereo.T_c1_c2: !!opencv-matrix
rows: 4
cols: 4
dt: f
data: [1.0071,0.0073,-0.00140,0.0798,
-0.0051,1.0161,0.0164,-0.0002,
-0.0020,-0.0091,1.0019,0.0003,
0,0,0,1.0000]
2. 运行
单目
单目基本只需要改一下相机参数,就可以了 更多的关于orbslam方面相关参数
其中因为自身数据录制的时候 image的type是 sensor_msgs/CompressedImage
需要做一下转换
roscore
rosrun image_transport republish compressed in:=/stereo/frame_right/image_raw raw out:=/camera/image_raw
然后再跑数据包
rosbag play --pause 20220216_MCR_normal.bag /imu:=/stim300/imu/data_raw
然后再跑算法
rosrun ORB_SLAM3 Mono Vocabulary/ORBvoc.txt Examples_old/Monocular/KIN.yaml
运行示例截图:
双目/双相机
双目需要改两个相机的内参,同时给出c1相机到c2的 homogeneous transformation 矩阵。
然后和单目的差不多 只是换一下算法名和republish的topic
roscore
rosrun image_transport republish compressed in:=/stereo/frame_left/image_raw raw out:=/camera/left/image_raw
rosrun image_transport republish compressed in:=/stereo/frame_right/image_raw raw out:=/camera/right/image_raw
然后再跑数据包
rosbag play --pause 20220216_MCR_normal.bag /imu:=/stim300/imu/data_raw
然后再跑算法
rosrun ORB_SLAM3 Stereo Vocabulary/ORBvoc.txt Examples_old/Stereo/KIN.yaml false
运行示例:
带IMU玩
感觉是外参一直搞错了 能跑,但是总是重置 emmm 后面再找找吧 大致探索一下,现在好像知道了 因为自己的数据包一开始录制的时候并不知晓 IMU的初始化需要时间等事宜
roscore
rosrun image_transport republish compressed in:=/stereo/frame_left/image_raw raw out:=/camera/left/image_raw
rosrun image_transport republish compressed in:=/stereo/frame_right/image_raw raw out:=/camera/right/image_raw
然后再跑数据包
rosbag play --pause 20220216_MCR_normal.bag /stim300/imu/data_raw:=/imu
然后再跑算法
rosrun ORB_SLAM3 Stereo_Inertial Vocabulary/ORBvoc.txt Examples_old/Stereo-Inertial/HKUST.yaml false
IMU会重置
if (!mCurrentFrame.mpImuPreintegrated || !mLastFrame.mpImuPreintegrated)
{
cout << "not IMU meas" << endl;
return;
}
可能原因:
- ROS 中坐标系和平常的不太一样
Running ORB-SLAM3 with ZED2 always appears error. · Issue #620 · stereolabs/zed-ros-wrapper
The camera/IMU transform is in the standard ROS frame: X Forward, Y left, Z Top.
但是两个相机之间的就没啥问题 所以应该不是
- 数据包的IMU 初始化时间不够 相关链接附后,需要运动与静止
the imu initialization need motion, you can try to move the imu at first till it print the "end VBA2".
Do you have enough motion in all directions, take a look at using ORBSLAM3 with e.g. EuRoC dataset: MH_01_easy.bag, seems like motion initially is important for the initialization of ORBSLAM3 to work issue
3. 算法参数
# ORB Extractor: Number o
f features per image
ORBextractor.nFeatures: 1000
# ORB Extractor: Scale factor between levels in the scale pyramid
ORBextractor.scaleFactor: 1.2
# ORB Extractor: Number of levels in the scale pyramid
ORBextractor.nLevels: 8
# ORB Extractor: Fast threshold
# Image is divided in a grid. At each cell FAST are extracted imposing a minimum response.
# Firstly we impose iniThFAST. If no corners are detected we impose a lower value minThFAST
# You can lower these values if your images have low contrast
ORBextractor.iniThFAST: 20
ORBextractor.minThFAST: 7
因为都是室内就没咋调,后面再有兴趣可以看看细节,运行起来感觉还不错,如果想得到pose可以直接pub一下pose,就能当个定位用了
赠人点赞 手有余香 ;正向回馈 才能更好开放记录 hhh
【SLAM】ORB_SLAM3 初步调试运行详细记录的更多相关文章
- Visual Studio 2008 调试运行Bug记录
1.VS2008LINK : fatal error LNK1000: Internal error during IncrBuildImage (1). 打开要编译的项目(2). 在项目菜单中打开属 ...
- 【转】vscode调试运行c#详细操作过程
[转]vscode调试运行c#详细操作过程 主要命令: //路径跳转cd //新建项目dotnet new console -o 路径 //运行dotnet run //用于发布exe<Runt ...
- visual studio code 里调试运行 Python代码
最近对微软的visual studio code 挺感兴趣的,微软的跨平台开发工具.轻量简洁. 版本迭代的也挺快的,截止16年8月2日已经1.3.1版本了,功能也愈加完善.(16年12月18日 已经, ...
- Maven 搭建SpringMvc+Spring+Mybatis详细记录
总觉得,看比人写的总是那么好,每次搭建框架时都会找博客,找教程来跟着一步一步走,虽然很快搭建成功了,但是经常情况是我并不知道我干了什么,也不记得具体步骤,到底为什么要这么做,今天我详细记录了一下自己搭 ...
- 1 win10双系统安装ubuntu16.04和18.04(问题详细记录)
我从来不想在琐事上花功夫.就拿装系统来说,我感觉拿过来一个完全陌生的项目源码,看起来,都比装系统爽.我属于典型的逻辑思考男.喜欢畅游程序的海洋. 一直windows跑深度学习和tensorflow,有 ...
- 毕业设计java实验室预约管理系统SSH机房预约系统javaweb机房实验室排课系统mysql机房管理系统 实验室管理系统 课程设计 代码讲解 调试运行
毕业设计java实验室预约管理系统SSH机房预约系统javaweb机房实验室排课系统mysql机房管理系统 实验室管理系统 课程设计 代码讲解 调试运行 注意:该项目只展示部分功能,如需了解,评论区咨 ...
- gdb调试运行时的程序小技巧
使用gdb调试运行时的程序小技巧 标签: 未分类 gdb pstack | 发表时间:2012-10-15 04:32 | 作者:士豪 分享到: 出处:http://rdc.taobao.com/bl ...
- CoCos2dx开发:PC端调试运行正常但打包apk文件后在手机上点击闪退
记:今天调试时出现的一个PC端调试运行正常,但打包apk文件后在手机上点击闪退的问题. 可能在不同的情况条件下,会有不同的原因导致apk安装后闪退问题.拿android studio等软件来说,开发安 ...
- 基于stm32的水质监测系统项目基础部分详细记录
基于stm32的水质监测系统项目基础部分详细记录 软件环境:MDK5 硬件环境:STM32F103ZET6 开发板.颜色传感器.串口屏.串口打印机 搭建工程模板 在进行项目软件的撰写时,首先新建一个基 ...
- 一种历史详细记录表,完整实现:CommonOperateLog 详细记录某用户、某时间、对某表、某主键、某字段的修改(新旧值
一种历史详细记录表,完整实现:CommonOperateLog 详细记录某用户.某时间.对某表.某主键.某字段的修改(新旧值). 特别适用于订单历史记录.重要财务记录.审批流记录 表设计: names ...
随机推荐
- SAP Adobe Form 教程二 表
本文将介绍一些进阶内容,前文:SAP Adobe Form 教程一 简单示例 方法和对比 使用表对象(Table Object)创建表 优点: 它简单易行. 当我们只有很少的字段单行时,我们可以使用它 ...
- Android Studio自强迫升级到4.2版本后调试Native项目时总是卡死问题
原文地址:https://www.zhaimaojun.top/Note/5464968 就在昨天,也就是2021年5月6号,Android Studio强迫用户升级到4.2版本, 原因就是jcent ...
- OpenCompass-书生浦语大模型实战营第二期第7节作业
书生浦语大模型实战营第二期第7节作业 这一节的作业和第6节作业一样没有特别多好说的,以运行结果为主. 基础作业 使用 OpenCompass 评测 internlm2-chat-1_8b 模型在 C- ...
- 显示器AVG、DVI、HDMI、DisplayPort、Type-C、雷电接口
在近十年的发展,显示设备的接口发生了巨大的改变.以前使用比较多的是蓝色VGA接口,接著出现了白色的DVI接口,当遇到不同接口时,还得买转接头进行转接.后来,又有了HDMI等接口,现在则出现DP和USB ...
- ansible(9)--ansible的yum模块
1. yum模块 功能:管理软件包,需要确认被管理端为红帽系列的,并且需要被管理端配置好yum源. 主要的参数如下: 参数 说明 name 指定安装软件包名或软件包URL state 指定yum对应的 ...
- csapp-attacklab(完美解决版)
注意:必须阅读Writeup,否则根本看不懂这个lab要怎么做 实验前准备 1.在终端中输入./ctarget和./rtarget结果报错 百度后得知自学的同学需要在执行文件时加上-q参数,不发送结果 ...
- JavaScript算法---基础排序类
<html> <script> //正序排序,把大的放到最后,arr[j]>arr[j+1] let fz=(arr)=>{ for(let len=arr.len ...
- AnaTraf 网络万用表流量分析教程系列 | AnaTraf 网络万用表 B 站频道
为了更好的向大家分享如何使用 AnaTraf 网络万用表进行网络流量分析.网络故障排除,AnaTraf 开通了 B 站频道. 在 B 站上,将以视频的形式向大家介绍如何使用 AnaTraf 网络万用表 ...
- Linux环境下:程序的链接, 装载和库[可执行文件的装载]
现代操作系统如何装载可执行文件? 给进程分配独立的虚拟地址空间 建立虚拟地址空间和可执行文件的映射关系 把CPU指令寄存器设置成可执行文件的入口地址,启动执行 可执行文件在装载的过程中实际上是映射的虚 ...
- Review社区PR的方式
有时候review社区改动较大的PR时,在github上看不太方便,需要把相应的pr,apply到本地,记录下常用的方式 # 添加pr仓库 git remote add ${upstream_name ...