DotsToSirface (Qt 5.11)
Демонстрационная программа на Qt 5.11 C++, которая:
- принимает массив 3D-точек
QVector<Point3f>; - выполняет stage-based pipeline (preprocess -> transform -> registration -> reconstruction);
- визуализирует точки и полученную треугольную поверхность.
Вход/выход API
src/algorithms/reconstruction/surface_reconstruction.h:
struct Point3f { float x, y, z; };struct Triangle { int i0, i1, i2; };QVector<Triangle> buildSurfaceTriangles(const QVector<Point3f>& points);
Triangle хранит индексы вершин в исходном массиве points.
Как это работает
Реализация использует инкрементальный Convex Hull 3D:
- удаление дубликатов точек (epsilon-сравнение);
- поиск стартового тетраэдра;
- поочередное добавление точек с пересчетом видимых граней и горизонта;
- поддержание ориентированных наружу треугольников.
Ограничения
Текущая реализация строит выпуклую оболочку облака точек. Для невыпуклых объектов и детальной реконструкции произвольной поверхности нужны более сложные алгоритмы (например, alpha-shapes, Poisson reconstruction и т.п.).
Архитектурный каркас под robotics pipeline
core: контракты (PointCloudFrame,PipelineContext,PipelineStats, stage-интерфейсы, plugin registry).adapters: мосты к источникам и внешним транспортам (FilePointCloudSource,Ros2PointCloudSource,PointCloud2/tf2adapters).strategies: конкретные стадии пайплайна (preprocess, transform, registration, reconstruction).factories: сборкаPipelineExecutorиз plugin-id и профиля.
Pipeline Dashboard: UX и анализ цепочки
В dashboard реализованы инструменты для пошаговой настройки всей pipeline-цепочки (preprocess + reconstruction):
- Категориальная палитра этапов: фильтры сгруппированы по логике обработки
(
Обрезка -> NaN (предочистка) -> Условия/Индексы -> Шум -> Морфология -> Прореживание -> Сглаживание -> Нормали -> Реконструкция), для каждого фильтра доступны краткие подсказки. - Проверка порядка этапов: при рискованной последовательности (например, когда
OutlierRemovalидет послеVoxelGrid) показываются предупреждения и рекомендация. - Стартовые пресеты: доступны шаблоны для типичных источников
(
LiDAR_scan,RGBD_camera,Synthetic_clean) как отправная точка с возможностью ручной донастройки. - Метрики между шагами: показывается вклад каждого preprocess-этапа: входные точки, выходные точки, сколько удалено и время шага в миллисекундах.
- Единый редактор параметров: и preprocess-стадии, и реконструкторы поверхности настраиваются через одинаковые карточки и один диалог параметров.
Пер-шаговые метрики собираются на уровне core::PipelineExecutor и возвращаются через
PipelineStats::preprocessStepMetrics, чтобы данные были едиными для GUI и тестов.
Профили выполнения
desktop_debug: дефолтный профиль для GUI/отладки.rpi4_runtime: профиль для Raspberry Pi 4 (жестче downsampling, лимит точек, reconstruction реже, async-friendly настройки).
Выбор профиля:
factories::pipeline::createPipelineExecutorForProfile("desktop_debug")factories::pipeline::createPipelineExecutorForProfile("rpi4_runtime")
Сборка и запуск в WSL
Рабочий поток для этого проекта на Windows: собирать и запускать через WSL.
cd /mnt/d/yakupov/Projects/DotsToSirface/build-wsl
qmake ../DotsToSirface.pro 'DEFINES+=PCL_ENABLED'
make -j4
LIBGL_ALWAYS_SOFTWARE=1 QT_QPA_PLATFORM=xcb ./DotsToSirface
Примечания:
DEFINES+=PCL_ENABLEDвключает PCL-стадии пайплайна.LIBGL_ALWAYS_SOFTWARE=1снижает риски графических артефактов в WSLg.QT_QPA_PLATFORM=xcbиспользуется как стабильный backend для Qt в WSL.
Перезапуск после правок:
pkill -f '^./DotsToSirface$' || true
cd /mnt/d/yakupov/Projects/DotsToSirface/build-wsl
qmake ../DotsToSirface.pro 'DEFINES+=PCL_ENABLED'
make -j4
LIBGL_ALWAYS_SOFTWARE=1 QT_QPA_PLATFORM=xcb ./DotsToSirface
Smoke tests (отдельный runner)
Для быстрой проверки пайплайна без GUI добавлен отдельный консольный таргет:
DotsToSirfaceTests.pro.
qmake DotsToSirfaceTests.pro
make
./release/DotsToSirfaceTests.exe
При успешном запуске runner печатает Smoke tests passed. и завершаетcя с кодом 0.
Демо
При запуске приложение:
- генерирует тестовое облако точек (приближенная сфера с небольшим шумом);
- строит триангуляцию;
- показывает статистику: количество точек, количество треугольников и время построения;
- отображает сцену в
QOpenGLWidget(ЛКМ - вращение, колесо - зум).