Хочу рассказать вам о том, как я делал и сделал самоуправляему машинку :)
Я мог бы рассказать сразу, как делать, сухо прикрепив схемы и bash команды, но так будет скучно. Предлагаю вам интересную (я надеюсь) историю о том, как лично я прошел этот путь, и куда пришел.
Те места, где было что фоткать, с фотками. Там, где про софт — скорее всего без фото.
Это будет действительно история в формате повествования, как я рассказывал бы вам за чашкой кофе. Это не про bash команды, python скрипты, и вот это вот всё.
Начнём с фотки и видео того, что получилось, и дальше вся история под катом.
История пройдет по такому сценарию
- Почему я этого захотел
- Как устроена самоуправляемая машина (взгляд сверху)
- Эпоха 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.
Сенсоры
То, что собирает некоторую информацию о окружающем мире, и передает в компьютер для принятия решений.
Базово, джентельменский набор для SDC такой:
- Камера. Основа основ SDC. Смотрит на кусок пространства перед собой, передает изображение компьютеру, который распознает происходящее, и решает, что делать. Кажется, что я не встречал реализаций SDC без камеры.
- IMU сенсор. Штука, показывающая ускорение и угол наклона по осям. Помогает понимать, куда мы, собственно, едем, и как изменилось наше местоположение относительно точки старта. Используется почти во всех коптерах.
- Лидар. Одновременно и простая и сложная штука, которая стреляет лазером вокруг себя, измеряет время возвращения луча, и понимает расстояние до границы пространства. Лидары бывают дорогими, как в настоящих SDC, и довольно дешевыми, как в вашем роботе пылесосе. Для сравнения, лидар из пылесоса стоит 75$, тогда как лидар для большой SDC от Velodyne нагуглился мне за 4K$. Такая разница в цене объясняется тем, что дорогие лидары строят 3D картинку, тогда как пылесосный лидар находит просто границы комнаты в 2D.
- GPS. Не используется в маленьких машинках, так как слишком большая погрешность измерения на маленьких расстояниях, но о нем стоит сказать, так как в больших SDC активно используется.
- Камера глубины. Работает примерно как смесь лидара и камеры — получает картинку с точками, и расстоянием до них. Позволяет строить 3D карту видимой области.
Компьютер
То, что получает значения от сенсоров, анализирует ситуацию, передаем команды управления тележке.
В мире компьютеров для встраиваемой электроники правят бал энергоэффективные ARM процессоры (как в вашем телефоне), и одноплатные компьютеры на их основе.
На сегодня есть два самых популярных варианта одноплатников — RaspberryPi и NVIDIA Jetson.
RaspberryPi отличается меньшей ценой, бОльшим количеством разнообразных проектов, бОльшим сообществом.
NVIDIA отличается бОльшей ценой, меньшим количество проектов, но при этом бОльшей производительностью в задачах машинного обучению. Имеет на борту 128 CUDA ядер (как в вашей большей NVIDIA видеокарте), которые используются для ускорения алгоритмов машинного обучения.
В моей коллекции есть три штуки Raspberry Pi (ZeroW, 3, 4) и NVIDIA Jetson Nano. Машинку я решил собирать, конечно же, на Jetson.
Алгоритм
То, что принимает решение о действиях на основе показаний сенсоров. Обычно, для этого используется комбинация компьютерного зрения и нейросетей. В самом базовом варианте, вы ездите сами на своей машинке вдоль некоторой разметки, записываете видео таких поездок с трекингом газ/тормоз/поворот, и потом обучаете на этом нейросеть, чтобы она находила вам зависимость сигналов двигателя от картинок с камеры. Совсем просто, это задача распознавания разметки, и попытка держаться в ней.
Если вы хотите освежить, как работает нейросеть, то предлагаю вам посмотреть вот такое видео:
Здесь я описал самый простой вариант, где есть только камера и езда по разметке. Но есть варианты с бОльшим количеством сенсоров и другой логикой работы — об этом здесь будет отдельный пост.
Если очень высокоуровнено, то это всё.
Остается только:
- собрать тележку
- повесить сенсоры
- подключить компьютер
- нарисовать разметку
- поездить по ней
- обучить нейросеть
- поехать
Теперь, когда мы разобрались, из чего состоит самоуправляемая тачка, давайте перейдем к тому, какие эпохи реализации были конкретно у меня.
Эпоха 1 — Gelendwagen из детского мира + Raspberry Pi Zero W + камера
Да, самый мой первый подход был именно такой. Так получилось потому, что рядом с моим домом был детский мир, в который я зашел, в котором мне понравился гелик, и я его купил.
Окей, подумал я, гелик есть, теперь нужен компьютер и сенсор. Подумано — сделано. Заказал RPi Zero W и камеру для неё. Пока ждал компьютер и камеру, зашел, купил для этого дела пауэрбанк.
Итак, всё на месте, пора собирать. Нашел вот такой проект, решил идти по нему.
Разобрал гелик, вытащил его родные
Прежде, чем переходить к самоуправлению, решил по приколу поездить через консоль, погоняться за кошкой, транслируя изображение с камеры к себе на ноут.
Тут-то меня и ждала пара провалов.
Первый — Raspberry Pi Zero W очень слабая в плане производительности.
Второй — Проходимость гелика из детского мира почти никакая, его останавливало почти любое минимальное препятствие.
Уже сейчас стало понятно, что проект мертворожденный, но ради интереса я попробовал собрать для Raspberry Pi Zero компьютерное зрение (OpenCV) прямо на ней же. Это заняло, без шуток, больше суток, и стало последним гвоздем в крышку гроба этой реализации SDC.
Стало понятно, что нужно менять и компьютер для большей производительность, и тележку, для большей проходимости.
Получилось довольно смешно:
Эпоха 2 — ГАЗ66 + NVIDIA Jetson Nano + Камера для RaspberryPi
Итак, на этом моменте стало понятно, что нужно какая-то более проходимая машина, и желательно, грузовик, чтобы положить в кузов все компоненты. После штудирования одного сервиса по подбору товаров, стало понятно, что мне подходит модель нашего родного ГАЗ66, он же шишига в народе. Окей, заказал, жду, пора думать про компьютер. К этому моменту NVIDIA как раз готовила старт продаж своих Jetson Nano, и я оформил заказ в первый день продаж.
Приехал грузовик, я продолжал ждать Jetson, в нетерпении катался на шишиге по дому, катал котят, которых родила кошка, упомянутая выше. Не сказать, что котятам нравилось — пришлось перестать.
Тем временем, Jetson еще ехал, а я заказал из Китая пылесосный лидар — пока не знал, как конкретно буду его применять, но понимал, что хочу.
В какой-то день в подъезде офиса возник деловитый курьер, вручил мне довольно большую коробку с одноплатником от NVIDIA, я расписался в накладной, и ощутил себя разработчиком энтузиастом — ничего себе, ко мне приехал девайс, купленный на старте продаж.
Пора собирать! Но сначала, надо разобрать, лол. Разобрал шишигу, выкинул ее родные
Подключил камеру, контроллер двигателя, поворотный двигатель, двигатель газ/тормоз, завел питоновские скрипты для теста — снова облом!
В этот раз история такая — у шишиги для поворота используется обычный двигатель, не сервопривод. А значит, у него нет обратной связи. А значит, я не могу им упрвлять точно, а значит, он не подходит для SDC.
Окей, снова нужно как-то это решать, что-то делать. Переходим к следующей эпохе.
Эпоха 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, просто на глазок приложил одно к другому — и правда, подходит! И выглядит круто! Окей, надо делать! Переходим к следующей эпохе.
Эпоха 4 — Соединение SMAX и ГАЗ66
Итак, на старте этой эпохи у меня есть внутренний таргет — соединить верх от одной машины с низом от другой. Так как мы с коллегами скинулись на 3D принтер, и я являюсь его совладельцем (серьезный инвестор), то было решено нарисовать соединение в CAD программе, распечатать, и таким образом их соединить.
С этой идеей я ходил около 2 месяцев, думая, что вот-вот сяду разбираться в CAD системах. Лол, нет. Признавшись себе в том, что я не хочу разбираться в CAD системах, я стал думать, какие еще есть варианты.
Зашел снова в детский мир, решил посмотреть конструкторы, вдруг они мне как-то помогут. Купил классический металлический конструктор, который был у меня, когда я учился в школе (аш олдскулы свело).
Притащил его домой, положил две части машинки рядом, и стал прикладывать к ним всякие элементы конструктора. Долго ли, коротко ли, стало появляться какое-то понимание, как, хотя бы в теории, это можно было бы сделать.
Начал делать. Провел не один день с детским гаечным ключом, гайками, и пространственным
Пока соединял, научился сверлить пластик отверткой, аккуратно отрывать лишние части так, чтобы не повредить корпус, контрить гайки другими гайками (но без шайб все равно так себе). В общем, мой трудовик бы мной гордился.
Спустя примерно три переделки и три дня я увидел перед собой этот монстр трак — ГАЗ66 SMAX Edition by Beslan.
Итак, кажется, hardware база готова, переходим к следующей эпохе.
Эпоха 5 — Монтирование компонентов на монстр траке
Наконец-то:
- у меня есть тележка с хорошими компонентами
- у меня эстетичный и вместительный верх
- на этой тележке нормально работают газ/тормоз/повороты
- верх и низ даже соединены вместе =)
Пора монтировать на этой красоте компоненты.
Вооружившись отверткой как сверлом для пластика, и двусторонним скотчем как универсальным креплением для всего, я взялся за дело.
Сделал на кабине крепление для камеры, которое позволяет регулировать угол наклона камеры. Кинул от камеры длинный шлей до Jetson, который, в свою очередь, поселился в кузове.
Помимо Jetson, в кузове поселились:
- пауэрбанк для питания компьютера (пожертвовал свой основной, классный, с usb power delivery, чтобы jetson не проваливался по питанию)
- PCA9685 (ШИМ контроллер) для управления двигателями
- батарея для питания двигателя машины
Так как проект уже на этот момент считался долгостроем, с лидаром решил пока не связываться, и сделать MVP хотя бы на камере и софте от Donkey Car.
По приколу подключил родные фары от ГАЗ66, чтобы было красивее и увереннее в темноте.
Окей, моя машинка включается, двигатели реагируют на команды из питона, камера дает картинку, фары горят, все окей, пора ставить софт.
Эпоха 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%.
Эпоха 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. Помните, где-то сильно выше я писал о том, что правил конфиг, менял разрешение картинки с камеры?
Так вот, на машинке я поправил, а на хост компьютере нет.
Возвращаюсь на хост компьютер, правлю конфиги там, заново обучаю, заново делаю фриз, заново конвертирую, закидываю обратно.
Запускаю машинку с моделью для tensorrt, и…
Эпоха 10 — Всё работает, наконец-то!
Ура! Моя машинка поехала! Сама, без меня. Очень круто. Я невероятно рад)
Почти год я всё это делал, и вот)
Что дальше?
На дальнейшее развитие есть ряд планов, пойду от простого к сложному.
- Добавить в модель IMU сенсор, чтобы, возможно, повысить точность. Например, что при движении в горку нужно больше усилия двигателю.
- Перевести логику на поездки не по трассе, а просто ездить, объезжая препятствия
- Добавить лидар и учитывать показания с него
Вызов на батл
Если вы сам, или с компанией друзей, чувствуете, что хотите гонок, то пишите мне, давайте устроим соревнования =)
Сообщество
Еще я собрал чатик по интересам, и готовлю канал. Я не уверен, что по правилам Хабра так можно, так что пришлю в личку по запросу.
Образ sd карты моей машинки
По запросу, так же, я пришлю вам img образ моей тачки, если хочется сделать на аналогичной базе, и не хочется париться с настройкой.
Автор: Беслан Курашов