留个笔记自用

LO-Net: Deep Real-time Lidar Odometry

做什么

Lidar Odometry激光雷达里程计,里程计作为移动机器人相对定位的有效传感器,为机器人提供了实时的位姿信息。移动机器人里程计模型决定于移动机器人结构和运动方式,即移动机器人运动学模型。
简单来说,里程计是一种利用从移动传感器获得的数据来估计物体位置随时间的变化而改变的方法

用建图的方式来理解,要实现机器人的定位与导航,就需要知道机器人走了多远,往哪走,也就是初始位姿和终点位姿,只有知道了里程计,才能准确将机器人扫描出来的数据进行构建。

做了什么

与大多数的激光雷达里程计不同,这里用多任务学习的方式来将目标分解,同时进行上述多任务的端到端学习,并且设计了一个建图模块
主要学习的任务有Normal Estimation法向量估计,Odometry Regression里程计回归
首先是法向量估计任务

点云法向量估计也是一个常见应用了,点云法向量是点云的一种特征表述,由空间变换可知,点云中每一点的法向量夹角及曲率值均不随物体的运动而改变,具有刚体运动不变性。

简单来说就像是找到该点的法线,但单独点打法线不好寻找,往往采用邻域曲线的曲面后再找法线,法向量的应用就很多了,比如点云渲染点云重建

然后是里程计回归任务,其实也可以称呼为动态区域估计

简单来说就是利用连续的点云序列判断出连续点云中有哪些部分是动态的哪些部分是静态的,这样能更好的估计点云物体的位姿等信息

怎么做


整体结构分为三个部分,对应了前面的多任务学习,第一部分法向量估计(Normal)子网络,第二部分运动估计(Siamese pose)子网络,第三部分掩码预测(Mask)子网络。整体输入是两次连续扫描的点云序列{st-1,st},输出是当前时间点云St的位姿信息,同时因为是多任务学习,这些子网络也能通过输入单独点云来进行各自任务的输出。
接下来是具体的细节
首先在这些子网络之前,先要对扫描的点云数据进行编码得到合法输入St,这里采用了根据坐标投影成矩阵的方式

假设某点坐标为(x,y,z),则构造一个巨大的矩阵,计算的α和β是该点在矩阵上投影的位置,∆α 和 ∆β 分别是激光雷达在水平和竖直⽅向上连续两束激光之间的平均⻆分辨率,得到该位置后用点云的强度值和角度值进行数值填充

然后就可以由扫描得到的点云数据的所有点得到一个输入矩阵∈RH×W×C
接下来就是网络结构的第一部分,Normal estimation法向量估计部分

这里采用的方法跟最上面所述相同,采用本点和邻域组成模拟曲面的方式估计法向量,也就是给定点Xi和它的邻域Xij,这里采用的邻域就是在矩阵上离点Xi位置相近的点


这里的Xi就是点Xi的位置向量,一个3D向量,wik是Xi这个点对于第k个邻居点的位置权重,这里是根据角度进行权重的设置

简单来说这里的权重就是根据两个点角度(深度)来进行计算,希望两个点深度相同,然后再深度权重的基础上根据三维向量坐标来直接减得到。
然后就是这k个邻居的求最小值,这里通常采用PCA(主成分分析法)的方法,但这里由于为了网络计算,采用的方法比较简单,在这里采用的式子为

跟上面的区别其实就是对于点Xi,邻居仅仅是上下左右四个位置,然后将其权重乘后累加作为最终该点Xi的法向量

在此基础上,为了保证序列的时空几何一致性,也就是顺序序列中两个顺序点它们所在各自矩阵的位置应该相对应,即

这里的T是两个点云的相对位姿变换,P是点云投影的过程,简单来说,对于Xtab和Xt-1ab也就是对于同一个点在t时刻和t-1时刻于各自点云嵌入矩阵的位置(a,b)上,都会存在一种转换方法使两者之间能进行转换,通过测量相应元素之间的相似性可以验证位姿变换的正确性,于是就可以定义变换约束

这里的∇r是这个位置的局部平滑度,为了最小化这个值,使得相对应元素的法向量值应相似
然后是第二部分,运动估计子网络,也就是位姿(Siamese pose)估计子网络

这里的输入是前面法向量估计得到的添加上法向量信息的点云矩阵,将序列中两个不同的点云矩阵叠加,然后经过几层简单的卷积核FC得到最后的点云之间的六⾃由度位姿变换。这里最末尾的两个紫色的FC的维度分别为3和4,分别代表平移向量和旋转变换(四元数)
绿色模块网络和第三部分掩码预测子网络部分相同

红色框线部分为绿色模块,为特征提取模块,将覆盖了法向量信息的点云矩阵进行encode,这里用到了论文《SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and <0.5MB model size》里提出的一个新的卷积模块,FireConv

简单来说这个卷积模块分为两个部分,第一部分squeeze是由1×1卷积核组成,第二部分expand是由多个1×1卷积核和多个3×3卷积核组成,这也很好理解,就是为了减少网络参数,利用1x1卷积核来降低输入到expand层中3x3卷积核的输入通道数,接下来就是定义这里的loss

这里的x是相对平移向量的GT,q是旋转向量的GT,后面两者就是前面网络的FC层所需要输出的预测三维平移向量和四元旋转组
在此基础上定义

这里的Lx和Lq与上述相同,sx和sq指的是两个可学习参数,为了权衡二者的重要性,也就是为了尽量同时保证两个位姿变换均正确。
最后是第三部分,掩码(mask)预测子网络


黑框部分就是掩码预测的完整网络,是前面那个子网络的延伸版,除了特征encode部分还添加了decode的FireConv以得到跟原矩阵相同维度的mask

这个mask的含义是因为实际的场景中通常包含动态物体,例如街道上⾏驶的汽⻋和⾏⼈,这些动态物体可能会⼲扰⽹络对运动估计的学习,所以这里设计了一个掩码预测来告诉网络内容的动态部分
添加了mask后将上上个子网络的几何约束修改


简单来说就是利用mask来减少动态区域对网络的影响,做一个权重
最后再添加一个正则项


最后这里还设计了一个建图方式来优化位姿变换,这里的方法是通过历史多帧来构建一个全局地图,然后利用该地图和当前帧进行简单匹配来优化位姿变换结果,保证基本变换不会过大

设计的输入有两个,分别是前面两个子网络得到的结果,位姿变换Tt和点云数据矩阵St,这里的St是在法向量+本点信息的基础矩阵上又添加了掩码信息,所以这两者均是前面多任务子网络得到的输出结果
接下来是图中多个不同符号的解释
Π是计算激光雷达相对于起始位置的位姿初始估计值
Ψ是利用前面Π得到的位姿变换减少空间自身运动所造成的失真

这里的p是当前t时间点位置,m是之前建图所得到的对应点位置,n是m点的法向量,简单来说这里的意思就是可以理解为,将当前的所有点根据时间位姿变换找到初始对应点后,尽量减少对应点之间的差距,这就是为了减少空间运动所产生的可能失真
Θ是将上一步得到的约束位姿变换记录到地图上

这里的Mk是总迭代次数也就是时间,以此得到当前帧t的最终位姿变换Mt
Φ是用简单的线性差值去矫正两帧点云之间的差别
Σ, N就是将得到的新点云加入地图

总结

1.文章最后提到了两个问题,第一个是点云的编码问题,这里采用了柱面映射的方式,这种方式太耗资源了,而且稀疏性太大,比较奇怪为什么不像pointnet和pct那样用embedding层来进行输入嵌入。第二个问题是这里是监督学习,训练的时候需要用到GT,在这几个loss中最需要用到GT的是
也就是匹配点的位置变换和旋转变换,这里就是匹配问题常遇到的,不知道像做无监督一样用弱label来进行模拟行不行,感觉它主要在意的是局部区域性,不用特别精确到具体点
2.整体结构简单但好用,除了map模块看起来比较高级,而且由于是多任务,每个单独的优化均可以尝试,但由于学习方式的问题,各个子网络联系较少,缺少交互性,感觉可以尝试将掩码和法向量进行attention融合的方式

《论文阅读》LO-Net: Deep Real-time Lidar Odometry相关推荐

  1. 论文阅读:Regularizing Deep Networks with Semantic Data Augmentation

    论文阅读:Regularizing Deep Networks with Semantic Data Augmentation 动机 特征空间的语义变换 Implicit semantic data ...

  2. 论文阅读笔记——A deep tree-based model for software defect prediction

    本论文相关内容 论文下载地址--Web Of Science 论文中文翻译--A deep tree-based model for software defect prediction 论文阅读笔记 ...

  3. 论文阅读:Practical Deep Raw Image Denoising on Mobile Devices

    论文阅读: Practical Deep Raw Image Denoising on Mobile Devices 旷视 2020 ECCV 基于深度学习的降噪方法在近几年得到了大量的研究,这些方法 ...

  4. 论文阅读笔记:Deep Object Co-segmentation via Spatial-Semantic Network Modulation(AAAI2020)

    协同分割论文阅读:Deep Object Co-segmentation via Spatial-Semantic Network Modulation(AAAI2020) 论文原文    代码 提出 ...

  5. 【论文阅读】Parametrized Deep Q-Networks Learning: RL with Discrete-Continuous Hybrid Action Space

    [论文阅读-深度强化学习打王者荣耀]Parametrized Deep Q-Networks Learning: Reinforcement Learning with Discrete-Contin ...

  6. 论文阅读(2)--Picking Deep Filter Responses for Fine-grained Image Recognition

    这次阅读的文章是Picking Deep Filter Responses for Fine-grained Image Recognition,这篇文章是来自上海交通大学Xiaopeng Zhang ...

  7. 论文阅读 2021 —— DRO: Deep Recurrent Optimizer for Structure-from-Motion

    阅读一个关于预测深度图和相机姿态的一篇论文<DRO: Deep Recurrent Optimizer for Structure-from-Motion>用于SFM的深度循环优化器. 通 ...

  8. 论文阅读计划2(Deep Joint Rain Detection and Removal from a Single Image)

    Deep Joint Rain Detection and Removal from a Single Image[1] 简介:多任务全卷积从单张图片中去除雨迹.本文在现有的模型上,开发了一种多任务深 ...

  9. 【论文阅读】DCAN: Deep Contour-Aware Networks for Accurate Gland Segmentation

    DCAN: Deep Contour-Aware Networks for Accurate Gland Segmentation 作者:Hao Chen Xiaojuan Qi Lequan Yu ...

  10. cartographer:论文阅读(Real-Time Loop Closure in 2D LIDAR SLAM)

    cartographer提供了实时并且可视化的建图,能够帮助操作员很好的评估建图质量和查看构建地图的范围,文章提供了一种5cm分辨率.实时建图和闭环的一种方法. 一. 介绍INTRODUCTION 本 ...

最新文章

  1. IntelliJ Idea 快捷键列表
  2. 【原】画流程图工具visio使用技巧汇总
  3. Ctr点击率预估理论基础及项目实战
  4. C# 进程Process基本的操作说明
  5. QT 之 TCP/IP 服务器和客户端(一)
  6. java c3p0获取主键_Tomcatc3p0配置jnid数据源2种实现方法解析
  7. iis php mysql 集成_如何在IIS上集成php(iis+mysql+php+zend)
  8. Jenkins远程命令执行漏洞(CVE-2018-1000861复现)
  9. R语言实战-读书笔记整理
  10. 为archlinux选择国内镜像
  11. IOS设计模式学习(7)单例
  12. 网络基础知识(黑马教程笔记)-5-路由
  13. 【教程】Edraw Max使用教程:Edraw Max快速入门指南
  14. Apache roller
  15. C++ malloc头文件
  16. 实事 | 神州十三号升空,点燃了谁的光与梦?
  17. Fiddler抓取手机端APP接口数据
  18. 后盾网php多少钱_后盾网php视频教程:2020最热的8个后盾网免费php视频教程
  19. qt调用simsimi api实现小黄鸡
  20. 2.5css ps切图、

热门文章

  1. 新浪UC端自动登录小工具和分析UC端登录
  2. 哪种处理器能跑vs还有oracle,AMD处理器哪个最强 2020AMD处理器性能排行榜
  3. 一加手机怎么root权限_一加手机的两种ROOT权限获取教程详解
  4. 计算机怎么打开网络共享,如何开启Window7的媒体流共享(开启电脑 DLNA 共享)...
  5. 【git】基于github开源平台的项目进行二次开发
  6. 快速由WP8升级到WP8.1
  7. 手游天龙八部服务器注册上限,腾讯手游助手注册已达上限怎么办 | 手游网游页游攻略大全...
  8. 无监督学习 半监督学习 #博学谷IT学习技术支持#
  9. 分布式事务之两阶段提交
  10. JQAjax读页面里面的方法