AMCL 激光测量模型

article/2025/9/17 8:06:08

一、似然域模型 likelihood_field model

1、原理

       它是一种“特设(ad hoc)”算法,不必计算相对于任何有意义的传感器物理生成模型的条件概率。而且,这种方法在实践中运行效果良好。即使在混乱的空间,得到的后验也更光滑,同时计算更高效。

       主要思想是将传感器扫描的终点z_{t}映射到栅格地图。计算与栅格地图最近障碍之间的距离。

 

           

 

2、代码

double AMCLLaser::LikelihoodFieldModel(AMCLLaserData *data, pf_sample_set_t* set)
{AMCLLaser *self;int i, j, step;double z, pz;double p;double obs_range, obs_bearing;double total_weight;pf_sample_t *sample;pf_vector_t pose;pf_vector_t hit;self = (AMCLLaser*) data->sensor;total_weight = 0.0;// Compute the sample weightsfor (j = 0; j < set->sample_count; j++){sample = set->samples + j;pose = sample->pose;//遍历每个粒子,这是粒子对应的位姿,是经运动模型更新后的先验位姿// Take account of the laser pose relative to the robotpose = pf_vector_coord_add(self->laser_pose, pose);p = 1.0;// Pre-compute a couple of thingsdouble z_hit_denom = 2 * self->sigma_hit * self->sigma_hit;//测量噪声的方差double z_rand_mult = 1.0/data->range_max;// 随机测量相关,1/雷达最大距离step = (data->range_count - 1) / (self->max_beams - 1);// 总角度/间隔大小// Step size must be at least 1if(step < 1)step = 1;//遍历激光点数,间隔选点,因为计算时间原因for (i = 0; i < data->range_count; i += step){obs_range = data->ranges[i][0];//距离obs_bearing = data->ranges[i][1];//角度// This model ignores max range readingsif(obs_range >= data->range_max)continue;// Check for NaNif(obs_range != obs_range)continue;pz = 0.0;// Compute the endpoint of the beamhit.v[0] = pose.v[0] + obs_range * cos(pose.v[2] + obs_bearing);hit.v[1] = pose.v[1] + obs_range * sin(pose.v[2] + obs_bearing);// Convert to map grid coords.//激光点云世界坐标转换至栅格坐标int mi, mj;mi = MAP_GXWX(self->map, hit.v[0]);mj = MAP_GYWY(self->map, hit.v[1]);// Part 1: Get distance from the hit to closest obstacle.// Off-map penalized as max distanceif(!MAP_VALID(self->map, mi, mj))//检测当前激光点是否已经超出栅格地图范围z = self->map->max_occ_dist;elsez = self->map->cells[MAP_INDEX(self->map,mi,mj)].occ_dist;//当前激光点与最近障碍物栅格之间的距离// Gaussian model// NOTE: this should have a normalization of 1/(sqrt(2pi)*sigma)pz += self->z_hit * exp(-(z * z) / z_hit_denom);// Part 2: random measurementspz += self->z_rand * z_rand_mult;// TODO: outlier rejection for short readingsassert(pz <= 1.0);assert(pz >= 0.0);//      p *= pz;// here we have an ad-hoc weighting scheme for combining beam probs// works well, though...p += pz*pz*pz;}sample->weight *= p;total_weight += sample->weight;}return(total_weight);
}

z 越大,pz 越小,粒子权重越小。

二、波束模型 beam model

1、原理

这里的模型采用四类测量误差,所有这些对使模型工作很重要。这四类误差包括小的测量噪声、意外对象引起的误差,以及由于未检测到对象引起的误差和随机意外噪声。因此,期望模型是四个密度的混合,每一中密度都与一个特定类型的误差有关。

1)具有局部测量噪声的正确范围。在一个理想世界中,一个测距仪总是测量位于其测量领域内的最近物体的正确距离。距离

可由射线投射(ray casting)来确定。实际是由当前激光点的位置,在其射线方向上搜索障碍物栅格得到的。这个测量噪声通常由一个窄的均值为、标准偏差为的高斯建模。

测量概率由以下公式给出:

                                          

                                                 

归一化因子\eta为:

                                                       

2)意外对象。移动机器人的环境是动态的,而地图m是静态的。因此,地图中不包含的对象可能引起测距仪产生惊人的短距离——至少与地图相比时。典型的移动机器人就是与机器人共享操作空间的人。处理这类对象的一种方法是将它们作为状态向量的一部分来对待并估计它们的位置;另一种更简单的方法是将它们作为传感器噪声来处理。作为传感器噪声来处理,未建模对象具有这样的特性,即它们会导致比更短而不是更长的距离。

                  

3)检测失败。有时环境中障碍会被完全忽略。例如,在声呐传感器遇到了镜面反射时,会经常发生此情况。当用激光测距仪检测到黑色吸光的对象时,或者某些激光系统在明媚的阳光下测量物体时,也会发生检测失败。传感器检测失败的典型结果是最大距离测量问题:传感器返回它的最大允许值z_{max}。由于这样的时间经常发生,那么在测量模型中明确地建立最大测量范围的模型就很必要。

        下面将用一个以z_{max}为中心的点群分布来建立这种情况的模型:

                                                 

4)随机测量。最后,测距仪偶尔会产生无法解释的测量。例如,当超声波被几面墙反弹或者它们受到不同传感器之间的串扰时,声呐常产生幻读。为了使之简单化,对于这样的测量,这里将使用一个分布在完整传感器测量范围[0; z_{max}] 的均匀分布来建立模型:

                                                          

                 

                                   

实际考虑

波束模型的局限 

 

2、代码

double AMCLLaser::BeamModel(AMCLLaserData *data, pf_sample_set_t* set)
{AMCLLaser *self;int i, j, step;double z, pz;double p;double map_range;double obs_range, obs_bearing;double total_weight;pf_sample_t *sample;pf_vector_t pose;self = (AMCLLaser*) data->sensor;total_weight = 0.0;// Compute the sample weightsfor (j = 0; j < set->sample_count; j++){sample = set->samples + j;pose = sample->pose;// Take account of the laser pose relative to the robotpose = pf_vector_coord_add(self->laser_pose, pose);p = 1.0;step = (data->range_count - 1) / (self->max_beams - 1);for (i = 0; i < data->range_count; i += step){obs_range = data->ranges[i][0];//真实测量距离obs_bearing = data->ranges[i][1];//角度// Compute the range according to the mapmap_range = map_calc_range(self->map, pose.v[0], pose.v[1],pose.v[2] + obs_bearing, data->range_max);pz = 0.0;// Part 1: good, but noisy, hitz = obs_range - map_range;pz += self->z_hit * exp(-(z * z) / (2 * self->sigma_hit * self->sigma_hit));// Part 2: short reading from unexpected obstacle (e.g., a person)if(z < 0)pz += self->z_short * self->lambda_short * exp(-self->lambda_short*obs_range);// Part 3: Failure to detect obstacle, reported as max-rangeif(obs_range == data->range_max)pz += self->z_max * 1.0;// Part 4: Random measurementsif(obs_range < data->range_max)pz += self->z_rand * 1.0/data->range_max;// TODO: outlier rejection for short readingsassert(pz <= 1.0);assert(pz >= 0.0);//      p *= pz;// here we have an ad-hoc weighting scheme for combining beam probs// works well, though...p += pz*pz*pz;}sample->weight *= p;total_weight += sample->weight;}return(total_weight);
}

 


http://chatgpt.dhexx.cn/article/b9XDF2CV.shtml

相关文章

Ansys Zemax | 使用OpticStudio进行闪光激光雷达系统建模(下)

在消费类电子产品领域&#xff0c;工程师可利用激光雷达实现众多功能&#xff0c;如面部识别和3D映射等。尽管激光雷达系统的应用非常广泛而且截然不同&#xff0c;而“闪存激光雷达”解决方案适用于在使用固态光学元件的目标场景中生成可检测的点阵列。 凭借在针对小型封装获…

相机+激光雷达重绘3D场景

将激光雷达与相机结合&#xff0c;再通过深度学习的方式获得场景的3D模型——Ouster首席执行官在博客中介绍了相机OS-1&#xff0c;并装有激光雷达。LiveVideoStack对原文进行了摘译。 文 / Angus Pacala. Ouster 译 / 王月美 技术审校 / 田栋 原文 https://medium.com/ouster…

2020年亚太杯数学建模竞赛赛题

https://download.csdn.net/download/Suger_Lover/46133529https://download.csdn.net/download/Suger_Lover/46133529https://download.csdn.net/download/Suger_Lover/46133529

PSpice仿真之建模-以半导体激光器为例

PSpice仿真之建模 第一篇原创博客&#xff0c;来点干货~最近应同学之托&#xff0c;解决一个PSpice建模问题&#xff0c;在解决过程中遇到很多问题&#xff0c;于是想写下来&#xff0c;后来者少走弯路哈。这里以半导体激光器为例&#xff0c;讲PSpice的建模。 PSpice是啥&am…

如何保证三维激光扫描的测量精度?

非接触式扫描是三维扫描技术中的一个重要分支&#xff0c;具有检测速度快、零接触等优势&#xff0c;可以将复杂、不规则的物体三维点云数据采集到电脑中&#xff0c;并快速构建出三维模型。如今&#xff0c;三维激光扫描测量技术在文物、建筑等行业都有了成功的应用案例。 在…

激光雷达应用案例|仓储3D体积量方测量

在物流、仓储等工业行业中&#xff0c;获取物品体积数量、掌握物品出入库情况对生产库存管理具有重要意义。 以煤炭仓储及生产领域煤炭体积测量为例&#xff0c;为了解煤炭出入库情况&#xff0c;通常依靠人力手持全站仪进行人工煤炭体积监测。然而这一传统解决方案始终面对着技…

数学建模——光盘的数据容量

1、背景和问题 &#xff08;1&#xff09;20世纪80年代出现激光唱片&#xff08;CD&#xff09;与激光视盘&#xff08;LD&#xff09;&#xff0c;统称为光盘。 &#xff08;2&#xff09;20世纪90年代出现数字视频光盘&#xff08;DVD&#xff09;。 &#xff08;3&#x…

管网三维激光扫描建模_BIM建模_可视化平台_吉优赛维数字孪生

这几年我国的能源领域已经得到了飞速的发展基础&#xff0c;基础建设也得到了长效的发展&#xff0c;那么现在在石油天然气的运输过程当中&#xff0c;是否已经做到了没有任何的后患之忧了呢&#xff1f;实际上现在的传统人工管理方式还是存在很大程度上的安全盲区的&#xff0…

LaserMaker激光建模软件V1.6.40 更新说明

尊敬的LaserMaker用户&#xff0c;LaserMaker进行了版本更新&#xff0c;新版本为V1.6.40&#xff0c;欢迎您下载使用 LaserMakerV1.6.40下载地址&#xff1a;LaserMaker 新增功能 1.打断线段 橡皮擦工具下新增打断线段功能&#xff0c;同一图案分别设置不同加工工艺更方便…

自制三维激光扫描建模

看图片就是我做的东西&#xff0c;很炫酷是不是。 好吧&#xff0c;开玩笑&#xff0c;这是电影普罗米修斯的截图。 当初看这个电影的时候就感觉这东西好眩酷&#xff0c;我能不能做出来。最近借着帮做毕业设计的机会我也做了一个。 就是这个丑丑的东西啦~ 首先感谢来自CSK的…

Ansys Zemax | 使用 OpticStudio 进行闪光激光雷达系统建模(上)

前言 在消费类电子产品领域&#xff0c;工程师可利用激光雷达实现众多功能&#xff0c;如面部识别和3D映射等。尽管激光雷达系统的应用非常广泛而且截然不同&#xff0c;但是 “闪光激光雷达” 解决方案通常都适用于在使用固态光学元件的目标场景中生成可检测的点阵列。凭借具…

复杂建筑物三维激光扫描与室内外精细建模的科普解析

如今&#xff0c;随着科技的进步&#xff0c;复杂建筑物的三维激光扫描与室内外精细建模成为了现实。本文将通过简洁易懂的方式&#xff0c;介绍这一技术的原理、应用和操作过程&#xff0c;并引用可靠数据和研究成果进行支持&#xff0c;以确保准确性和可信度。 第一部分&…

真实多模激光的建模

作者&#xff1a;Daniel Asoubar&#xff08;LightTrans&#xff09; 相关文件&#xff1a;Tutorial_101.01&#xff0c;Snippet_028 需求&#xff1a;VirtualLab™5.11.1-基本工具箱 许可证&#xff1a;CC-BY-SA 3.0 摘要 1). 这个案例展示了如何在VirtualLab中对一个真…

nohup启动jar_nohup命令详解

nohup命令详解 在我们想要把SpringBoot微服务工程部署到远程服务器时&#xff0c;会通过java -jar springboot.jar的方式启动SpringBoot微服务。但是当我们把运行这个命令的SSH客户端退出登录就会导致SpringBoot进程也一起停止了&#xff0c;然后当然就没法访问我们启动的项目了…

Linux-nohup命令详解

场景 今天在linux上部署wdt程序&#xff0c;在SSH客户端执行./start-dishi.sh,启动成功,在关闭SSH客户端后&#xff0c;运行的程序也同时终止了&#xff0c;怎样才能保证在推出SSH客户端后程序能一直执行呢&#xff1f;通过网上查找资料&#xff0c;发现需要使用nohup命令。 …

c语言连续生成不同随机数_C语言连续生成多个随机数(可限制范围)

生成随机数 在现实中我们经常用到随机数&#xff0c;可怎么实现呢&#xff0c;且听小乔慢慢道来。 在C语言中&#xff0c;我们一般使用 头文件中的 rand() 函数来生成随机数 int void rand() 可是却发现生成的数字都一样。 这是因为rand() 函数产生的随机数是伪随机数&#xff…

c语言不用随机数种子,C语言的随机数与随机种子

引言&#xff1a; 在实际编程中&#xff0c;我们经常会用到随机数这个概念&#xff0c;其实也是一个伪随机数&#xff0c;实际上并不是一个真正的随机数&#xff0c;但是也足够我们使用了。在C语言中&#xff0c;编写一些关于游戏之类的程序时就需要用到随机数了。同时C语言也提…

C 语言随机数

1. 随机数概述 编写程序过程中&#xff0c;我们经常需要产生一些随机数。随机数在程序中分为两种&#xff1a; 真随机数&#xff1a;完全没有规则&#xff0c;无法预测接下来要产生的数。 伪随机数&#xff1a;通过一些预先设定好的规则产生不能简单预测的数。 当然&#xff0…

产生瑞利分布的随机数 C语言实现

瑞利分布的概率密度函数为 瑞丽分布的均值为,方差为 首先使用逆变换法产生参数的指数分布的随机变量,其概率密度函数为 然后通过变换&#xff0c;产生瑞丽分布的随机变量x&#xff0c;具体的方法如下&#xff1a; &#xff08;1&#xff09;产生均匀分布的随机数 &#xff…

产生(a,b)区间上均匀分布的随机数 C语言实现

uniform.h文件 #ifndef UNIFORM_H_ #define UNIFORM_H_/* 函数功能&#xff1a; 产生&#xff08;a,b&#xff09;区间上均匀分布的随机数组 输入参数说明&#xff1a; a 给定区间的下限 b 给定区间的上线 seed 长整型指针变量&#xff0c; *seed 为伪随机数的种子 */ doubl…