AMCL
文章平均质量分 75
一叶执念
这个作者很懒,什么都没留下…
展开
-
AMCL代码详解(七)amcl中的kd-Tree
在amcl中,对于每个粒子滤波器对象都有两个粒子集合,该粒子集合是为后续Resampling时,能将其中一个粒子集合作为缓存集合使用。但是由于每个粒子集合中包含的粒子数量很大(比如5000个粒子,可自定义),因此每个粒子的权重即使在多次Resampling之后都还是很小,并且这也将导致位置上相邻的粒子的权重差值不大,从而使粒子滤波器在最后输出预测位姿时不准确。为了解决这个问题,在Ros的代码中便引入了一个新的结构体(Cluster)原创 2022-11-09 11:03:33 · 417 阅读 · 0 评论 -
AMCL代码详解(六)amcl中的重采样
每次都从w1左边的竖线开始转,显而易见,转到w1的概率为0-w1之间的随机数,转到w2的概率为w1到w1+w2之间的随机数,转到w3的概率为w1+w2到w1+w2+w3之间的随机数,后面的依次类推。当某个粒子的权值较大的时候,产生的随机数落在相应区间的概率就会增大,从而实现了对权值大粒子的多次复制,权值小的粒子的剔除。可以看出,在整个重采样的过程中,粒子进行了两次种情况的刷新,一种是随机生成的新的粒子,一种是对原来的粒子的复制。得到的值越大,说明粒子的权重越小,当前粒子的可信度比较小,需要重采样粒子。原创 2022-10-31 10:34:53 · 951 阅读 · 0 评论 -
AMCL代码详解(五)根据激光观测更新粒子权重
上一篇中讲述了里程计在amcl中的作用,算法根据里程计反馈对每个粒子的位姿进行更新。在粒子更新后,则需要根据激光的观测数据对粒子的权重进行更新,这里主要看一下激光电云在amcl中的作用:原创 2022-10-08 11:16:05 · 1081 阅读 · 0 评论 -
AMCL代码详解(四)根据运动更新粒子位姿
AMCL中粒子的运动更新函数在AmclNode::laserReceived函数中进行调用,当接收到正常的激光点云后调用里程计更新函数对每个粒子的位姿进行运动更新,具体实现是在amcl_odom.cpp函数中的AMCLOdom::UpdateAction:原创 2022-09-30 09:03:52 · 525 阅读 · 0 评论 -
AMCL代码详解(二)位姿初始化
AMCL的初始位姿估计可以来自于两个地方:1.用粒子滤波算法估计出的机器人位姿作为最新的位姿在AmclNode::AmclNode() 中参数设置完后首先调用了这么一个函数:updatePoseFromServer();跳到该函数看一下:void AmclNode::updatePoseFromServer(){ init_pose_[0] = 0.0; init_pose_[1] = 0.0; init_pose_[2] = 0.0; init_cov_[0] = 0.5 *原创 2022-05-08 18:22:38 · 2627 阅读 · 0 评论 -
AMCL代码详解(一)
AMCL是移动机器人中应用较为广泛的一种定位算法,也算是在ROS中被广泛使用的一种开源算法了。它的核心还算是比较好理解的,主要包括了以下几个部分:1.位姿初始化AMCL的初始位姿估计可以来自于两个地方:第一种是用好粒子滤波算法估计出的机器人位姿p作为last_publishedpose存储备用。updatePoseFromServer();//从参数服务器中获取初始位姿,这个位姿可以来自于之前节点关闭时存储于服务器中的数据,没有的话默认为原点第二种是订阅initialpose的pose,经过in原创 2022-05-04 20:44:05 · 1821 阅读 · 0 评论 -
AMCL代码详解(三)创建粒子模型
AMCL中创建粒子模型的方式有两种:1.高斯分布模型第一种方式的模型主要使用了高斯模型去建立了一系列粒子点:// // 使用高斯模型(均值,协方差)初始化滤波器 void pf_init(pf_t *pf, pf_vector_t mean, pf_matrix_t cov){ int i; //创建粒子sample集set,粒子sample对象,概率密度函数pdf //pf_sample_set_t中包含了位姿权重,kd树,簇等多个因素 pf_sample_set_t *set;原创 2022-09-10 11:45:00 · 474 阅读 · 0 评论