1

我是 MRPT 的新手,我想用它来使用 velodyne 点云构建占用网格地图。

KITTI 数据集提供 (x,y,z,r) 格式的 velodyne 点云,其中 r 是反射率。我正在尝试用此类数据填充 mrpt::obs::CObservationVelodyneScan,但使用 insertObservation 方法似乎无济于事。你能指出我使用这种观察类型的正确方向吗?

我的代码基本上是这样的:

COccupancyGridMap2D map;

// allocate 4 MB buffer (only ~130*4*4 KB are needed)
int32_t num = 1000000;
float *data = (float*)malloc(num*sizeof(float));

// pointers
float *px = data+0;
float *py = data+1;
float *pz = data+2;
float *pr = data+3;

// load point cloud
FILE *stream;
stream = fopen (args.velodyne_filename.c_str(),"rb");
num = fread(data,sizeof(float),num,stream)/4;

obs::CObservationVelodyneScan v;
v.point_cloud.x.resize(num);
v.point_cloud.y.resize(num);
v.point_cloud.z.resize(num);
v.point_cloud.intensity.resize(num);

for (int32_t i=0; i<num; i++) 
{
    v.point_cloud.x[i] = *px;
    v.point_cloud.y[i] = *py;
    v.point_cloud.z[i] = *pz;
    v.point_cloud.intensity[i] = *pr;

    px+=4; py+=4; pz+=4; pr+=4;
}
fclose(stream);

map.likelihoodOptions.likelihoodMethod = OccupancyGridMap2D::lmRayTracing;

map.insertObservation(&v);

谢谢,

弗朗切斯科

4

1 回答 1

0

这些天我也在研究 Kitti 数据集,所以我刚刚添加了一个新函数来将 kiti velodyne 数据文件直接加载到 MRPT 中(参见这个 PR)。

然而,经过一番思考,我注意到 Kitti 原始数据与 不完全匹配CObservationVelodyneScan,后者旨在存储每个 LiDAR 光束的原始范围,并且只能选择存储点云。Kitti velodyne 数据实际上是点云,因此我添加了一个带有 XYZ+Intensity 的新 PointCloud 类型并为其mrpt::maps::CPointsMapXYZI添加了一个方法loadFromKittiVelodyneFile()。请注意,这是针对 mrpt master git 分支“版本 1.9.9”。

现在,如何将其插入到网格图中?您使用 velodyne CObservation 将其插入到网格图中的想法是我们队列中的未决问题之一,但无论如何,如上所述,Kitti 数据集最好作为点云加载。

我建议您将点云转换为CObservation2DRangeScan,然后将其插入网格中。这将允许您控制您真正希望在网格中反映的 3D 数据的哪一部分(即什么高度等)

希望它有所帮助!

于 2018-11-25T04:22:02.767 回答