При обследовании зданий и сооружений часто встает задача создания точной 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‑системами‑ Альтернативные варианты крепления и мобильных платформ‑ Результаты использования на реальных объектах Для детального обсуждения технических вопросов — пишите в личку на Хабре.