Главная » Радиоуправление
Призовой фонд
на август 2021 г.

JETBOT на базе NVIDIA Jetson Nano

Платформа с открытым исходным кодом предоставляет разработчикам DIY, студентам и энтузиастам все необходимое для создания различных приложений на базе ИИ. Набор JetBot работает на базе маленького, но мощного компьютера NVIDIA Jetson Nano который обеспечивает параллельную работу нескольких датчиков и нейронных сетей для распознавания объектов, предотвращения столкновений и других задач. Все документы по сборке и полный список полных компонентов для оригинального AI-робота NVIDIA JetBot доступны на GitHub (https://github.com/NVIDIA-AI-IOT/jetbot).

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

Комплект Jetbot AI содержит:

1 Металлическая коробка x1
2 Держатель камеры x1
3 Акриловая часть x1
4 Плата расширения Jetbot x1
5 IMX219-160 Camera x1
6 Wireless-AC8265 x1
7 Мотор 2PCS x1
8 Колесо 2PCS x1
9 Всенаправленное колесо 2PCS x1
10 Блок питания EU head x1
11 12,6 В зарядное устройство x1
12 Беспроводной геймпад x1
13 Отвертка 2PCS x1
14 6Pin 9см кабель x1
15 Пакет винтов x1
16 Гаечный ключ x1

Также необходимо добавить три 18650 батареи (3,7 В), поскольку они не включены в комплект.

Jetbot от Waveshare в сборе. Инструкция по сборке https://www.waveshare.com/wiki/JetBot_AI_Kit_Assemble_Manual

Т.к. для NVIDIA Jetson Nano я брал короб, вид в сборе немного отличается от оригинала.


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

Запись образа JetBot на SD-карту

Используем SD-карту на 64 Гб. Скачиваем образ по ссылке JetBot jetbot_image_v0p4p0.zip

Для записи образа на карту используем программу Etcher - https://www.balena.io/etcher/

Запуск комплекта разработчика Jetson Nano

Вставляем SD-карту в слот для SD-карты микрокомпьютера Jetson nano (слот находится под платой Jetson Nano)

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

Подключение JetBot к Wi-Fi

После загрузки системы необходимо авторизоваться (jetbot и пароль jetbot)

Подключаемся к сети Wi-Fi с помощью графического интерфейса рабочего стола Ubuntu.

Теперь Jetson Nano должен автоматически подключаться к Wi-Fi при загрузке и отображать свой IP-адрес на дисплее piOLED.

Подключение к JetBot из веб-браузера

После того, как ваш робот подключен к Wi-Fi, можно отключите монитор HDMI, USB-клавиатуру, мышь и источник питания от Jetson Nano

и после перезагрузки Jetson Nano подключиться к роботу через веб-браузер.

Смотрим IP-адрес робота на экране дисплея piOLED . И заходим с любого компьютера сети по адресу http://<jetbot_ip_address>:8888

 

Установка последней версии программного обеспечения

Установим последнюю версию

Репозиторий JetBot на GitHub может содержать более новое программное обеспечение, чем то, которое предварительно установлено на образе SD-карты. Чтобы установить последнюю версию программного обеспечения необходимо на странице http://<jetbot_ip_address>:8888 выбрать Terminal и набрать следующие команды

git clone https://github.com/NVIDIA-AI-IOT/jetbot
cd jetbot
sudo python3 setup.py install

А также установить новую папку с примерами

sudo apt-get install rsync
rsync jetbot/notebooks ~/Notebooks

Настройка режима питания

Чтобы гарантировать, что Jetson Nano не будет потребляет больше тока, чем может обеспечить аккумулятор, переведем Jetson Nano в режим Вт, вызвав в Terminal команду

sudo nvpmodel -m1

Убедимся, что Jetson Nano находится в режиме мощности 5 Вт.

sudo nvpmodel -q

 

Примеры

На странице http://<jetbot_ip_address>:8888 в среде программирования Jupiter Notebook находятся примеры.

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

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

Установил на другую платформу от разобранного пылесоса iRobot Create.

Пример 1 - Основное движение
Управление JetBot из веб-браузера.

  1. Подключаемся к jetbot перейдя в http://<jetbot_ip_address>:8888

  2. Входим в систему с паролем по умолчанию jetbot

  3. Переходим к ~/Notebooks/basic_motion/
  4. Открываем basic_motion.ipynb

Пример 2 - Дистанционное управление

Управление JetBot удаленно, с просмотром потокового видео в реальном времени и возможностью сохранять снимки по нажатии кнопки джойстика.

  1. Подключаемся к jetbot перейдя в http://<jetbot_ip_address>:8888

  2. Входим в систему с паролем по умолчанию jetbot

  3. Выключите все остальные процессы Kernel->Shutdown All Kernels...
  4. Переходим к ~/Notebooks/teleoperation/
  5. Открываем teleoperation.ipynb

В программу необходимо внести изменения

При создании экземпляра виджета контроллера, необходимо указать значение для index. Если подключено одно устройство - index=0.

Если несколько - заходим на сайт http://html5gamepad.com и смотрим

Указываем значение для index

import ipywidgets.widgets as widgets

controller = widgets.Controller(index=0)  # replace with index of your controller

display(controller)

Далее, необходимо определить оси джойстика для управления левым и правым колесом

И внести изменения в программу 

from jetbot import Robot
import traitlets

robot = Robot()

left_link = traitlets.dlink((controller.axes[1], 'value'), (robot.left_motor, 'value'), transform=lambda x: -x)
right_link = traitlets.dlink((controller.axes[5], 'value'), (robot.right_motor, 'value'), transform=lambda x: -x)

 

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

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

controller.buttons[9].observe(save_snapshot, names='value')

Запуск live_demo.ipynb смотрите на видео

Пример 3 - Предотвращение столкновения

Это пример сбора набора данных классификации изображений. Далее обучения JetBot обнаруживать два сценария free и blocked. Этот классификатор AI будет использоваться, чтобы предотвратить столкновения JetBot с препятствиями.

Пример включает 3 шага: сбор данных (фото для free и blocked), обучения нейронной сети и демонстрация работы

Можно пропустить 2 первых шага и воспользоваться предоставленной разработчиками предварительно обученной моделью, я так сначала и сделал Скачал модель drive.google.com/open?id=1UsRax8bR3R-e-0-80KfH2zAt-IyRPtnW. Скопировал модель в папку ~/Notebooks/collision_avoidance/ и запустил пример live_demo.ipynb. 

Запуск live_demo.ipynb смотрите на видео

 

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

Шаг 1. Сбор данных

Cбор данных (фото для обучения классификатора двух состояний free (возможно движение робота прямо) и blocked (обнаружение препятствий - поворот робота) ), Нам необходимо создать множество фото, поместив их в 2 папки dataset/free и dataset/blocked

  1. Подключаемся к jetbot перейдя в http://<jetbot_ip_address>:8888
  2. Входим в систему с паролем по умолчанию jetbot
  3. Выключите все остальные процессы Kernel->Shutdown All Kernels...
  4. Переходим к ~/Notebooks/collision_avoidance
  5. Открываем data_collection.ipynb

 

При нажатии на кнопки, создается изображение и помещается в одну из папок - free или blocked.  Необходима разная ориентация границы, различное освещение, различные текстурированные полы и пр.  Чем больше данных с изображениями, с которыми робот столкнется в реальном мире, тем лучше будет поведение робота. Важно получить разнообразные данные , а не просто много данных,. 

Затем сжимаем полученные данные в zip-файл. Это если использовать эти данные для обучения нейронной сети на другом компьютере.

 

Шаг 2. Обучение нейронной сети

Обучение классификатора изображений определять два состояния free и blocked cиспользованием популярной библиотеки глубокого обучения PyTorch. 

Разделяем набор данных на обучающий и тестовый наборы

train_dataset, test_dataset = torch.utils.data.random_split(dataset, [len(dataset) 

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

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

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

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

model = models.alexnet(pretrained=True)

Модель alexnet изначально была обучена для набора данных, который имел 1000 меток классов, но наш набор данных имеет только две метки классов! Заменяемм последний слой новым, нетренированным слоем, который имеет только два выхода.

model.classifier[6] = torch.nn.Linear(model.classifier[6].in_features, 2)

Переносим нашу модель для выполнения на GPU

device = torch.device('cuda')
model = model.to(device)

Обучаем нейронную сеть в течение 30 проходов, сохраняя наиболее эффективную модель после каждого прохода.

 

Шаг 3. Запуск

Запуск live_demo.ipynb смотрите на видео

 

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

Используем такую разметку территории

 

Также проходим три шага

  1. Сбор данных
  2. Обучение
  3. Развертывание

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

Шаг 1. Сбор данных

Cбор данных (фото для обучения классификатора двух состояний free (возможно движение робота прямо) и blocked (обнаружение препятствий - поворот робота) ), Нам необходимо создать множество фото, поместив их в 2 папки dataset/free и dataset/blocked

  1. Подключаемся к jetbot перейдя в http://<jetbot_ip_address>:8888
  2. Входим в систему с паролем по умолчанию jetbot
  3. Выключите все остальные процессы Kernel->Shutdown All Kernels...
  4. Переходим к ~/Notebooks/road_following
  5. Открываем data_collection.ipynb

Мы используем класс Camera от JetBot для включения камеры CSI MIPI. Нейронная сеть принимает в качестве входных данных изображение размером 224х224 пикселя. 

IMG

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

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

Шаг 2. Обучение нейронной сети

Обучение нейронной сети на получение изображения с камеры и вывод набора значений x, y, соответствующих цели. Используется фреймворк PyTorch deep learning для обучения модели нейронной сети ResNet18 для нашего приложения road follower.

Набор данных  разделяемм  на обучающий и тестовые наборы. 90% обучающий -10% тестовый. Тестовый набор будет использоваться для проверки точности модели, которую мы тренируем.

test_percent = 0.1
num_test = int(test_percent * len(dataset))
train_dataset, test_dataset = torch.utils.data.random_split(dataset, [len(dataset) - num_test, num_test])

Мы используется модель ResNet-18, доступная на PyTorch Torch Vision.

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

Загрузка модели

model = models.resnet18(pretrained=True)

Переносим модель для выполнения на GPU

model.fc = torch.nn.Linear(512, 2)
device = torch.device('cuda')
model = model.to(device)

 

Обучаем нейронную сеть в течение 50 проходов, сохраняя наиболее эффективную модель после каждого прохода.

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

Шаг 3. Запуск

Запуск live_demo.ipynb смотрите на видео

 

Пример 5 - Отслеживание объекта
Пример следования за объектом. Используется предварительно обученная модель обнаружения объектов coco. При этом JetBot запустит модель предотвращения столкновений.

Скачать модель обнаружения можно на странице https://jetbot.org/v0.4.3/examples/object_following.html

или по ссылке https://drive.google.com/open?id=1KjlDMRD8uhgQmQK-nC2CZGHFTbq4qQQH

Скачанную модель необходимо переместить в папку object_following

Список объектов можно посмотреть в файле https://github.com/tensorflow/models/blob/master/research/object_detection/data/mscoco_complete_label_map.pbtxt

 

Запускаем пример.

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

Запуск live_demo.ipynb смотрите на видео

Теги:

Опубликована: 0 0
Я собрал 0 0
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 0 Проголосовало: 0 чел.

Комментарии (4) | Я собрал (0) | Подписаться

0
Публикатор #
На форуме автоматически создана тема для обсуждения статьи.
Ответить
0
mr_smit #
А какое реальное применение у всего этого кроме как поиграться в офисе?
Ответить
0

[Автор]
victoruni #
В таком варианте только поиграться, ну и получить навык сбора данных для обучения, приходились по несколько раз переобучать. А дальше можно на Jetson ставить ROS и уже делать робота.
Ответить
0
andro #
Перспективный проект, может сильно пригодится там, куда человеку не следует лезть - заминированный объект или среда с повышенной опасностью (газ, огонь, и т.п.)
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется сила тока?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

Набор 4WD Kit Bluetooth
Набор 4WD Kit Bluetooth
Arduino UNO AVR-программатор USB ASP
вверх