自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(55)
  • 收藏
  • 关注

原创 记录一下ubuntu16编译caffe以及在c++工程中调用caffe接口的过程

请珍惜2020年还在用caffe做深度学习的人,当然,为了兼容之前的代码,以及照顾大多数人的习惯,我选择在c++工程中直接调用caffe模型,一是避免使用python降低运行速度,二是避免了多进程通信,这样我们能选择的深度学习框架就比较有限了。这篇文章希望能帮助在较为纯净的环境中搭建caffe框架的同学们。一、下载caffe与准备工作git clone https://github.com/BVLC/caffe.git1、将Makefile.config.example改为Makef.

2020-11-28 19:55:31 49

原创 来用C++实现八叉树以及解决点云的均匀降采样问题

点云降采样

2020-10-29 18:03:29 389 4

原创 VINS-MONO源码阅读(三)滑动窗口与边缘化方法

​void MarginalizationInfo::preMarginalize(){ for (auto it : factors) { it->Evaluate(); std::vector<int> block_sizes = it->cost_function->parameter_block_sizes(); for (int i = 0; i < static_cast<int&gt.

2020-10-11 15:55:59 116

原创 VINS-MONO源码阅读(二)紧耦合的相机定位

当在线初始化完成之后

2020-10-09 15:49:59 77

原创 HDL-localization源码阅读

在一般的激光定位中,

2020-09-26 15:10:21 453 3

原创 MSCKF-vio源码阅读

作为一个小白来说,弄明白kf、ekf等滤波方法实属不易,

2020-09-19 18:21:08 324 1

原创 VINS-MONO源码阅读(一)imu预积分和在线初始化

自从进入了

2020-09-17 21:56:14 185

原创 InfiniTAM v3的使用和源码阅读

最近在学习三维重建方面的知识,而目前效果比较好的算法有KinectFusion(Kinfu)、ElasticFusion、InfiniTAM、DynamicFusion、BundleFusion等,我就不一一介绍了,感兴趣的参考https://www.zhihu.com/question/29885222?sort=created作为Ubuntu爱好者,在综合了编译环境、编译难度、建模效果的前提下,选择了InfiniTAM v3作为切入点,发现它的表现已经能让人满意,除了未着色外。...

2020-08-01 16:16:03 624 5

原创 ORB_SLAM2源码阅读(三)相机定位

我们继续上一节的tracking部分,三、位姿估计说到位姿估计就不得不翻开《多视图几何》这本大部头才能看懂作者的源码。回到Track函数,作者为相机设计了两种运行模式,分别是匀速运动模式和关键帧匹配模式。bool Tracking::TrackWithMotionModel(){ ORBmatcher matcher(0.9,true); // Update last frame pose according to its reference keyframe //

2020-07-12 00:21:19 217

原创 ORB_SLAM2源码阅读(二)初始化过程

SLAM的后端一般是利用滤波器或图结构进行增量式的分析,分为filter式和graph式的SLAM方法。本工程是采用g2o进行图优化,相比ceres,g2o更为简单粗暴,它无需构造误差函数,直接利用封装好的模块构造不同编号的位姿间的连接,并根据编号进行回环的更新。最后用一张搓搓的图来表示整个工程的流程,我们可以清晰地看到,前端作为位姿估计,为后端提供初始位姿,而后端使用的图优化方法进行综...

2020-06-21 18:01:57 178

原创 ORB_SLAM2源码阅读(一)概要

最近入手一个可爱的单目摄像头,

2020-06-07 16:34:28 183

原创 v-loam源码阅读(四)深度图点云与建图部分

在这一套代码中,激光部分其实是比较简略的,

2020-06-03 22:29:56 698 9

原创 v-loam源码阅读(三)光束平差法和位姿融合

又到了人见人爱的bundle adjustment部分,这里只涉及了三个话题,接收了来自StackDepthPoint的深度图,以及ba优化前后的里程计信息。 ros::Subscriber depthPointsSub = nh.subscribe<sensor_msgs::PointCloud2> ("/depth_points_stacked", 1, depthPointsHandler); ros::

2020-06-03 22:08:37 355

原创 v-loam源码阅读(二)视觉里程计

再转到VisualOdometry这一节点,这是我们在loam系列中没有接触过的,但对于熟悉视觉里程计的我们来说也不算太难,根据论文,前端是采用msckf作为视觉里程计,但根据本篇代码来看更偏向于继承loam非线性优化的特征点匹配方法,我们重点学习之前没有完全搞懂的imu处理部分。首先看到本节点所涉及的话题,它接收视觉特征查找节点的特征点、深度图节点的转化为深度信息的雷达点云、imu信息,发布的话题包括ros::Subscriber imagePointsSub = nh.subscribe&lt

2020-06-01 09:01:10 707 1

原创 v-loam源码阅读(一)视觉特征

在一开始写lego-LOAM的时候,我就对v-loam有所耳闻,毕竟同出于大神之手,但我一直错误地以为它是将视觉与激光雷达点云融合成一个大型的rgbd,就像我之前的某种错误的打开方式。。。...

2020-06-01 09:00:05 2000 3

原创 move_base中的actionlib机制的源码探析

actionlib是

2020-05-17 11:52:13 595

原创 记录一下将yolov3模型移植到海思H35系列芯片的步骤

海思芯片的nnie加速器可谓是黑科技了,可以在不到100元的2个gpu核的芯片上跑yolov3,对于菜狗来说吸引力很大,但是一般在x86上运行的darknet可执行文件是没法在芯片上运行的,需要严格执行以下步骤:1、将darknet模型转换为caffemodel海思h35系列目前只支持caffe模型,因此需要先将darknet转换为caffemodel①caffe模型缺少上采样层,目前已手动加入,一起编译②运行darknet2caffe.py,9012年了,Python2可能会出很多问题了,

2020-05-09 16:20:13 1024

原创 重读数据结构之爬楼梯问题(动态规划)

leetcode能让人身心愉悦(误),每天抽出一点时间做一道题更是养生之道。那么,

2020-03-17 13:58:47 99 3

原创 软件开发随笔:用C++实现上下层级的类的数据共享

一般在工程的实现中,我都喜欢把oop发挥到极致,也就是把一切都封装成类,并且用指针实现类之间的层级调用,那么在面临类之间的数据流通与共享时,存在一个原则,称作接口与实现分离,下层的类提供那么,假设现在存在“积重难返”的局面,之前由于太菜,或者考虑不周到,或者万恶的产品经理又新增了一些需求,没有...

2020-03-15 11:14:23 148

原创 ros源码分析(四)service的实时反馈机制

服务(service)向来不是一个陌生的词汇,它在我们的领域一般成对存在,分为客户端和服务器,客户端提出请求,服务器处理并给予回应。在ros节点间的通信过程中,如果需要获取对面进程的一些信息,利用话题通信需要两次来回通讯来确认该次请求与回复(有点像TCP/IP的握手),而调用ros service则只需要一次通信,因此它也广泛使用在机器人等ros软件不同层级的指令调用中。那么,与话题通信的分析...

2020-03-01 18:13:17 747

原创 Jetson tx2 配置Yolov3与deep-sort环境的具体步骤

首先明确的一点是,tx2是arm内核并自带cuda9.0,至于cudnn的版本也需要得知,用cat /usr/include/cudnn.h | grep CUDNN_MAJOR -A 2 进行查看,tx2自带的cudnn版本为7。一、安装opencv(python)在python3中需要用到opencv 3.4.0 在 python3.5中的安装,检查是否成功的方法是用python3.5...

2020-02-23 23:21:44 1003

原创 ros源码分析(三)ros::spin( )背后发生的事

接收器subscriber的demo大家也耳熟能详,它和发布器一样,在nodehandle中调用subscribe函数,实现话题名与回调函数的注册,而在进程的main函数中,又在调用ros::spin函数,那么就从这两个部分依次分析接收器的原理。一、subscribe的声明在node_handle.cpp中,subscribe函数的声明如下,template<class M,...

2020-02-23 16:51:03 1226

原创 ros源码分析(二)topic调用了publish之后发生了什么?

隔了很久才写第二篇实在是抱歉。继续从ros wiki的角度下手,最开始接触的publisher和subscriber的demo十分经典,而进程间通信这一过程本身就是它的最大卖点,发布器、接收器这样的名词以及advertise、publish这样简单易懂的API更是焕然一新,回过头来研究它的实现方式,是从了解、掌握到熟悉ros的必要过程。publisher的实现,在demo中的实现为如下,那么N...

2020-01-20 19:18:25 1099

原创 ros源码分析(一)从ros::init开始

在初次接触ros时,roswiki告诉我们ros是一种通信中间件,能够通过近乎完美的封装,实现进程之间的通信,使得数据传输省略了冗长的socket编写。而之后的学习与应用中,我们主要是基于这一既定事实进行愉快的代码编写与GUI的使用,对它本身的实现机制并不需要了解,接触ros若干年的时间里,也没有考虑过打开它的头文件去阅读这一切,直到今年出现了ros话题与服务阻塞的巨大问题。有一说一,计算机在...

2019-11-29 01:02:31 1073 1

原创 三维SLAM算法SegMap源码阅读(三)后端篇

在slam的过程中,再精确的前端也会带入一些细小误差,强如lego_loam的特征匹配也会偶尔陷入局部最优,看不出来只是因为尺度还不够大而已!-_-。像经典的小场景建图算法gmapping,它相当于只携带了前端的里程计误差模型,不太适用于颠簸的路面,也容易在大场景中走偏。在大尺度的建图中,一般需要具备一个监管者来时刻协调之前的轨迹,这便是slam的后端模型,它一般充斥着非线性优化、位姿图、图优化等...

2019-11-12 00:36:14 894 1

原创 三维SLAM算法SegMap源码阅读(二)前端篇

上一篇对SegMap整体的流程与模块进行了概括,接下来我们看看slam的前端部分。一、匹配器SegMatch是SegMap的最大创新点,利用点云分割进行地图的语义化,能够更好的实现回环。这篇论文的地址是https://arxiv.org/pdf/1609.07720.pdf。// SegMatch objects. segmatch_ros::SegMatchWorkerPara...

2019-09-01 17:48:33 1297 3

原创 三维SLAM算法SegMap源码阅读(一)概要篇

今天来阅读一下比较前沿的三维点云与SLAM技术的SegMap,望文生义,它是基于点云的分割(segmentation)与语义识别,从而降低数据的处理量,这样也降低了对环境的依赖,增强了鲁棒性。要注意,在下载源码的同时需要下载laser_slam包,地址为https://github.com/ethz-asl/laser_slam,这个模块是slam的前端模块。我们先看看运行它的launch文件...

2019-07-28 21:04:08 1894 1

原创 记录一下TX2,ros,Python,opencv与TensorFlow的血海深坑

最近为了让机器人更加聪慧而善解人意,准备在英伟达的TX2上开发一下视觉目标检测与速度预判,需要一种比较好的方案,因此选择了Retinanet(Resnet)残差网络进行图像的识别。它需要配置TensorFlow1.4.0以上级别的框架,以及Python3.5,于是乎步入了血海深坑至今酸爽不已。接下来是需要注意的坑(对于菜狗来说,很多都是坑,让大神见笑了):一、ARM内核与X86内核是不同的,在...

2019-04-25 23:00:17 912

原创 哈希表的C++实现

哈希表是一种基于键值映射的快速搜索的数据结构,时间复杂度基本上是O(1)。针对键与值的映射,我们通过哈希函数(散列函数)来实现,它大致有数字分析法、平方取中法、折叠法、除留余数法等,而除留余数法对我们来说最为常见,也更适合初学者理解。但是在取余的过程中可能会导致散列冲突,在这里先用开放定址法中的线性探测法实现。哈希表目前在STL中的实现是unorder_map,非常好用,今天试着自己实现一个:...

2019-03-19 12:10:02 1691

原创 三维SLAM算法LeGO-LOAM源码阅读(四)

最后一个部分是对位姿信息的融合计算,难得代码不长,先看看构造函数://综合后发送的里程计信息pubLaserOdometry2 = nh.advertise<nav_msgs::Odometry> ("/integrated_to_init", 5);//特征匹配时粗配准的里程计信息subLaserOdometry = nh.subscribe<nav_msgs::O...

2019-02-21 21:34:30 3311 7

原创 三维SLAM算法LeGO-LOAM源码阅读(三)

再来看看第三部分,这一节是建图部分,与原有LOAM不同的是增加了回环检测,我们可以用经典的graphSLAM的思想来看它的过程。定位到主函数,它与上一个节点类似,也是一个run函数不停轮转,它对实时性要求较高。void run(){ if (newLaserCloudCornerLast && std::abs(timeLaserCloudCornerL...

2019-02-21 18:04:28 6736 16

原创 三维SLAM算法LeGO-LOAM源码阅读(二)

接下来是featureAssociation.cpp,里程计部分,它分为特征点的提取与匹配两部分。这是一个非常长的代码,首先进入主函数:int main(int argc, char** argv){ ros::init(argc, argv, "lego_loam"); ROS_INFO("\033[1;32m---->\033[0m Feature Associ...

2019-02-19 21:43:45 6928 14

原创 三维SLAM算法LeGO-LOAM源码阅读(一)

LeGO-LOAM是LOAM的增强版,在LOAM的基础上增加了回环检测。论文地址:https://github.com/RobustFieldAutonomyLab/LeGO-LOAM/blob/master/Shan_Englot_IROS_2018_Preprint.pdf它分别由点云分割、特征提取、激光里程计、激光建图组成,算法思想与RGBD-SLAM有些类似,系统通过接收来自三维激光雷...

2019-02-18 15:35:47 13420 38

原创 KNN算法的KD树C++实现

KD树本质上是一种二叉树,它拥有具备特定排列顺序的分裂节点以便查找数据,即在二叉排序树之中,某个分裂节点左子树的值均小于分裂节点的值,而右侧均大于分裂节点的值,如果用中序遍历这棵树,它的打印顺序将是从小到大递增的顺序。当然剩下的科普就不说了,这也是在PCL库当中,最常用的轮子之一,处理点云速度非常快。另外,KNN算法是机器学习训练的一种非常有效的分类方法,手撸这个算法就显得很重要了。当然,在企业级...

2019-01-17 21:42:16 473 1

原创 Dijkstra算法以及邻接表与堆优化

Dijkstra算法是最经典的单源最短路算法,它很像是广度优先遍历与最小生成树的结合,从出发点开始向四周扩散,直到搜索完毕所有节点为止,因此它很适合用来计算节点较少的稀疏图的最短路径问题,但是它以简单粗暴著称,算法思想属于贪心法的范畴。在初始时先将起点放入,从起点开始依次遍历邻居节点,将邻居的边权值设置为目前邻居的路径长度,再从中找到从起点开始路径最短的邻居节点,作为下一次遍历的起点,纳入到已...

2019-01-16 22:25:25 568

原创 GraphSLAM算法源码Cartographer阅读

GraphSLAM是目前比较主流的建图方法之一,它的思想是将机器人的位姿以及地图上的特征抽象成图,每一时刻的位姿可以看作是图的顶点,而位姿之间由观测而产生的约束看作是图的边,那么建图的过程就是将图的点与边进行优化的过程。GraphSLAM的大致流程如下:1.首先根据运动模型初始化每一时刻的位姿,无视测量数据。2.将一系列控制量、测量值、位姿的估计通过线性化方法构造信息矩阵与信息矢量。...

2019-01-15 21:09:34 948

原创 FastSLAM算法源码GMapping阅读

Gmapping是目前广泛运用的建图算法之一,通过操纵手柄或键盘移动机器人便可以快速地建立地图。它主要是利用粒子滤波原理进行实时定位再利用固定路径下的栅格地图建图方法建立占用栅格地图。进行建图工作所开启的节点是slam_gmapping,而通过cmakelist我们看到slam_gmapping.cpp和main.cpp的源文件生成的该节点。因此我们从main.cpp首先开始看看。int...

2019-01-12 17:50:04 5617 2

原创 利用人工势场法的最短路径寻找

人工势场法也可以用作机器人避障。我目前思考的是使其作为全局规划器,规划全局路径,也可以做局部规划直接下达至速度计算,目前暂时先看看全局路径计算。它将整个地图环境抽象为势场,机器人同时受到目标点的引力与障碍物的斥力,向合力的方向移动,当机器人逐步接近障碍物,受到的斥力越来越大以致偏离障碍物,达到避障的效果。如果做一个简化,每次计算便向合力方向延伸一个步长,便可逐渐到达终点。在栅格地图中,障碍物很...

2019-01-07 21:30:43 3782 6

原创 Navigation源码阅读之amcl

amcl(自适应蒙特卡罗)定位方法是目前比较流行的定位算法,它利用粒子表示置信度,通过把合适的概率运动模型与感知模型代入到粒子滤波算法模型中得到估算出的机器人状态。而根据tf树就可以看到,它实际上是估算了base_link到map的tf变换。和local_planner相似,这个包的文件也很多,先在CmakeList看看它们的依赖关系,可以看到它生成了amcl_sensors,amcl_map...

2019-01-03 17:23:03 1203

原创 用A*算法求自主导航的最短路径

A*算法是基于图搜索的一种较快捷的寻路算法,下面是它的基本思路。一.节点的数据结构。在每一个路径节点或潜在的节点(即地图的栅格)中,具有的数据如下:1.最基本的坐标值,在这里我们选择用栅格二维数组的下标而不是笛卡尔坐标x、y。2.父节点,它意味着路径的拓展过程中本节点是从其父节点延伸过来的。3.在每一轮迭代查找时,该路径点的优劣,它包括F,G,H三个数值,G指的是从起点移动到当前栅格的移动...

2019-01-01 23:44:13 1053 2

空空如也

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人 TA的粉丝

提示
确定要删除当前文章?
取消 删除