填充MRPT velodyne扫描观察
Filling MRPT velodyne scan observation
我是 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);
谢谢,
弗朗切斯科
我最近也在研究 Kitti 数据集,所以我刚刚添加了一个新功能,可以将 kiti velodyne 数据文件直接加载到 MRPT 中(参见 this PR)。
然而,经过一番思考,我注意到 Kitti 原始数据与 CObservationVelodyneScan
不完全匹配,后者旨在存储每个 LiDAR 光束的原始范围,并且只是可选的点云。 Kitti velodyne 数据实际上是点云,因此我添加了一个具有 XYZ+Intensity mrpt::maps::CPointsMapXYZI
的新点云类型,并向其添加了一个方法 loadFromKittiVelodyneFile()
。请注意,这是针对 mrpt master git 分支,"version 1.9.9".
现在,如何将其插入网格图中?您使用 velodyne CObservation 将其插入网格图中的想法是我们队列中的 pending issues 之一,但无论如何,如上所述,Kitti 数据集最好加载为点云。
我建议您将点云转换为 CObservation2DRangeScan
,然后将其插入到网格中。这将允许您控制您真正想要反映在网格中的 3D 数据的哪一部分(即什么高度等)
希望对您有所帮助!
我是 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);
谢谢,
弗朗切斯科
我最近也在研究 Kitti 数据集,所以我刚刚添加了一个新功能,可以将 kiti velodyne 数据文件直接加载到 MRPT 中(参见 this PR)。
然而,经过一番思考,我注意到 Kitti 原始数据与 CObservationVelodyneScan
不完全匹配,后者旨在存储每个 LiDAR 光束的原始范围,并且只是可选的点云。 Kitti velodyne 数据实际上是点云,因此我添加了一个具有 XYZ+Intensity mrpt::maps::CPointsMapXYZI
的新点云类型,并向其添加了一个方法 loadFromKittiVelodyneFile()
。请注意,这是针对 mrpt master git 分支,"version 1.9.9".
现在,如何将其插入网格图中?您使用 velodyne CObservation 将其插入网格图中的想法是我们队列中的 pending issues 之一,但无论如何,如上所述,Kitti 数据集最好加载为点云。
我建议您将点云转换为 CObservation2DRangeScan
,然后将其插入到网格中。这将允许您控制您真正想要反映在网格中的 3D 数据的哪一部分(即什么高度等)
希望对您有所帮助!