注:本文主要是实验的一些记录,通过对已有项目的运行和代码的了解来学习三维重建和SLAM相关的知识,意在打个基础。
三维重建和SLAM
总所周知,一个SLAM包含了很多流程,前端配准,后端优化。利用传感器的数据建图的问题也被包含在内。而对轮式机器人来说,在配置限制的情况下由于相机角度固定和2D雷达的原因三维重建并不能将稠密的三维模型整体建立出来,同时其对实时性也有要求,这和三维重建的其他应用场景差别较大,因此在机器人上更多的说法是SfM。
- SfM( Structure from Motion):属于被动的三维重建的方法,是在已经知晓机器人的运动信息(相机姿态)和相机画面后进行匹配后建图
- VSLAM: 视觉slam即在搭载摄像头的机器人下进行实时建图和定位导航等,要求输入图像的系统是线性时不变的
- NerF (Neural Radiance Fields):神经网络辐射场是近几年非常火的基于深度学习的主动式三维重建方法,重建的为Explcilt representation的三维图。按笔者的理解来说,主动的意思就是要在要针对重建的对象上拍几张照片;和implicit representation则是人类能直接看出来的模型,而不是计算机能用的。
3D Reconstruction
KinectFusion学习
KinectFusion是什么
来自Izadi大神团队,Richard A. Newcombe 等人在2011年提出的是一个基于RGBD相机的适用于任何环境光照的实时重建追踪和重建算法,以下是它的工作流程

代码实现
姿态估计
通过借助前一帧的表面信息{v, n}与当前帧的顶点和法线来进行alignment的计算,主要是通过使用point to plane ICP
计算表面向量,后进行SVD
for (size_t i = 0; i < correspondence.size(); ++i ){
auto match = correspondence[i];
Eigen::Vector3d d_i = destPoints[ match.first ];
Eigen::Vector3d n_i = destNormals[ match.first ];
Eigen::Vector3d s_i = sourcePoints[ match.second ];
Eigen::Matrix<double, 6, 1> A_i;
A_i << s_i.cross(n_i) , n_i;
A.row(i) = A_i;
b(i) = n_i.dot(d_i) - n_i.dot(s_i);
}
Eigen::Matrix<double, 6,1> x = A.bdcSvd(Eigen::ComputeThinU | Eigen::ComputeThinV).solve(b);
Point2Point
void LinearSolver::solvePoint2Point(const std::vector<Eigen::Vector3d>& sourcePoints,
const std::vector<Eigen::Vector3d>& destPoints,
const std::vector<std::pair<size_t, size_t>>& correspondence){
const size_t N = correspondence.size();
Eigen::MatrixXd A( N*3 , 6);
Eigen::MatrixXd b( N*3 , 1);
for (size_t i = 0

本文介绍了SLAM(SimultaneousLocalizationAndMapping)的基本概念,包括前端配准和后端优化,并探讨了在轮式机器人上SfM(StructurefromMotion)的应用。文章详细讨论了KinectFusion的实时重建算法,以及姿态估计和表面探测的过程。此外,还提到了基于深度学习的三维重建方法NerF。最后,作者分享了ORB-SLAM系列,特别是ORB-SLAM2的实验过程和经验,强调了实时性和稳定性的重要性。
最低0.47元/天 解锁文章
7390

被折叠的 条评论
为什么被折叠?



