双目相机畸变和平行矫正
1 双目相机内外参
1.1 内参矩阵
左相机:
右相机:
1.2 畸变系数
左相机:
右相机:
1.3 外参系数
左相机外参: 和
右相机外参: 和
1.4 理想内参矩阵
构建一个两个相机共同的理想内参矩阵
2 典型步骤
参照 [2] 中的步骤,双目相机典型的畸变和平行矫正流程如下:分别将两个图像的像素坐标系通过共同的内参矩阵转换到相机坐标系:
分别对两个相机坐标系进行旋转得到新的相机坐标系。通过左乘旋转矩阵R1和R2。
针对新的相机坐标分别进行左、右相机的去畸变操作。
去畸变操作结束后,分别用左、右相机的内参矩阵将左、右两个相机坐标系重新转换到左、右图像像素坐标系。
并分别用左、右源图像的像素值对新左、右图像的像素点进行插值。3 OpenCV 中的相关函数findChessboardCorners()用来发现棋盘格的角点位置,这里用的是haaris角点检测方法。cornerSubPix()角点位置精确到亚像素级。
stereoCalibrate()通过角点推算出两个相机的内参矩阵M1,M2和畸变系数D1,D2,当然外参矩阵随之也就计算出来了(在图像校正中还没有用到外参),这里用到的是张正友相机标定算法。
stereoRectify()根据内参矩阵和畸变系数计算右相机相对于左相机的旋转R和平移矩阵T,并将这个旋转和平移矩阵分解成左、右相机各旋转一半的旋转R1,R2和平移矩阵T1,T2,这里用到的是bouguet极线校正的方法。
initUndistortRectifyMap()和remap()对左右相机拍摄的图像进行校正(在今后的文章中将会详细介绍实现方法和步骤)。参考文献
[1] https://blog.csdn.net/wangxiaokun671903/article/details/37935113
[2] https://blog.csdn.net/wangxiaokun671903/article/details/38017055...
论文笔记:Deep Closest Point: Learning Representations for Point Cloud Registration
DCP 是一篇基于 Deep Learning 来解决 ICP 问题的,其中 Deep Learning 部分主要用于做匹配,后端仍然沿用 SVD 的方法。比很多 MLP 直接出 Pose 的合理,也取得了更好的效果。在与传统方法例如 Go-ICP 以及深度学习方法 PointNetLK 的对比中,都取得了一定的优势。1 经典 ICP 问题
这一部分在之前的论文笔记中已经有了比较详细的阐述,参见:使用 SVD 方法求解...
使用 SVD 方法求解 ICP 问题
本文是结合《Least-Squares Rigid Motion Using SVD》和《Least-Squares Fitting of Two 3-D Point Sets》两篇文章写的一个总结,里面有一些是自己的理解不一定正确。
1 问题定义
假设我们有两个点云集合 和 ,则我们定义的 ICP 问题是通过最小化点对之间距离获得相应的 Pose:
其中 代表每个点的权重。R 和 t 是我们所要求的旋转矩阵和平移向量。
2 计算平移
我们分两步求解旋转和平移,首先求解 t。固定...
论文笔记:Dynamic Graph CNN for Learning on Point Clouds
DGCNN 是对 PointNet 的改进,PointNet 网络每个点单独提取特征缺乏局部关联。DGCNN 提出了 EdgeConv 就是对它的改进。
1 网络结构
DGCNN 网络结构如下图所示,可以看出其整体架构和 PointNet 是基本一致的,主要区别就是将其中的 MLP 替换成了 EdgeConv。2 EdgeConv
2.1 EdgeConv 结构上图是 EdgeConv 的示意图。假设一个F维点云 其中 F 表示每个点的维度,最简单的可能是 x,...
论文笔记:GCNv2: Efficient Correspondence Prediction for Real-Time SLAM
GCNv2 是一个专门针对几何匹配的描述子网络,是对 GCN 的改进版主要工作如下:1)与常见深度学习特征匹配的性能并且显著减少了前向运算的时间;2)加入了二值化层,生成二值特征。
1 GCNv2 网络结构
GCNv2 网络结构如下图所示:这一结构不必赘述,其实跟 SuperPoint 很像,不过 Descriptors 部分是把 Keypoints 直接拿来取了相应的部分。PixelShuffle (有人也叫作 Sub-pixel Convolution 或者亚像素卷积)在文章(《Real-Time Single Image and Video Super-Resolution Using an Efficient...
DTAM 中的 Cost Volume 笔记
DTAM 是比较经典的基于 RGBD 的 SLAM 算法,其中的 Cost Volume 部分也是后续比较常见的模块,这里进行一下记录。
1 定义说明
定义 表示从相机坐标系 到世界坐标系 的变换矩阵:
其中 表示旋转矩阵, 表示平移向量。
则对于空间中一个点具有如下变换关系:
以及投影操作:
反投影操作:
其中 表示像素 对应的逆深度。
则 2D...
Semantic SLAM 文章收集
截至目前 Semantic SLAM (注意不是 Semantic Mapping)工作还比较初步,可能很多思路还没有打开,但可以预见未来几年工作会越来越多。语义 SLAM 的难点在于怎样设计误差函数,将 Deep Learning 的检测或者分割结果作为一个观测,融入 SLAM 的优化问题中一起联合优化,同时还要尽可能做到至少 GPU 实时。
这一篇博客我将尽力收集一些有代表性的文章,提供下载和简单思路的理解,但个人精力、能力有限也欢迎大家随时提供更多更好的文章。
1、《Probabilistic Data Association for Semantic SLAM》 ICRA 2017语义 SLAM 中的概率数据融合,感觉应该算开山鼻祖的一篇了。这篇也获得了 ICRA...
欧拉积分、中点积分与龙格-库塔积分
在 SLAM 系统中经常用到各种不同的数值积分方法,工程上最常见的有三种:欧拉积分(Euler method)、中点积分(Midpoint method)和龙格-库塔法积分(Runge–Kutta methods)。他们的区别就是如何用数值方法模拟一个斜率。这里简单总结如下:
一、欧拉积分
设有如下微分方程:
并且 和 时刻的差为 ,则欧拉积分定义为:
也就是说用 t 时刻的斜率作为整个 时刻的导数。
二、中点积分
设有如下微分方程:
并且 和 时刻的差为 ,则显式中点积分定义为:
则隐式中点积分定义为:
也就是说用 时刻的斜率作为整个 时刻的导数。
欧拉积分与中点积分都是一阶近似并没有本质不同,二者只是一阶导数所取位置不同,他们的性能也有差别,如下图所示,作为一阶积分近似方法来讲,中点积分有时会稍好一些(带来更快的收敛速度)。图示为方程 ...
VI ORB SLAM2 与 VINS 对比实验
一、实验说明
之前做了一些 VI ORB SLAM2 与 VINS Mono 性能的对比试验,由于 VI ORB SLAM2 并没有官方的版本,我们主要使用王京实现的一个版本(https://github.com/jingpang/LearnVIORB)来做测试(我们加入了双目 VIO 部分,但不论单目还是双目该版本实现与官方版本性能有较大差距)。VINS Mono (https://github.com/HKUST-Aerial-Robotics/VINS-Mono)是港科大开源的一个单目 VIO 算法,速度快而且性能不错,同样受到很大关注。本篇博客我们对二者进行了一些粗浅的实验对比。
说明如下:
1、实验主要指标为 RMSE:
其中:
代表真值, 代表估计值。
2、实验采用 EuRoC 测试集(https://projects.asl.ethz.ch/datasets/doku.php?id=kmavvisualinertialdatasets)。以下是一些初步的实验结果,做一记录。因为没有深入研究和调试,试验次数也比较有限,不一定具有代表性。如大家有任何改进建议或者疑问欢迎留言。
二、实验结果
1、ORB 与 VI...
[ROS] 在 Ubuntu 16.04 系统上安装 ROS Kinetic
ROS 的发行版很多,之前的文章中我们介绍过在 Ubuntu 14.04 上安装 indigo。
时光荏苒,Ubuntu 和 ROS 的长期支持版本都已经更新了,对于最新的 Ubuntu 16.04 通常情况下我们更多地使用其稳定版本 Kinetic。这篇文章就讲下 Kinetic 版本在 Ubuntu 下的安装。
0、安装环境
Ubuntu 16.04 LTS
1、配置源
使用 ROS 官方源:
Shell
sudo sh -c 'echo "deb...