- 博客(71)
- 收藏
- 关注
原创 项目过程记录
目录ROS基础知识修改传递参数查看节点信息修改launch文件节点Gmappingrrt节点修改环境问题ROS基础知识修改传递参数在 C++ 中实现参数服务器数据的增删改查,可以通过两套 API 实现:ros::NodeHandleros::param在 Python 中实现参数服务器数据的增删改查ros::get_param查看节点信息在 ROS 同提供了一些实用的命令行工具,可以用于获取不同节点的各类信息,常用的命令如下:rosnode : 操作节点rostopic : 操作话题
2021-12-12 15:14:21 545
原创 11月学习总结
目录因子图优化贝叶斯网络因子图gtsamgtsam例子新概念飞行器概念对比国内外实例因子图优化贝叶斯网络贝叶斯网络是种概率图,由随机变量节点和表达随机变量条件独立性的边组成,形成一个有向无环图。在 SLAM 中,由于我们有运动方程和观测方程,它们恰好表示了状态变量之间的条件概率,故SLAM 可以自然地表达成一个动态贝叶斯网络(Dynamic Bayes Network, DBN).下图是slam问题的贝叶斯网络表示:从图中可以看出节点间存在着条件关系,z是由三维点和位姿产生的观测点,x基于上一时刻
2021-11-27 18:50:40 403
原创 orbslam2代码详解之tracking线程——局部地图跟踪
目录局部地图跟踪TrackLocalMap()UpdateLocalMap()UpdateLocalKeyFrames()UpdateLocalPoints()SearchLocalPoints()NeedNewKeyFrame()CreateNewKeyFrame()位姿跟踪三种方法都是基于帧间匹配,优化3D-2D重投影误差得到当前帧的初始位姿。这样得到的初始位姿不是可靠的,其只利用了两帧数据的信息,如果前一帧质量太差,得到的位姿可信度低。因此为了利用更多的信息,需要进一步将当前帧与局部地图进行匹配和.
2021-02-24 19:34:09 1683 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 1080 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 825 1
原创 视觉slam十四讲学习笔记(2)
目录李群李代数李群李代数基础群李代数的引出李群李代数由于在slam中位姿是未知的,所以需要解决什么样的相机位姿最符合当前观测数据这样的问题。一种典型的方式是把它构建成一个优化问题,求解最优的R,t,使得误差最小化。然而,旋转就很自身是存在约束的(正交且行列式为1)。当它们作为优化变量时,会引入额外的约束,使优化变得困难。通过李群李代数的转换,希望将其变为无约束的优化问题,简化求解。李群李代数基础三维旋转矩阵构成了特殊正交群SO(3),变换矩阵构成了特殊欧氏群SE(3):旋转矩阵以及变换矩阵对于加
2020-12-26 21:29:23 536
原创 视觉slam十四讲学习笔记(1)
SLAM是搭载特定传感器的主体,在没有环境先验信息的情况下,于运动过程中建立环境的模型。定位和建图可以看成感知的内外之分,一方面要明白自身的状态,另一方面也要了解外在的环境。将传感器分为两类,一类传感器是携带与机器人本体上的,例如机器人的轮式编码器、相机、激光灯等。一类是安装于环境中的,例如导轨、二维码标志等。安装于环境中的传感设备,通常能够直接测量到机器人的位置信息,简单有效地解决定位问题。但是,由于必须在环境中设置,在一定程度上限制了机器人的适用范围。按照相机的工作方式,将相机分为单目、双目和深
2020-12-21 23:09:38 392
原创 opencv2学习笔记(2)
滤波是信号处理的及图像处理中的一个基本操作,旨在特定的应用程序中,选择性地提取图像中被认为的传达重要信息的部分。滤波去除图像中的噪声,提取感兴趣的视觉特征,允许图像重样,等等。观察图像中变化的频率构成了描述图像的一种方式,这种观点被称为频域,而通过灰度分布来描述一副图像被称为空间域。#低通滤波器低通滤波器的目的是降低图像变化的速率幅度。cv::blur函数的作用是将每个像素替换为相邻矩形内像素的平均值。用法如下。cv::blur(image,result,cv::Size(5,5));...
2020-12-13 15:29:14 282 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 1867 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 372
原创 动手学深度学习学习笔记(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 376
原创 动手学深度学习学习笔记(12)
模型选择,欠拟合,过拟合有的时候,模型在训练数据集上十分准确,但是在测试数据集上却不一定。训练误差和泛化误差通常,训练误差指模型在训练数据集上表现出的误差的期望,泛化误差指模型在任意一个测试数据样本上表现出的误差,并常常听过测试数据集上的误差来近似。计算训练误差和泛化误差可以使用损失函数。在机器学习中,通常假设训练数据集和测试数据集里的每一个样本都是从同一个概率分布中相互独立地生成的。基于这个假设,给定任意一个机器学习模型,它的训练误差的期望和泛化误差都是一样的。由于参数是在训练数据集上训练模型而
2020-08-14 21:16:51 280
原创 动手学深度学习学习笔记(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 279
原创 动手学深度学习学习笔记(10)
SoftMax的简洁实现import torchfrom torch import nnfrom torch.mm import initimport numpy as npimport syssys.path.append("...")import d2lzh_pytorch as d2l获取和读取数据batch_size = 256train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)定义和初始化模型soft
2020-08-12 22:59:36 225
原创 动手学深度学习学习笔记(9)
softmax回归的从零开始实现import torchimport torchvisionimport numpy as npimport syssys.path.append("...")import d2lzh.pytorch as d2l获取和读取数据使用Fashion Mnist数据集,并且设置batch_size为256batch_size = 256train_iter,test_iter = d2l.load_data_fashion_mnist(batch_size)
2020-08-11 23:08:05 225
原创 动手学深度学习学习笔记(8)
图像分类数据集 fashion mnist使用torchversion包1.torchversion.datasets:一些加载数的函数及常用的数据集接口2.torchversion.models:包含常用的模型结构(含预训练模型),例如Alexnet,VGG,ResNet等。3.torchversion.transforms:常用的图片变换,例如裁剪,旋转等。4.torchvision.utils:其他有用的方法获取数据集导入需要的包和模块import torchimport torch
2020-08-07 23:12:26 258
原创 动手学深度学习学习笔记(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 305
原创 动手学深度学习学习笔记(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 201
原创 动手学深度学习学习笔记(5)
深度学习基础线型回归线性回归输出是一个连续值,因此使用于回归问题。回归问题在实际中很常见,如预测房屋价格,气温,销售额等连续值的问题。与回归问题不同,分类问题中的模型的最终输出是一个离散值。图像分类,垃圾邮件识别,疾病检测等输出为离散值的问题都属于分类问题的范畴。softmax回归则适用于分类问题。通过深度学习框架来实现线性回归首先导入需要的包matplotlib可以用于作图,且设置成嵌入显示%matplotlib inlineimport torchfrom TPython impor
2020-08-05 23:03:04 297
原创 动手学深度学习学习笔记(4)
自动求梯度PyTorch提供的autograd包能够根据输入和前向传播过程自动构建计算图,并执行反向传播。概念Tensor是这个包的核心,如果将其属性.requires_grad设置为True,它将开始追踪在其上的所有操作(这样就可以利用链式法则进行梯度传播)。完成计算后,可以调用.backward()来完成所有梯度计算。此Tensor的梯度将累积到.grad属性中。注意在y.backward()时,如果y是标量,则不需要为backward()传入任何参数,否则,需要传入一个与y同形的Tensor。
2020-08-02 22:20:08 237
原创 动手学深度学习学习笔记(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 155
原创 动手学深度学习学习笔记(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 yy.add_(x)print(y)注:PyTorch操作inplace版本都有后缀
2020-08-01 22:48:21 118
原创 动手学深度学习学习笔记(1)
深度学习简介目前机器学习和深度学习应用共同的核心思想,逆向思考,用数据编程机器学习是一门讨论各式各样的适用于不同问题的函数形式,以及如何使用数据来有效的获取函数参数具体值的学科。深度学习是指机器学习中的一类函数,它们的形式通常为多层神经网络。绝大多数神经网络都包含以下的核心原则:1.交替使用线性处理单元和非线性处理单元,它们经常被称为层2.使用链式法则(即反向传播来更新网络的参数)随着发展,计算力的增长大于数据量的增长大于存储容量的增长,这种趋势使得我们需要提升存储的利用效率,例如使用非线性处
2020-08-01 21:20:43 245
原创 opencv学习笔记
import cv2 as cv#导入cv2filename = 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 212
原创 think python学习笔记(18)
大多数unix系统提供了一个叫做md5sum的命令,来读取一个文件的内容并计算出一个“校验和(checksum)”。不同的内容产生相同校验和的概率非常小。可以使用一个管道来从python终运行md5sum,并得到计算结果。filename = 'book.tex'cmd = 'md5sum' + filenamefp = os.popen(cmd)res = fp.read()stat = fp.close()print(res)print(stat)编写模块任何包含python代码的文
2020-06-24 19:20:46 267
原创 think python学习笔记(17)
捕获异常试图读写问件事,很多地方可能会发生错误。如果你试图打开一个不存在的恩建A级,会得到一个输入输出错误(IOError)fin = open('bad_file')如果没有权限访问一个文件会得到PmissionErrorfout = open('/etc/passwd','w')如果你试图打开一个目录来读取,会得到会得到IsADirectoryErrorfin = open('/home')为了避免这些错误,你可以使用类似os.path.exists和os.path.isfile的函数
2020-06-23 23:12:55 213
原创 think python学习笔记(16)
选择数据结构时还需要考虑运行时间例如,in运算符对于字典比列表要快,至少当元素的数目很大的时候但是通常事先不知道哪个实现更快,一种选择是两个都实现,然后看哪个更快,这种方法被称作基准测试。另一种是选择更容易实现的数据结构,然后看它对于拟定的应用是否足够快。如果是的话,就不需要继续了。如果不是,就可以使用一些工具,例如profile模块,识别程序中哪处最耗时另一个需要考虑的因素是存储空间。例如,使用直方图表示后缀集合可能会用更少的空间,因为无论一个单词在文本中出现多少次,也只需要储存一次。对于很多应用
2020-06-23 22:27:13 198
原创 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 190
原创 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 195
原创 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 245
原创 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 195
原创 think python学习笔记(11)
字典内建数据类型,字典是python中最优秀的特性之一字典即映射字典与列表类似,但是更加通用。在列表中,索引必须是整数,它们几乎可以是任何类型字典包含了一个索引的集合,被称为键,和一个值的组合。一个键对应一个值。这种一一对应的关联被称为键值对,有时也被称为项。在数学语言中,字典表示的是从键到值的映射,所以也可以说每一个键映射到一个值。dict函数生成一个不含任何项的新字典。是内建函数名eng2sp = dict()花括号{}表示一个孔子点,可以使用方括号向字典中添加项eng2sp['one
2020-06-16 16:33:33 188
原创 think python学习笔记(10)
下面的函数接收一个字符串列表作为参数,返回包含大写字母的新列表:def capitalize_all(t): res = [] for s in t: res.append(s.capitalize()) return resres初始化一个空列表,每进行一次循环会添加一个新的元素类似该函数的操作有时会被称为映射,因为映射一个函数到序列中的每个元素上下面函数返回了一个列表中仅包含大写字符的子列表def only_upper(t): res = [] for s in t: if
2020-06-15 22:22:27 177
原创 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 162
原创 think python学习笔记(8)
搜索def find(word,letter): index = 0 while index < len(word): if word[index] == letter; return index index = index+1 return -1find接收的是字符,并找到该字符所在的索引,如果没有找到该字符,函数返回-1再循环内部使用return,如果找到字符,函数停止循环马上返回这种计算模式,遍历一个蓄力并在找到寻找的东西时返回,被称作搜索循环和计数计算字母a在字
2020-06-12 11:31:45 247
原创 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 277
原创 think python学习笔记(6)
增量式开发面对复杂的程序,可以采用增量式开发增量式开发的目标是通过每次只增加和测试少量代码,来避免长时间的调试这种开发而关键在于1.从一个能运行的程序开始,每次只增加少量改动2.用临时变量储存中间值,便于检查3.删除脚手架代码组合写一个函数,接受两个点作为参数,分别是圆心和圆周上一点,然后计算圆的面积圆心坐标xc,yc 圆周上的点的坐标存储在xp和yp中第一步是计算两点距离,也就是半径radius = diatance(xc,yc,xp,yp)用得到的半径计算圆的面积resul
2020-06-08 16:15:21 207
原创 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 216
原创 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 217
原创 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 313
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人