我正在尝试将使用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
方法,它只是使用传感器姿势将局部坐标更改为全局坐标。
使用下面的图片可以最好地显示该问题:
而激光雷达距离传感器产生以下点图:
kinect 2D 范围扫描是弯曲的,当然更窄,因为与激光雷达的 270 度范围相比,水平 FOV 为 70.6 度。
我正在尝试修复的正是这种曲率;我正在使用的 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);
我搜索了 google 和 SO,似乎解决这个问题的唯一答案是this one和that one。因此,虽然我知道曲率是我为每个像素列分配 PCL 值的结果,但我不确定如何使用它来消除曲率。
每个回复似乎都采取了不同的方法,据我了解,任务是每像素比率的角度和当前像素坐标的线性插值?