insertObservation
中的函数COccupancyGridMap2D
接受两个参数,即CPose3D
和CObservation2DRangeScan
值,即使这两个值都是准确的且没有噪声,网格会产生扭曲的边界。我唯一能想到的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 的图像
从占用网格投射的角度看起来是正确的,具有一致的间隔,但角度仍然偏离单点图,长度看起来还可以,并且似乎每条光线都可以旋转以匹配其中一个红点。可能发生的是映射问题,并且由于我们试图将角度设置为离散的水平和垂直步长,这会导致未对齐。我试过提高分辨率,但这无济于事,我想这是有道理的,因为缩放水平/垂直比例仍然会导致相同的比例和不匹配。不过,我可能会遗漏一些东西,还有什么可能导致这种失真,这是预期的,我们能做的最好的吗?感谢您的任何帮助。