精华内容
下载资源
问答
  • MATLAB连接三维空间中的两个点

    千次阅读 2020-06-10 20:16:48
    先从最简单的两个坐标相连: 首先给出两个点的坐标(x1,y1,z1),(x2,y2,z2) 其中数据的存储方式为:x=[x1,x2],y=[y1,y2],z=[z1,z2] 接下来我们用真实的坐标来表示:(1,1,0)(1,1,666) 存储的矩阵为:x = [1,1]...

    今天想做一个这样的图:

     

    图片出处:黄建华. 复杂快递网络的优化方法及抗毁性能研究[D]. 大连理工大学.

    整张图可以简化两个三维坐标相连。

    先从最简单的两个坐标相连:

    首先给出两个点的坐标(x1,y1,z1),(x2,y2,z2)

    其中数据的存储方式为:x=[x1,x2],y=[y1,y2],z=[z1,z2]

    接下来我们用真实的坐标来表示:(1,1,0)(1,1,666)

    存储的矩阵为:x = [1,1]; y = [1,1]; z = [0,666];

    x = [1,1];
    y = [1,1];
    z = [0,666];
    plot3(x,y,z,'--or');

    出图:

    接下来尝试两组两个坐标相连:

    (1,1,0)和(1,1,666)相连,(1,2,0)(1,2,1770)相连

    存储的矩阵为:x=x1 = [1,1;1,1]; y1 = [1,2;1,2]; z1 = [0,0;666,170];

    x1 = [1,1; 1,1];
    y1 = [1,2; 1,2];
    z1 = [0,0; 666,170];
    plot3(x1,y1,z1,'--or');

    出图:

    现在可以绘制自己的图了,我们的数据格式为:

    其中x为坐标中x轴的数据,y为坐标中y轴的数据,z为坐标中z轴的数据

    看下x,y,z的数据内容:

    可以看出x,y,z需要进行转置。

    运行程序:

    plot3(x',y',z','--k');

    得到下图:

    按照最初的标准,要让z=0的平面上的坐标没有圆圈,所以去掉连接的两点圆圈,单独为z>=0的地方标记圆圈。

    取出x的第一列,y的第一列,z的第二列标记圆圈,点用黑色圆圈表示,线段为实线。

    plot3(x',y',z','-k',x(:,1),y(:,1),z(:,2),'ok');

     得图:

    好啦,完成了。

     

     

    展开全文
  • 我试图在给定的数据集中找到... This PDF特别是甚至有一个引理说明引理2.4如果它们的Voronoi区域是边缘相邻的,则两个S由Delaunay边连接 .所以,我发现我的数据集的delaunay镶嵌为dt = delaunay(dataset); %using ...

    我试图在给定的数据集中找到与边缘相邻的Voronoi区域的点 . 我是计算几何的新手,但是通过在线阅读,似乎使用Delaunay曲面细分将是一种简单的方法 . This PDF特别是甚至有一个引理说明

    引理2.4如果它们的Voronoi区域是边缘相邻的,则两个S点由Delaunay边连接 .

    所以,我发现我的数据集的delaunay镶嵌为

    dt = delaunay(dataset); %using delaunayn() since dataset can be multidimensional

    但现在,当我将此与该数据集的voronoi图一起绘制时,我发现delaunay边缘返回了连接点,这些点的区域实际上不是边缘相邻的 .

    这是我用来一起绘制Voronoi和Delaunay的代码:

    voronoi(dataset(:, 1),dataset(:, 2));

    hold on;

    dt = delaunayn(dataset);

    triplot(dt, dataset(:, 1), dataset(:, 2), 'red');

    这是输出:

    409b685f-d3df-47dc-a9bc-67ce0a5fa322.png

    作为问题的一个示例,请参见连接到左下角附近的Y点的图右端的点X.

    另一个例子是this SO question - 点1连接到2和3,即使它们似乎是任何方式1和2可以共享边缘,即使扩展到无穷大 . 这个问题实际上是促使我用上面的代码测试delaunayn输出的原因 .

    为什么会发生这种情况,我如何实际获得我需要的边缘相邻邻域?

    注意:要以完整尺寸和清晰度查看图像,请右键单击并选择“查看图像”或类似图像 .

    展开全文
  • 我们要解决的问题是找一组 和 ,使得$mathbf{P}$中的每一个点经过变化后同 中的最近点的误差之和最小。用数学的话描述就是最小化如下一个目标函数: 求解的方法有很多,这里只介绍SVD方法目标函数简化 我们定义两组...

    d0de5992a65b48440c25a0adc619ff39.png

    迭代最近点算法ICP(Iterative Closest Point)

    问题描述

    假设我们有两组点集,注意这里的

    分别相对于变换前和变换后的相机参考系。我们要解决的问题是找一组
    ,使得$mathbf{P}$中的每一个点经过变化后同
    中的最近点的误差之和最小。用数学的话描述就是最小化如下一个目标函数:
    求解的方法有很多,这里只介绍SVD方法

    目标函数简化

    我们定义两组点集的中心为

    注意到最后一项

    从而原式可化简为

    其中
    该目标函数的最优解求解可以分为两部分,先求第一项,再求第二项(实际上第二项最优解始终为0)

    即最小化目标函数等价于最大化

    SVD求解

    在上一步的基础上,有

    引理1:对任意正定对称阵$AA^T$和任意正交阵$B$,有

    这个引理用Schwarz不等式很容易得到,不在这里证明了。 我们的目的是什么呢?根据(1.5),我们的目的是要找一个R使得Tr(RH)最大。那由上面这个引理,我们很容易想到,如果RH是一个对称正定的形式,那对任何旋转矩阵R,显然迹只会不增。因此我们对H做SVD分解,
    ,那么
    就是我们要找的R。因为

    是正定对称阵,则由引理1可知,对任意旋转矩阵(正交)B,都有

    即X是使得(1.5)式最大的R。

    迭代过程

    实际上刚才我们只完成了一次计算,而ICP的全称是Iterative Closest Point,即迭代最近点。我们来理解一下整个过程

    1. 对P中的每个点,在Q中找到匹配的最近点。这里需要注意,并不是每次的点云都是一一匹配,点云的数量是一方面,另外可以预见的是,很容易出现多对一最近点匹配,当然,可以通过一些额外的限定在达到一对一匹配的效果。
    2. 根据上述过程计算最优的R和T.
    3. 利用得到的位姿作用于P,如果此时的误差大于阈值,则重新进行迭代,直到迭代次数达到阈值或者误差小于阈值。

    简单的理解,有点像梯度下降寻找极值点的过程,同样的,一个好的初值对加快ICP的收敛过程也十分重要。另外点对点的计算量十分大,复杂度为$O(mn)$,在一维的情况下,二分查找是常见的优化,对高维的情况,一个类似的过程是通过KD树来实现的。

    KD树优化匹配过程

    KD树原理

    KD树是每个节点均为K维数值的二叉树,其上的每个节点代表一个超平面,该超平面垂直于当前划分维度的坐标轴,并在该维度上将空间一分为二。其构建过程是循环选取数据点的各个维度来作为切分维度,将当前维度的中值作为划分点,递归处理各子树,直到所有数据点挂载完毕。

    KD树的一些优化

    切分维度选择的时候,一般优先选择方差大的维度开始切分。 选择中值时,对数据量较大的维度,不一定严格取中值,可以随机采样一定的数据,并取采样的中值作为划分点,加快划分过程。

    一个例子

    以二维平面点(x,y)的集合(2,3),(5,4),(9,6),(4,7),(8,1),(7,2)为例结合下图来说明k-d tree的构建过程。

    7a7f31cd3cca28664ffd48fc143fc82a.png

    对应的是将一个二维平面逐步划分的过程

    9d847c931d6a4590e0e600390287446e.png

    KD树最近邻搜索过程

    我们构建KD树的目的是为了加快最近点搜索过程,那么KD树如何进行最近邻搜索呢? 假设我们要搜索同(3,5)最近的点。 1)从根节点(7,2)出发,将当前的最近邻设为(7,2),对KD树做深度优先遍历。以(3,5)为圆心,到(7,2 )的距离为半径画圆。对在圆外的点,如果位于左侧,则忽略左子树,位于右侧,则忽略右子树。下图忽略(8,1)的右子树。 2)深度遍历子节点。以(5,4)为根节点,判断(5,4)比(7,2)更近,更换最近点,并重新剪枝。此时,(7,2)的右子树均被忽略。 3)深度遍历子节点,直到遍历结束,返回最近点。

    898ea8c2217c2eab0f7177e5418d34fa.png

    完整伪代码如下图

    7b9e63dff66bdaf08dd23cc1fdaca91e.png

    KD树构建的复杂度为O(log(m)),查找的复杂度为O(mlog(n)),所以利用KD查找最近邻的复杂度为O(mlog(n)),远小于O(mn)。

    正态分布变换NDT(Normal Distribution Transform)

    简介

    目前的配准方法,前提都是环境大部分是不变的,但是完全不变的环境其实也是很少的,比如一辆车飞驰而过,一个人走过等。我们更多应该考虑的是允许小部分差异的配准,这时候点对点匹配比如ICP就会出现一些问题,而NDT则可以很好地解决细微差。 我们知道,如果随机变量满足正态分布,那么对应的概率密度函数(PDF)为

    对随机向量则有

    其中D表示维数,

    表示协方差矩阵。简单来说,一维的数变成了高维的向量。

    目标函数

    与ICP不同,NDT假设点云服从正态分布,我们的目的是找一个姿态,使得当前扫描点位于参考扫描平面上的可能性最大。假设当前扫描得到的点云为

    ,用空间转换函数
    来表示使用姿态变换
    来移动
    。我们的目标是最大化似然函数:

    等价于最小化负对数似然,这么做还有一个好处,加法对求导更友好

    基本步骤

    在上一部分中我们没有解释p函数,当然你可能会说不就是概率密度函数吗?是,但是我们并没有先验的概率密度函数,怎么得到的。这里唯一可以利用的即使参考点云,我们将参考点云网格化,然后计算每个网格的多维正态分布参数。用

    表示一个网格内的所有扫描点,则

    均值:

    协方差矩阵:

    概率密度函数:

    实际上这里f不是正态分布也可以 下一步就是如何求解

    对目标函数进行数学上的简化

    如下图所示,直接取负对数会出现无穷大的点,这样偶然扫到的一些异常点可能会对本来表现很好的结果产生很大的影响导致被舍弃,为了避免这种情况,在原函数的基础上做了一些限制。

    9fdf53d459bc1acefc2ca19099792920.png

    这时候我们的目标函数中的单项就变成

    我们之前也提到了,加法对求导比较友好,但是log函数对求导不友好,而在求解优化问题的时候,经常会利用到一阶二阶导数(比如梯度下降,牛顿法),所以我们想办法对上述函数做一个近似,如果你对函数图像有一定的敏感性的化,很容易发现上面这两个绿色的函数好像还挺像?也就是说我们可以利用高斯函数来拟合负对数

    利用x=0,

    解得近似参数为

    0949a4ec4b9e6ba6ea096cb9935d2069.png

    这样,我们可以得到不同项对NDT结果的贡献(偏移项是一致的,可暂时忽略),注意这里多了一个负号,我的理解应该是为了之后求导时前面的负号正好可以消掉

    原目标函数变成

    牛顿法求解

    这公式实在长,直接截图了,牛顿法的关键就是通过梯度矩阵g和海森矩阵H求解步长

    548225d7d067550184ef83fd45f17471.png

    这里对上面的结果求导可得

    36109d60319f2a75226a70e5035d6b47.png

    举一个简单的二维的例子来说明上面的$x_k$对$p_i$的求导过程

    44839ef62dcc247cbb4374cb577fd666.png

    最后结合流程图梳理一下NDT的流程

    91330fcafbf673c4f02dbc0ac67eb0d7.png

    1)划分网格

    2)计算各网格的PDF

    3)对每个点云数据,找到对应的网格点,并根据PDF和评分函数计算结果

    4)根据结果更新g和H,计算新的步长

    5)判断是否收敛或达到迭代次数,是则跳出,否则继续步骤3-5

    对NDT实验结果的一些优化

    1. cell size. 太大了容易导致损失一些局部特征,太小了则会增加很多计算量,太小会导致失去统计普适性,部分数据对结果影响过大。另外,作者直接舍弃掉少于五个数据的网格(因为会造成协方差矩阵不可逆)。
    2. Fixed discretization。固定大小是最常见的划分方式,操作简单,而且容易找到每个点对应的网格。缺点的话见底下几种方法
    3. Octree discretization。如何快速找到每个点对应的网格是搜索速度的关键,八叉树结构是常见的三维搜索树。
    4. Iterative discretization。好的初始位置可以加快收敛过程,一个常见的方法就是起始位置迭代,将上一次的终点位姿作为本次的起点位姿
    5. Adaptive clustering。非固定大小网格划分的一种方法,采用K均值聚类(其他聚类方式类似)划分,更能表现出每个局部数据的特征。
    6. Linked cells。上面提到数据少于五的网格会被舍弃,导致会出现一些空网格,损失了一些完整性,一个改进措施是将这些空网格用指针连接到最近的非空网格上,以该处的PDF代替,由于处于边缘,值还是很小,但是保证了数据的完整性。
    7. Trilinear interpolation。插值的逻辑就是固定划分实际上会出现边缘不连续的情况,插值法相当于做了一个平滑,计算的时候考虑所有含该数据点的网格取最优值,计算量大约是原来的4倍,但效果也有较大的改善。示意图如下

    eeb8c4b136027e02f5b4ef2e666d5d57.png

    其他一些配准方法

    1. Iterative dual correspondences (IDC) algorithm。ICP的一种改进,主要是采用极坐标代替笛卡尔坐标系进行最近点搜索
    2. Probabilistic iterative correspondence (PIC) method。这个方法考虑了噪声和初始位姿的不确定性
    3. Gaussian fields。采用高斯混合模型,类似NDT
    4. Conditional random fields (CRFs) 。条件随机场,还没细看
    5. Branch-and-bound strategy 。分支定界法,没看。
    6. Registration using local geometric features。结合图像的局部特征进行匹配
    7. 除此之外最近还有一些结合深度学习的方法,比如百度无人车团队2019CVPR的工作:L3-Net: Towards Learning based LiDAR Localization for Autonomous Driving。输入包括实时激光点云,地图和IMU数据,输出位姿结果。

    欢迎关注我的博客一起交流(知乎就不打算在Markdown支持一下Latex吗)

    https://blog.csdn.net/banzhuan133blog.csdn.net

    参考资料

    1.ICP SVD方法论文: Least-Squares Fitting of Two 3-D Point Sets

    2. NDT方法详细介绍论文:Magnusson M. The three-dimensional normal-distributions transform: an efficient representation for registration, surface analysis, and loop detection[D]. Örebro universitet, 2009.

    3. 论文2部分翻译:https://blog.csdn.net/qq_23225073/article/details/89221098

    4. KD树介绍:https://leileiluoluo.com/posts/kdtree-algorithm-and-implementation.html

    展开全文
  • 点多的时候效果比较好,因为每两个点之间是直线连接。曲线的颜色是从起点到终点渐变的~ function [ ] = DrawColorfulCurve( PointList, startPointColor,endPointColor,circleRadius) %DRAWCOLOR...

    写论文时候,可能会用到绘制空间曲线。这里给出一个自己写的matlab函数,用于将一组离散的3D点绘制成空间曲线。点多的时候效果比较好,因为每两个点之间是直线连接。曲线的颜色是从起点到终点渐变的~

    function [  ] = DrawColorfulCurve( PointList, startPointColor,endPointColor,circleRadius)
    %DRAWCOLORFULCURVE 绘制从起点到终点颜色渐变的空间曲线
    %PointList :3D point array
    %startPointColor: the color of starting point
    %endPointColor: the color of end point
    %circleRadius: the tadius of starting and end points
    % Below is some default params
    
    if(nargin<2)
        startPointColor = [1,0,0];
        endPointColor = [0,1,0];
        circleRadius=50;
    elseif(nargin<4)
        circleRadius=50;
    end
    
    % the main function body
    [PointNUM, temp]  = size(PointList);
    colorStep = (endPointColor-startPointColor)/(PointNUM-1);
    for i=1:PointNUM-1
        plot3(PointList(i:i+1,1),PointList(i:i+1,2),PointList(i:i+1,3),'color',colorStep*(i-1)+startPointColor); 
        hold on
    end
    hold on
    scatter3(PointList(1,1),PointList(1,2),PointList(1,3),circleRadius,startPointColor);
    hold on
    scatter3(PointList(PointNUM,1),PointList(PointNUM,2),PointList(PointNUM,3),circleRadius,endPointColor);
    end
    clear all
    PointList =load('TrajectoryData.txt');
    DrawColorfulCurve(PointList);
    grid on

    给出一个参考数据点文件,绘制效果如下图。

    链接: https://pan.baidu.com/s/1lPBEU5uvPUvqtClo2gbFvA 密码: kd8x

     

    展开全文
  • ps:一周每天下班熬到一两点就整这了。所谓笨鸟先飞,写博客一起起飞,其中不足之处还请指正。 首先装文件目录: ccs5.5版本(CCS5.5.0.00077_win32) 安装在ccs目录下的: bios_setupwin32_6_37_03_30 ti...
  • 前言今天我们来聊聊轨迹插值,在机器人的运动规划和控制...本文所涉及的代码全部开源,提供Matlab和Python两个版本,仓库地址详见文末。首先,我们定义一下问题:如下图所示,给定一些离散的数据,我们需要通过...
  • MATLAB绘图总结

    千次阅读 多人点赞 2021-01-31 18:56:03
    目录一些常用的MATLAB绘图方法二维图像绘制三维作图 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 一些常用的MATLAB绘图方法 ...MATLAB中最常用的两个二维函数绘制函数plot()和fplot() pl
  • Matlab 数据可视化

    千次阅读 2019-01-18 13:35:11
    图形绘制的基本概念 一个二元实数坐标(x,y)就可以对应平面上的一个点。 绘制一个点: 线是由连续的点组成的。...Matlab只能实现有限区间内的数据可视化。...2.把每两个离散点用直线连接,以每两个离散...
  • 9 多目标Pareto最优解搜索算法(胡斐) 多目标优化是指在约束条件下有两个两个以上的优化目标,而且这些目标之间相互矛盾,不能同时达 到最优,也就是说,一个目标的最优往往是以牺牲其它目标作为代价的,因此多...
  • Matlab-拓扑图绘制

    千次阅读 2020-08-06 18:32:22
    这是8节点的全连接拓扑,即任意两点之间均连接,但连接的权重不同,在图上主要呈现的是 拓扑连接关系:全连接 标记节点的名称:1, 2,…, 8 标记连接权重:0.28125, 0.42188,… 连接权重越大,连接线越粗 连接线的...
  • 需要使用两个矩阵来表示之间的连接关系(也就是R与C) 比如 R=[1 1 2 2 3 4 4 5 5 6 6];% 起始节点向 C=[2 6 3 5 4 1 6 3 4 2 5]; % 终止节点向量 表示1与2之间有边可以连接,1和6之间也有边连接。 对于稀疏矩阵...
  • matlab实现换行

    千次阅读 2013-09-20 17:01:35
    个点前要有一个空格,这样matlab才能把...识别成换行符号;另外,这几种换行操作有区别: (1)... , 起到连接两行的目的,也就是说,实际上是一个命令分开写而已,比如 a=1+2 ... +3 结果会是 a=6。 (2)...
  • matlab初涉

    2018-01-22 14:42:27
    一 绘图 二 图像处理之计算出米粒数 米粒过大是两个米粒连接在一起了 米粒过小是小白 三 数据拟合
  • matlab学习笔记 2

    2010-08-16 18:52:00
    连接行(三个点)!调用操作系统命令,!ping www.baidu.com‘字符串标识符% 注释标识符2。运算中常见的命令clc 类似于cls命令cd 显示工作目录 clear 清理内存中的变量3。基本数据类型及matlab中自定义变量3.1 matlab...
  • matlab语言丰富的图形表现方法使得数学计算结果可以方便地多样性地实现了可视化这是其它语言所不能比拟的 一二维绘图 一plot 最基本的二维图形指令 plot的功能 plot命令自动打开一图形窗口Figure 用直线连接相邻...
  • dubins曲线是在满足曲率约束和规定的始端和末端的切线方向的条件下,连接两点的最短路径。计算方法:1. 给定起始终点位置和末端切线,并且设定最小转弯半径r。2. 坐标转换,以起始作为原点,起始到结束向量...
  • 问 题求上图V1至个点的最短路径。...每个节点表示一个实体,每个边表示两个节点之间的连接。有关详细信息,一般分为有向图和无向图。该问题先构造各节点的邻接矩阵,以V1节点为例,V1至V1至为0,至V2为1,至V3为...
  • MATLAB被称为矩阵实验室,这就意味着他具有十分强大的图像处理功能。...其中x设置了自变量x为从0到2PI,每一连接点为0.01,即MATLAB换函数图形也是将函数值一个连接起来,这就0.01表示每隔0.01确定一
  • 学了一天最小生成树,稍稍总结一下,这是第一篇kruskal算法关于kruskal算法已有大量的资料,不再赘述,算法流程为:得到邻接矩阵和权值;...下面给出两个子函数,一个用于寻找根节点(RootNode),一个用...
  • Dijkstra算法及其matlab实现

    万次阅读 2018-09-05 20:17:01
    图论中的图是由若干给定的连接两点的线所构成的图形,这种图形通常用来描述某些事物之间的某种特定关系,用代表事物,用连接两点的线表示相应两个事物间具有这种关系。 一个图可以用数学语言描述为G(V(G),E(G...
  • MATLAB插值函数interp1

    万次阅读 多人点赞 2017-04-15 00:51:02
    插值法  插值法又称“内插法”,是利用函数f (x)在某区间中已知的若干的函数值,作出适当的特定函数,在区间的... 线性插值法是指使用连接两个已知量的直线来确定在这两个已知量之间的一个未知量的值的方法。  
  • Voronoi图及matlab实现

    千次阅读 2019-10-05 01:47:00
    Voronoi图,又叫泰森多边形或Dirichlet图,它是由一组由连接两邻点直线的垂直平分线组成的连续多边形组成。N个在平面上有区别的点,按照最邻近原则划分平面;每个点与它的最近邻区域相关联。Delaunay三角形是由与...
  • 这里有一点一定要注意,因为为无向图,因此邻接矩阵一定要是关于对角线对称的,即Aij=Aji(且对角线上元素Aii=0),两点之间相互无向连接,有向图可以不为对称矩阵(有方向) 方法及函数: 1.推荐matlab图论很...
  • MATLAB】创建网格图和曲面图

    千次阅读 2019-08-20 13:35:40
    文章目录关于网格图和曲面图可视化包含两个变量的函数绘制正弦函数彩色曲面图将曲面图设置为透明 关于网格图和曲面图 MATLAB® 在 x-y 平面中的网格上方使用的 z 坐标来定义曲面图,并使用直线连接相邻的。mesh ...
  • MATLAB可视化-连续数据绘图

    千次阅读 2019-04-16 22:05:46
    2.把每两个离散用直线连接,近似表示两个离散之间的函数特征 clear all; x1=(0:12)*pi/6; %把2pi分割成了12份 y1=cos(3*x1); x2=(0:360)*pi/180 %把2pi分割成了360份 y2=cos(3*x2); figure;%创建一个新的...
  • VSC-HVDC的matlab模型

    2018-10-30 09:11:38
    描述 200 MVA(+/- 100 kV DC)强制换向电压源转换器(VSC)互连用于将功率从230 kV,2000 MVA,50 Hz系统传输到另一个相同的AC...请注意,模型的“模型初始化”功能会自动在MATLAB®工作空间中设置这两个采样时间。
  • Matlab知识小结

    2018-06-17 12:03:00
    1 %元素级乘法,要执行元素级乘法(而非矩阵乘法),请使用 .* 运算符: 2 %要将数值转换为字符,请使用num2str或int2str等函数 ... 4 %%subplot 的前两个输入表示每行每列的绘图数,第三个输入...
  • Plot(X,Y) 最基本的二维图形命令 plot命令自动打开一个图形窗口Figure1 原理 用直线连接相邻两数据来绘制图形 根据图形坐标大小自动缩扩坐标轴,将数据标尺及单位标注自动加到两个坐标轴上 使用方法: (1) X, Y都是...

空空如也

空空如也

1 2 3 4 5 6
收藏数 101
精华内容 40
关键字:

matlab连接两个点

matlab 订阅