自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 项目过程记录

目录ROS基础知识修改传递参数查看节点信息修改launch文件节点Gmappingrrt节点修改环境问题 ROS基础知识 修改传递参数 在 C++ 中实现参数服务器数据的增删改查,可以通过两套 API 实现: ros::NodeHandle ros::param 在 Python 中实现参数服务器数据的增删改查 ros::get_param 查看节点信息 在 ROS 同提供了一些实用的命令行工具,可以用于获取不同节点的各类信息,常用的命令如下: rosnode : 操作节点 rostopic : 操作话题

2021-12-12 15:14:21 652

原创 11月学习总结

目录因子图优化贝叶斯网络因子图gtsamgtsam例子新概念飞行器概念对比国内外实例 因子图优化 贝叶斯网络 贝叶斯网络是种概率图,由随机变量节点和表达随机变量条件独立性的边组成,形成一个有向无环图。在 SLAM 中,由于我们有运动方程和观测方程,它们恰好表示了状态变量之间的条件概率,故SLAM 可以自然地表达成一个动态贝叶斯网络(Dynamic Bayes Network, DBN).下图是slam问题的贝叶斯网络表示: 从图中可以看出节点间存在着条件关系,z是由三维点和位姿产生的观测点,x基于上一时刻

2021-11-27 18:50:40 537

原创 orbslam2代码详解之tracking线程——局部地图跟踪

目录局部地图跟踪TrackLocalMap()UpdateLocalMap()UpdateLocalKeyFrames()UpdateLocalPoints()SearchLocalPoints()NeedNewKeyFrame()CreateNewKeyFrame() 位姿跟踪三种方法都是基于帧间匹配,优化3D-2D重投影误差得到当前帧的初始位姿。这样得到的初始位姿不是可靠的,其只利用了两帧数据的信息,如果前一帧质量太差,得到的位姿可信度低。因此为了利用更多的信息,需要进一步将当前帧与局部地图进行匹配和.

2021-02-24 19:34:09 1976 2

原创 orb-slam2代码详解之system

目录system在orb-slam2中的作用system程序基本结构system类的基本介绍system.hsystem类system构造函数传入参数读取传进来的文件路径初始化各种线程和数据库附录FileStorage类orb vocabularyOrbVocabulary部分KeyFrameDatabase线程类构造函数run成员函数线程间数据的传递 mono_kitti.cc中main函数里有创建System对象的语句: ORB_SLAM2::System SLAM(argv[1],argv[2],OR

2021-01-23 11:50:59 1254 1

原创 orb-slam2代码详解之mono kitti

目录前言orb-slam的优势总体基础知识命名规则mono-kitti文件的主体结构代码详解参数读取LoadImages函数实例化SLAM系统 前言 orb-slam2是基于orb特征点检测的视觉slam系统,继承自orb-slam,并在此基础上拓展为支持单目(MONOCULAR),双目(STEREO),深度相机(RGBD)的SLAM系统。 本文从mono-kitti文件开始,梳理以kitti数据集为基础的单目系统代码原理。 orb-slam的优势 总体基础知识 主体三个线程 Tracking Loca

2021-01-22 17:53:21 985 1

原创 视觉slam十四讲学习笔记(2)

目录李群李代数李群李代数基础群李代数的引出 李群李代数 由于在slam中位姿是未知的,所以需要解决什么样的相机位姿最符合当前观测数据这样的问题。一种典型的方式是把它构建成一个优化问题,求解最优的R,t,使得误差最小化。 然而,旋转就很自身是存在约束的(正交且行列式为1)。当它们作为优化变量时,会引入额外的约束,使优化变得困难。通过李群李代数的转换,希望将其变为无约束的优化问题,简化求解。 李群李代数基础 三维旋转矩阵构成了特殊正交群SO(3),变换矩阵构成了特殊欧氏群SE(3): 旋转矩阵以及变换矩阵对于加

2020-12-26 21:29:23 751

原创 视觉slam十四讲学习笔记(1)

SLAM是搭载特定传感器的主体,在没有环境先验信息的情况下,于运动过程中建立环境的模型。 定位和建图可以看成感知的内外之分,一方面要明白自身的状态,另一方面也要了解外在的环境。 将传感器分为两类,一类传感器是携带与机器人本体上的,例如机器人的轮式编码器、相机、激光灯等。一类是安装于环境中的,例如导轨、二维码标志等。安装于环境中的传感设备,通常能够直接测量到机器人的位置信息,简单有效地解决定位问题。 但是,由于必须在环境中设置,在一定程度上限制了机器人的适用范围。 按照相机的工作方式,将相机分为单目、双目和深

2020-12-21 23:09:38 489

原创 opencv2学习笔记(2)

滤波是信号处理的及图像处理中的一个基本操作,旨在特定的应用程序中,选择性地提取图像中被认为的传达重要信息的部分。滤波去除图像中的噪声,提取感兴趣的视觉特征,允许图像重样,等等。 观察图像中变化的频率构成了描述图像的一种方式,这种观点被称为频域,而通过灰度分布来描述一副图像被称为空间域。 #低通滤波器 低通滤波器的目的是降低图像变化的速率幅度。 cv::blur函数的作用是将每个像素替换为相邻矩形内像素的平均值。用法如下。 cv::blur(image,result,cv::Size(5,5)); ...

2020-12-13 15:29:14 388 1

原创 opencv2学习笔记(1)

cv::Mat 类是用于保存图像以及其他矩阵数据的数据结构。默认情况下,它们的尺寸为0,但是也可以指定初始尺寸。 cv::Mat ima(240,320,CV_8U,cv::Scalar(100)); 同时指定矩阵中元素的类型,这里的CV_8U对应的是单字节的像素图像。字母U意味着无符号的(Unsigned)。也可以使用字母S声明带符号的类型。 对于彩色图像,需要指定三个通道(CV_8UC3).也可以声明16位或32位的整数图像,或者浮点数图像。 当CV::Mat对象离开作用域后,分配的内存将被自动释放,

2020-11-17 18:58:20 1971 7

原创 动手学深度学习学习笔记(14)

丢弃法 深度学习模型常常使用丢弃法来应对过拟合问题。 丢弃法有一些变体,本节中提到的丢弃法特指倒置丢弃法。 方法 设丢弃概率为p,那么有p的概率hi会被清零,有1-p的概率hi会除以1-p做拉伸。 丢弃概率是丢弃法的超参数。具体来说,设随机变量εi为0和1的概率分别为p和1-p。计算新的隐藏单元hi’ hi’ = εi*hi/1-p 由于εi的期望为1-p,所以 hi’ 的期望仍是hi 所以丢弃法不会改变输入的期望值。 由于在训练中隐藏层神经元的丢弃是随机的,所以每一个神经元都有可能被清零,输出层的计算无法

2020-08-15 15:12:50 425

原创 动手学深度学习学习笔记(13)

三阶多项式函数拟合 这个模型的训练误差和测试数据集的误差都较低,模型参数也接近真实值。 fit_and_plot(poly_features[:n_train,:],poly_features[n_train:,:], labels[:n_train], labels[n_train:]) 线性函数拟合 欠拟合 训练误差始终很高,线性模型在非线性模型生成的数据集上容易欠拟合。 fit_and_plot(features[:n_train, :],features[n_train:,:], labels[:n

2020-08-14 23:50:33 460

原创 动手学深度学习学习笔记(12)

模型选择,欠拟合,过拟合 有的时候,模型在训练数据集上十分准确,但是在测试数据集上却不一定。 训练误差和泛化误差 通常,训练误差指模型在训练数据集上表现出的误差的期望,泛化误差指模型在任意一个测试数据样本上表现出的误差,并常常听过测试数据集上的误差来近似。计算训练误差和泛化误差可以使用损失函数。 在机器学习中,通常假设训练数据集和测试数据集里的每一个样本都是从同一个概率分布中相互独立地生成的。基于这个假设,给定任意一个机器学习模型,它的训练误差的期望和泛化误差都是一样的。 由于参数是在训练数据集上训练模型而

2020-08-14 21:16:51 355

原创 动手学深度学习学习笔记(11)

sigmoid含糊 可以将元素的值变换到0和1之间: sigmoid(x) = 1/(1+exp(-x)) sigmoid在早期神经网络中较为欧变,但是逐渐被更简单的ReLU函数取代。 当输入接近0时,sigmoid接近线性变换。 tanh函数 双曲正切函数可以将元素的值变换到-1到1之间;: tanh(x) = 1-exp(-2x)/1+exp(-2x) 输入接近0时,tanh函数接近线性变换。 该函数形状和sigmoid函数形状很像,但是tanh函数关于零点对称。 多层感知机的从零开始实现 import

2020-08-13 21:55:37 339

原创 动手学深度学习学习笔记(10)

SoftMax的简洁实现 import torch from torch import nn from torch.mm import init import numpy as np import sys sys.path.append("...") import d2lzh_pytorch as d2l 获取和读取数据 batch_size = 256 train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size) 定义和初始化模型 soft

2020-08-12 22:59:36 265

原创 动手学深度学习学习笔记(9)

softmax回归的从零开始实现 import torch import torchvision import numpy as np import sys sys.path.append("...") import d2lzh.pytorch as d2l 获取和读取数据 使用Fashion Mnist数据集,并且设置batch_size为256 batch_size = 256 train_iter,test_iter = d2l.load_data_fashion_mnist(batch_size)

2020-08-11 23:08:05 275

原创 动手学深度学习学习笔记(8)

图像分类数据集 fashion mnist 使用torchversion包 1.torchversion.datasets:一些加载数的函数及常用的数据集接口 2.torchversion.models:包含常用的模型结构(含预训练模型),例如Alexnet,VGG,ResNet等。 3.torchversion.transforms:常用的图片变换,例如裁剪,旋转等。 4.torchvision.utils:其他有用的方法 获取数据集 导入需要的包和模块 import torch import torch

2020-08-07 23:12:26 307

原创 动手学深度学习学习笔记(7)

定义模型 pytorch提供了大量预定义的层 首先导入torch.nn模块,实际上nn是neural networks的缩写,该模块定义了大量神经网络的层。 nn就是利用autograd来定义层。nn的核心结构数据是Module,是一个抽象概念,既可以表示神经网络中的某个层,也可以表示很多层的神经网络。 最常用的做法是继承nn.Module,写自己的层 class LinearNet(nn.Module): def __init__(self,n_feature): super(LinearNet,s

2020-08-06 22:25:27 348

原创 动手学深度学习学习笔记(6)

定义模型 下面是线性回归的矢量计算表达式的实现,使用mm函数做矩阵乘法。 def linreg(X,w,b): return torch.mm(X,w) + b 定义损失函数 使用平方损失来定义线型回归的损失函数。 需要把真实值y变成预测值y_hat的形状。 函数返回结果也和y_hat的形状相同。 def squared_loss(y_hat,y): #返回值仍是向量,此外,pytorch中的MSELoss并没有除以2 return (y_hat-y.view(y_hat.size()))**2/2

2020-08-06 19:40:19 261

原创 动手学深度学习学习笔记(5)

深度学习基础 线型回归 线性回归输出是一个连续值,因此使用于回归问题。回归问题在实际中很常见,如预测房屋价格,气温,销售额等连续值的问题。与回归问题不同,分类问题中的模型的最终输出是一个离散值。 图像分类,垃圾邮件识别,疾病检测等输出为离散值的问题都属于分类问题的范畴。 softmax回归则适用于分类问题。 通过深度学习框架来实现线性回归 首先导入需要的包 matplotlib可以用于作图,且设置成嵌入显示 %matplotlib inline import torch from TPython impor

2020-08-05 23:03:04 367

原创 动手学深度学习学习笔记(4)

自动求梯度 PyTorch提供的autograd包能够根据输入和前向传播过程自动构建计算图,并执行反向传播。 概念 Tensor是这个包的核心,如果将其属性.requires_grad设置为True,它将开始追踪在其上的所有操作(这样就可以利用链式法则进行梯度传播)。完成计算后,可以调用.backward()来完成所有梯度计算。此Tensor的梯度将累积到.grad属性中。 注意在y.backward()时,如果y是标量,则不需要为backward()传入任何参数,否则,需要传入一个与y同形的Tensor。

2020-08-02 22:20:08 310

原创 动手学深度学习学习笔记(3)

广播机制 当对两个形状不同的Tensor按元素运算时,可能会除法广播机制:先适当复制元素使这两个Tensor形状相同后再按元素运算。 x = torch.arange(1,3).view(1,2) print(x) y = torch.arange(1,4).view(3,1) print(y) print(x+y) 输出 tensor([[1, 2]]) tensor([[1], [2], [3]]) tensor([[2, 3], [3, 4],

2020-08-02 20:10:45 177

原创 动手学深度学习学习笔记(2)

操作 算术操作 在pytorch中,同一种操作可能有很多种形式,下面用加法作为例子。 加法形式一 y = torch.rand(5,3) print(x + y) 加法形式二 print(torch.add(x,y)) 还可指定输出: result = torch.empty(5,3) torch.add(x,y,out = result) print(result) 加法形式三 inplace # add x to y y.add_(x) print(y) 注:PyTorch操作inplace版本都有后缀

2020-08-01 22:48:21 145

原创 动手学深度学习学习笔记(1)

深度学习简介 目前机器学习和深度学习应用共同的核心思想,逆向思考,用数据编程 机器学习是一门讨论各式各样的适用于不同问题的函数形式,以及如何使用数据来有效的获取函数参数具体值的学科。 深度学习是指机器学习中的一类函数,它们的形式通常为多层神经网络。 绝大多数神经网络都包含以下的核心原则: 1.交替使用线性处理单元和非线性处理单元,它们经常被称为层 2.使用链式法则(即反向传播来更新网络的参数) 随着发展,计算力的增长大于数据量的增长大于存储容量的增长,这种趋势使得我们需要提升存储的利用效率,例如使用非线性处

2020-08-01 21:20:43 310

原创 opencv学习笔记

import cv2 as cv #导入cv2 filename = r"C:\Users\ASUS\Desktop\season.jpg" #r代表不转义,如果不加r则需要使用文件分隔符,反斜杠 img = cv.imread(filename) """ imread函数在不加第二个参数的情况下默认将图片转化为了一个三维数组, 一维代表了三个通道的灰度值,二维表示第一行所有元素的灰度值, 第三个维度表示所有行,形容了一个图片 """ gray = cv.cvtColor(img,cv.COLOR_BGR2

2020-07-23 17:36:05 262

原创 think python学习笔记(18)

大多数unix系统提供了一个叫做md5sum的命令,来读取一个文件的内容并计算出一个“校验和(checksum)”。不同的内容产生相同校验和的概率非常小。 可以使用一个管道来从python终运行md5sum,并得到计算结果。 filename = 'book.tex' cmd = 'md5sum' + filename fp = os.popen(cmd) res = fp.read() stat = fp.close() print(res) print(stat) 编写模块 任何包含python代码的文

2020-06-24 19:20:46 343

原创 think python学习笔记(17)

捕获异常 试图读写问件事,很多地方可能会发生错误。如果你试图打开一个不存在的恩建A级,会得到一个输入输出错误(IOError) fin = open('bad_file') 如果没有权限访问一个文件 会得到PmissionError fout = open('/etc/passwd','w') 如果你试图打开一个目录来读取,会得到 会得到IsADirectoryError fin = open('/home') 为了避免这些错误,你可以使用类似os.path.exists和os.path.isfile的函数

2020-06-23 23:12:55 259

原创 think python学习笔记(16)

选择数据结构时还需要考虑运行时间 例如,in运算符对于字典比列表要快,至少当元素的数目很大的时候 但是通常事先不知道哪个实现更快,一种选择是两个都实现,然后看哪个更快,这种方法被称作基准测试。 另一种是选择更容易实现的数据结构,然后看它对于拟定的应用是否足够快。如果是的话,就不需要继续了。如果不是,就可以使用一些工具,例如profile模块,识别程序中哪处最耗时 另一个需要考虑的因素是存储空间。例如,使用直方图表示后缀集合可能会用更少的空间,因为无论一个单词在文本中出现多少次,也只需要储存一次。对于很多应用

2020-06-23 22:27:13 248

原创 think python学习笔记(15)

累加直方图中所有项的值,就是文件中的单词总数 def total_words(hist): return sum(hist.values()) 不同单词的数量恰好是词典中项的数目 def different_words(hist): return len(hist) 最常用单词 使用元组;列表,其中每个元组包含单词和它的频率 具有映射关系的组合常用元组 下面的函数接受一个直方图并且返回一个单词频率的元组列表 def most_common(hist): t = [] for key,value in

2020-06-20 12:45:30 230

原创 think python学习笔记(14)

字典和元组 字典中有一个叫做items的方法,它返回由多个元组组成的序列,其中每个元组是一个键值对 d = {'a':0,'b':1,'c':2} t = d.items() 其结果是一个dict_items对象,这是一个对键值对进行迭代的迭代器,可以在for循环中这样使用它 for key,value in d.items(): print(key,value) 由于是字典生成的对象,所以这些项是无序的 也可以使用元组的列表初始化一个新的字典 d = dict(t) 将dict与zip结合使用,可以简洁

2020-06-20 00:28:41 229

原创 think python学习笔记(13)

元组作为返回值 严格来说,一个函数只能返回一个值,但是如果这个返回值是元组,其效果等同于返回多个值 例:对两个整数做除法,计算出商和余数,同时计算出这两个值更好。 内建函数divmod接受两个实参,返回包含两个值的元组:商和余数。 可以使用元组来存储返回值 t = divmod(7,3) quot,rem = divmod(7,3) 也可以使用元组赋值分别存储它们 def min_max(t): return min(t),max(t) max和min是用于找出一组元素序列中最大值和最小值的内建函数。mi

2020-06-19 22:29:53 318

原创 think python学习笔记(12)

字典和列表 在字典中,列表可以作为值出现。 例如,当倒转字典的时候,可能有的键对应的值,就是由列表组成的 def invert_dict(d): inverse = dict() for key in d: val = d[key] if val not in inverse: inverse[val] = [key] else: inverse[val].append(key) return inverse 每次循环,key从d获得一个键和相应的值val。如果val不在inv

2020-06-16 19:30:19 230

原创 think python学习笔记(11)

字典 内建数据类型,字典是python中最优秀的特性之一 字典即映射 字典与列表类似,但是更加通用。在列表中,索引必须是整数,它们几乎可以是任何类型 字典包含了一个索引的集合,被称为键,和一个值的组合。一个键对应一个值。这种一一对应的关联被称为键值对,有时也被称为项。 在数学语言中,字典表示的是从键到值的映射,所以也可以说每一个键映射到一个值。 dict函数生成一个不含任何项的新字典。是内建函数名 eng2sp = dict() 花括号{}表示一个孔子点,可以使用方括号向字典中添加项 eng2sp['one

2020-06-16 16:33:33 252

原创 think python学习笔记(10)

下面的函数接收一个字符串列表作为参数,返回包含大写字母的新列表: def capitalize_all(t): res = [] for s in t: res.append(s.capitalize()) return res res初始化一个空列表,每进行一次循环会添加一个新的元素 类似该函数的操作有时会被称为映射,因为映射一个函数到序列中的每个元素上 下面函数返回了一个列表中仅包含大写字符的子列表 def only_upper(t): res = [] for s in t: if

2020-06-15 22:22:27 214

原创 think python学习笔记(9)

搜索 查找是否存在禁止字符 def avoid(word,forbidden): for letter in word: if letter in forbidden: return False return True 利用in方法,如果找到禁止字符,返回False 通过允许使用字符来判断 def uses_only(word,available): for letter in word: if letter not in available: return False retu

2020-06-12 15:04:19 218

原创 think python学习笔记(8)

搜索 def find(word,letter): index = 0 while index < len(word): if word[index] == letter; return index index = index+1 return -1 find接收的是字符,并找到该字符所在的索引,如果没有找到该字符,函数返回-1 再循环内部使用return,如果找到字符,函数停止循环马上返回 这种计算模式,遍历一个蓄力并在找到寻找的东西时返回,被称作搜索 循环和计数 计算字母a在字

2020-06-12 11:31:45 318

原创 think python学习笔记(7)

平方根 循环常用于计算数值的程序中,这类程序一般从一个大概的值开始,然后迭代式的进行改进 例如,牛顿法是计算平方根的一种方法 当我们想求a的平方根时,从任意一个估算值开始x,利用下面的公式可以计算出更为精确地估算值 y = (x + a/x)/2 得到的y的值会更加接近平方根的真实值,不断的用y去代替x,利用这个式子多次运算,当估算值不在变动的时候,我们基本就得到了正确的答案,也就是当y == x时,就可以停止运算了 while True: print(x) y = (x + a/x)/2 if y=

2020-06-11 15:54:50 376

原创 think python学习笔记(6)

增量式开发 面对复杂的程序,可以采用增量式开发 增量式开发的目标是通过每次只增加和测试少量代码,来避免长时间的调试 这种开发而关键在于 1.从一个能运行的程序开始,每次只增加少量改动 2.用临时变量储存中间值,便于检查 3.删除脚手架代码 组合 写一个函数,接受两个点作为参数,分别是圆心和圆周上一点,然后计算圆的面积 圆心坐标xc,yc 圆周上的点的坐标存储在xp和yp中 第一步是计算两点距离,也就是半径 radius = diatance(xc,yc,xp,yp) 用得到的半径计算圆的面积 resul

2020-06-08 16:15:21 267

原创 think python学习笔记(5)

链式条件 当有多个可能的时候,我们需要多个分支 表示这种情况的方法之一是链式条件 if x>y: print(0) elif x<y: print(1) else: print(2) elif是else if的缩写,elif语句数目没有限制,如果只有一个else1从句,那么这个从句必须在最末,但这个语句并不是必须的 嵌套条件 存在外层条件和内层条件 if x==y: print("equal") else: if x<y: print("less") else:

2020-06-08 14:21:34 251

原创 think python学习笔记(4)

重构 当我们书写circle时,可以复用polygon,因为多边形和圆形非常相似,但是arc(弧形)就会有所不同 因为前者计算运用了中心角360,但是弧度并不是 第一种代替方案: 是在arc函数中直接书写出画图的运算,不使用函数 def arc(t,n,angle): arc_length = 2*math.pi*r*angle/360 n = int(arc_length/3) + 1 #n要取整数 step_length = arc_length/n step_angle = angle/n

2020-06-08 10:45:29 280

原创 think python学习笔记(3)

组合 编辑语言最有用的特征之一,是能够将小块的构建材料组合在一起。例如,函数的实参可以是任意类型的表达式,包括算数运算符,也可以是函数调用 x = math.sin(degrees/360.0*2*math.pi) x = math.exp(math.log(x+1)) 几乎所有可以放值的地方都可以放一个任意类型的表达式,只有一个例外 赋值语句的左侧必须是一个变量名,左侧放其他任何表达式都会产生语法错误 新建函数 一个函数的定义,指定了新函数的名称以及当函数被调用时执行的语句序列 def myprint()

2020-06-04 19:16:23 402

空空如也

空空如也

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

TA关注的人

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