справа показано положение камеры относительно объекта съемки
справа показано положение камеры относительно объекта съемки

Лет пять назад мы с другом делали один необычный проект рекламного характера с продвинутой видеосъемкой с дрона. Проект в итоге завершен не был, но интересные наработки остались. Возможно кому-то пригодятся эти наработки или кто-то захочет довести этот проект до конца.

Постановка задачи: определить координаты дрона относительно движущегося объекта.

Обзор существующих решений похожих задач:

А) Бинокулярное зрение. Лидеры отрасли гражданских БПЛА используют для ориентации дронов в пространстве бинокулярное зрение. Например у дрона DJI mavic 3 pro четыре пары сдвоенных камер для избегания препятствий.

8 камер для построения 3д модели местности и, соответственно, избегания препятствий
8 камер для построения 3д модели местности и, соответственно, избегания препятствий
тут DJI показывает, как система построения 3д модели местности видит окружающий мир. (гифка взята с их сайта)
тут DJI показывает, как система построения 3д модели местности видит окружающий мир. (гифка взята с их сайта)

Другой лидер индустрии гражданских беспилотников тоже использует бинокулярное зрение: в модели Skydio1 оспользовалось 8 камер для ориентации в пространстве (4 пары). В модели skydio2 используется 6 камер (уже не сдвоенные, а строенные, но принцип все равно тот же). Подробнее про бинокулярное зрение дронов можно почитать здесь: Бинокулярное зрение: машинное и естественное

Б) Монокулярное зрение: Structure-from-Motion и Visual SLAM

Чтобы не перегружать статью картинками, уберу схему работы Structure-from-Motion и Visual SLAM на примере машинного зрения Tesla под этот спойлер
Общая схема работы Structure-from-Motion:  3д пространство строится последовательно по мере продвижения камеры.
Общая схема работы Structure-from-Motion: 3д пространство строится последовательно по мере продвижения камеры.

Structure-from-Motion и Visual SLAM это формально два разных, но очень похожих способа построения 3д модели окружающего пространства. Оба метода основаны на геометрическом методе вычисления расстояния до фич (углов, ярких точек и т.п.) объекта. Основная разница в том, что первый метод сравнимает каждый кадр с каждым, а visual SLAM сравнивает кадр только со следующим и предыдущим. В рамках данной статьи будем считать SLAM частным случаем S-f-M.

так работает метод S-f-M на автомобиле Tesla model 3
так работает метод S-f-M на автомобиле Tesla model 3

Основным недостатком данного метода является то, что движущиеся предметы оказываются не видны. Из-за этого недостатка алгоритма могут происходить аварии подобные этой: Очередной инцидент с Tesla, чуть не столкнувшейся с поездом, вызывает опасения по поводу автопилота

Тут автопилот tesla model3 не увидел движущийся поезд. Если бы поезд не двигался, то алгоритм Structure-from-Motion (Visual SLAM) наверняка бы увидел препятствие.
Тут автопилот tesla model3 не увидел движущийся поезд. Если бы поезд не двигался, то алгоритм Structure-from-Motion (Visual SLAM) наверняка бы увидел препятствие.

Наш подход:

Чтобы избежать недостатков метода Structure-from-Motion, мы решили использовать "обратный" Structure-from-Motion.

Это классический метод S-f-M. В этом примере будет построена 3д модель серого авто, дороги и окружающего поля. Поскольку черный автомобиль движется, то алгоритм его не увидит и черный авто не отобразится в конечной 3д модели.
Это классический метод S-f-M. В этом примере будет построена 3д модель серого авто, дороги и окружающего поля. Поскольку черный автомобиль движется, то алгоритм его не увидит и черный авто не отобразится в конечной 3д модели.
Это пример метода обратного S-f-M. Здесь в конечной 3д модели будет только  автомобиль.Поле и трава здесь являются движущимися объектами, поэтому в 3д модели не отобразятся.
Это пример метода обратного S-f-M. Здесь в конечной 3д модели будет только автомобиль.Поле и трава здесь являются движущимися объектами, поэтому в 3д модели не отобразятся.

С теорией закончили, теперь реализация.

Сначала делаем видео с объектом в стиле обратного S-f-M. Затем нарезаем это видео на несколько сотен кадров. Допустим у нас получилось 1000 кадров. Это неразмеченный датасет. Размесает этот датасет, пропуская через алгоритм Structure-from-Motion в любой программе фотограмметрии. Мы использовали Meshroom (кстати разбить видеоролик на несколько сотен кадров можно в нем же). Разметка каждого кадра идет в таком формате: IMAGE_ID, QW, QX, QY, QZ, TX, TY, TZ, CAMERA_ID, NAME

пример: 1 0.998302 -0.00448578 0.053215 -0.0232721 0.213129 -0.225976 4.24765 3391136576 1007579105.jpg

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

Возможный результат. В итоге мы получим робота/дрон/автопилот, который хорошо определяет свое местоположение относительно конкретного объекта даже если этот объект движется.

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

Если запрограммировать удар точно в боекомплект системы HIMARS, то удар будет именно туда, даже если техника движется. Потому что модель точно определяет свое местоположение относительно объекта.
Если запрограммировать удар точно в боекомплект системы HIMARS, то удар будет именно туда, даже если техника движется. Потому что модель точно определяет свое местоположение относительно объекта.

P.S. Я наверное лишнего расписал теорию и мало написал про практику. Но общий смысл в том, чтобы автоматически размечать датасеты с помощью программ фотограмметрии. Если кто-то уже делал или сейчас делает что-то подобное-пишите в комментах, будет интересно пообщаться.

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


  1. eimrine
    07.11.2025 10:22

    Какие системные требования к вычислителю который будет на дроне?

    Правильно ли я понимаю что если делать то же самое но с бинокулярным зрением, например с целью уклонения от "чёрного автомобиля" и прочих случайных объектов вроде деревьев то требования к вычислителю возрастут в два раза?


    1. malyazin_2010 Автор
      07.11.2025 10:22

      Бинокулярный дрон Skidio2 построен на плате jetson TX2 . У нее не самая большая вычислительная мощность.

      Дроны с бинокулярным зрением могут уклоняться от движущихся объектов. главный минус-что для бинокулярного зрения нужно удвоение числа камер, но есть и другие недостатки.


  1. TimID
    07.11.2025 10:22

    Пока всё написанное - это просто слова.
    Идея, так сказать. Коих очень много всем приходят в голову, но так и не доходят до реализации.
    Так что подавайте-ка реализацию. С описанием проблем с которыми столкнулись и которые мужественно преодолели


  1. VBDUnit
    07.11.2025 10:22

    Приходилось писать реалтаймовое автоматическое выравнивание камер глубины между собой (RealSense D415), то есть вычислять относительно одной камеры положение всех остальных. Нужно это было для реалтаймового 3D сканирования с текстурой — строим несколько поверхностей и сшиваем.

    Выравнивание сделал так: ищем общие точки на цветных 2D картинках, через канал глубины вытаскиваем расстояние до них и рассчитываем их 3D координаты в локальной системе отсчёта конкретной камеры, дальше уже простая триангуляция. Ну то есть вот треугольник видит одна камера, вот другой треугольник видит другая камера. Мы знаем, что это в реале эти два треугольника на самом деле один и тот же треугольник, поэтому можем посчитать матрицу трансформации.

    D415 шумит конечно, но точек много, комбинаций по 3 точки ещё больше, поэтому немного медианной фильтрации, усреднения и кое‑какой магии — и вот уже точность +‑ приемлемая. Камеры, в основном, стояли на месте, их иногда могли перенести куда‑нибудь или просто случайно сместить. Поэтому я мог позволить себе оооочень долгое интегрирование по времени :)

    Так вот, есть мысли что подобный подход применим и тут, и высоковероятно, что ресурсов жрать оно будет меньше, чем нейросетка, даже в случае с монокулярной камерой. Фактически при движении дрона мы получаем новые ракурсы, и нам нужно просто узнать координаты нового местоположения в системе координат предыдущего (или нескольких), и просто интегрировать путь.

    А ещё это довольно несложно (относительно) впихнуть в ASIC и производить по 50 000 штук в месяц.


  1. ForeverYoung
    07.11.2025 10:22

    Ну-ну