Сегментация плоскости PCL дает очень странные коэффициенты - PullRequest
0 голосов
/ 28 сентября 2018

Я испытываю очень странные результаты сегментации плоскости SAC, которые работали для меня когда-либо раньше.

У меня есть облако точек местности, которое почти полностью является плоскостью, и я хочу получить его плоские коэффициенты.Полученные коэффициенты ужасно случайны, несмотря на очень регулярную структуру облака точек.Что еще более загадочно, просто рядом с этим я делаю ту же сегментацию на другом облаке точек (лидарное сканирование), гораздо более разреженный, и результаты очень хорошие, неоднократно.

На изображении вы видите проблемный ПК (тускло-красный, обрезанный в прямоугольнике), его обнаруженные углы (ярко-красная полоса) и разреженное облако точек сканирования лидара в сером цвете.У этого серого облака точек есть плоские коэффициенты, хорошо определяемые каждый раз, почти прямо по горизонтали.

Я видел этот вопрос: SACSegmentation обнаруживает модель нечетной плоскости

Но естьнет конструктивного ответа, и, как вы можете видеть, разреженное лидарное облако точек в моем случае работает очень хорошо, несмотря на то, что оно также далеко от своего источника (облака точек находятся в одной системе отсчета).Я пытался доставить этот вопрос в список рассылки пользователей PCL, но в настоящее время у него есть некоторые проблемы с регистрацией.

Коэффициенты плоскости, напечатанные в консоли: Карта плоскости: 0.129365,0.988998, -0.0717494, -46.6275, Плоскость сканирования: -0.00558903, -0.131864,0.991252, -469.395,

Пример изображения

Код, генерирующий это, выглядит следующим образом, без преобразования служб:

pcl::SACSegmentationFromNormals<pcl::PointNormal,pcl::PointNormal> seg;

 seg.setModelType (pcl::SACMODEL_NORMAL_PLANE);
 seg.setNormalDistanceWeight (0.1);
 seg.setMethodType (pcl::SAC_RANSAC);
 seg.setMaxIterations (200);
 seg.setDistanceThreshold (max_dist_plane); // equal to 0.2
 seg.setOptimizeCoefficients (true);

seg.setInputCloud(map_norm_near);
 seg.setInputNormals(map_norm_near);
seg.segment(*inliers_plane, *coeff_plane_map);

std::cout « "Map plane: " « ap « "," « bp « "," « cp « "," « dp « "," «
std::endl;

seg.setInputCloud(scan_norm_near);
 seg.setInputNormals(scan_norm_near);
 seg.segment(*inliers_plane, *coeff_plane_scan);

 std::cout « "Scan plane: " « ap2 « "," « bp2 « "," « cp2 « "," « dp2 « ","
« std::endl;

Я выполняю код внутри узла ROS в цикле.Объект сегментации повторно инициализируется на каждой итерации.Я использую PCL 1.7.2 под Ubuntu 16.04.Я пытался использовать SAC-сегментацию от нормалей и регулярную сасегментацию, устанавливать и выключать коэффициенты оптимизации, устанавливать оси и epsangle, без заметных различий.Сканирование лидара хорошо сегментировано, плоскость карты - помешанная.

Кто-нибудь может объяснить, в чем причина этого?

...