输入参数

  • 点云A的极坐标集合
  • 点云A对应Lidar所在pose
  • 点云B的极坐标集合
  • 点云B对应Lidar所在pose

Features

  • 根据两个点云的弧度关系确定找点的起始位置
  • 根据两个点云的弧度关系设置找点的停止条件
  • 算出被投影点云的大跳小跳表,根据大跳小跳表来遍历点云

大跳小跳表(假设点云A中间点为a点)

建立大跳小跳表的前提点云的弧度是递增的

理论上来说当点云A的所有点的弧度都一样,那么点云A中长度和b点长度相同的点,距离最近

a点一共有两个大跳表和两个小跳表:

序号比a点小的点 序号比a点小的点 序号比a点大的点 序号比a点大的点
小跳表1(有序) 大跳表1(有序) 小跳表2(有序) 大跳表2(有序)
长度比a短 长度比a长 长度比a短 长度比a长

前提

  1. 输入参数点云的极坐标的弧度是有序的(这里的有序不是说弧度是递增或者递减,而是说点是Lidar顺时针或者逆时针扫了一圈出来
  2. 不同弧度上的任意两点长度越接近,距离越近
  3. A和C之间区取余角,Lsin(余角)是A点距离CC'这条线最近距离

步骤

  1. 过滤原始数据的无效点

    a. 原始数据中长度为0(或者近似)的点标记为无效

    b. 原始数据中长度过长(超出Lidar扫描能里的点)标记为无效

    c. 使用滑窗(2cm),每次滑窗内的点合并成一个点(x和y取平均值)
  2. 找出点云A和点云B各自的最小弧度和最大弧度
  3. 排序点云(原始数据的有序请看前提1),排序结果为弧度递增
  4. 转换两个点云各自的迪达尔坐标
  5. 计算两个点云对应Lidar pose的差
  6. 根据Lidar pose的差,将点云B投影到点云A为C,算出C的笛卡尔坐标
  7. 建立点云A的大跳小跳表
  8. 算出点云A每弧度的点数量NumA
  9. 遍历点云C的每个点X

    a. 算出X的极坐标

    b. 算出X点弧度和点云A最小弧度的差值,然后乘以NumA,得到的结果cur_idx是遍历点云A的起始点序号

    c. 如果保存了X的前一点在点云A最近点的序号last_beat_idx,那么X点就从last_beat_idx+1开始在点云A上找最近点,cur_idx=last_beat_idx+1

    d. 从X点的分别向前向后查找最近点,每次遍历都保存目前找到的最近距离dist(根据大跳小跳表遍历)

    e. 算出点云A任意一点a和X的弧度差raX,然后用X的长度做斜边,算出和X点弧度相差raX的点的距离best_dist(最近距离),一旦之前存在dist <= best_dist,那么就认为找到了最近点D
  10. 找到最近点D之后,算出点D前一个点D1和后一个点D2分别距离点X的距离,距离更短的点就认为是距离点X第二最近的点

未完

一对多

plicp 点云迭代最近邻点配准法的更多相关文章

  1. 【第1期】腾讯云的1001种玩法征集,Ipad mini和Kindle 等你拿!(文章评审中)

    版权声明:本文由阁主的小跟班原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/695994001482226944 来源:腾云 ...

  2. 【腾讯云的1001种玩法】几种在腾讯云建立WordPress的方法(Linux)(二)

    版权声明:本文由张宁原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/126547001488207964 来源:腾云阁 ht ...

  3. MATLAB用二分法、不动点迭代法及Newton迭代(切线)法求非线性方程的根

    MATLAB用二分法.不动点迭代法及Newton迭代(切线)法求非线性方程的根 作者:凯鲁嘎吉 - 博客园http://www.cnblogs.com/kailugaji/ 一.实验原理 二.实验步骤 ...

  4. 【腾讯云的1001种玩法】在腾讯云上创建您的SQL Cluster(5)

    版权声明:本文由李斯达 原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/97264001482830465 来源:腾云阁 h ...

  5. 【腾讯云的1001种玩法】腾讯云搭建DiscuzX论坛

    版权声明:本文由艾可德原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/506828001481866457 来源:腾云阁 h ...

  6. for循环语句以及迭代法和穷举法

    循环语句: 四要素:初始条件,循环条件,状态改变,循环体 for(初始条件;循环条件;状态改变){ //循环体} 案例1:打印等腰直角三角形和菱形 左上三角 static void Main(stri ...

  7. 【腾讯云的1001种玩法】 Laravel 整合万向优图图片管理能力,打造高效图片处理服务

    版权声明:本文由白宦成原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/574549001488234358 来源:腾云阁 h ...

  8. 【腾讯云的1001种玩法】 Laravel 整合微视频上传管理能力,轻松打造视频App后台

    版权声明:本文由白宦成原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/108597001488193402 来源:腾云阁 h ...

  9. 作业:for循环,迭代法和穷举法

                                                    for()循环 四要素:初始条件,循环条件,状态改变,循环体. 执行过程:初始条件--循环条件--循环体 ...

随机推荐

  1. 什么是B+树??

    上一篇中,我们了解了B树,辣么..B+树又是什么呢?? 一:定义:B+树是基于B树的,是B树的变形,也是一种多路搜索树.查询性能更加出色. 1.每个父节点元素出现在子节点中,是子节点的最大或最小元素. ...

  2. SpringMvc中函数的返回值是什么?

    返回值可以有很多类型,有String, ModelAndView.ModelAndView类把视图和数据都合并的一起的,但一般用String比较好.

  3. Java有没有goto?

    goto 是Java中的保留字,在目前版本的Java中没有使用.(根据James Gosling(Java之父)编写的<The Java Programming Language>一书的附 ...

  4. 说几个 zookeeper 常用的命令?

    常用命令:ls get set create delete 等.

  5. 数据库之“日期处理函数:date_add()与 date_sub()与 datediff()与 timedifff()与 date_format()”

    一.加减某个时间间隔:date_add()与 date_sub()函数 1. date_add() :加 select date_add('2019-12-12', interval 1 day) d ...

  6. 聊一聊Java8 Optional,让你的代码更加优雅

    码农在囧途 随着时间的推移,曾经我们觉得重要的东西,可能在今天看来是如此的浅薄和无知,同理,今天我们放不下,想不开,觉得重要的东西,多年后我们可能也会觉得也就那样,所以,今天的的所有烦恼,忧愁,想不开 ...

  7. python-杨辉三角形

    [题目描述]输出n(0<n)行杨辉三角形,n由用户输入. [练习要求]请给出源代码程序和运行测试结果,源代码程序要求添加必要的注释. [输入格式]一行中输入1个整数n. [输出格式]输出n行杨辉 ...

  8. Python窗口学习之浅尝按键触发事件

    一.窗口上敲键盘触发事件(以Enter键为例) 二.点击窗口按钮触发事件(以鼠标左键双击为例) 代码: import tkinter as tk root = tk.Tk() root.geometr ...

  9. java中接口interface可以持有多个类的共享常量

    3.接口持有多个类的共享常量  接口另一主要功能,马克-to-win: 可以使用接口来引入多个类的共享常量.所有的这些变量名都将作为常量看待.所有定义在接口中的常量都默认为public.static和 ...

  10. Unknown host mirrors.opencas.cn You may need to adjust the proxy settings in Gradle 报错及解决办法

    亲测Unknown host mirrors.opencas.cn You may need to adjust the proxy settings in Gradle 解决办法 - 程序员大本营 ...