Часть 4 — выход на новый уровень.

Предыдущие посты из этой серии можно найти здесь.

Багста

После того, как моя «тестовая» машина наконец-то заработала, пришло время попробовать что-то более захватывающее. У меня была FTX Bugsta, быстрая машина — до 37 миль в час на 3-элементном LiPo!

Я не собирался приближаться к такой скорости, но был заинтересован в том, чтобы это работало снаружи. Моя первая попытка обернулась катастрофой: я вообще не мог управлять машиной с помощью Bluetooth-контроллера — дальность была ужасной, а точность — ужасной. Я хотел использовать свой RC-контроллер, но, к сожалению, Jetson не может считывать ШИМ-сигналы, поэтому потребуется хак Arduino, чтобы измерить ШИМ, преобразовать его и отправить через pyserial и USB-разъем на Jetson. Подробнее об этом можно прочитать здесь и здесь. Гораздо более простым решением было использовать Raspberry Pi 4, который может делать это напрямую.

Первая попытка

Мой конвейер был:

  1. Используйте Raspberry Pi 4 и контроллер RC для записи тренировочных данных.
  2. Перенесите данные на рабочий стол с графическим процессором и изучите модель. Я пробовал разные разрешения изображения, но в итоге остановился на маленьком 160x120, чтобы позволить pi выполнять свой код вывода с достаточно высокой частотой кадров.
  3. Перенесите модель обратно в Pi и дайте машине поехать.

Для своего первого трека на свежем воздухе я использовал «розовую ленту», привязанную к палочкам в саду:

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

Вторая попытка

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

Обучение выглядит хорошо, и после преобразования модели в tflite машина смогла ездить сама по себе. Ура!

Это показывает график потерь тензорной доски для линейной модели CNN, которая состоит из 5 сверточных слоев, чередующихся с отсевом (0,2), за которыми следуют два плотных слоя с таким же отсевом. Другими параметрами были: Адам, LR Снижение на плато и Ранняя остановка.

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

Несмотря на то, что у меня не было высокой частоты кадров на raspberry pi (‹10/с), машина все еще могла управлять собой. Вот результат!

Поведенческие режимы вождения

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

Для этого было важно использовать Jetson Nano, и я использовал родной формат Nvidia TensorRT для модуля распознавания объектов. Я использовал этот замечательный блог, в котором описывалось, как запустить GoogLeNet с TensorRT на Nano. GoogLeNet — это 22-слойный вариант исходной сети, который выводит прогнозы объектов, распознанных на сцене, с использованием классов ImageNet 1000. Затем я выбрал метку Тедди и, если она обнаружена, установил дроссель на 0.

Затем я модифицировал его, чтобы он работал как модуль на автомобиле, и с моим размером изображения 240x160 распознавание объектов заняло около 35 мс. Запуск этого вместе с выводом tflite позволил мне получить общее время цикла движения 67 мс или 15 кадров / с, и это позволило машине обнаружить Тедди и вовремя остановиться!

Вывод

Безусловно, здорово видеть, как модель автомобиля сама по себе ездит по вашему саду и избегает чрезвычайно важных игрушек!

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

Я узнал (снова), что все дело в данных, и без качественного ввода вы не получите удовлетворительную систему, и что время требуется на разработку (данные или физические).

Чтобы пойти дальше, потребуется немного матовой краски или неотражающего дорожного покрытия, чтобы удалить отражения на дороге. Следующим шагом может стать использование других датчиков, таких как IMU, вместе с объединением датчиков в нейронной сети. И чтобы быть действительно авантюрным, я мог бы попробовать визуальную одометрию, чтобы узнать внутреннее представление дороги, используя что-то вроде DF-VO. Это позволит автомобилю узнать, где он находится на внутренней карте, которую он может использовать для прогнозирования необходимого рулевого управления и дроссельной заслонки.

Надеюсь, вам понравилось, и вы, возможно, нашли несколько полезных советов, которые помогут вам построить свой собственный автомобиль с автоматическим управлением!