我是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);
谢谢
弗朗切斯科
答案 0 :(得分:0)
这几天我一直在处理Kitti数据集,所以我刚刚添加了一个新功能,可以将kiti velodyne数据文件直接加载到MRPT中(请参见this PR)。
但是,经过一番思考,我注意到Kitti原始数据与CObservationVelodyneScan
并不完全匹配,loadFromKittiVelodyneFile()
的目的是存储每个LiDAR光束的原始范围,并且仅存储点云。 Kitti velodyne数据实际上是点云,因此我添加了具有XYZ + Intensity mrpt::maps::CPointsMapXYZI
的新PointCloud类型,并为其添加了方法CObservation2DRangeScan
。请注意,这是针对mrpt主git分支“版本1.9.9”的。
现在,如何将其插入到网格图中?您使用Velodyne CObservation将其插入到网格图中的想法是我们队列中的pending issues之一,但是无论如何,如上所述,Kitti数据集可以更好地加载为点云。
我建议您将点云转换为DynamicSupervisor
,然后将其插入网格中。这样一来,您就可以控制要真正在网格中反映3D数据的哪一部分(即什么高度等)
希望它有所帮助!