При обследовании зданий и сооружений часто встает задача создания точной 3D-модели помещения для формирования паспорта объекта или для разметки дефектов на уже существующей BIM-модели. Как следствие, лидар и 3D-сканер сегодня входят в необходимый джентльменский набор инженера, при этом стоит такой кит весьма недешево, в среднем 150к-1,5 млн рублей. Мы попробовали изучить возможность использования лазерных лидаров более бюджетного класса, к примеру, Unitree 4D LiDAR-L2 (далее Unitree L2), который стоит в пределах 28-40К рублей. Можно ли с помощью лидара, используемого не в промышленном сканировании, а в робототехнике (конкретно эта модель используется как навигатор для робособак – что позволяет его назвать «собачьим» лидаром) составлять из облаков точек 3D-модели зданий и сооружений? Дополнительно еще решили задачку, а можно ли это делать на Windows, так как у инженеров в поле чаще всего на ноутбуках стоит именно эта ОС, тогда как официально ПО Unitree L2 написано под Ubuntu?

Наш ответ на оба вопроса – да, можно! И мы расскажу, как. 


Lidar Unitree L2 4D
Lidar Unitree L2 4D

Заявленные характеристики лидара

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)

Режимы работы Unilidar.exe
Режимы работы Unilidar.exe

У лидара есть опция "интенсивность отражения" (gray on):

Gray ON сохраняет данные об интенсивности отраженного лазерного луча. Это важно для:

  1. Определения материалов:

  • Металл отражает сильно (высокая интенсивность)

  • Бетон - средне

  • Черные поверхности - слабо

  1. Обнаружения дефектов:

  • Влажные участки отражают иначе, чем сухие

  • Можно увидеть протечки на стенах

  • Трещины имеют другую отражательную способность

  1. Улучшения качества 3D модели:

  • Помогает алгоритмам различать края объектов

  • Улучшает регистрацию сканов при SLAM

  1. Фильтрации шумов:

  • Точки с очень низкой интенсивностью часто являются шумом

  • Можно отфильтровать ложные отражения

Для обследования зданий и сооружений 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']  
Облако точек в Cloud compare
Облако точек в Cloud compare

Автоматизация сканирования

Для удобства работы в поле добавили автоматический режим с звуковыми сигналами:

# Настройки сканирования

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 м².

Методика сканирования

Для получения полного облака точек помещения использовался метод многопозиционного сканирования:

  1. Центральная позиция - лидар устанавливался в центре помещения для захвата общей геометрии

  2. Периметральные позиции - 14 дополнительных точек по периметру для детализации стен и углов

  3. Автоматический режим - 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])

Это позволило автоматически развернуть план параллельно осям координат, что критично для строительных чертежей.

Обнаружение конструктивных элементов

Алгоритм автоматически обнаружил воздуховод - конструктивный элемент, выступающий от стены:

  1. Анализ плотности точек вдоль периметра помещения

  2. Поиск отклонений от прямой линии стены

  3. Классификация по размерам и форме

В нашем случае был обнаружен воздуховод размером 0.9×0.85 м, выступающий на 10 см от линии кухонного гарнитура. Интересно, что воздуховод имеет ступенчатую форму - состоит из двух прямоугольных секций: передняя часть шириной 0.9 м и задняя (ближе к стене) шириной 0.79 м. Несмотря на то, что он выступает всего на 10 см от линии кухонной мебели и практически сливается с ней в облаке точек, алгоритм смог его выделить за счет анализа плотности точек и небольших отклонений геометрии.

2D план помещения

[Изображение: План кухни с автоматическим выравниванием]

На 2D плане четко видны:

  • Контур помещения с размерами 3.72×3.01 м

  • Автоматически обнаруженный воздуховод (синяя пунктирная линия)

  • Облако точек стен (серые точки)

3D модель

3D визуализация показывает:

  • Полную геометрию помещения высотой 2.2 м

  • Воздуховод как конструктивный элемент стены

  • Возможность измерения любых размеров

2D план
2D план
3D план
3D план

Точность измерений

Сравнение с контрольными измерениями рулеткой:

Параметр

Лидар

Рулетка

Погрешность

Длина

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-модели, паспорта здания, необходимо также производить замеры с помощью дальномера для уточнения параметров.

Преимущества для обследования ЗиС

  1. Скорость - полное сканирование помещения за 3-5 минут

  2. Полнота данных - миллионы точек против десятков ручных измерений

  3. Автоматизация - обнаружение конструктивных элементов без разметки

  4. Документирование - готовые планы для паспортизации объекта

  5. Цена - в 5-50 раз дешевле промышленных сканеров

Ограничения и рекомендации

Ограничения метода:

  • Дальность 30 м ограничивает применение небольшими помещениями, хотя при картировании можно использовать сшивку нескольких планов

  • Ручная регистрация сканов (мы автоматизировали  через ICP)

  • Нет решений для мобильной съемки без собаки-носителя – нет площадок для штативов, держателей. На стандартном штативе идет сильная вибрация.

  • Ненадежный UART-USB адаптер - критическая проблема при полевых работах. Адаптер легко отходит при движении, что требует постоянного контроля соединения. Необходимо либо использовать Ethernet-подключение, либо доработать механическую фиксацию разъемов.

Плюсы  метода:

  • Отличная компенсация вибраций - встроенный IMU и алгоритмы стабилизации позволяют получать качественные данные даже при съемке "с рук" в движении. Это особенно важно при отсутствии штатива или при работе в стесненных условиях.

  • Может охватить небольшое помещение буквально с одной позиции в центре без искажений

  • Низкая стоимость и малый вес.

Рекомендации по применению:

  • Идеален для помещений до 200 м²

  • Оптимален для объектов: школы, детсады, ЦТП, котельные, подстанции

  • Может служить резервным инструментом при обследовании крупных объектов

Практические советы

Из опыта тестирования можно дать следующие рекомендации:

  1. Подключение: По возможности используйте Ethernet вместо UART - это надежнее и позволяет работать на большем расстоянии от ноутбука

  2. Защита адаптера: UART-USB адаптер поставляется как открытая плата в целлофане. Для полевых работ необходим жесткий корпус - подойдет футляр для очков с прорезанными отверстиями для кабелей или любой защелкивающийся пластиковый контейнер подходящего размера. Фиксировать разъемы можно малярным скотчем или термоклеем по краям, не касаясь платы.

  3. Оптимальная методика: При возможности делайте первый скан с неподвижной точки (стол, тумба) - это даст наиболее чистое облако точек для базовой геометрии

  4. Работа в одиночку: Можно работать с руки или использовать площадку из плотного пенопласта для павербанка и лидара, вместо ноутбука использовать телефон с большим хранилищем или катить за собой ноутбук на штативе-пюпитре (неудобно при смене высоты)

  5. Питание: Несмотря на заявленные характеристики, обычные павербанки на 2A не обеспечивают стабильную работу. Необходим мощный павербанк для видеокамер (3A и выше) с соответствующим переходником. При недостаточном питании будет вращаться только нижний (малый) мотор, а внешний мотор остановится - это явный признак просадки напряжения.

  6. Высота сканирования: Оптимальная высота 1-1.2 м от пола - это позволяет захватить и пол, и потолок в большинстве помещений

Дальнейшее развитие

По мере развития проекта планируется:

  1. Автоматическая регистрация сканов - реализация ICP (Iterative Closest Point) для объединения без ручной привязки

  2. Экспорт в BIM - конвертация в форматы IFC/RVT для работы в Revit

  3. Детекция дефектов - использование интенсивности отражения для поиска влажных зон и трещин

  4. Мобильное приложение - управление через смартфон вместо ноутбука

  5. Вместе со следующей статьей выложу все свои наработки в гитхаб, обсудим.

Заключение

Кто-то может подумать, причем здесь дефектовка зданий и сооружений, это же всего лишь 3D модель, на ней не отображаются дефекты. Верно. Но будут отображаться. Полученная 3D-модель зданий, помещений, сооружений - это база для привязки обнаруженных дефектов к точным координатам в 3D-пространстве. Это дает нам возможность автоматического измерения размеров трещин, площади коррозии, отслеживания динамики развития дефектов при повторных сканированиях. Подход предварительного сканирования уже предусмотрен в ГОСТе, регулирующем обследование зданий и сооружений. Новизна предложенного решения - в демократизации сканирования и существенном удешевлении затрат на подготовку 3D-модели. В существующем варианте лидар с его программной обвязкой под Linux может быть сложным для инженеров по обследованию ЗиС, а разработанное мной ПО для Windows снимает ограничения официального SDK и делает лидар доступным для инженеров без опыта работы с Linux и ROS. Исходный код парсера и примеры обработки данных будут доступны на GitHub в августе.

Обратная связь

Буду рада обсудить опыт использования бюджетных лидаров в комментариях. Особенно интересны: Решения проблемы с UART‑адаптером — Опыт работы через Ethernet‑ Интеграция с BIM‑системами‑ Альтернативные варианты крепления и мобильных платформ‑ Результаты использования на реальных объектах Для детального обсуждения технических вопросов — пишите в личку на Хабре.

Комментарии (0)