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

Давайте разберемся с этим, настолько простым, что даже вы сможете понять.

TL; DR; о том, как я построил это

Я использовал ROS (Роботизированная операционная система), чтобы помочь успешно взаимодействовать между узлами обнаружения светофора, узлом обновления путевых точек и узлом проводной связи (DBW) посредством использования данных с датчика. фьюжн (не знаю, что это, нажмите здесь). Беспилотный автомобиль работает с использованием алгоритма обновления путевых точек, создавая траекторию (набор путевых точек), автомобиль может правильно следовать по пути, обеспечивая при этом безопасность пассажиров.

Архитектура системы

Вот примерное описание того, как работала схема самоуправления, и используемые узлы ROS + темы.

Узел ROS, по сути, является оператором, при наличии определенных данных он выполняет определенные операции (подумайте о нем как о калькуляторе, в данном случае это будет исполняемый код, который мы » d write), а затем использует эту операцию для публикации в теме.

Обычно, когда мы работаем с ROS, мы можем подписаться и публиковать сообщения на определенную «тему» ​​(например, категорию, например, темой футбольного узла будет спорт). В этом случае тема ROS позволяет нам предоставлять информацию (и обновлять) информацию (которая будет выходом узла ROS) узлам ROS, которые «подписаны» на эту тему.

Например, если вы посмотрите на узел "Обнаружение светофора", вы заметите, что он подписан на 3 темы: traffic_waypoint, current_pose и image_color. Эти данные затем передаются всем остальным узлам в системе ROS → для темы traffic_waypoint 2 подписанных узла - это узел обнаружения светофора и узел обновления путевой точки.

Все эти данные взяты из машины (симулятора).

Обнаружение трафика

Вот как это выглядит на узле Traffic Detection крупным планом.

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

Программа обновления путевой точки

Назначение узла обновления путевой точки состоит в том, чтобы в основном позволить нам обновлять наши целевые скорости для каждой путевой точки с учетом данных светофора + обнаружения препятствий (вход слияния камеры и датчика соответственно). Затем мы опубликуем новый список путевых точек впереди машины с желаемыми скоростями, включая скорости автомобиля.

DBW

Электронный привод (DBW) - это тип системы, который использует CARLA (беспилотный автомобиль Udacity). Это означает, что все параметры дроссельной заслонки, тормоза и рулевого управления имеют электронное управление (без механического управления, мы бы использовали эту электронную систему для активации этих функций).

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

Разрушая все это

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

Восприятие

В двух узлах, как показано на схеме архитектуры системы, есть как узел обнаружения объектов, так и узел обнаружения светофора.

Начнем с обнаружения объектов. Это включает в себя Sensor Fusion и использование датчиков LiDAR и Radar, чтобы помочь выяснить, где мы можем ехать, а где нет.

Кроме того, мы также можем использовать вход камеры для обнаружения объектов для автомобилей и объектов, которые слияние датчиков может даже не обнаружить. Хотя я не выбрал вход камеры, потому что алгоритм Sensor Fusion работал нормально, вот как будет выглядеть краткое изложение камеры.

Мы бы использовали особый тип сверточной нейронной сети (подробнее здесь), известный как MobileNet-SSD. В основном он состоит из 3 шагов:

  1. Выполните глубинные свертки со свертками 1x1 (это также известно как точечная свертка) вместо ванильной свертки.
  2. Оттуда используйте «множитель ширины», который позволяет установить пороговое значение для размеров входных и выходных каналов от 0 до 1.
  3. Затем мы также использовали «множитель разрешения», чтобы уменьшить исходный размер ввода и порог до 0 и 1.

Не забудьте отметить, что MibileNets разработан специально для использования на мобильных устройствах, а не на облачных графических процессорах. Несмотря на то, что большее количество параметров позволит получить более точную модель, помните, что мы хотим запускать эту модель в реальном времени в динамических средах, где имеет значение FPS (количество кадров в секунду).

Вот как будет выглядеть общая архитектура CNN:

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

Репозиторий Github для получения дополнительной информации:



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

Используя эту систему обнаружения трафика, мы просто публикуем состояние светофора (красный, зеленый или синий) через ROS для подписанных узлов.

Мы можем получить данные о местоположении светофора через нашу траекторию. Если светофор является частью пути желаемой траектории, то мы сможем получить состояние света, которое публикуется через ROS.

Планирование

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

Когда мы планируем желаемую траекторию, мы обычно хотим, чтобы машина не двигалась назад и обычно вперед во время движения (очевидно, есть ситуации, когда сделать шаг назад - это хорошо, но в данном случае мы игнорируем это).

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

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

Также в случае, если передо мной есть объект или я на светофоре, мне нужно будет сбросить скорость по моим путевым точкам (траектории) и убедиться, что я успею, прежде чем ударить автомобиль или нарушить закон. Мы можем установить специальный порог, чтобы скорость нашего автомобиля стала фактическим ограничением скорости, и по мере того, как я продолжаю двигаться, мне нужно убедиться, что я двигаюсь с меньшей скоростью, чем на одном временном шаге раньше.

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

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

Контроль

В качестве подсистемы управления мы будем использовать узел DBW, чтобы управлять дроссельной заслонкой, тормозом и рулевым управлением автомобиля. В основном это можно сделать с помощью ПИД-регулятора.

Обычно во время движения возникает так называемая ошибка перекрестного следа. При движении ошибка перекрестной полосы (CTE) будет центром нашей полосы. Мы хотим быть уверенными, что едем по центру полосы, чтобы не отклониться от центра и не врезаться в другую машину.

Весь ПИД-регулятор основан на этой ошибке: P означает пропорциональный, I - интегральный, а D - производный.

Мы говорим пропорционально относительно текущей ошибки (ошибка перекрестной траектории), чтобы получить выходной сигнал, пропорциональный CTE. Подумайте о пропорциональном (P) контроллере как о форме «обратной связи», поскольку он полностью основан на CTE.

Часть I (интегральная) ПИД-регулятора в основном принимает интеграцию ошибки CTE. Это означает, что мы возьмем сумму всех ошибок CTE и будем использовать ее в качестве переменной для настройки. Используя отклонения, на которые влияют пропорционально их величине, мы можем устранить любое смещение (раскачивание) во время движения, позволяя автомобилю быть более центрированным.

Контроллер D (производный) должен быть впереди. В случае чрезвычайно высоких интегральных и пропорциональных значений, взяв производную этих значений по времени, теперь мы можем получить меньший результат для угла поворота. Это гарантирует, что мы не сделаем резких изменений во время вождения, и если требуется желаемое рулевое управление, это можно сделать безопасно, без необычного поведения рулевого управления.

Мы также можем установить пороговое значение для нашего вождения: в случае, если наши желаемые значения PID должны продолжать движение прямо, и если наша скорость ниже определенного порогового значения, мы можем поставить автомобиль на тормоз, чтобы предположить, что мы ' Вы либо на светофоре, либо перед нами какой-то объект.

Полученные результаты

Не стесняйтесь взглянуть на код Github, чтобы запустить код самостоятельно!



Планирование на будущее

Из-за обстоятельств COVID я, к сожалению, не смог запустить код на реальном беспилотном автомобиле Udacity (если вы сотрудник Udacity, читающий это прямо сейчас, прекратите меня электронное письмо, пожалуйста »!!!)

Очевидно, что этот не похож на машину, я действительно могу въехать сам и отвезти меня туда, где я действительно хочу. Я думаю, что есть огромный потенциал для улучшения и потенциальные возможности для продолжения исследования + оказания влияния в сфере беспилотных автомобилей!

В настоящее время меня увлекает использование входов камеры для обнаружения полосы движения в крайне неблагоприятных условиях (снег, туман и т. Д.). Если вы знаете кого-нибудь, кто занимается исследованиями в этой области, я с удовольствием пообщаюсь с ним! Пожалуйста, отправьте мне письмо по электронной почте, это будет означать весь мир! Вот мой адрес электронной почты: [email protected].

Кроме того, я также открыт для стажировок где угодно в сфере самоуправления. Если вы знаете кого-нибудь (или вас), кто хотел бы принять меня в качестве стажера или поговорить о потенциальных возможностях работы, почувствуйте бесплатно, чтобы отправить мне электронное письмо, используя ссылку выше.

Связаться со мной

"Эл. адрес"

Linkedin

Твиттер

"Веб-сайт"

Находите этот материал крутым? Подпишитесь на мою рассылку.