1.7.AMCL包源码分析 | 粒子滤波器模型与pf文件夹(三)
2.UE4-Slate源码学习(四)FSceneViewport
3.GridSample算子源码解析
4.5.AMCL包源码分析 | 粒子滤波器模型与pf文件夹(一)
7.AMCL包源码分析 | 粒子滤波器模型与pf文件夹(三)
在上一讲中,源码我们深入探讨了pf.cpp文件,源码它将Augmented-MCL算法和KLD-sampling算法融合使用。源码重点在于pf_pdf_gaussian_sample(pdf)函数、源码pf_init_model_fn_t初始化模型以及pf->random_pose_fn方法进行粒子初始化。源码粒子的源码説图谱源码插入和存储采用kd树数据结构,同时kd树也表达直方图的源码k个bins,通过叶子节点数展现。源码
本讲聚焦kd树在粒子滤波器模型中的源码作用(pf_kdtree.cpp)、概率密度函数pdf与特征值分解的源码关系(eig3.cpp、pf_vector.cpp)以及如何利用pdf生成随机位姿(pf_pdf.cpp),源码同时解释kd树与直方图的源码对应关系。
在概率密度函数pdf的源码创建中,我们首先定义一个高斯PDF结构体pf_pdf_gaussian_t,源码包含均值和协方差的源码描述,接着进行协方差矩阵的分解,通过Housholder算子和QR分解完成特征值分解过程。签到功能轨迹html源码
通过pdf结构体实现随机位姿的生成,具体在pf_pdf.cpp中pf_pdf_gaussian_sample函数实现,使用无均值带标准差的高斯分布进行生成。
kd树数据结构在pf_kdtree.cpp中定义,包括节点和树的初始化,以及新位姿的插入。kd树的插入依据树的性质,通过计算max_split、中位数和分支点维数来定位新节点位置。查找节点和计算给定位姿权重则通过kd树结构实现,最终将树中叶子节点打标签,以统计特性如均值和协方差计算整个粒子集。
kd树在AMCL中承担直方图功能,以叶子节点数目表示bin个数(k),概率密度函数pdf依赖于输入的均值和协方差生成,用于随机位姿的KDJ逃顶指标源码产生。此外,kd树还用于判断粒子集是否收敛。最后,kd树表达直方图的过程在pf.cpp中pf_update_resample函数中实现,而pf_resample_limit函数用于设定采样限制。
kd树在粒子滤波器模型中的作用包括存储粒子样本集、查找和插入新位姿,以及统计特性计算。概率密度函数pdf的使用除了初始化粒子位姿外,还有判断粒子收敛的作用。下一讲将探讨amcl_node.cpp的处理内容,包括初始位姿、激光数据和坐标系转换,以及粒子滤波器pf的运用。
UE4-Slate源码学习(四)FSceneViewport
即视口是引擎中显示游戏画面的SWidget控件,也是爆枪英雄源码教程编辑器中显示游戏内容的窗口。场景绘制视口(FSceneViewport)与SViewport绑定,用于场景渲染。鼠标捕获模式(EMouseCaptureMode)与鼠标锁定模式(EMouseLockMode)在项目设置中可配置,影响鼠标的交互。FSceneViewport事件处理包括鼠标按下(OnMouseButtonDown)、触摸开始(OnTouchStarted),事件响应后构造FReply,并更新几何体缓存、鼠标位置缓存。鼠标位置由绝对坐标转换为相对于视口的相对坐标。根据捕获状态和输入处理逻辑,事件最终被传递至PlayerController,通过PlayerInput管理。对于触摸输入,处理流程类似,调用InputTouch接口。onetool云代挂源码
移动事件(OnMouseMove)、触摸移动(OnTouchMoved)记录鼠标的Delta和NumMouseSample累计值,Tick时处理。ProcessAccumulatedPointerInput在Tick阶段调用,处理键盘、鼠标输入,相关流程见第二章。完成输入处理后,FEngineLoop调用FinishedInputThisFrame,最终在ProcessAccumulatedPointerInput中调用InputAxis,处理至PlayerController的InputAxis,存储在PlayerInput中。其他事件如鼠标释放(OnMouseButtonUp)、触摸结束(OnTouchEnded)同样遵循类似流程。
若SWidget为视口,执行相关事件调用至ViewportClient接口,进而触发输入系统(PlayerController、PlayerInput、InputComponent)。日常游戏开发中,通过视口事件实现如旋转相机、隐藏鼠标等操作。PlayerController提供三种模式(FInputModeUIOnly、FInputModeGameAndUI、FInputModeGameOnly),通过调整SViewport和ViewportClient参数,实现不同模式下的捕获、锁定、显隐鼠标功能。所讨论内容基于UE4版本4..2。
GridSample算子源码解析
PyTorch的GridSample算子,其核心功能是按给定的索引进行采样,具体如官方描述:从低分辨率的输入(input)根据流场grid生成高分辨率的输出(output)。
实现该算子的关键步骤是通过核心函数grid_sampler_2d_kernel进行二维数据处理。这个函数扮演了运算的桥梁,它处理输入数据和grid索引,以生成最终的高分辨率结果。
另一个关键方法是grid_sampler_compute_source_index,它负责计算grid中的每个索引在原始输入数据中的精确对应位置,这是生成采样结果的关键步骤。
在性能优化方面,可以考虑使用共享内存或L2缓存技术,例如,通过将频繁访问的数据如input、grid和output存储在这些高效存储区域,以减少内存访问时间和提高运算效率。
5.AMCL包源码分析 | 粒子滤波器模型与pf文件夹(一)
粒子滤波器这部分内容较为复杂,涉及众多理论与数据结构,我们将分多个部分进行介绍。本部分内容主要对pf文件夹进行简要分析,包括蒙特卡罗定位在pf中的代码实现、KLD采样算法的理论介绍及其在pf中的具体实现。
pf文件夹主要由以下部分组成:3✖3对称矩阵的特征值和特征向量的分解、kdtree的创建与维护方法、Gaussian模型与概率密度模型采样生成粒子、三维列向量、三维矩阵、实现pose的向量运算、局部到全局坐标的转换以及全局坐标到局部坐标的转换。
接下来,我们将对各个头文件进行简要分析。
粒子滤波器是AMCL定位的理论基础,属于粒子滤波的一种。关于粒子滤波的原理及代码效果演示,可以参考相关资料。
AMCL包中的粒子滤波器作用如下:首先,参考pf.cpp中的pf_update_action函数,了解sample_motion_model代码实现;其次,参考pf.cpp中的pf_update_sensor函数,了解measurement_model的代码实现。
AMCL引入KLD采样理论,对蒙特卡罗定位进行再次改进。参考《概率机器人》第8章,讨论粒子滤波器的效率及采样集大小的重要性。KLD采样是蒙特卡罗定位的一个变种,它能随时间改变粒子数,降低计算资源的浪费。
3.1 KLD_Sampling_MCL算法介绍:算法将以前的采样集合、地图和最新的控制及测量作为输入,要求统计误差界限err和sigma。在满足统计界限之前,KLD采样将一直产生粒子。算法产生新粒子,直到粒子数M超过Mx和使用者定义的最小值Mx(min)。
3.2 KLD采样算法在AMCL包中的具体应用:代码在pf.cpp中的pf_update_resample函数中实现。接下来,我们将详细分析pf文件夹里每个CPP文件的代码逻辑。
2024-11-20 20:06
2024-11-20 19:47
2024-11-20 19:45
2024-11-20 19:41
2024-11-20 19:21
2024-11-20 19:13
2024-11-20 18:30
2024-11-20 18:20