Перейти к основному содержимому

Лидары

Учебный робот сканирует препятствия лидаром

Лидар даёт роботу не фотографию, а набор измеренных расстояний в разных направлениях. По одному скану программа может увидеть ближайшие стены и предметы, а по последовательности сканов — уточнять карту, положение робота и свободный путь.

Коротко

Лидар испускает свет, принимает отражение и оценивает расстояние до поверхности. Сканирующий модуль повторяет измерение под разными углами, поэтому результат удобно представить как лучи или точки вокруг датчика.

Зачем это нужно

Представьте мобильного робота в учебной аудитории. По команде «езжай вперёд» он должен объехать ножку стола, не задеть стену и найти проход. Один дальномер сообщает расстояние только вдоль одного направления. Лидар за один цикл получает целый набор направлений и расстояний, поэтому алгоритм видит сразу несколько границ вокруг платформы.

Эти данные полезны для трёх разных задач:

  • обнаружение препятствий — отметить занятые участки рядом с роботом;
  • локализация — сравнить наблюдаемые контуры с уже известной картой и оценить позу робота;
  • построение карты — объединить сканы, снятые из разных положений.

Лидар не выбирает маршрут самостоятельно. Он лишь поставляет измерения. Программа должна знать, где установлен датчик, отфильтровать недопустимые значения и преобразовать точки в систему координат карты.

Главная идея

В простом учебном скане для каждого направления программа получает одно выбранное значение дальности. Если угол луча равен θ, а дальность — r, то точку в плоскости датчика можно вычислить так:

x = r · cos(θ)
y = r · sin(θ)

Так массив расстояний превращается в набор координат. Один скан похож на пунктирный контур поверхностей вокруг робота, а не на готовый чертёж помещения.

Что известноОбозначениеЧто оно задаёт
угол начала сканированияangle_minнаправление первого луча
шаг между лучамиangle_incrementугол следующего измерения
массив расстоянийrangesдальность для каждого направления
допустимый диапазонrange_min, range_maxкакие значения можно использовать
время скана и лучейscan_time, time_incrementкогда получены измерения

В сообщении ROS 2 sensor_msgs/LaserScan именно эти поля описывают плоский лазерный скан. На один угол в массиве хранится одна дальность. Некоторые устройства способны зарегистрировать несколько возвращений одного импульса или выбирать режим возвращения; для таких данных драйвер должен явно определить, какое значение попало в LaserScan, либо использовать другое представление. Значения вне диапазона датчика должны быть отброшены, а временные поля нужны, если платформа перемещалась во время сканирования.

Как получается расстояние

Один распространённый принцип — измерение времени прохождения света. Устройство посылает короткий световой импульс и фиксирует задержку отражения. Свет проходит путь к объекту и обратно, поэтому расстояние связано с задержкой формулой:

r = c · Δt / 2

Здесь c — скорость света, Δt — время между отправкой и приёмом, а деление на два учитывает двойной путь. NOAA описывает этот принцип для лидарных систем: более далёкое отражение приходит позже. В конкретных компактных лидарах могут применяться и другие способы оценки фазы или частоты, поэтому внутренний алгоритм следует уточнять в документации выбранной модели.

Отражение — это не объект

Лидар регистрирует ответ от поверхности, на которую попал луч. Одна точка не сообщает программе, что перед ней «стул» или «стена». Значение и форму приходится выводить из множества измерений и контекста.

Сканирование выполняется механическим вращением оптики, зеркалом, электронным управлением лучом или сочетанием методов. Для программирования важнее не конструкция, а выходные данные: угол, дальность, время и иногда интенсивность возвращённого сигнала.

2D-скан и облако точек

Плоский лидар измеряет направления в одной плоскости. Его удобно устанавливать горизонтально на мобильного робота: контуры стен, коробок и ножек мебели образуют 2D-срез. Многослойный или трёхмерный лидар получает точки с разными вертикальными углами и описывает пространство объёмнее.

ПредставлениеЧто хранитКогда удобно
LaserScanупорядоченный массив дальностей и геометрию угловплоская навигация и компактная передача одного скана
PointCloud2набор точек с полями координат и возможными дополнительными каналами3D-сцены, несколько слоёв, совместная обработка разных источников
сетка занятостиячейки «свободно / занято / неизвестно»планирование пути на плоскости
карта стоимостичисловую цену прохода по ячейкеобход препятствий с запасом под размеры робота

Пакет ROS 2 laser_geometry умеет проецировать LaserScan в PointCloud2. При преобразовании он отбрасывает дальности вне допустимых границ; при наличии преобразований координат может учитывать движение датчика во время скана.

От скана к маршруту

Скан, карта точек и маршрут робота

Рабочая цепочка состоит из нескольких проверяемых шагов:

  1. Драйвер получает скан и метку времени.
  2. Программа отбрасывает недопустимые дальности.
  3. Угол и расстояние каждого луча превращаются в координаты.
  4. Точки переводятся из системы координат лидара в систему робота или карты.
  5. Наблюдения отмечают занятые и свободные области.
  6. Планировщик ищет путь с учётом корпуса робота и запаса до препятствий.

В Nav2 слой препятствий принимает LaserScan или PointCloud2, отмечает препятствия и может очищать пространство трассировкой лучей. Это хороший пример разделения ролей: сенсор поставляет наблюдение, слой карты интерпретирует его, а планировщик использует уже карту стоимости.

Карта точек и карта занятости — не одно и то же

Точки показывают места отражений. Сетка занятости делит пространство на ячейки и хранит оценку их состояния. Между ними работает алгоритм, который учитывает лучи, положение датчика и предыдущие наблюдения.

Система координат и установка

Точка (x, y) имеет смысл только вместе с системой координат. В системе лидара начало находится в оптическом центре. В системе робота начало может быть в центре шасси. Карта имеет собственное неподвижное начало. Преобразование между ними должно учитывать положение и поворот сенсора.

Если лидар физически смещён на 8 см вперёд, но программа считает его установленным в центре, все контуры будут смещены. Если модуль наклонён, горизонтальный срез может пересекать пол или пропускать низкие препятствия. Поэтому крепление должно быть жёстким, а положение сенсора — записано в конфигурации.

Проверка перед навигацией:

  • на неподвижном роботе контур стены не «плывёт»;
  • поворот робота не меняет форму неподвижной комнаты после перевода точек в карту;
  • передняя точка скана действительно находится перед шасси;
  • минимальная и максимальная дальности соответствуют документации устройства;
  • препятствие не исчезает из-за неверной высоты плоскости сканирования.

Детализация и частота

У скана есть пространственная и временная дискретность. Малый угловой шаг даёт больше направлений в одном обзоре, но не гарантирует, что тонкая стойка будет замечена на любой дальности. Между соседними лучами расстояние растёт по мере удаления от сенсора. Частый скан быстрее обновляет наблюдение, однако увеличивает поток данных и не устраняет задержку всего контура управления.

Поэтому параметры оценивают вместе с задачей. Для медленного робота в широком коридоре может хватить редкого обзора. Быстрой платформе рядом с тонкими ножками мебели требуется проверка вероятности пропуска, возраста данных и тормозного пути. Изменять частоту или угловое разрешение программно можно только в пределах режимов конкретного устройства и драйвера.

Пример: преобразование учебного скана

Ниже — обычный Python-код без ROS. Он превращает три угла и дальности в точки. Такой расчёт полезно выполнить до подключения настоящего лидара: можно проверить единицы и направление осей.

from math import cos, radians, sin

angles_deg = [-45, 0, 45]
ranges_m = [1.4, 0.9, 1.2]

points = []
for angle_deg, distance_m in zip(angles_deg, ranges_m):
angle_rad = radians(angle_deg)
x = distance_m * cos(angle_rad)
y = distance_m * sin(angle_rad)
points.append((round(x, 3), round(y, 3)))

print(points)

Здесь положительная ось x направлена вперёд, а положительный угол поворачивается против часовой стрелки. Это соответствует соглашению, описанному в LaserScan, если ось Z направлена вверх. В другом проекте соглашения могут отличаться — их нельзя угадывать по картинке.

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

Пусть робот должен остановиться, если корректное измерение в переднем секторе меньше 0.45 м. Надёжная логика сначала выбирает передний сектор, затем удаляет NaN, бесконечности и значения вне диапазона сенсора, и только после этого ищет минимум.

СитуацияОшибочное действиеБолее безопасная проверка
одно значение NaNсравнить его с порогом как обычное числоисключить нечисловое измерение
дальность меньше range_minсчитать объект почти касающимсяпометить измерение недопустимым и применить политику безопасности
нет ни одного корректного лучарешить, что путь свободеностановиться или перейти в заранее заданное безопасное состояние
препятствие сбокутормозить по минимуму всего кругаанализировать сектор, соответствующий движению

Значение «нет корректных данных» отличается от «препятствий нет». Первая ситуация говорит о качестве наблюдения, а вторая — о сцене.

Что запомнить про лидар

  • В простом LaserScan на направление хранится одна выбранная дальность; сам лидар не распознаёт предметы.
  • Луч задаётся углом и расстоянием; из них вычисляется точка.
  • Один 2D-скан образует редкий контур поверхностей в плоскости измерения.
  • Для карты нужно знать позу датчика и время наблюдения.
  • Навигация использует обработанные данные: облако точек, сетку занятости или карту стоимости.
  • Пропуск измерения нельзя автоматически трактовать как свободное пространство.

Практика

Задание 1. Нарисуйте скан

На листе отметьте лидар в начале координат. Возьмите углы -60°, -30°, , 30°, 60° и дальности 1.0, 1.2, 0.8, 1.3, 0.9 м. Вычислите точки и нанеси их на плоскость. Стоит ли соединять эти точки линией? Обоснуй решение.

Задание 2. Проверьте данные

Дан массив дальностей:

[0.08, 0.42, NaN, 1.35, inf, 4.70]

Допустимый диапазон лидара — от 0.12 до 4.0 м. Составьте правила фильтрации и запишите, какие состояния должен различать алгоритм после проверки.

Задание 3. Спланируй эксперимент

Поставьте робот неподвижно перед ровной стеной. Опишите, как по пяти последовательным сканам проверить повторяемость, направление нулевого угла и влияние небольшого наклона лидара. Не подбирай результат заранее: запишите метрики до измерения.

Задание 4. Выберите представление

Для трёх задач выберите LaserScan, PointCloud2 или сетку занятости: аварийная остановка по переднему сектору, отображение 3D-склада, поиск пути по коридору. Укажите, какие преобразования потребуются.

Проверьте себя

  • Почему в формуле времени пролёта есть деление на два?
  • Что связывает индекс в массиве ranges с направлением луча?
  • Чем LaserScan отличается от PointCloud2?
  • Почему скан нельзя сразу считать картой помещения?
  • Как ошибка в положении лидара влияет на точки в системе робота?
  • Чем отсутствие корректного отражения отличается от большой измеренной дальности?
  • Как лидарные данные попадают в карту препятствий Nav2?
Ориентиры для самопроверки

Сначала ответьте без подсказки. Ответ можно считать полным, если вы:

  • формулируете основную мысль своими словами;
  • называете важные условия, ограничения или меры безопасности;
  • для схемы, кода или расчёта показываете ход решения и ожидаемый результат.

Если один из пунктов объяснить не получается, найдите соответствующую главу статьи, перечитайте её и повторите ответ.

Словарь статьи

  • Лидар — активный оптический сенсор, оценивающий дальность по возвращённому свету.
  • Скан — набор измерений, полученных за один цикл обзора.
  • Луч — направление отдельного измерения дальности.
  • Дальность — расстояние от оптического центра сенсора до измеренной поверхности.
  • Облако точек — набор координат точек, иногда с дополнительными полями.
  • Сетка занятости — карта из ячеек с оценкой свободного, занятого или неизвестного пространства.
  • Карта стоимости — сетка, где числа задают сложность или опасность проезда.
  • Система координат — начало, оси и правила, относительно которых записаны координаты.
  • Локализация — оценка положения и ориентации робота на карте.
  • SLAM — одновременное построение карты и оценка положения на ней.

Связанные темы

Источники