1

insertObservation中的函数COccupancyGridMap2D接受两个参数,即CPose3DCObservation2DRangeScan值,即使这两个值都是准确的且没有噪声,网格会产生扭曲的边界。我唯一能想到的scan.aperture设置可能会产生这种效果,但这些设置在 2*PI 范围内是正确的,并且点云的其他视觉助手根本没有显示任何翘曲。下面是一个例子。

与地面实况正方形边界相比,右侧的占用网格发生了扭曲。左边的点看起来很好,并且使用相同的光圈和加载 FromVectors 设置。 图片

这是尝试验证您自己的扭曲效果的示例代码。

COccupancyGridMap2D gridmap;
gridmap.setSize(-4.0,4.0,-4.0,4.0,0.025f);

#define SCANS_SIZE 100
char SCAN_VALID[] = {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};

CPose3D transform = CPose3D(0,0,0,0,0,0);

CObservation2DRangeScan read_scan;

read_scan.aperture = 2*M_PIf;
read_scan.rightToLeft = true;


vector<float> landmark = {2.9f,2.906f,2.924f,2.953f,2.996f,3.052f,3.124f,3.212f,3.319f,3.447f,3.601f,3.786f,4.007f,3.948f,3.736f,3.560f,3.413f,3.290f,3.188f,3.104f,3.037f,2.984f,2.945f,2.918f,2.903f,2.900f,2.909f,2.930f,2.963f,3.009f,3.069f,3.144f,3.237f,3.349f,3.483f,3.644f,3.837f,4.069f,3.891f,3.689f,3.521f,3.380f,3.263f,3.166f,3.086f,3.022f,2.973f,2.937f,2.913f,2.901f,2.901f,2.913f,2.937f,2.973f,3.022f,3.086f,3.166f,3.263f,3.380f,3.521f,3.689f,3.891f,4.069f,3.837f,3.644f,3.483f,3.349f,3.237f,3.144f,3.069f,3.009f,2.963f,2.930f,2.909f,2.900f,2.903f,2.918f,2.945f,2.984f,3.037f,3.104f,3.188f,3.290f,3.413f,3.560f,3.736f,3.948f,4.007f,3.786f,3.601f,3.447f,3.319f,3.212f,3.124f,3.052f,2.996f,2.953f,2.924f,2.906f,2.900f};
float *SCAN_RANGES = &landmark[0];

read_scan.loadFromVectors(SCANS_SIZE, SCAN_RANGES,SCAN_VALID);

gridmap.insertObservation(&read_scan,&transform);

CSimplePointsMap m3;
m3.insertObservation(&read_scan);

m3.getAllPoints(map_xs,map_ys,map_zs);

这是 simplePointsMap 图(红点)与 OccupanyGrid 的图像

从占用网格投射的角度看起来是正确的,具有一致的间隔,但角度仍然偏离单点图,长度看起来还可以,并且似乎每条光线都可以旋转以匹配其中一个红点。可能发生的是映射问题,并且由于我们试图将角度设置为离散的水平和垂直步长,这会导致未对齐。我试过提高分辨率,但这无济于事,我想这是有道理的,因为缩放水平/垂直比例仍然会导致相同的比例和不匹配。不过,我可能会遗漏一些东西,还有什么可能导致这种失真,这是预期的,我们能做的最好的吗?感谢您的任何帮助。

4

2 回答 2

0

我刚刚意识到发生了什么,CSimplePointsMap 和 COccupancyGridMap2D 使用两个稍微不同的点角度参考。CSimplePointsMap 期望第一个点和最后一个点之间有重叠,而 COccupancyGridMap2D 则没有。解决所有这些问题的简单方法是少读一次 COccupancyGridMap2D 扫描,然后将所有内容排成一行。这是如果您的角度被定义为这样,这对于 CSimplePointsMap 来说很好。

for (int i = 0; i < Raysize; i++) 
{

    float angle = -angle_range / 2 + i * (angle_range) / (Raysize-1);

这是使用 SCANS_SIZE-1 的 OccupancyGridMap2D insertObservation 的修复,而 CSimplePointsMap 仍然可以使用 SCANS_SIZE。

read_scan.loadFromVectors(SCANS_SIZE-1, SCAN_RANGES,SCAN_VALID);
gridmap.insertObservation(&read_scan,&transform);
于 2018-01-02T21:46:25.493 回答
0

在我看来,问题在于假设每个扫描“射线”的角度

查看mrpt::obs::CSinCosLookUpTableFor2DScans类,为您的特定扫描对象生成一个这样的 sin/cos LUT,并仔细检查 sin/cos 值是否与用于生成扫描的值一致。

顺便说一句,COccupancyGridMap2D有一种方法可以从网格图图像模拟 2D 扫描,试一试,如果该方法产生扭曲的结果,请填写错误报告(!);-)

干杯。

于 2017-12-29T17:19:42.653 回答