点云转换为2D范围

时间:2017-04-04 14:10:47

标签: c++ computer-vision point-clouds kinect-v2

我正在尝试将使用libfreenect2从Kinect V2获取的点云(x,y,z)数据转换为虚拟 2D激光扫描(例如,水平角度) /距离矢量)。

我目前正在为每个像素列分配PCL距离值,如下所示:

std::vector<float> scan(512, 0);
for (unsigned int row = 0; row < 424; ++row) {
    for (unsigned int col = 0; col < 512; ++col) {
        float x, y, z;
        registration->getPointXYZ(depth, row, col, x, y, z);
        if (std::isnan(x) || std::isnan(y) || std::isnan(z)) {
            continue;
        }
        Eigen::Vector3f values = rotate_translate((-1 * x), y - 1.186, z);
        if (scan[col] == 0) {
            scan[col] = values[1];
        }
        if (values[1] < scan[col]) {
            scan[col] = values[1];
        }
    }
}

您可以忽略rotate_translate方法,它只是使用传感器姿势更改本地坐标到全局坐标。

使用下面的图片可以最好地显示问题:

LIDAR范围传感器产生以下点图:

lidar Map

kinect 2D范围扫描弯曲,当然更窄,因为水平FOV与激光雷达的270度范围相比为70.6度。

kinect map

我试图解决这个曲率;我正在使用的SLAM / ICP库是mrpt,实际数据scan被插入到mrpt::obs::CObservation2DRangeScan观察中:

auto obs = mrpt::obs::CObservation2DRangeScan();
obs.loadFromVectors(scan.size(), scan.data(), (char*)scan.data());
obs.aperture = mrpt::utils::DEG2RAD(70.6f);
obs.maxRange = 6.0;
obs.rightToLeft = true;
obs.timestamp = mrpt::system::now();
obs.setSensorPose(sensor);

我搜索了谷歌和搜索引擎优化,而似乎解决这个问题的唯一答案是this onethat one。因此,虽然我理解曲率是我为每个像素列分配PCL值的结果,但我不确定如何使用它来消除曲率。

每个回复似乎都采用了不同的方法,据我所知,任务是每像素角度的线性插值和当前像素坐标?

0 个答案:

没有答案