При обследовании зданий и сооружений часто встает задача создания точной 3D-модели помещения для формирования паспорта объекта или для разметки дефектов на уже существующей BIM-модели. Как следствие, лидар и 3D-сканер сегодня входят в необходимый джентльменский набор инженера, при этом стоит такой кит весьма недешево, в среднем 150к-1,5 млн рублей. Мы попробовали изучить возможность использования лазерных лидаров более бюджетного класса, к примеру, Unitree 4D LiDAR-L2 (далее Unitree L2), который стоит в пределах 28-40К рублей. Можно ли с помощью лидара, используемого не в промышленном сканировании, а в робототехнике (конкретно эта модель используется как навигатор для робособак – что позволяет его назвать «собачьим» лидаром) составлять из облаков точек 3D-модели зданий и сооружений? Дополнительно еще решили задачку, а можно ли это делать на Windows, так как у инженеров в поле чаще всего на ноутбуках стоит именно эта ОС, тогда как официально ПО Unitree L2 написано под Ubuntu?
Наш ответ на оба вопроса – да, можно! И мы расскажу, как.
Заявленные характеристики лидара
Unitree L2 — это 4D лидар (3D позиция + 1D уровень серого), способный производить 64 000 измерений в секунду. Ключевые характеристики:
Дальность и точность:
-
Минимальная дистанция: 0.05 м
-
Максимальная: 30 м (при 90% отражательной способности)
-
Точность: ±2 см
Поле зрения (FOV):
-
Горизонтальное: 360°
-
Вертикальное: 90° (стандартный режим) или 96° (NEGA режим)
-
Полусферическое покрытие пространства
Производительность:
-
Частота выборки: 64 000 точек/сек
-
Круговое сканирование: 5.55 Гц
-
Вертикальное сканирование: 216 Гц
-
Встроенный IMU: 3-осевой акселерометр и гироскоп (1 кГц)
Физические параметры:
-
Вес: 230 г
-
Рабочая температура: -10°C до +50°C
-
Класс лазерной безопасности: IEC-60825 Class 1
Режимы работы:
-
3D/2D режим
-
Normal/NEGA режим (расширенный FOV)
-
Вывод: TTL UART или Ethernet UDP
-
Поддержка уровня серого (интенсивность отражения)
Подключение может быть через UDP или через UART-разъем, который имеет адаптер к usb. При подключении к Windows лидар определяется как виртуальный COM-порт, в моем случае COM3 на скорости 4 Мбод, драйвер CH343.
Промышленные лидары обычно имеют дальность 30-150 метров и производительность 300 000 — 2 000 000 точек/сек. Unitree L2 с дальностью 30м и 64 000 точек/сек вполне может стать резервным лидаром в наборе инженера и применяться для небольших зданий и сооружений, к примеру, школ, детских садов, тепловых пунктов, котельных, подстанций, небольших торговых точек или бизнес-центров.
Однако, чтобы «собачий» лидар начал служить для дефектовки зданий и сооружений, нужно было решить несколько вопросов.
В частности, собственное ПО лидара для Windows – это только Unitree.exe, все остальное ПО лидара работает под управлением ROS/ROS2, а также имеется SDK, написанная под Linux (Ubuntu). При этом у инженеров по мониторингу дефектов ЗиС в поле чаще всего на рабочих ноутбуках установлена ОС Windows, так как инженеры пишут отчеты в офисных программах.
Официальное ПО Unilidar_2
При подключении лидара к Windows можно использовать программу Unilidar_2.exe со страницы официального центра загрузки ПО Unilidar для Unitree L2 (отображается для скачивания как Point Cloud Software). Разберем её возможности:
Основные режимы работы:
-
UDPMode / SerialMode — выбор между Ethernet и COM-портом
-
3D Mode / 2D Mode — полное сканирование или только одна плоскость
-
Normal Mode / NEGA— стандартный или расширенный FOV c негативным углом
-
Gray ON/OFF — включение/отключение данных об интенсивности
Настройки подключения:
-
Select Serial Port: выбор COM-порта (COM3 в нашем случае)
-
ENET/UART Select: переключение между интерфейсами
-
Power On mode: SELF START (автозапуск)
Отображаемая телеметрия:
-
outboard_motor_speed: скорость внешнего мотора (~12900 об/мин)
-
lower_motor_speed: скорость нижнего мотора (~330 об/мин)
-
apd_temperature: температура лавинного фотодиода (~40°C)
-
apd_voltage: напряжение APD (~145V)
-
laser_voltage: напряжение лазера (~50V)
У лидара есть опция «интенсивность отражения» (gray on):
Gray ON сохраняет данные об интенсивности отраженного лазерного луча. Это важно для:
-
Определения материалов:
-
Металл отражает сильно (высокая интенсивность)
-
Бетон — средне
-
Черные поверхности — слабо
-
Обнаружения дефектов:
-
Влажные участки отражают иначе, чем сухие
-
Можно увидеть протечки на стенах
-
Трещины имеют другую отражательную способность
-
Улучшения качества 3D модели:
-
Помогает алгоритмам различать края объектов
-
Улучшает регистрацию сканов при SLAM
-
Фильтрации шумов:
-
Точки с очень низкой интенсивностью часто являются шумом
-
Можно отфильтровать ложные отражения
Для обследования зданий и сооружений Gray ON также интересен, так как с его помощью можно уточнять структуру материалов конструкций.

Ограничения Unilidar_2.exe:
-
Только визуализация в реальном времени
-
Нет функции записи или экспорта данных
-
Нет инструментов измерения расстояний
-
Невозможно сохранять файлы, или открыть другие файлы, если нет ROS.
Официальный SDK разработан только для Linux с ROS. Документация утверждает, что нужно настроить на Ubuntu ROS/ROS2. Далее использовать Point-LIO для записи в .pcd и конвертировать через CloudCompare. Именно эти ограничения и привели нас к необходимости написания собственного парсера под Windows.
Реверс-инжиниринг протокола
Изучив исходники SDK на C++, я выяснила структуру протокола передачи данных.
Структура пакетов
# Константы протокола из unitree_lidar_protocol.h FRAME_HEADER = [0x55, 0xAA, 0x05, 0x0A] FRAME_HEADER_SIZE = 12 FRAME_TAIL_SIZE = 12 # Типы пакетов LIDAR_POINT_DATA_PACKET_TYPE = 102 # Облако точек LIDAR_IMU_DATA_PACKET_TYPE = 104 # Данные IMU
Каждый пакет содержит:
-
Заголовок с типом и размером
-
Полезную нагрузку (данные точек или IMU)
-
Контрольную сумму
Парсинг облака точек
Самое сложное — правильно распарсить структуру данных точек:
def parse_point_packet(self, data): """Парсинг пакета с облаком точек""" if len(data) < LIDAR_POINT_DATA_SIZE: return None # Распаковка заголовка DataInfo (16 байт) seq, payload_size, stamp_sec, stamp_nsec = struct.unpack('<IIII', data[0:16]) # Пропускаем служебные структуры и читаем параметры сканирования offset = 16 + 36 + 32 # DataInfo + LidarInsideState + LidarCalibParam # Параметры сканирования (9 float + 1 int) scan_params = struct.unpack('<ffffffffI', data[offset:offset+36]) point_num = scan_params[8] # Количество точек в пакете # Далее идут массивы расстояний (uint16) и интенсивностей (uint8)
Преобразование в 3D координаты
Лидар передает данные в сферических координатах. Преобразование в декартовы координаты выполняется с учетом калибровочных параметров:
def transform_to_3d_points(self, packet_data): """Преобразование из сферических в декартовы координаты""" calib = packet_data['calib'] # Предвычисленные тригонометрические значения sin_beta = np.sin(calib['beta_angle']) cos_beta = np.cos(calib['beta_angle']) for i in range(len(ranges)): # Расстояние с учетом калибровки range_float = calib['range_scale'] * (float(ranges[i]) + calib['range_bias'])
# Формулы преобразования из документации A = (-cos_beta_sin_xi + sin_beta_cos_xi sin_alpha) range_float B = cos_alpha cos_xi range_float C = (sin_beta_sin_xi + cos_beta_cos_xi sin_alpha) range_float point.x = cos_theta A - sin_theta B point.y = sin_theta A + cos_theta B point.z = C + calib['a_axis_dist']
Автоматизация сканирования
Для удобства работы в поле добавили автоматический режим с звуковыми сигналами:
# Настройки сканирования POSITIONS_COUNT = 15 # Количество позиций WAIT_TIME = 7 # Секунд на позицию MOVE_TIME = 7 # Секунд на перемещение for position in range(1, POSITIONS_COUNT + 1): # Звуковой сигнал - начало сканирования winsound.Beep(1000, 500) # Высокий звук = стой # Сканирование parser.point_cloud.clear() time.sleep(WAIT_TIME) # Сохранение cloud = parser.get_current_cloud() np.save(f"scan_{position:02d}_pos.npy", cloud) # Сигнал к перемещению winsound.Beep(500, 300) # Низкий звук = иди
Что получилось
После реализации парсера протокола и системы автоматического сканирования, мы провели тестовое обследование кухни площадью 11.2 м².
Методика сканирования
Для получения полного облака точек помещения использовался метод многопозиционного сканирования:
-
Центральная позиция — лидар устанавливался в центре помещения для захвата общей геометрии
-
Периметральные позиции — 14 дополнительных точек по периметру для детализации стен и углов
-
Автоматический режим — 7 секунд на сканирование + 7 секунд на перемещение между позициями
Звуковые сигналы позволили одному оператору эффективно работать:
-
Высокий звук (1000 Гц) — остановиться и держать лидар неподвижно
-
Низкий звук (500 Гц) — переместиться на следующую позицию
Обработка данных
Объединение сканов
Полученные 15 файлов .npy объединялись в единое облако точек:
# Загрузка всех сканов clouds = [] for i in range(1, 16): cloud = np.load(f"scan_{i:02d}_pos.npy") clouds.append(cloud) # Объединение в глобальное облако global_cloud = np.vstack(clouds) print(f"Общее количество точек: {len(global_cloud):,}")
Результат: 2.8 миллиона точек за 3.5 минуты сканирования.
Автоматическое выравнивание
Для корректной ориентации плана применялся анализ главных компонент (PCA):
# Определение основного направления стен pca = PCA(n_components=2) pca.fit(wall_points[:, :2]) rotation_angle = np.arctan2(pca.components_[0][1], pca.components_[0][0])
Это позволило автоматически развернуть план параллельно осям координат, что критично для строительных чертежей.
Обнаружение конструктивных элементов
Алгоритм автоматически обнаружил воздуховод — конструктивный элемент, выступающий от стены:
-
Анализ плотности точек вдоль периметра помещения
-
Поиск отклонений от прямой линии стены
-
Классификация по размерам и форме
В нашем случае был обнаружен воздуховод размером 0.9×0.85 м, выступающий на 10 см от линии кухонного гарнитура. Интересно, что воздуховод имеет ступенчатую форму — состоит из двух прямоугольных секций: передняя часть шириной 0.9 м и задняя (ближе к стене) шириной 0.79 м. Несмотря на то, что он выступает всего на 10 см от линии кухонной мебели и практически сливается с ней в облаке точек, алгоритм смог его выделить за счет анализа плотности точек и небольших отклонений геометрии.
2D план помещения
[Изображение: План кухни с автоматическим выравниванием]
На 2D плане четко видны:
-
Контур помещения с размерами 3.72×3.01 м
-
Автоматически обнаруженный воздуховод (синяя пунктирная линия)
-
Облако точек стен (серые точки)
3D модель
3D визуализация показывает:
-
Полную геометрию помещения высотой 2.2 м
-
Воздуховод как конструктивный элемент стены
-
Возможность измерения любых размеров
Точность измерений
Сравнение с контрольными измерениями рулеткой:
|
Параметр |
Лидар |
Рулетка |
Погрешность |
|
Длина |
3.72 м |
3.70 м |
2 см (0.5%) |
|
Ширина |
3.01 м |
3.00 м |
1 см (0.3%) |
|
Высота |
2.20 м |
2.18 м |
2 см (0.9%) |
Погрешность не превышает заявленные ±2 см.
Отметим, что при формировании 3D-плана помещения при отсутствии BIM-модели или 2D-модели, паспорта здания, необходимо также производить замеры с помощью дальномера для уточнения параметров.
Преимущества для обследования ЗиС
-
Скорость — полное сканирование помещения за 3-5 минут
-
Полнота данных — миллионы точек против десятков ручных измерений
-
Автоматизация — обнаружение конструктивных элементов без разметки
-
Документирование — готовые планы для паспортизации объекта
-
Цена — в 5-50 раз дешевле промышленных сканеров
Ограничения и рекомендации
Ограничения метода:
-
Дальность 30 м ограничивает применение небольшими помещениями, хотя при картировании можно использовать сшивку нескольких планов
-
Ручная регистрация сканов (мы автоматизировали через ICP)
-
Нет решений для мобильной съемки без собаки-носителя – нет площадок для штативов, держателей. На стандартном штативе идет сильная вибрация.
-
Ненадежный UART-USB адаптер — критическая проблема при полевых работах. Адаптер легко отходит при движении, что требует постоянного контроля соединения. Необходимо либо использовать Ethernet-подключение, либо доработать механическую фиксацию разъемов.
Плюсы метода:
-
Отличная компенсация вибраций — встроенный IMU и алгоритмы стабилизации позволяют получать качественные данные даже при съемке «с рук» в движении. Это особенно важно при отсутствии штатива или при работе в стесненных условиях.
-
Может охватить небольшое помещение буквально с одной позиции в центре без искажений
-
Низкая стоимость и малый вес.
Рекомендации по применению:
-
Идеален для помещений до 200 м²
-
Оптимален для объектов: школы, детсады, ЦТП, котельные, подстанции
-
Может служить резервным инструментом при обследовании крупных объектов
Практические советы
Из опыта тестирования можно дать следующие рекомендации:
-
Подключение: По возможности используйте Ethernet вместо UART — это надежнее и позволяет работать на большем расстоянии от ноутбука
-
Защита адаптера: UART-USB адаптер поставляется как открытая плата в целлофане. Для полевых работ необходим жесткий корпус — подойдет футляр для очков с прорезанными отверстиями для кабелей или любой защелкивающийся пластиковый контейнер подходящего размера. Фиксировать разъемы можно малярным скотчем или термоклеем по краям, не касаясь платы.
-
Оптимальная методика: При возможности делайте первый скан с неподвижной точки (стол, тумба) — это даст наиболее чистое облако точек для базовой геометрии
-
Работа в одиночку: Можно работать с руки или использовать площадку из плотного пенопласта для павербанка и лидара, вместо ноутбука использовать телефон с большим хранилищем или катить за собой ноутбук на штативе-пюпитре (неудобно при смене высоты)
-
Питание: Несмотря на заявленные характеристики, обычные павербанки на 2A не обеспечивают стабильную работу. Необходим мощный павербанк для видеокамер (3A и выше) с соответствующим переходником. При недостаточном питании будет вращаться только нижний (малый) мотор, а внешний мотор остановится — это явный признак просадки напряжения.
-
Высота сканирования: Оптимальная высота 1-1.2 м от пола — это позволяет захватить и пол, и потолок в большинстве помещений
Дальнейшее развитие
По мере развития проекта планируется:
-
Автоматическая регистрация сканов — реализация ICP (Iterative Closest Point) для объединения без ручной привязки
-
Экспорт в BIM — конвертация в форматы IFC/RVT для работы в Revit
-
Детекция дефектов — использование интенсивности отражения для поиска влажных зон и трещин
-
Мобильное приложение — управление через смартфон вместо ноутбука
-
Вместе со следующей статьей выложу все свои наработки в гитхаб, обсудим.
Заключение
Кто-то может подумать, причем здесь дефектовка зданий и сооружений, это же всего лишь 3D модель, на ней не отображаются дефекты. Верно. Но будут отображаться. Полученная 3D-модель зданий, помещений, сооружений — это база для привязки обнаруженных дефектов к точным координатам в 3D-пространстве. Это дает нам возможность автоматического измерения размеров трещин, площади коррозии, отслеживания динамики развития дефектов при повторных сканированиях. Подход предварительного сканирования уже предусмотрен в ГОСТе, регулирующем обследование зданий и сооружений. Новизна предложенного решения — в демократизации сканирования и существенном удешевлении затрат на подготовку 3D-модели. В существующем варианте лидар с его программной обвязкой под Linux может быть сложным для инженеров по обследованию ЗиС, а разработанное мной ПО для Windows снимает ограничения официального SDK и делает лидар доступным для инженеров без опыта работы с Linux и ROS. Исходный код парсера и примеры обработки данных будут доступны на GitHub в августе.
Обратная связь
Буду рада обсудить опыт использования бюджетных лидаров в комментариях. Особенно интересны: Решения проблемы с UART‑адаптером — Опыт работы через Ethernet‑ Интеграция с BIM‑системами‑ Альтернативные варианты крепления и мобильных платформ‑ Результаты использования на реальных объектах Для детального обсуждения технических вопросов — пишите в личку на Хабре.
ссылка на оригинал статьи https://habr.com/ru/articles/931300/
Добавить комментарий