# DotsToSirface (Qt 5.11) Демонстрационная программа на Qt 5.11 C++, которая: - принимает массив 3D-точек `QVector`; - выполняет 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 buildSurfaceTriangles(const QVector& points);` `Triangle` хранит индексы вершин в исходном массиве `points`. ## Как это работает Реализация использует инкрементальный `Convex Hull 3D`: - удаление дубликатов точек (epsilon-сравнение); - поиск стартового тетраэдра; - поочередное добавление точек с пересчетом видимых граней и горизонта; - поддержание ориентированных наружу треугольников. ## Ограничения Текущая реализация строит **выпуклую оболочку** облака точек. Для невыпуклых объектов и детальной реконструкции произвольной поверхности нужны более сложные алгоритмы (например, alpha-shapes, Poisson reconstruction и т.п.). ## Архитектурный каркас под robotics pipeline - `core`: контракты (`PointCloudFrame`, `PipelineContext`, `PipelineStats`, stage-интерфейсы, plugin registry). - `adapters`: мосты к источникам и внешним транспортам (`FilePointCloudSource`, `Ros2PointCloudSource`, `PointCloud2`/`tf2` adapters). - `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. ```bash 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. Перезапуск после правок: ```bash 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`. ```bash qmake DotsToSirfaceTests.pro make ./release/DotsToSirfaceTests.exe ``` При успешном запуске runner печатает `Smoke tests passed.` и завершаетcя с кодом `0`. ## Демо При запуске приложение: - генерирует тестовое облако точек (приближенная сфера с небольшим шумом); - строит триангуляцию; - показывает статистику: количество точек, количество треугольников и время построения; - отображает сцену в `QOpenGLWidget` (ЛКМ - вращение, колесо - зум).