CubeSLAM学习

2023-05-16

Cube SLAM

此代码包含两种模式:

  1. 与ORB SLAM集成的对象SLAM。 请参见orb_object_slam具有ros bag输入的在线SLAM。 读取离线检测到的3D对象
  2. 仅适用于多维数据集SLAM的基本实现。 参见object_slam。给定RGB和2D对象检测,该算法从每个帧中检测3D长方体,然后制定对象SLAM以优化相机姿势和长方体姿势。 是主包装。 detect_3d_cuboid是单图像立方体检测的C ++版本,对应于matlab版本。

作者: Shichao Yang

论文:

  • CubeSLAM: Monocular 3D Object SLAM, IEEE Transactions on Robotics 2019, S. Yang, S. Scherer PDF

0.安装

环境要求

ROS indigo/kinetic, Ubuntu 14.04/16.04, Opencv 2/3.

ROS melodic 我也测试成功

mkdir -p ~/cubeslam_ws/src
cd ~/cubeslam_ws/src
catkin_init_workspace
git clone git@github.com:shichaoy/cube_slam.git
cd cube_slam

编译 g2o

sh install_dependenices.sh

编译整个工程

cd ~/cubeslam_ws
catkin_make -j4

1.运行

source devel/setup.bash
roslaunch object_slam object_slam_example.launch

You will see results in Rviz. Default rviz file is for ros indigo. A kinetic version is also provided.

To run orb-object SLAM in folder orb_object_slam, download data. See correct path in mono.launch, then run following in two terminal:

roslaunch orb_object_slam mono.launch
rosbag play mono.bag --clock -r 0.5

数据集用的kitii单目

https://drive.google.com/open?id=1FrBdmYxrrM6XeBe_vIXCuBTfZeCMgApL

launch文件的目录做了修改

运行:

roslaunch object_slam object_slam_example.launch

在这里插入图片描述

roslaunch orb_object_slam mono.launch
rosbag play mono.bag --clock -r 0.5

在这里插入图片描述

在这里插入图片描述

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gtLVip4e-1593331017060)(./typraData/Kazam_screenshot_00007.png)]

结论:

对车辆等物体创建3D的框架,自由度为9个:xyz,rpw,长宽高

对比原始的ORB-SLAM2,初始化效果非常好,原始ORB-SLAM2在该数据集下无法初始化成功

待测试:单目摄像头

3.细节

它发表在 2019年 最近一期的 IEEE Transactions on Robotics上,CubeSLAM用单目相机实现了物体级的建图、定位、和动态物体跟踪。
在这里插入图片描述

4.作者思路

传统基于特征点的SLAM基本已什么可做的,点之上的高维表达包括线、面、物体,这些先验暂时无法做到通用,但在室内的结构环境下有不少可以尝试的点。必然需要解决这些物体的观测模型、地图中的表达、在BA中的融合数学模型等等。
CubeSLAM里则提出用立方体来建模物体。它提出了整套观测误差函数,并放入ORBSLAM2的BA过程中统一优化。这里面提出几点很有价值的想法是:

  1. 如何从单目利用2D bounding box, 辅助Vanish Points(消影点) 来恢复三维立方体结构
  2. 如何在传统SLAM的静态假设上,将动态物体(车辆等)也追踪起来。实现相机位姿估计和运动物体位姿估计。

5.本文贡献

  1. 一种高效,准确和鲁棒的单目3D立方体检测方法,无需CAD之类的先验对象模型;
  2. 一种在相机,物体和点之间进行新颖测量的对象SLAM方法,可在包括KITTI基准在内的许多数据集上实现更好的姿态估计;
  3. 一种在动态场景中利用运动物体改善姿态估计的方法。

6.论文核心

III. Single Image 3D Object Detection

A.3D box proposal generation

3Dbox用9个自由度描述,除了6维刚体变换外,还增加了3个dimension: 即长宽高。

由于一个前端矩形检测的四个端点只能提供4个约束,而一个3Dbox有8个点需要确定,因而需要其他的信息,如下图。

在这里插入图片描述

我们使用VP来改变和减少回归参数,而不去预测依赖的维度

VP点:Vanishing Point

在这里插入图片描述

VP是平行线的相交点。一个3D cuboid有三个正交轴,因此可以形成3个VPs,而且只与物体旋转有关!

R表示物体的旋转
V P i = K R c o l ( i ) ; i = 1 、 2 、 3 VPi = KRcol(i); i={1、2、3} VPi=KRcol(i);i=123

1. Get 2D corners from the VP

从VP点得到2Dcorners的8个点

立方体最多能观察到3面,所以情况分为以下三种情况,论文距离说明了怎样计算立方体的8个点

以图a为例,已知A、B、C、D点和VP1、VP2、VP3以及p1点,x表示两条线之间的相交点。
p 2 = ( V P 1 , p 1 ) × ( B , C ) p2 = (VP1,p1) × (B,C) p2=(VP1,p1)×(B,C)

p 3 = ( V P 1 , p 4 ) × ( V P 2 , p 2 ) p3 = (VP1,p4) × (VP2,p2) p3=(VP1,p4)×(VP2,p2)

p 5 = ( V P 3 , p 3 ) × ( C , D ) p5 = (VP3,p3) × (C,D) p5=(VP3,p3)×(C,D)

其余点可以通过类似的方法求出。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YVvKcUbH-1593331017063)(C:\Users\Xiong\AppData\Roaming\Typora\typora-user-images\image-20200624154312436.png)]

2. Get 3D box pose from 2D corners

得到了2D平面内的立方体顶点后,要估计其三维位姿。
将物体分成两类:1). 任意位姿的物体;2). 地面物体

1). 任意位姿的物体

使用PnP solver来求解通常的立体3D位姿和大小,由于单目尺度不确定性,我们需要确定一个尺度因子。数学上来说,立方体的8个3D顶点在

​ 物体坐标系:
[ ± d x , ± d y , ± d z ] / 2 [±dx,±dy,±dz]/2 [±dx±dy±dz]/2
​ 相机坐标系:
R [ ± d x , ± d y , ± d z ] / 2 + t R [±dx,±dy,±dz]/2+t R[±dx±dy±dz]/2+t

选择4个相连的顶点如1,2,4,7,然后从上述3D交点投影到2D中去,如顶点1有:
p 1 = π ( R [ d x , d y , d z ] / 2 + t ) ) p1 = π (R [dx,dy,dz]/2 + t)) p1=π(R[dxdydz]/2+t))
π是相机的投影函数

因此每个点可以贡献两个约束,4个点即可估计9个自由度的位姿(除了尺度)。

2). 地面物体

地面物体的roll/pitch都是0. 可以大大简化上述计算

we can get eight 2D corners from VP.

可以直接反向投影地面的顶点到三维地平面上,然后计算其他垂直的顶点

比如上述在三维地平面上的顶点5,可以表达为 [n,m] ( 相机帧里的向量和距离 ), 相对应的三维顶点 P5是反向投影射线K-1p5与地平面的交点:
P5 = −m/(nT(K−1p5)) * K−1p5

3).Sample VP and Summary

the box estimation problem changes to how to get three VPs and one top 2D corner, because after we get the VP.

VP点由对象旋转矩阵R确定。尽管可以使用深度网络通过大量的数据训练直接预测它们,但出于通用性考虑,我们选择手动对其进行采样,然后对其进行评分(排序)

B.Proposal scoring

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eiS84rFb-1593331017064)(C:\Users\Xiong\AppData\Roaming\Typora\typora-user-images\image-20200624174453016.png)]

在图中,左图先提取了一些直线,右图分别是根据不同的直线生成的立体矩形假设,左上角是最佳的假设。每个不同假设可以得到不同的代价函数值。由下式计算:

立方物体O = {R,t,d} ,I是图像

Distance error
在这里插入图片描述

2D立体边界应该与真实图像的边界匹配。通过Canny边缘检测,并生成 DT变换,对于每个可见的立体边,均匀sample 10个点,并综合计算所有距离值,然后除以2d矩形的对角线长度。

Angle alignment error
:

距离误差与false positive的边很敏感,比如物体表面的纹理。因此,我们也检测长线条段(用LSD检测),然后测量它们的角度是否跟VP点匹配。这些直线首先与3个VP点之一关联,基于点-线支撑关系。对于每个VP,可以找到最远的两条线段,它们有最小和最大的倾角。

这里的含义应该是这两条线的交点应该是消影点VP.
那么关键在于为何点-线支撑关系能找到这样的两条最远线段呢. 参考文献给的

Varsha Hedau, Derek Hoiem, and David Forsyth. Thinking inside the
box: Using appearance models and context based on room geometry.
In European Conference on Computer Vision, pages 224–237. Springer,
2010.

Shape error

前两个的误差可以在2D图像平面内计算。但是,相似的2D立体端点可能生成完全不一样的3D立方体。我们添加一个误差来惩罚有巨大倾斜( 长宽比 ) 的比率。也可以添加更严格的先验,比如某些特殊种类物体的固定长宽值或比例。

IV. Object SLAM

我们延伸单图像三维物体检测到多物体SLAM,来联合优化物体位姿和相机位姿。系统基于ORBSLAM2搭建,包含前端相机追踪和后端BA。

我们主要的挑战是完善BA来联合物体、点和相机位姿,本部分将详细介绍。
其他SLAM应用细节可以见VI-B, 静态物体在本部分介绍,动态物体将在下一节强调。

A. Bundle Adjustment Formulation

分别代表相机-物体相机-点物体-点的约束

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wbuPWL3P-1593331017064)(C:\Users\Xiong\AppData\Roaming\Typora\typora-user-images\image-20200624184059732.png)]

B. Measurement Errors

1) 相机-物体测量

a ) 3D测量:

第一种是在3D物体检测是准确的时候使用的3D测量,比如使用RGBD相机时。检测的物体位姿,作为物体在当前相机帧的测量。为了计算测量误差,我们转换路标物体到相机帧,然后比较测量误差:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5w2DR4TG-1593331017065)(C:\Users\Xiong\AppData\Roaming\Typora\typora-user-images\image-20200624184537960.png)]

其中 log 将 SE3的误差映射到 6DOF的切向量空间,因而eco3D∈R9 。为了改善鲁棒性,我们使用 Huber 鲁棒核函数。

注意这里在没有先验时有歧义,无法分清前向和后向。因而在优化时要沿着高度方向旋转0 ±90 180度来获得最小误差。

b) 2D测量:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BeL9fJXD-1593331017066)(C:\Users\Xiong\AppData\Roaming\Typora\typora-user-images\image-20200624185508185.png)]

对于2d测量,我们将立方体路标投影到图像平面来获得2D的红色bounding box,然后与检测的蓝色box之间比较。简单来说,就是将8个顶点投影到平面内,寻找最小和最大的投影像素x,y坐标来建立一个矩形:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bedyD6bn-1593331017067)(C:\Users\Xiong\AppData\Roaming\Typora\typora-user-images\image-20200624185307310.png)]

c和s分别是矩形框的中心和边长。定义两个矩形框之间的误差为:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mRGcriNg-1593331017068)(C:\Users\Xiong\AppData\Roaming\Typora\typora-user-images\image-20200624185630016.png)]

即直接让4D参数相减。
这个测量比起上述的3D测量不确定性更小,因为一般2D检测更加准确。但不同的三维实体也可能有相同的2D投影。

2)物体-点测量

Points and objects can provide constraints for each other

若点P属于物体,则应该在3D物体内部。我们首先将点转换到立体坐标系,然后与立方体的大小比较来获得三维误差:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xSz6ezac-1593331017069)(C:\Users\Xiong\AppData\Roaming\Typora\typora-user-images\image-20200624191515904.png)]

使用max是鼓励点在立方体内部而非正好在表面。

3) 相机-点测量

We use the standard 3D point re-projection error in feature-based SLAM

重投影误差

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xKmvpnWI-1593331017071)(C:\Users\Xiong\AppData\Roaming\Typora\typora-user-images\image-20200624191720771.png)]

C. Data association

使用帧间的点来跟踪检测框。 考虑哪些检测框内离中心在10像素以内的点。哪些匹配点最多,则关联谁。
同时,对于匹配上的点过少的框( 使用对极几何搜索),它们可以认为是动态物体而去除掉!!

7.评价

目前最先进的单目相机位姿估计,同时提升了3D目标检测的准确性

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CubeSLAM学习 的相关文章

随机推荐

  • ctags 基本使用方法

    ctags 基本使用方法 简介 ctags xff08 Generate tag files for source code xff09 是vim下方便代码阅读的工具 尽管ctags也可以支持其它编辑器 xff0c 但是它正式支持的只有 V
  • Java 生产者和消费者3种实现方式

    使用 Objcet 的 wait 和 notifyAll 实现 使用 BlockingQueue 实现 使用 Lock 的 Condition 的 await signal 实现 使用 Objcet 的 wait 和 notifyAll 实
  • 【python安全攻防】python简易端口扫描器

    文章目录 socket套接字optparse模块socket解析主机进行连接获取bannerthreading多线程端口扫描器python nmap端口扫描 对自己看python绝技的一次学习记录 socket套接字 与TCP端口进行交互
  • EsLint 常用规则

    ESLint 是一个代码规范和错误检查工具 xff0c 有以下几个特性 所有东西都是可以插拔的 你可以调用任意的 rule api 或者 formatter api 去打包或者定义 rule or formatter 任意的 rule 都是
  • qt 手动释放new出堆中的内存,如何释放什么时候释放,qt和c++中使用delete的不同

    http www 360doc com content 20 1019 10 65283686 941181306 shtml
  • C++:error C4996解决方法

    背景 使用fopen sprintf strcpy strstr 等函数 xff0c 在编译c 43 43 程序时报如下错 xff1a error C4996 strncat This function or variable may be
  • call(zoom)_如何解决您的Zoom Call问题

    call zoom A lot of people and businesses have turned to Zoom as their go to video conferencing application However Zoom
  • Nginx配置访问密码(在线|离线安装)

    Nginx配置访问密码 在线 xff5c 离线安装 实现效果 xff1a 1 通过nignx访问的站点或目录 xff0c 需要让用户输入用户名密码才能访问 2 在nginx下 xff0c 提供了ngx http auth basic mod
  • linux下docker安装rabbitmq无法打开控制台

    文章目录 一 安装rabbitmq xff0c 并启动二 访问三 解决问题 linux下使用docker安装rabbitmq后 xff0c 无法访问控制台 xff0c 已解决 一 安装rabbitmq xff0c 并启动 1 拉取镜像 do
  • Wake On Lan(WOL)失败的原因

    Wake On Lan xff0c 失败的原因 发送Magic Packet xff08 魔法数据包 xff09 xff0c 不多阐述 xff0c 如果是编程发包 xff0c 请使用UDP封包 在BIOS中开启 Wake On Lan 选项
  • spring的配置文件

    使用流程 添加spring依赖创建类创建spring配置文件 xff0c 并在配置文件中给要被spring创建和管理的类添加标识 在主程序中加载spring配置文件从容器中获取对象 bean的配置 在spring配置文件中 xff0c 通过
  • 解决vc++运行窗口一闪而过的方法

    1 可以在程序添加头文件 include lt Windows h gt 然后在main函数最后的 return 0 xff1b 前面加上system pause xff1b 2 不要手动按运行键 xff0c 而用快捷键ctrl 43 f5
  • centos 6升级内核小版本、更新yum源和升级gcc版本

    文章目录 前言一 升级内核小版本1 1 设置开机自启动网卡1 2 下载待升级内核小版本的rpm文件1 3 修改内核版本启动顺序 二 更换yum源三 升级g 43 43 版本参考链接 前言 将centos 6 8 2 6 32 642 el6
  • 【PX4_BUG】jMAVSim仿真找不到libawt_xawt.so和libjawt.so文件或jdk版本不匹配的解决方法

    在使用make px4 sitl jmavsim命令进行仿真时出现错误 java lang UnsatisfiedLinkError Can 39 t load library usr lib jvm java 11 openjdk amd
  • Windows Server 2016域控服务器如何取消密码复杂性规则

    图 1 报错截图 具体解决办法 第一步 打开服务器管理 如图直接在 放大镜搜索框里面 直接输入搜索服务器管理或者打开箭头3所示的图标 第二步 点击工具 打开组策略管理 第三步 找到 Default Domain Policy 然后鼠标右击编
  • noVNC搭建

    noVNC搭建 1 环境准备 Os centos7 5准备两台设备 192 168 17 176 和 192 168 17 177 2 安装python环境 安装python3 在192 168 17 176操作如下 查看之前是否存在环境
  • Arduino小项目1---esp8266 WiFi 签到机

    Arduino小项目1 ESP8266 WiFi 签到机 前言0 使用的材料和软件1 准备一个HTML网页A 搭建出适合手机的页面框架B 在body中加入表单元素form标签 xff1a 它的常用属性是action xff0c 就是把表单提
  • 如何找回忘记的Facebook密码

    If you don t use a password manager those complex passwords can be pretty hard to remember If you ve forgotten your Face
  • Cube-SLAM编译遇到的问题

    error iota was not declared in this scope 解决办法 xff1a 报错位置添加 xff1a span class token macro property span class token direc
  • CubeSLAM学习

    Cube SLAM 此代码包含两种模式 xff1a 与ORB SLAM集成的对象SLAM 请参见orb object slam具有ros bag输入的在线SLAM 读取离线检测到的3D对象仅适用于多维数据集SLAM的基本实现 参见objec