粒子重量更新似乎并不工作

5 Ansichten(30天)的
DarZim
DarZim 我2023年4月8日
Kommentiert: DarZim我2023年4月19日
你好,
我实现了一个2 d入住率地图和一个机器人模型。机器人将会在地图上移动。它配备了一个模拟激光雷达传感器。如果我让Matlab的蒙特卡罗定位功能运行,我的代码工作。粒子收敛于机器人的位置。然而,如果我检查过程中粒子权重,它们都是一样的。如果我有2000个粒子,所有2000个粒子总是有相同的重量。有人知道为什么这是或可能是什么问题?
我假设代码正常工作因为它并收敛。所以重量必须改变在后台没有我的知识。
代码的主要部分是在每个时间步的循环。最后Vehiclepose将被更新为下一个时间步。
(范围、角度)=激光雷达(Vehiclepose,地图);
扫描= lidarScan(范围、角度);
[isUpdated, estimatedPose estimatedCovariance] =制程(Vehiclepose,扫描);
(颗粒、重量)= getParticles(制程);
谢谢你!

Antworten (1)

Gokul Nath年代J
Gokul Nath年代J 我2023年4月19日
Bearbeitet:Gokul Nath年代J 我2023年4月19日
嗨DarZim,
根据我的理解,似乎整个模拟粒子权重是统一的。
如果所有2000个粒子具有相同的重量在蒙特卡洛定位过程中,那么它可能有一个错误在你实现粒子的权重更新步骤。
注意,粒子权重更新的可能性的基础上测量粒子的位置。一些可能的解释为什么下面列出了粒子在相同的权重,
  • 似然函数可能不正确地实现所有粒子或返回相同的值。
  • 你也可以尝试绘制每个粒子将测量的可能性是否存在任何模式或可能性的计算问题。
  • 测量噪声方差设置过低,这可能导致所有粒子有类似的可能性,因此类似的权重值。
  • 如果重新取样没有正确执行,这可能会导致所有粒子都有同样的重量。
谢谢,
Gokul Nath年代J
1 Kommentar
DarZim
DarZim 我2023年4月19日
嗨Gokul Nath J,
非常感谢你的回应。我同意你所说的。这是我的理解。然而,我比较相信我的代码是工作或者工作不正确,它至少仍是收敛的。这应该不会发生如果某事是错误的。
如果我情节机器人构成的2 d入住率地图和颗粒,我可以看到他们分散在整个地图和一些步骤之后,粒子收敛于机器人的位置。这就是为什么我很困惑。我觉得该算法工作但是如果我看我的重量,他们不改变。
这是我的模型前initialiaztion循环:
% %激光雷达
%模拟激光雷达传感器和检测角度设置为(-π/ 2π/ 2)
激光雷达= rangeSensor;
激光雷达。HorizontalAngle =(-π/ 2π/ 2);
SensorModel。NumBeams = 181;
%设置最小和最大值传感器的探测范围的米
lowerLimit = 0;
upperLimit = 30;
激光雷达。范围= [lowerLimit upperLimit];
%产生激光雷达数据
(范围、角度)=激光雷达(Vehiclepose,地图);
%存储和可视化的二维激光雷达扫描
扫描= lidarScan(范围、角度);
% % MonteCarloLocalization /粒子滤波
odometryModel = odometryMotionModel;
odometryModel。噪音= (0.4 - 0.4 0.4 - 0.4);
rangeFinderModel = likelihoodFieldSensorModel;
rangeFinderModel。SensorLimits = [lowerLimit upperLimit];
rangeFinderModel。NumBeams = 129;
rangeFinderModel。地图=地图;
rangeFinderModel。MeasurementNoise = 0.2;
制程= monteCarloLocalization;
恢复期。UseLidarScan = true;
恢复期。MotionModel = odometryModel;
恢复期。SensorModel = rangeFinderModel;
恢复期。UpdateThresholds = (0.4 0.4 0.4);
恢复期。ResamplingInterval = 1;
恢复期。ParticleLimits = (500 - 5000);
恢复期。GlobalLocalization = true;%如果错误:使用最初的姿势,如果这是真的:粒子均匀分布在整个地图
恢复期。InitialPose = Vehiclepose;
恢复期。InitialCovariance =眼(3)* 0.5;
和我的循环:
k = 1:尺寸(traj, 1)
clf
显示(图)
:Vehiclepose = traj (k);
(范围、角度)=激光雷达(Vehiclepose,地图);
扫描= lidarScan(范围、角度);
[isUpdated, estimatedPose estimatedCovariance] =制程(Vehiclepose,扫描);
(颗粒、重量)= getParticles(制程);
%绘制粒子
i = 1:尺寸(粒子,1)
helperPlotParticles (gca、颗粒(我:),重量(我));
结束
持有
%可视化激光雷达扫描
i = 1:尺寸(scan.Ranges, 1)
scan_map (1) = Vehiclepose (1) + scan.Ranges(我)* cos (scan.Angles(我)+ Vehiclepose (3));
scan_map(我,2)= Vehiclepose (2) + scan.Ranges(我)* sin (scan.Angles(我)+ Vehiclepose (3));
结束
散射(scan_map (: 1) scan_map (:, 2),“填充”)
甘氨胆酸helperPlotRobot (Vehiclepose);%显示机器人在阴谋
暂停(0.5)
%保存图作为图像
exportgraphics (gca、gifFile附加= true);
结束
但下部只是所有可视化。所以循环中的重要行只能:
(范围、角度)=激光雷达(Vehiclepose,地图);
扫描= lidarScan(范围、角度);
[isUpdated, estimatedPose estimatedCovariance] =制程(Vehiclepose,扫描);
(颗粒、重量)= getParticles(制程);
据我理解。
你能看到问题可能是什么?
非常感谢你,
DarZim

Melden您西奇,嗯祖茂堂kommentieren。

Kategorien

找到更多的在移动机器人算法设计帮助中心文件交换

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!

翻译的