- 博客(97)
- 资源 (66)
- 收藏
- 关注

原创 VINS-Mono和ORB-SLAM2代码阅读笔记汇总
VINS-Mono代码是港科大沈老师组开放出来的非常优秀的开源SLAM项目,融合了视觉和IMU,是SLAM学习研究中一个很好的项目。这里列出本人学习该项目代码过程中的笔记,后续有新的理解会不断更新。代码学习过程中也借鉴参考了许多网上的其他资料来帮助自己理解,非常感谢有这么多人分享自己的学习经验。VINS-Mono代码阅读笔记(一):从Euroc数据集的运行开始 VINS-Mono代码...
2020-01-12 10:04:13
6140
6
原创 docker registry镜像清理
docker registry创建后,如果一直使用的话会最终会出现占用磁盘空间过多的问题。这时候就需要清楚docker镜像,以下是笔者实验后得出的使用脚本清理的方式,在此做过记录。1.清除仓库中的镜像文件#!/bin/bashset -edf_lines=$(df -P | wc -l)max_siz=0for i in $(seq 2 $df_lines)do mount_point=$(df -P | awk -v i=$i 'NR==i{print $6}') if [[
2021-05-16 11:27:54
1969
原创 工作9年的程序员几点感受
1.如果学历不行,那么能力要强到让别人忽视你的学历“你这个xxx学院是个什么学校”,这句话是北京时间2020年12月8日下午5点的时候从大洋彼岸的美国硅谷传来的。没错,我当时在进行远程语音面试,面试官是对方公司的一个VP,而那时候的硅谷时间已经是午夜一点以后了。问我这种问题,上次已经是6年多以前了。记得当时我在面试一家上市通信企业,按照他们公司正常流程的话到第三轮就已经结束了。但是,由于我的本科学校是个地方二本院校,和他们的“211/985重点院校”相差甚远。记得当时为了能让我入职,我们部门的部长还
2020-12-28 18:36:37
1369
7
原创 怎样对系统进行优化?
作为一名软件开发人员,我想对于怎样对系统进行优化这样的问题,迟早都会遇上的。在此简单记录一下自己的一点思考,如果有哪位大神飘过,有不对的或者不恰当的地方麻烦指正,对于您的任何高见还请补充,不吝赐教,谢谢[拱手]。一个系统的良好高效运行涉及到许多方面。运行在怎样的硬件平台上、什么样的操作系统、用的什么语言、有没有使用一些现有的被证明优秀的框架(刚好和该系统某些模块匹配)或者设计模式,等等,这些方面对系统都是有影响的。那么,如果你现在接手了一个系统的优化和维护任务,你该怎么来优化?以下是笔者的一点个人思
2020-11-23 23:15:08
3504
原创 线程并发中std::mutex和boost::mutex::scoped_lock的使用
1.为什么需要互斥锁软件系统中往往存在多个线程共同来工作,如果多个线程同时对系统中的临界资源(或者代码段)进行访问的话,很容易发生混乱。比如打印机是临界资源,如果多个线程同时都要调用打印机来进行打印的话会出现什么情况?例如有两个线程都要打印,第一个线程调用打印机后在它所处的时间片内还没有打印完成的时候,打印机被第二个线程占有了,这样第一个线程的打印任务就被迫终止了。其实在笔者上学的时候,我们老师讲这里的时候举了一个很简单的例子:你家的卫生间只有一个,家里有多个人,在一个人上卫生间的时候,如果其他人也
2020-11-03 17:17:23
7280
2
原创 C++知识点总结
1.变量的定义和声明定义和声明的由来:c++中程序根据业务和具体实现,往往被分割为多个文件,如果要在多个文件之间共享一个变量。该怎么来设计呢?c++的设计是变量只能在一个地方定义,在其他需要的文件中进行声明。变量只能被定义一次,并且定义的时候就会分配内存空间,也可以在定义的时候进行初始化;变量在一个文件中定义之后,如果要在其他文件中使用,必须使用extern来进行声明,告诉当前文件该变量在其他地方已经定义过了,这里可以放心使用。定义和声明的区别:变量在定义的时候分配了内存空间,也可以对其进行初始化,
2020-10-30 23:35:10
571
原创 error: invalid use of incomplete type ‘class Ogre::SceneManager’问题修改
1.问题描述自己开发的程序中使用到了jsk_rviz_plugins这个包,之前使用的是Nvidia的PX2板子,系统环境是Ubuntu16.04+ROS kinetic,编译运行没有问题。最近开发板子升级到Nvidia Xavier之后,系统环境也升级为Ubuntu18.04+ROS melodic,结果编译程序的时候遇到如下问题:/home/nvidia/workspace/autonomousDriving_Xavier/src/utils/jsk_rviz_plugins/src/bound
2020-09-22 11:41:06
1112
原创 AutowareArchitectureProposal设计和代码结构梳理
最近看了下autoware最新架构的情况,在此做个笔记简单记录一下。1.系统总体架构先贴一张AutowareArchitectureProposal的总体架构设计图,通过这张图来感受一下系统的整体架构,看看系统中各个模块之间的联系。2.AutowareArchitectureProposal的由来简介1)为什么会有AutowareArchitectureProposal这个架构?过去的autoware.ai存在下面两个显著的问题:A.没有非常清晰具体的架构设计;B.存在.
2020-09-14 18:11:17
3131
5
原创 一点惆怅的故乡情
1.北漂,漂不下去的时候就回西安2011年8月,自己踏上了北漂的征途。其实早在2008年的寒假我是去过一次北京的,印象中北京的街道那么宽敞,自己那么渺小……北漂的前四年工作生活还是比较顺利的,作为一名程序员,现在想来认识的人除了自己部门的同事之外,大概就是房东了。老家有句话叫做“新和尚爱念经”,作为初入职场的我来说也是如此。对于加班来说自己积极性也蛮高的,只是有时候疲惫的时候会想起北京让人望而却步的房价,让人不得不去思索一个问题:自己能不能在这座城市立足?租房换房,想必对每个北漂来说都是再熟悉不
2020-09-05 00:32:39
593
1
原创 ROS中插件plugin的简单使用方法
插件,如同其名字一样,第一次接触的时候让我想到了U盘或者USB线这类东西,它们和电脑没有关系,但是插入(挂载)电脑USB口后却可以正常使用,仿佛扩展了电脑的功能。软件中的插件也是类似的,插件化开发使得程序开发扩展性增强,并且不需要对于程序的框架做本质上的改变。插件的本质是创建一个第三方库在软件中来使用。ROS中插件的创建步骤如下5步:1)创建基类2)创建插件3)注册插件4)编译插件5)将新的插件添加到ROS的工具链当中1.在ROS中创建插件1)创建基类先创建一个工作空间c
2020-08-10 15:29:51
5926
2
原创 static assertion failed: Error: GTSAM was built against a different version of Eigen问题修改
1.问题描述:最近在下载编译BLAM代码的时候,运行命令./update后出现了下面问题:/usr/local/include/gtsam/base/Vector.h:72:1: error: static assertion failed: Error: GTSAM was built against a different version of Eigenstatic_assert(2.原因:原因是GTSAM自带的eigen和我系统安装的eigen之间有冲突。GTSAM编译的时候默认使用了自.
2020-07-01 10:57:28
7894
6
原创 怎样缩小人和人之间的差距——一点思考
1.上周末去给孩子打疫苗,网约车司机打我一上车就开始跟我拉话。从孩子打疫苗的话题不知道怎么扯到孩子教育上去了,他说了句“苏州的教育真好啊”,我不禁疑问“苏州的教育怎么好了?”其实我心想苏州的高考成绩在江苏省内来说并不怎么样啊,何以见得教育好。司机师傅说他儿子现在上高中一年级,成绩还不错,按照老师的说法这样发展下去考个一般的一本类大学肯定没问题。紧接着就说起了自己儿子的以前,2.3.橘生淮南则为橘,生之淮北则为枳。叶徒相似,其实味不同。...
2020-06-20 22:33:52
719
2
原创 在Nvidia PX2板子上使用docker方式安装autoware的失败记录
笔者最开始按照官网autoware.ai源码方式进行安装,但是安装好后运行demo的时候发现特别卡,CPU直接拉升到100%甚至Rviz直接卡死掉。看了下别人在PX2上跑autoware的视频,还是相当流畅的,怎么在自己这就卡成这样了呢?检查了下原因,主要是因为PX2上的GPU没有用起来,相当与还是在用CPU跑,这种情况下PX2甚至还不如PC。要在Rviz中渲染点云、加载地图等信息这种复杂的渲染工作不是单单靠CPU就能很好完成的。笔者使用的PX2环境是ubuntu16.04的系统,arm64架构,cud
2020-06-05 10:33:47
804
2
原创 No rule to make target /opt/ros/kinetic/lib/liborocos-kdl.so.1.3.2问题解决
编译autoware过程中遇到下面问题,在网上找了好长时间没有找到。问题错误日志:--- stderr: map_file make[2]: *** No rule to make target '/opt/ros/kinetic/lib...
2020-05-29 11:18:29
2913
1
原创 aarch64-linux-gnu/libGL.so: undefined reference to drmGetDevices2问题解决
最近在Nvidia的PX2板子上安装Autoware,按照Autoware.ai的source build步骤进行环境配置、下载代码并进行编译。编译过程中遇到了下面的问题:--- stderr: kitti_player ...
2020-05-26 17:53:52
2746
原创 旋转矩阵和四元数的几个基本知识点
1.旋转矩阵的四元数表示我们知道,旋转矩阵也可以用四元数来描述。一个四元数由一个实部和三个虚部组成,通常可写为如下形式: 或者 其中,前边的为实部,为虚部。由于实部为标量,虚部为矢量,所以可写为:...
2020-04-20 17:41:37
2710
2
原创 记录两个ROS工程编译时候的问题
1.contains a package but "catkin_make" must be invoked in the root of workspace先说下我是怎么出现这个问题的吧。我在创建了一个catkin_ws目录之后,在这个目录里边直接使用命令catkin_create_pkg命令创建了个maker子目录,然后进入marker里边添加了CMakeLists.txt并进行编辑,同时...
2020-04-09 17:04:54
4209
1
原创 单应矩阵学习笔记
单应矩阵是视觉SLAM当中一个很重要的概念,它用于描述处于共同平面上的一些特征点在两张图像之间的变换关系。举个现实例子,我们去商店买东西,结账的时候柜台前的微信/支付宝收款二维码就相当于处于同一个平面上的特征点组成的平面,而张三打开手机端摄像机拍到的图片和李四手机拍摄到的二维码的图片之间的转换关系就可以用单应矩阵来描述。而且,两个人站在不同的角度用手机扫一扫二维码后,在手机端出现的二维码竟然是方方...
2020-04-07 15:35:01
807
原创 清明节的哀悼与思念
清明节,是一个让我们停下脚步静下心来缅怀逝去亲人的日子。而今年的清明节却显得格外特殊,一定会成为许多人永生的记忆。就在今天,全国和各个驻外使领馆降半旗哀悼在新冠肺炎疫情中牺牲的烈士和逝去的同胞。即便是我自己,过去这段时间从网上读到那些逝去亲人的家庭中一个个充满血泪的故事都会泪涌,更何况在每个逝去的同胞身后,都是一个个破碎的家庭,那些痛失亲人的同胞们内心的伤痛恐怕需要很久才能平复……我自己出生自...
2020-04-04 22:55:01
484
2
原创 ORB-SLAM2系统中的优化函数
SLAM系统中,一般在特征点投影完成一次的时候就要进行一次优化,优化是为了将匹配的误差最小化,进而剔除一些outlier点。ORB-SLAM系统当中的优化分为下面5个,从优化的范围层次逐步扩大。1.位姿优化函数PoseOptimization一些说明:PoseOptimization优化的是单帧图像的位姿。相机在运动的时候每个图像帧可以对应三维世界中多个地图点,那么此时我们可以知道三维世界...
2020-03-26 12:17:58
2620
4
原创 ORB-SLAM2中LoopClosing线程主要流程梳理
LoopClosing线程主要工作是两个:一个是对当前新到来的关键帧进行闭环检测,看看之前的关键帧中哪个和当前关键帧形成闭环;另一个是纠正闭环,就是在检测到闭环的时候要将当前关键帧和闭环关键帧的位姿拉到一起,形象点说就是进行融合(既然都存在闭环了,那肯定得合并啊)。一、闭环检测DetectLoop1.从关键帧列表中获取列表头的关键帧,也就是获取最新插入到LoopClosing线程的关键帧,...
2020-03-25 00:12:39
1101
原创 ORB-SLAM2中LocalMapping线程主要流程梳理
一、LocalMapping线程简述在ORB-SLAM2当中,LocalMapping作为一个线程在系统启动后就一直在运行,只是在Tracking线程“生产出”新的关键帧并插入到LocalMapping线程中的mlNewKeyFrames列表后,LocalMapping线程检测到该列表中有关键帧后开始处理这些新插入的关键帧(CheckNewKeyFrames函数用来检测mlNewKeyFram...
2020-03-20 17:49:29
1249
1
原创 ORB-SLAM2中Tracking线程主要流程梳理
一、初始化部分:1.首次进入初始化 对于当前帧中关键点数>100的帧,用该帧来构造初始化帧和上一个帧; 并记录当前帧中关键点的坐标值,用于下一帧进来的时候进行特征点匹配; 使用当前帧构造初始化器;2.第二次进入初始化 如果当前传入的帧的关键点数<=100的帧,删除初始化器,直接返回; 对当前传入的帧和初始化帧之间进行特征点匹配,调用matcher.Searc...
2020-03-13 23:49:45
1484
3
原创 记录一个VSCode中代码跳转不到定义文件的问题
问题描述:我使用的是Ubuntu16.04版本的Linux系统,安装VSCode浏览和ROS系统相关的代码,最近突然出现在IDE中跳转不到函数定义的地方。重新安装VSCode也没有解决该问题。。。问题原因:Visual Studio Code Extension for ROS出了问题。解决办法:步骤1:打开VSCode IDE,输入ctrl+shift+x,在页面左侧显示@insta...
2020-03-07 17:58:27
16882
2
原创 记录几个SLAM疑问
记录几个本人的SLAM疑问,有大神恰好路过的麻烦给指教一下。谢谢!1.目前大多开源的优秀SLAM系统都包含有闭环检测,那么在实际使用当中如果SLAM系统运行在无人车上的话,从A地到B地之间路线没有闭环的情况下,闭环检测是不是就失效了?这时候通过闭环检测来较小漂移和误差的“想法”是不是就失效了?实践当中是怎么来实现的呢?2.视觉和IMU融合的方案,主要是借助IMU测量的加速度对其积分计算出速...
2020-03-06 09:30:53
579
8
原创 和房子有关的幸福
1.春节前的一个夜晚,我在朋友圈里看到小姑家的表弟在他们公司年会上被评为优秀员工。晒出的图片是表弟佩戴着奖牌和领导站在一起合影的照片,配图文字是:感恩老板 柳总让我拥有一个幸福的家!想起小时候和表弟一起成长的经历,以及这十多年来表弟在城市里踏实工作和打拼的一些事情,让我为这个表弟感到衷心地高兴。在他身上我看到了几个词语:踏实、坚韧、感恩。小姑家在我们那的农村来说是相当贫寒的,小时候每年有足...
2020-03-01 18:26:29
2033
2
原创 VINS-Mono代码阅读笔记(十四):posegraph的存储和加载
本篇笔记紧接着VINS-Mono代码阅读笔记(十三):posegraph中四自由度位姿优化,来分析位姿图的存储和加载。完整(也是理想的)的SLAM的使用应该是这样的:搭载有SLAM程序的移动设备在一个陌生环境中运行一圈来对该环境进行建图;建图完成后存储该地图;当设备再次运行在该环境中的时候加载已经创建的地图帮助定位。VINS-Mono系统当中存储的是posegraph,先来看看论文中对po...
2020-01-20 14:49:55
3453
5
原创 VINS-Mono代码阅读笔记(十三):posegraph中四自由度位姿优化
本篇笔记紧接着VINS-Mono代码阅读笔记(十二):将关键帧加入位姿图当中,来学习pose_graph当中的紧耦合优化部分。在重定位完成之后,进行位姿图优化是为了将已经产生的所有位姿统一到一个全局一致的配置当中。如论文中展示的下图所示,参考帧处于世界坐标系下,当相机运动的时候会相对于参考帧发生变化。而由于重力向量始终不会发生变化,所以从重力方向得到的水平面也不会发生变化,进而该水平面对应的两...
2020-01-19 17:47:40
4831
1
原创 VINS-Mono代码阅读笔记(十二):将关键帧加入位姿图当中
本篇笔记紧接着上一篇VINS-Mono代码阅读笔记(十一):进入pose_graph节点代码分析,继续阅读在process线程中将关键帧加入到位姿图当中的代码。1.创建关键帧在KeyFrame类中可以看到有两个KeyFrame构造函数,这里调用的是第一个构造函数。该函数代码解释如下:/** * double _time_stamp, 关键帧的时间戳 * int _index...
2020-01-08 15:22:30
4680
3
原创 VINS-Mono代码阅读笔记(十一):进入pose_graph节点代码分析
本篇笔记紧接着上一篇VINS-Mono代码阅读笔记(十):vins_estimator中的非线性优化,来接着学习VINS-Mono系统中重定位和全局优化部部分的代码。这部分代码在pose_graph节点中,首先看一下在第一篇笔记中贴出来的下面这张系统运行时的Node graph图。从这张图中可以看到pose_graph在系统节点中所处的位置以及它要订阅和发布的topic有哪些,rviz就是...
2020-01-05 18:04:13
4150
1
原创 活着,要有温暖的感觉
1.12月初联系了在上海工作的大学舍友,令我惊讶的是他说不想在上海呆了,要回老家省会城市西安了……我为什么惊讶呢?他自从研究生毕业,在上海工作已经有5个年头多了,留在上海是他一直心心念念的事情。他甚至为了在上海买房而提早准备存款,生吃俭用,反正一直单身着一个人吃饱全家不饿。再者,他家庭在三四线城市的老家还是很不错的,基本上生活没有什么大的忧虑。我想起了往日和他的沟通内容,对于呆在上海他是那么的...
2019-12-27 10:46:26
712
1
原创 VINS-Mono代码阅读笔记(十):vins_estimator中的非线性优化
本篇笔记紧接着VINS-Mono代码阅读笔记(九):vins_estimator中的相机-IMU对齐,初始化完成之后就获得了要优化的变量的初始值,后边就是做后端优化处理了。这部分对应论文中第VI部分,紧耦合的单目VIO,这部分也是该系统的核心部分。1.前言在我们对经典的视觉SLAM框架和现有的知识一无所知的情况下,我们看到搭载有相机的移动设备(无人车或者无人机等)从A地点运动到B地点,我们...
2019-12-23 15:47:30
4361
9
原创 VINS-Mono代码阅读笔记(九):vins_estimator中的相机-IMU对齐
本篇笔记紧接上一篇VINS-Mono代码阅读笔记(八):vins_estimator中的相机-IMU初始化。阅读分析视觉惯导对齐部分的代码。相机-IMU对齐指的是将视觉SFM结构和IMU的预积分结果进行对齐,主要分为1)陀螺仪偏差的标定;2)速度、重力向量和尺度初始化;3)对重力进行修正三部分。效果如论文中提供的下图所示。1.陀螺仪偏差的标定1)论文中理论描述推导从滑动窗口中根据视...
2019-12-10 21:21:18
4277
13
原创 VINS-Mono代码阅读笔记(八):vins_estimator中的相机-IMU初始化
本篇代码阅读笔记接着上一篇VINS-Mono代码阅读笔记(七):vins_estimator中相机与IMU的外参标定,来学习一下VINS-Mono中初始化部分的代码。在VINS论文的第V. ESTIMATOR INITIALIZATION部分将初始化分为两部分来描述:A.在滑动窗口中仅视觉的SFM;B.视觉和惯导的对齐。初始化部分是从processImage函数中开始的,所以先从process...
2019-11-28 11:15:50
4187
9
原创 VINS-Mono代码阅读笔记(七):vins_estimator中相机与IMU的外参标定
VINS SLAM系统运行过程中,其实就是根据一帧一帧的图像之间匹配的特征点,通过对极几何进行相机位姿的计算,IMU的加入能够将尺度极大的“精确化”,这样就使得相机的运动有了测量尺度。那么,系统中有了两类sensor,单目相机和IMU之间的旋转关系也就是外参标定怎么来计算呢?本篇笔记主要分析这个问题。1.相机与IMU外参标定是什么VINS系统中使用了相机来获取图像信息,使用IMU来“...
2019-11-25 17:04:34
4780
10
原创 VINS-Mono代码阅读笔记(六):vins_estimator中图像处理1
引言VINS-Mono代码阅读笔记(四):vins_estimator中process线程代码分析 中讲process函数的时候,说到了一段设置重定位帧的代码,但是没有做分析,本篇笔记先把这部分代码进行梳理,接着分析图像处理这个重头戏的代码逻辑。1.设置重定位帧// set relocalization frame 设置重定位帧 sensor_msgs::Po...
2019-10-21 11:08:26
3242
12
原创 要专心投入的做事
1.昨天和一个很久未联系的初中的老同学聊天,他说他现在算是摆脱了基本的经济束缚,而我们同期的不少人还在挣扎中。朋友所处的是基因检测这个行业,用他的话来说就是生物医药行业里的计算机行业。对我来说,印象最深刻的是他聊到“我们应该专心投入的做事,在做事的年纪,尽量看到其他对做事有影响的事情”。是啊,只有聚焦精力投入某一方面去努力,才可能会做出一些成绩。他是我的学生生涯中,见过的最聪明的同学。所以,我...
2019-10-20 15:38:20
769
原创 VINS-Mono代码阅读笔记(五):vins_estimator中IMU预积分处理
1.前言本篇紧接着上一篇笔记 VINS-Mono代码阅读笔记(四):vins_estimator中process线程代码分析 来分析IMU数据的相关处理代码流程。先上一张图从代码结构上看一下IMU处理在process函数中的位置。如上图所示,process函数中有三个for循环:1)第一个for循环也就是最外层的for循环是在遍历measurements,这样可以获取每个mea...
2019-10-10 10:43:10
3594
22
原创 VINS-Mono代码阅读笔记(四):vins_estimator中process线程代码分析
process线程作为estimator中的主要线程,对接收到的imu消息和image消息进行处理,进而通过这些信息估计出相机位姿。1.process函数介绍阅读IMU相关代码前,要能够明白IMU都能测量哪些数据。IMU就是惯性传感器的缩写,主要用于测量加速度和旋转运动的传感器。基础的IMU包括加速度计和角速度计,一般由三轴的加速度传感器和三个轴的陀螺仪组成,可以测量IMU在三个轴方向上的...
2019-10-08 11:45:04
3164
12
原创 VINS-Mono代码阅读笔记(三):vins_estimator中main函数分析
在VINS-Mono代码阅读笔记(一):从Euroc数据集的运行开始 中我们已经初步知道了vins_estimator中订阅和发布的topic,那么,在研究vins_estimator模块的代码时,一个很有用的思路就是关注接收到的每一个topic是怎么进行处理的,发送的topic的message信息有哪些。把这些搞清楚了,这个模块的主要工作也就搞清楚了。1.vins_estimator的mai...
2019-10-07 17:04:01
4121
8
pinyin4j-2.5.0
2016-05-20
tomcat 报异常解决
2012-02-11
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人