- PVSM.RU - https://www.pvsm.ru -

Self-driving ГАЗ66 Monster Truck 1-16

Хочу рассказать вам о том, как я делал и сделал самоуправляему машинку :)

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

Те места, где было что фоткать, с фотками. Там, где про софт — скорее всего без фото.

Это будет действительно история в формате повествования, как я рассказывал бы вам за чашкой кофе. Это не про bash команды, python скрипты, и вот это вот всё.

Начнём с фотки и видео того, что получилось, и дальше вся история под катом.

Self-driving ГАЗ66 Monster Truck 1-16 - 1

История пройдет по такому сценарию

  • Почему я этого захотел
  • Как устроена самоуправляемая машина (взгляд сверху)
  • Эпоха 1 — Gelendwagen из детского мира + Raspberry Pi Zero W + камера
  • Эпоха 2 — ГАЗ66 + NVIDIA Jetson Nano + Камера для RaspberryPi
  • Эпоха 3 — Remo Hobby SMAX
  • Эпоха 4 — Соединение SMAX и ГАЗ66
  • Эпоха 5 — Монтирование компонентов на монстр траке
  • Эпоха 6 — Установка Donkey Car и окружения
  • Эпоха 7 — Сборка трассы, поездки
  • Эпоха 8 — Поездки с джойстика
  • Эпоха 9 — Обучение нейронки
  • Эпоха 9 — Всё работает, наконец-то!
  • Что дальше?
  • Вызов на батл
  • Сообщество
  • Образ sd карты моей машинки

Наливайте кофе, мы выезжаем!

Почему я этого захотел

Всё началось с того, что я фрустрировал с того, что в одной большой IT компании России делают очень классные беспилотники, это невероятно круто, а я не у дел :)

Не, ну правда, это же так круто — самоуправляемые тачки) Отличный сплав из механики и алгоритмов :)

Фрустрация продолжалась до тех пор, пока я не соединил у себя в голове разные факты о себе, а именно:

  • я умею писать на питоне
  • я (примерно) понимаю как работает машинное обучение
  • я знаю, как работать с линуксом в консольке
  • я провел детство с паяльником
  • у меня есть целая коробка с diy компонентами (raspberry pi, arduino, сенсоры, и т.д.)

Когда всё в голове сложилось, я решил — self drirving car (sdc) быть!

Для начала, решил я, стоит вообще разобраться, как устроена sdc, и об этом будет следующий раздел.

Как устроена самоуправляемая машина (взгляд сверху)

Для того, чтобы машина поехала сама, ей нужно четыре компонента — тележка, сенсоры, компьютер, алгоритм.

Давайте разберемся

Тележка

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

Здесь есть две условных когорты машинок, которые я назвал для себя так — машинки из детского мира, и машинки для хобби.

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

Машинки из мира хобби — то, что вам нужно. У них мощные двигатели, хорошие батареи, сервоприводы на передних колесах для поворотов. Считайте, что это порог входа. Самое дешевое и нормальное, что мне удалось найти — Remo Hobby SMAX.

Self-driving ГАЗ66 Monster Truck 1-16 - 2

Сенсоры

То, что собирает некоторую информацию о окружающем мире, и передает в компьютер для принятия решений.

Базово, джентельменский набор для SDC такой:

  • Камера. Основа основ SDC. Смотрит на кусок пространства перед собой, передает изображение компьютеру, который распознает происходящее, и решает, что делать. Кажется, что я не встречал реализаций SDC без камеры.
  • IMU сенсор. Штука, показывающая ускорение и угол наклона по осям. Помогает понимать, куда мы, собственно, едем, и как изменилось наше местоположение относительно точки старта. Используется почти во всех коптерах.
  • Лидар. Одновременно и простая и сложная штука, которая стреляет лазером вокруг себя, измеряет время возвращения луча, и понимает расстояние до границы пространства. Лидары бывают дорогими, как в настоящих SDC, и довольно дешевыми, как в вашем роботе пылесосе. Для сравнения, лидар из пылесоса стоит 75$, тогда как лидар для большой SDC от Velodyne нагуглился мне за 4K$. Такая разница в цене объясняется тем, что дорогие лидары строят 3D картинку, тогда как пылесосный лидар находит просто границы комнаты в 2D.
  • GPS. Не используется в маленьких машинках, так как слишком большая погрешность измерения на маленьких расстояниях, но о нем стоит сказать, так как в больших SDC активно используется.
  • Камера глубины. Работает примерно как смесь лидара и камеры — получает картинку с точками, и расстоянием до них. Позволяет строить 3D карту видимой области.

Self-driving ГАЗ66 Monster Truck 1-16 - 3

Компьютер

То, что получает значения от сенсоров, анализирует ситуацию, передаем команды управления тележке.

В мире компьютеров для встраиваемой электроники правят бал энергоэффективные ARM процессоры (как в вашем телефоне), и одноплатные компьютеры на их основе.

На сегодня есть два самых популярных варианта одноплатников — RaspberryPi и NVIDIA Jetson.
RaspberryPi отличается меньшей ценой, бОльшим количеством разнообразных проектов, бОльшим сообществом.

NVIDIA отличается бОльшей ценой, меньшим количество проектов, но при этом бОльшей производительностью в задачах машинного обучению. Имеет на борту 128 CUDA ядер (как в вашей большей NVIDIA видеокарте), которые используются для ускорения алгоритмов машинного обучения.

В моей коллекции есть три штуки Raspberry Pi (ZeroW, 3, 4) и NVIDIA Jetson Nano. Машинку я решил собирать, конечно же, на Jetson.

Self-driving ГАЗ66 Monster Truck 1-16 - 4

Алгоритм

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

Если вы хотите освежить, как работает нейросеть, то предлагаю вам посмотреть вот такое видео:

Здесь я описал самый простой вариант, где есть только камера и езда по разметке. Но есть варианты с бОльшим количеством сенсоров и другой логикой работы — об этом здесь будет отдельный пост.

Если очень высокоуровнено, то это всё.

Остается только:

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

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

Эпоха 1 — Gelendwagen из детского мира + Raspberry Pi Zero W + камера

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

Окей, подумал я, гелик есть, теперь нужен компьютер и сенсор. Подумано — сделано. Заказал RPi Zero W и камеру для неё. Пока ждал компьютер и камеру, зашел, купил для этого дела пауэрбанк.
Итак, всё на месте, пора собирать. Нашел вот такой проект [1], решил идти по нему.
Разобрал гелик, вытащил его родные мозги [2], перекинул их на контроллер двигателя, его, в свою очередь, перекинул на RPi, к ней подключил камеру, запитал всё это дело пауэрбанком, остался доволен.

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

Тут-то меня и ждала пара провалов.

Первый — Raspberry Pi Zero W очень слабая в плане производительности.

Второй — Проходимость гелика из детского мира почти никакая, его останавливало почти любое минимальное препятствие.

Уже сейчас стало понятно, что проект мертворожденный, но ради интереса я попробовал собрать для Raspberry Pi Zero компьютерное зрение (OpenCV) прямо на ней же. Это заняло, без шуток, больше суток, и стало последним гвоздем в крышку гроба этой реализации SDC.
Стало понятно, что нужно менять и компьютер для большей производительность, и тележку, для большей проходимости.

Получилось довольно смешно:

Self-driving ГАЗ66 Monster Truck 1-16 - 5

Эпоха 2 — ГАЗ66 + NVIDIA Jetson Nano + Камера для RaspberryPi

Итак, на этом моменте стало понятно, что нужно какая-то более проходимая машина, и желательно, грузовик, чтобы положить в кузов все компоненты. После штудирования одного сервиса по подбору товаров, стало понятно, что мне подходит модель нашего родного ГАЗ66, он же шишига в народе. Окей, заказал, жду, пора думать про компьютер. К этому моменту NVIDIA как раз готовила старт продаж своих Jetson Nano, и я оформил заказ в первый день продаж.

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

Тем временем, Jetson еще ехал, а я заказал из Китая пылесосный лидар — пока не знал, как конкретно буду его применять, но понимал, что хочу.

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

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

Подключил камеру, контроллер двигателя, поворотный двигатель, двигатель газ/тормоз, завел питоновские скрипты для теста — снова облом!

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

Окей, снова нужно как-то это решать, что-то делать. Переходим к следующей эпохе.

Self-driving ГАЗ66 Monster Truck 1-16 - 6

Self-driving ГАЗ66 Monster Truck 1-16 - 7

Эпоха 3 — Remo Hobby SMAX

Так как в этот момент времени было понятно, что машинка нужна не только проходимая, но и минимально хорошая по комплектующим, выбор пал на магазины для тех, у кого RC, это хобби.
Не мудрствуя лукаво, я приехал в один такой магазин, и не таясь рассказал, что делаю, и какая мне нужна машинка. Продавец, будь ласка, рассказал мне, какая машинка подходит под мои минимальные требования, и это был Remo Hobby SMAX. Купил.

Приехал домой, достал шишигу, скинул всё с неё, сел подключать к SMAX. И что, как вы думаете? Правильно — снова неудача!

Базово, RC машинки устроены так, что двигатель подключается к контроллеру двигателя, а тот, в свою очередь, подключается к радио модулю, который общается с пультом. И вот именно SMAX устроен так, что там контроллер двигателя и радио модуль были объединены — у меня буквально не было возможности подключиться к контроллеру двигателя вместо радио модуля.

Окей, надо что-то снова делать. Возвращаюсь на сайт RC машинок, лезу в комплектующие. Ковыряюсь там, и ура, нахожу такой контроллер двигателя, у которого есть отдельный провод до радио модуля.

Заказываю, привозят, собираю всё заново — работает, но только повороты. А газ и реверс нет! Да что, блин, такое, думая я, но продолжаю ковыряться.

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

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

Сначала я перебирал по 100 — мимо. Потом по 50 — мимо. И вот когда дошел до перебора по 10, на 360 услышал какой-то приветственный писк — ура! Работает!

Потестил из консоли газ/реверс/лево/право, все работает. Вот это огонь, вот это я программист =)

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

Нашел проект donkey car, в котором есть всё под ключ, чтобы собрать свою SDC — и Hardware примеры, и Software фреймворк. Казалось бы, круто, бери и пользуйся, но, есть нюансы:

  • они печатают верх машины на 3D принтере, и машину оно потом напоминает очень отдаленно. некрасиво, короче, не эстетично
  • их 3D модели совместимы с такими машинами, которые у нас не продаются.

Окей, запомним Donkey Car, возьмем потом их Software фреймворк, но пока надоо думать про hardware.

В какой-то день, крутя в своей квартире головой, я посмотрел на разобранную шишигу, на SMAX без верхней части, и подумал — хммм, а они, кажется, одного масштаба (1/16). Взял шишигу, взял SMAX, просто на глазок приложил одно к другому — и правда, подходит! И выглядит круто! Окей, надо делать! Переходим к следующей эпохе.

Self-driving ГАЗ66 Monster Truck 1-16 - 8

Self-driving ГАЗ66 Monster Truck 1-16 - 9

Эпоха 4 — Соединение SMAX и ГАЗ66

Итак, на старте этой эпохи у меня есть внутренний таргет — соединить верх от одной машины с низом от другой. Так как мы с коллегами скинулись на 3D принтер, и я являюсь его совладельцем (серьезный инвестор), то было решено нарисовать соединение в CAD программе, распечатать, и таким образом их соединить.

С этой идеей я ходил около 2 месяцев, думая, что вот-вот сяду разбираться в CAD системах. Лол, нет. Признавшись себе в том, что я не хочу разбираться в CAD системах, я стал думать, какие еще есть варианты.

Зашел снова в детский мир, решил посмотреть конструкторы, вдруг они мне как-то помогут. Купил классический металлический конструктор, который был у меня, когда я учился в школе (аш олдскулы свело).

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

Начал делать. Провел не один день с детским гаечным ключом, гайками, и пространственным мышлением [2].

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

Спустя примерно три переделки и три дня я увидел перед собой этот монстр трак — ГАЗ66 SMAX Edition by Beslan.

Итак, кажется, hardware база готова, переходим к следующей эпохе.

Self-driving ГАЗ66 Monster Truck 1-16 - 10

Self-driving ГАЗ66 Monster Truck 1-16 - 11

Эпоха 5 — Монтирование компонентов на монстр траке

Наконец-то:

  • у меня есть тележка с хорошими компонентами
  • у меня эстетичный и вместительный верх
  • на этой тележке нормально работают газ/тормоз/повороты
  • верх и низ даже соединены вместе =)

Пора монтировать на этой красоте компоненты.

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

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

Помимо Jetson, в кузове поселились:

  • пауэрбанк для питания компьютера (пожертвовал свой основной, классный, с usb power delivery, чтобы jetson не проваливался по питанию)
  • PCA9685 (ШИМ контроллер) для управления двигателями
  • батарея для питания двигателя машины

Так как проект уже на этот момент считался долгостроем, с лидаром решил пока не связываться, и сделать MVP хотя бы на камере и софте от Donkey Car.

По приколу подключил родные фары от ГАЗ66, чтобы было красивее и увереннее в темноте.

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

Self-driving ГАЗ66 Monster Truck 1-16 - 12

Self-driving ГАЗ66 Monster Truck 1-16 - 13

Эпоха 6 — Установка Donkey Car и окружения

Благо, на прошлых этапах я нашел проект Donkey Car, и он очень упростил мне жизнь, избавим меня от написания всего самостоятельно. Говоря по простому, DonkeyCar, это фреймворк, в котором уже есть все, что нужно для SDC. И у них даже есть гайды по тому, как ставить софт. Но, как это обычно бывает с OpenSource — гайды устарели, и моментами противоречат друг другу.

Окей, придется разбираться. Для нормальной работы фреймворка нужны следующие библиотеки:

  • OpenCV
  • tensorflow-gpu (gpu именно для jetson, ибо есть cuda ядра. для rpi там tensorflow-lite)
  • tensorrt (библиотека для ускорения инференса нейронок)
  • и все то, что ставится автоматически исходя из списка окружения

Начнем с OpenCV.

В гайде DonkeyCar сказано, что его нужно собрать самом из исходников, ибо для ARM нет OpenCV в pip-е. Я это даже проделал, скомпилял OpenСV, но перед установкой решил проверить, вдруг в системе есть старая версия OpenCV, и ее надо снести. Позвал питон, заимпортил cv2, спросил версию, а она бац, и актуально. Быстренько поискал, и узнал, что оказывается, в последние версии linux4tegra (который в jetson) ребята из NVIDIA стали класть OpenCV. Круто, мне меньше дел. Молодец, что смог сам скомпилять :)

Дальше, tensorflow-gpu.

В гайде DonkeyCar указана, во первых, устаревшая ветка версий (1.xx), во вторых, даже не последняя версия из устаревших. Я решил их не слушать, и поставить последнюю актуальную версию (2.0).

Следующий шаг — tensorrt.

Гайд по установке tensrort на jetson написан отдельной вики страницей, и по ней понятно, что автор не читал основной гайд =) Ибо в гайде по tensorrt переназначаются переменные окружения, и перестает работать OpenCV. Я покрутил это и так и этак, откатил всё назад, и решил забить на окружения и переменные окружения — вкатил прямо в основное окружение.

Довольный собой открыл питон, по очереди позвал cv2, tensorflow, tensorrt, и потом спросил у питона их версии — они все заимпортились, все показали актуальные версии. Круто!

Процесс установки самого donkey car довольно простой, не буду описывать, предлагаю почитать их гайд. Единственное, что отмечу сейчас — в конфиге donkey car можно повысить разрешение картинки с 86х86 для RPi до 224х224 для Jetson (ибо больше производительности и так будет выше точность).

Итак, все готово, время запускать и тестировать!

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

Еще пришлось откалибровал значения, подаваемые на ШИМ (PCA9685), чтобы найти полный ход вперед, полный назад, максимальные повороты в стороны.

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

Круто, пора переходить к подготовке трассы!

Эпоха 7 — Сборка трассы, поездки

Алгоритм Donkey Car так устроен, что там нейронка, обучаемая учителем. А это значит, что трекается картинка с камеры, и рядом с каждой картинкой появляется json файл, в которой пишется имя картинки, ускорение, поворот, timestamp. И для того, чтобы обучить нейронку, таких пар «картинка + json» нужно минимум 5К.

Трассу было решено собирать дома, мол квартира большая, есть где развернуться. Но начав собирать, стало понятно, что по всей квартире не поездить — пол разного цвета, контраст будет разный, и моделька может не вывезти.

Окей, решил собирать в одной комнате. Купил 4 рулона малярного скотча, и наклеил им по полу трассу.

Поставил машинку, запустил, поехал, и снова провал — оказывается, одна комната слишком маленькая, и моя машинка банально не входит в повороты. Точнее входит, но на такой скорости, что будет стыдно потом =)

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

Окей, день Х, после ивента про А/Б эксперименты решено остаться в офисе, и делать трассу.
Место выбрано, скотч готов, команда строителей трассы в игре. Буквально час, и в коридоре офиса появляется отличная трасса.

Ставлю машинку, включаю, пробую ездить — ура, в повороты входит, и скорость пришлось ограничить всего до 80%.

Self-driving ГАЗ66 Monster Truck 1-16 - 14

Эпоха 8 — Поездки с джойстика

Итак, у меня есть трасса, есть машина, и мне нужно 5К пар картинка+json.

Опытным путем я выяснил, что один круг моей трассы, это 250 пар фотка+json, а это значит, что мне нужно отъездить минимум 20 кругов.

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

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

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

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

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

Хм, значит нужно как-то объединить телефон и джойстик. Окей, у меня есть читалка, она достаточно большая, на ней поместится и телефон и джойстик — подойдет. Взял скотч, и примотал скотчем к читалке телефон, а чуть ниже джойстик. Смотрел на это чудо, и думал — что ты такое, вообще? :-)

Но, сработало :) С этой штукой мне удалось отъездить 20 кругов. А на самом деле, даже 25, ибо я вошел во вкус где-то к 15 кругу.

Такс, готово, у меня есть датасет для обучения нейронки, пора обучать!

Эпоха 9 — Обучение нейронки

В этот момент у меня есть машинка, трасса, датасет — да я в одном шаге от результата!
Дома крутился PC на холостом ходу, с NVIDIA RTX 2070, на котором я и планировал обучаться. Благо, для умного дома у меня есть внешний IP, и нужно было всего лишь прокинуть 22 порт из интернета на PC. Хорошо, что нашлись помощники, которые сделали это для меня, пока я был в офисе.

Итак, захожу по ssh на комп с убунтой, монитирую домашнюю папку по sshfs, закидываю файлы. Казалось бы, всего 40 мегабайт, но это длилось около 30 минут. Так вышло, я так понимаю, потому, что их было очень много.

Файлы на компе, tensorflow-gpu установлен, софт от DonkeyCar установлен, пора обучать.
Зову скрипт от DonkeyCar для обучения нейронки, указываю ему на папки с датасетом — побежало.
Пока нейронка бегает, nvtop (монитор загрузки видеокарты) показывает 1406% утилизации, обычный htop показывает 100% загрузки cpu по всем 16 ядрам, дело идет).

Спустя каких-то 20 минут у меня есть обученная модель для управления тачкой. Казалось бы, бери, пользуйся. Но нет :)

Помните, я выше писал про tensorrt, который оптимизирует инференс нейронок и запускает их на cuda ядрах? Конечно-же, я хочу выполняться через него.

А это значит, что мне нужно:

  • зафризить модель (упаковать всё нужно для модели в один файл)
  • сконвертировать результат фриза в пригодный для tensorrt формат

Пытаюсь зафризить модель, зову скрипт от DonkeyCar, неудача. А тем временем, дело к ночи, скоро уборщики демонтируют мою трассу, мне нужно быстро.

Родилась гипотеза, что это потому, что я взял не тот tensorflow, что был у DonkeyCar. Окей, сношу tensorflow 2.0, ставлю 1.15, пробую еще раз — успех, ура!

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

Зову скрипт из того места, и правда отзывается. Но, говорит, никаких тебе третьих питонов, давай второй.

Окей, зову второй питон. Он мне говорит — у меня нет tensorflow. Хорошо, прошу его поставить tensorflow-gpu 1.15, а он мне говорит, что такой версии нет, есть только 1.14. Ладно, соглашаюсь я, давай рискнем, и поставим разные версии в разные питон окружения. Поставил tensorflow во второй питон, позвал конвертацию — ура, сработало!

Окей, у меня есть модели для tensorrt и для обычного tensorflow-gpu, закидываю в машинку.

Запускаю машинку с моделью для tensorrt, огромный трейсбек ошибки, время давит — окей, попробую обычную модель.

Запускаю обычную, снова ошибка, но на этот раз довольно четкая — ваш размер картинки 224X224, тогда как ожидается 86X86. Помните, где-то сильно выше я писал о том, что правил конфиг, менял разрешение картинки с камеры?

Так вот, на машинке я поправил, а на хост компьютере нет.

Self-driving ГАЗ66 Monster Truck 1-16 - 15

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

Запускаю машинку с моделью для tensorrt, и…

Эпоха 10 — Всё работает, наконец-то!

Ура! Моя машинка поехала! Сама, без меня. Очень круто. Я невероятно рад)

Почти год я всё это делал, и вот)

Что дальше?

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

  • Добавить в модель IMU сенсор, чтобы, возможно, повысить точность. Например, что при движении в горку нужно больше усилия двигателю.
  • Перевести логику на поездки не по трассе, а просто ездить, объезжая препятствия
  • Добавить лидар и учитывать показания с него

Вызов на батл

Если вы сам, или с компанией друзей, чувствуете, что хотите гонок, то пишите мне, давайте устроим соревнования =)

Сообщество

Еще я собрал чатик по интересам, и готовлю канал. Я не уверен, что по правилам Хабра так можно, так что пришлю в личку по запросу.

Образ sd карты моей машинки

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

Автор: Беслан Курашов

Источник [3]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/diy/347144

Ссылки в тексте:

[1] вот такой проект: https://becominghuman.ai/building-self-driving-rc-car-series-1-intro-equipments-plan-8d9f579df45c

[2] мозги: http://www.braintools.ru

[3] Источник: https://habr.com/ru/post/489046/?utm_source=habrahabr&utm_medium=rss&utm_campaign=489046