Я испытываю очень странные результаты сегментации плоскости 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, без заметных различий.Сканирование лидара хорошо сегментировано, плоскость карты - помешанная.
Кто-нибудь может объяснить, в чем причина этого?