
建图和定位
文章平均质量分 51
chamomoe
这个作者很懒,什么都没留下…
展开
-
基于深度学习的众包地下停车场地图构建
从用户车辆采集的数据一般以轨迹为主,部分带有车位,车道线,路面箭头等元素。所以不太能依赖于严格的对齐策略。但对人来说,每次采集的数据之间有很强的形状的相关性。使用这种整体的形状相关性正好是深度学习擅长的地方。 把三维的轨迹转化为2d的图像,高度信息用颜色表示。 网络的输入是一张画有两条轨迹的图片。可以设定一个像素代表一定的距离值。比如一个像素代表50cm,那么一个1000*1000像素的图片可以代表500*500米的区域。两条轨迹分别用不同的颜色代表,比如目标轨迹用红色,待对齐轨迹用蓝色。然后背景用灰色原创 2020-09-16 12:30:57 · 1277 阅读 · 0 评论 -
insta360数据逆向
描述原创 2020-08-13 14:03:06 · 456 阅读 · 1 评论 -
ORB-SLAM3笔记
相对orbslam2的改进点有: IMU的官方支持 引入相机通用类,方便替换不同模型的相机。并且官方实现了通用相机模型,就是pinhole-equi或者fisheye模型。 假如地图管理功能,支持多个子地图的存在,以及可能的时候合并子地图 recall更高的回环检测,因为要合并地图。如果recall太低,会照成大量的重复地图。 之前的做法是要求DBOW能够找到连续的3 frame。现在改为只要找到1 frame,然后就做集合一致性检查。 使用通用相机模型带来的改变 因为非小孔原创 2020-08-12 15:40:14 · 811 阅读 · 0 评论 -
坐标系变换和对齐
本篇文章先定义坐标系变换,然后讲解什么是坐标系的对齐,最后说明怎么对一个物体做非刚体的对齐。三维空间的点要像用数学来表示的话,就必须要要先建立坐标系。只有确定了坐标系,才能给每个3d的点一个坐标值。 最开始用来计算3d点坐标值的坐标系我们叫做局部坐标系。 对3d点做任何旋转平移操作后,每个3d点的坐标值发生了变化。这个过程可以看作把这些3d点在另外一个坐标系表示出来了。这里的另外一个坐标系就叫做全局坐标系。而这里的旋转和平移的操作,也就是把点在局部坐标系中的坐标值转换成全局坐标系中的坐标值的变换。原创 2020-08-12 13:59:07 · 4013 阅读 · 0 评论 -
相机通用模型
有很多讲相机模型的文章,一般会从小孔模型开始讲,后面再讲到鱼眼模型的时候,就都是数学的东西了。而且小孔模型以外的模型的命名也很乱,所以加大的理解的难度。其实可以用很通俗的模型来解释所有类型的相机,这个就是这里要讲的东西。不管什么样的相机,其实本质都是做了一件事情:把不同角度来的光的强度记录在一个二维的点阵上。换个说法是,相机就是一个函数,输入是不同的角度,输出是二维的坐标。 r=f()。r是离图像中心的距离,是光线在透镜上的入射角 之前说得五花八门的相机模型其实就对应不同的f函数。 只要知道一原创 2020-08-12 11:45:43 · 656 阅读 · 0 评论 -
全景slam
全景slam是指用全景相机来做视觉slam。全景相机有多种方式实现,目前性价比最高的是用两个背对的鱼眼相机来实现。比较好的供应商有insta360。下面的说明都是基于这种全景相机。 全景相机输出的原始图像是两个正方形的图片,图片里有一个球型图案。图案上的每一个像素均匀代表一个方向的光的强度,后面有文章会详细介绍相机模型。 原始图像一般会转换成一张1:2的图像。图像的横坐标对应一个球的经度,纵坐标代表球的纬度(360:180) 所以跑slam有两种方式 直接在原始图像上跑,看作两个刚体连接的摄像机。目原创 2020-08-12 11:09:04 · 2082 阅读 · 2 评论 -
kalibr标定实践
二维码的标定版(aprilTag)对分辨率的要求比棋盘格高。但aprilTag不需要所有点同时被看到。所以在标定大视角的镜头的时候,棋盘格也有优势。因为大视角的相机,在分辨率比较吃亏,但是视野大,也很容易看到全部各点。所以在对分辨率有要求的情况下,可能棋盘格是唯一的选择。 使用--show-extraction可以看到特征提取的结果。 标定大视角fisheye的时候一定要有足够量的正面图像,不然会初始化失败并且优化发散。([ERROR] [1596945603.223429]: Did not conv原创 2020-08-09 12:42:00 · 4004 阅读 · 3 评论 -
Chamo VPS v4.0 技术概念
概述:v4.0的目的是实现地图从无到有的这个过程的建立。要求不管数据的多少,地图都需要有一定的呈现形式,并且随着数据的增加,地图能够稳定的丰富起来。而且数据的增加不会带来非线性的维护的增加。最后能够接受各种质量的数据。新概念:视觉指纹:Visual Finge Print(VFP)每张图片都能提取一个VFP,换个说法是VFP是一张图片的信息浓缩。只用存储VFP来代替存储完整的图...原创 2019-10-25 14:35:23 · 302 阅读 · 0 评论 -
鱼眼相机原理
小孔模型和鱼眼模型的比较普通的小孔模型的示意图:鱼眼模型的示意图:对于小孔模型,在焦距一定的情况下感光片的面积直接决定了视场角。因为在小孔模型中,光都是直线传播的。因为鱼眼相机中,光通过镜头后,光路发生转向。在焦距和感光片大小都一定的情况下,也可以得到不同的视场角。鱼眼镜头的去畸变去畸变是指用小孔模型来等效鱼眼模型。如果限定光线穿过镜头后不能转向。那么只有增大感光面...原创 2019-10-24 13:30:34 · 4833 阅读 · 2 评论 -
SLAM中全局优化初值设置的经验谈
情况分析:有两段轨迹,段内的重投影误差很小,但是两段轨迹的相对位置有点错位。我们找到了这两段轨迹overlap的一些共视关系。这个时候如果我们直接把两段轨迹放一起做BA,其实是不能减少这两段轨迹的整体偏差的。 假设我们通过纯视觉slam得到了一堆点云和一个轨迹。每个pose都有一个gps的位置对应。我们知道slam的轨迹和gps轨迹之间有很大的一个变换。想通过BA直接把slam的数据和gps...原创 2019-05-22 12:24:13 · 969 阅读 · 2 评论 -
BA-NET: DENSE BUNDLE ADJUSTMENT NETWORKS 理解
一句话定义BA-NETBA-NET是关于怎么用深度学习来做sfm用深度学习来做sfm之前有些什么样的思路最直接的方法就是把多张图片直接送给神经网络,误差函数就是网络输出的pose以及像素深度和真值之间的差异。 只用神经网络把RGB的图转换成特征图。之前稠密的SFM是为了最小化多张图片对齐后图像的亮度差异。现在改为最小化特征图的差异。 上一种方法中,特征层提取的网络需要单独训练,但是很...原创 2019-05-12 17:21:18 · 2208 阅读 · 1 评论 -
矩阵的rank,nullspace以及eigenvalue的理解
对于线性方程:Ax=b。如果有唯一解的化,那么没有任何向量乘以A后能够等于0向量:Ab=0。这个时候叫做full rank。也就是rank =n。 如果如果Ax=b没有唯一解,那么就会有很多向量使Ab=0。这些向量b本身组成了一个空间(可以哦嗯一组基表示所有满足要求的向量)。 如果rank=n-1,那么这个nullspace由一个基向量就可以表示,如果rank=n-2,那么这个nullspac...原创 2019-05-24 20:12:04 · 9843 阅读 · 0 评论 -
支持compressed image消息的kalibr,错误TypeError: Conversion is only valid for arrays with 1 or 2 dimensions
kalibr是标定camera和imu外参的重要工具,但是原配的只支持ros的image消息。这里通过修改源代码使其支持compressed image消息。搜索文件:ImageDatasetReader.py 修改函数def getImage为: def getImage(self,idx): topic, data, stamp = se...原创 2019-05-07 15:09:23 · 524 阅读 · 0 评论 -
sim3优化的理解
sim3变换就是相似变换:p2=sRp1+ts是一个缩放系数。可以这么理解,p1在旋转后,又被放大了s倍。但是之前的平移量t没有发生变化,随意乘以s和不乘s的效果是t的作用变小了s倍。也就有了下面的关系:p2/s=Rp1+t/s对比两个表达,s的引入就是让结果整体小了s倍。其实s的作用就是把一个物体放大或者缩小。如果我们有个两个变换相加:A+B=C如果A是带scale变化的...原创 2019-05-22 13:25:35 · 4524 阅读 · 0 评论 -
建图全局优化经验总结
重投影误差优化,如果对于每张图片的重投影都是最小了,全局很难再被优化了。所以如果局部地图已经是最优了,全局也很难有什么改进。 每帧都做全局BA可以保证系统的稳定性。 不能随意删除误差大的点,这些点才是把最后结果掰正确的关键。 使用G2O的化,如果不对linearizeOplus做实现,系统会调用基类的linearizeOplus。研究是使用数值方法计算雅克比。这种方法比解析的方法慢一些。使用...原创 2019-03-18 21:48:50 · 742 阅读 · 0 评论 -
maplab中的lightweight_filtering使用
这是一个基于模板编程的通用滤波器,支持EKF,IEKF,UKF。并且还有一套参数的序列化系统:PropertyHandler。这篇文章讲详细讲解lightweight_filtering的使用。https://github.com/rabienrose/3d_vision/blob/master/visual_map/src/try_lightfilter/src/main.cc首先需要从...原创 2019-03-25 13:22:34 · 1082 阅读 · 0 评论 -
G2o 报"Invalid sizes when resizing a matrix or array."' failed.
这个因为BlockSolver没有选对。对于标准的3d到2d重投影的优化,可以用如BlockSolver_6_3。对于其他任意Edge的问题,需要用BlockSolverXg2o::SparseOptimizer optimizer;g2o::OptimizationAlgorithmLevenberg* solver = new g2o::OptimizationAlgorithmL...原创 2019-03-21 15:55:56 · 1105 阅读 · 1 评论 -
Eigen的matrix transpose()函数的返回值不能直接=自己
经常为了方便使用这样的语句:Eigen::Matrix<float, 1, 5>a;a=a.transpose();结果是a只有第一个元素是正确的。如果要把结果存回自己,可以这么些:a.transposeInPlace();cv::Mat 的确可以这么写,但是Eigen不行。...原创 2019-03-14 12:10:19 · 1394 阅读 · 0 评论 -
Lie群和Lie代数在雅克比矩阵推导中的总结
这里以SO3为例子,用于SLAM之类的3d视觉中。SE3基本雷同,如有特殊会专门提出。Lie群和Lie代数的理解:SO3就是旋转矩阵,代表以x,y,z三个轴旋转的分量。如果在单位旋转矩阵附近分别对这三个轴的旋转求导可以得到下面三个矩阵: 把三维旋转矩阵用表示出来,然后分别对求导就能得到上面三个矩阵。 把这三个矩阵当作空间的基,再分别乘以3个系数,就能组成一个三维向量空间。 因...原创 2019-03-09 15:01:48 · 2785 阅读 · 2 评论 -
建图和定位算法研究中的自动化地图生产和测试系统
目的:建图和定位算法的研究需要一定量的数据处理,但是这部分数据处理量又不如真正地图生产时的量大,但另外要求自动化流程需要一定的灵活性。细节:在服务器上配置某个数据处理模块的环境共其他人使用。比如要生成一段地图,如果每个生成地图的人都要自己去配一遍地图生成程序的环境的话非常麻烦。有了服务器提供的功能服务,就能解决这个问题。 使用jinkins作为工具的接口。每个功能模块提供一个使用模板脚...原创 2019-02-24 16:24:16 · 688 阅读 · 0 评论 -
Maplab系列:共视关系筛选全局匹配
在通过描述符匹配得到的原始匹配中有大量的误匹配,结果是当前帧几乎和地图里面所有的帧都有匹配。后面通过匹配数量在地图中每帧的分布来筛除一部分错误匹配。这部分工作主要在下面函数中完成。MatchingBasedLoopDetector::doCovisibilityFiltering函数的一个重要入参是 loop_closure::IdToMatches<IdType>& ...原创 2019-02-18 15:54:28 · 745 阅读 · 0 评论 -
Eigen的SSE兼容,内存分配,和std容器的兼容理解
SSE支持128bit的多指令并行,但是有个要求是处理的对象必须要在内存地址以16byte整数倍的地方开始。不过这些细节Eigen在做并行化的时候会自己处理。但是,如果把一些Eigen的结构放到std的容器里面,比如vector,map。这些容器会把一个一个的Eigen结构在内存里面连续排放。可以想象,如果这些Eigen的结构本身不是16byte大小,一连续排放后,自然有很多对象就不是在1...原创 2019-02-17 22:55:40 · 2006 阅读 · 0 评论 -
Eigen的map函数使用
经常会处理其他数据结构和Eigen的转换,比如把opencv的mat转为eigen的matrix,或者std::vector的填入matrix。在不进行拷贝的情况下可以使用eigen的map功能进行内存映射。不过一定注意映射后的内存不要被原结构释放了直接上例子int array[9];Eigen::Map<MatrixXi> mat(array,3,3);虽然mat...原创 2019-02-17 22:28:05 · 11958 阅读 · 0 评论 -
香浓定理和信息量的理解
10多年前的本科的信息论课上就知道了香浓定理,后面时不时这个词还会出现,但到最近其实还不太明白这个定理到底有什么用。要理解一个定理的意义一定要回到提出它的背景中来看。我们虚构这样一个场景:100多年前,在英国每周都会举行一个赛马比赛。每次比赛都是相同的8只马来比赛。在大西洋彼岸的纽约华尔街的某些人非常关注每周赛马的结果,因为他们发现优胜的马的结果和某个股票的涨跌有非常大的相关性。当时正...原创 2019-02-11 23:47:51 · 1864 阅读 · 1 评论 -
Maplab系列15:Inverted File
关于Inverted File的主要说明在这篇文章中:Get Out of My Lab:Large-scale, Real-Time Visual-Inertial Localization文章说道:BOW的方法,针对超大量的描述符的时候,效果就不太好了。 KD-Tree的方法,一个是速度比较慢,而且每当数据库有变化的时候,需要重新生成树结构 所以提出了Inverted File方法...原创 2019-02-15 14:32:03 · 498 阅读 · 0 评论 -
视觉半稠密点云匹配性能测试:基于super 4pcs算法
介绍:点云匹配一般会分为两个步骤,一个是全局的变换的计算,叫做全局对齐。一个是把全局计算的变换作为初值的微调,叫做局部对齐。 全局对齐的方法有 分割加描述符 这篇文章的重点:super 4pcs 局部对齐的方法有 icp ndt 如果要对齐两快很大的点云,最好把一块点云分段后,分别和另一个大点云做匹配。然后用graph优化来调整误差。因为很大的两个点云很难做到全局一致...原创 2019-06-09 13:59:39 · 2094 阅读 · 6 评论 -
视觉半稠密点云匹配性能测试:基于分割描述符法
简介:SegMap是一种点云全局对齐的方法,原工作主要是针对lidar点云的。 SegMap的特点是速度非常快,鲁棒性很好,因为提取了特征描述符。 本工作主要把SegMap方法尝试在视觉生成的半稠密点云上应用。 具体原理见:https://blog.youkuaiyun.com/ziliwangmoe/article/details/87445298测试方案:使对统一条街,两次采集图像数据,用...原创 2019-06-09 18:08:52 · 720 阅读 · 2 评论 -
DSO半稠密点云生成工具
介绍:半稠密点云的生成主要通过两个方面: 把多个Frame的像素投影到同一个Frame上面,计算这一个Frame上面像素的深度。这种做法不考虑像素之间的相关性。但其实像素之间是有相关性的,因为3d空间中的表面大都是连续的,所以相邻像素的深度的变化应该也是连续。 通过深度的连续性不断扩展不能通过视察计算出来的那些像素的深度。 有一类算法叫做MVS(Multi-View Steros)...原创 2019-06-09 22:14:04 · 1655 阅读 · 1 评论 -
maplab系列2: FeatureTracksList
maplab有很多和特征点跟踪有关的函数,比如extractFromNFrameStream输入1个VisualNFrame,输出一个aslam::FeatureTracksList结构。主要相关文件:maplab/aslam_cv2/aslam_cv_frames/include/aslam/frames/keypoint-identifier.h maplab/aslam_cv2/a...原创 2018-09-26 15:08:46 · 351 阅读 · 0 评论 -
ROS以及Catkin build安装
①Setup your sources.listsudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'②Set up your keyssudo apt-key adv --keyserv...原创 2019-09-07 11:46:51 · 3685 阅读 · 0 评论 -
大规模视觉定位地图关键技术:综述
大规模视觉定位地图需求:室外有和GPS对齐的能力,室内有和语义地图对齐的能力。 只得到xyz值的意义不大,一定还要和某些语义关联起来。虽然基于定位地图可以自己建立各种语义信息,这样保证了语义信息和定位信息的对齐,但另外一种途径就是让生成的定位地图直接和其他语义地图对齐。室外的话gps坐标作为通用的位置接口,室内需要手动和地图对齐,或者结合wifi定位等泛定位信息,但这要求室内定位地图的相对精...原创 2019-08-27 19:47:58 · 1568 阅读 · 0 评论 -
大规模视觉定位地图关键技术:基于ORB-SLAM的纯视觉定位算法
问题:纯视觉,使用特征点描述符,尽可能多的利用各种信息的前提下,什么样的定位算法最好?需求:要有高效的全局匹配能力。 需要用里程计来弥补地图匹配不好的区域。 要有全局地图可以提高里程计的精度。 里程计和全局的结果要能平滑的融合。结论:尝试了很多方案后,觉得使用给予ORB-SLAM修改的版本笔记哦好。 修改内容: 把ORB-SLAM的LoopDetect用Maplab里面...原创 2019-08-27 18:19:38 · 1379 阅读 · 1 评论 -
大规模视觉定位地图关键技术:GPS数据边缘化
问题:为了对大量gps数据的平均,需要保留所有gps以及相关的图像数据,这会让建图中的BA操作非常慢。因为会处理大量的冗余的视觉信息。如果把冗余的视觉信息扔掉,用于gps平均的数据又不够多。原理:本研究提出可以对剔除掉的gps数据进行边缘化。让这些剔除掉的gps信息让然对系统有作用。其本质是把所有数据求和后再平均变成了做滑动平均。实现:假设每个gps数据用一个不确定度和均值表示...原创 2019-08-25 12:44:37 · 488 阅读 · 0 评论 -
大规模视觉定位地图关键技术:使用视觉匹配提升GPS的绝对定位精度
问题:单目相机的弱点在于很难把同一个地点不同方向的特征对齐。比如道路上两个方向行驶的车,虽然空间位置很近,但是从视觉的共視关系上看却很远。如果只使用视觉的话,唯一能够对不同方向的地图进行对齐的信息就是十字路口。但这种方式不是十分稳定。能够提供绝对位置的gps的精度在10米左右,又不够用。视觉建图中,特征点和相机相互耦合,理论上任意两个特征点的位置都是相关的。这样给大规模的建图带来了困难,因...原创 2019-08-25 12:35:42 · 2692 阅读 · 2 评论 -
g2o报Update contains a nan for vertex和 found NaN in error for edge错误的原因
这两个错误的意思是出现某些edge的误差计算出来是无穷大或者计算出来的更新值是无穷大。而且经常是迭代到一定次数后出现。造成的原因多是某些数据异常,比如BA中出现同一帧不同的2d点连接到相同的3d点上面。所以报这种错误的时候需要对数据有更严格的合理性筛除。...原创 2019-08-20 12:01:26 · 1167 阅读 · 0 评论 -
建图和定位算法研发心得:好的算法是被具体场景不断打磨出来的
开门点题:细节是魔鬼很多人喜欢问别人你用的什么slam框架呀?ORB-SLAM,VINS,LOAM,Cartography还是什么?或者问你是用的开源的框架还是自己的算法?其实我最终用的算法是所有开源框架的综合加上部分自己设计的算法。其实哪个框架的选择并不重要,没有一个框架能够真正完全应对实际使用中的一个非常具体的场景,更不要说有应对所有场景的框架了。比如你的用途是离线建图,然后较...原创 2019-08-20 11:11:13 · 1212 阅读 · 1 评论 -
视觉定位受天气影响的实验
理论上当太阳在不同的角度的时候,物体上形成的阴影图案不同,从而造成视觉特征的不同。本工作测量了不同光照对视觉定位的实际影响。阴天数据建图,阴天数据定位 这是最容易的case,全天候都能有很好的匹配。这里不专门进行测试。 晴天数据建图,晴天数据定位 当天上午10点开始的,测试是每隔1小时左右进行测试的,分别对三个测试点测试了8组数据。 三个测试点分表叫做:office,build_...原创 2019-07-24 21:48:05 · 727 阅读 · 3 评论 -
基于RTK的视觉定位精度测量
移动中的相机的视觉自定位的精度是比较难测量的。最容易的情况是在室外,把视觉定位地图和rtk对齐后,使用定位时的rtk作为真值。 图像的分辨率对精度的影响很大,rolling shutter影响也很大。在不在意太高精度的情况下,这些参数都不重要。但只要这些参数能够做得更精细,应该能做到室外定位精度正负5cm。 要做精度提升的工作,一定要有一种更高精度的测量方法。 rtk和相机的中心点也需要有测...原创 2019-07-23 23:09:54 · 4722 阅读 · 0 评论 -
视觉定位地图数列化总结,把protobuf转为自定义的文件存取
描述:地图数据本来用protobuf存储的,现在要改为用fstream来存储。本文总结了fstream的各种经验。 protobuf最大单文件不能大于67mb protobuf会占用很多额外的空间,也就是probuf存出来的文件比实际需要的要大 protobuf不方便优化存储的结构 protobuf的好处是可以做多版本兼容,但是我们用来存储地图而不是用来作为网络数据的格式,相对格...原创 2019-07-03 11:33:30 · 641 阅读 · 0 评论 -
pose graph优化总结
描述:pose优化相比BA优势在于: 更快,也就是能处理更大规模的数据 可以做按层级来优化,也就是可以处理超大规模的数据,并且可以根据更新量的特点,只做某个层级的优化。 可以修正更大的便宜修正 全局优化的步骤为: 通过点云匹配,把各个submap通过sim3整体变换到近似的位置。为pose优化得到初值 通过frame到点云的匹配,得到frame之间的sim3变换。做pos...原创 2019-07-03 10:21:00 · 3245 阅读 · 1 评论