Кто не хочет, чтобы роботы учились чему-то? Хорошо, я знаю.

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

Большая часть программирования будет на Python, но будет немного Arduino и другие мелочи. Может быть, немного CAD- и 3D-печати, если я буду действительно заинтересован.

Идея

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

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

Монитор

Я использую Raspberry Pi с прикрепленной камерой Pi. Поместив Pi и камеру в несколько напечатанных на 3D-принтере ящиков, я приклеил Raspberry Pi и камеру к стене. Я не понимал, как далеко это должно быть!

Робот

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

По основным частям я остановился на:

  • Wimos D1 mini: чип Wi-Fi, совместимый с Arduino, который может запускать базовый веб-сервер. Хотел бы я выбрать один с большим количеством вводов-выводов, потому что в итоге я добавил 2 регистра сдвига и аналоговый мультиплексор.
  • Аккумулятор 18650: включая базовую схему зарядки от eBay и повышающий преобразователь для получения напряжения 5 В.
  • 28BYJ-48 2003 Шаговый двигатель: Это самые дешевые шаговые двигатели, которые вы можете найти на eBay.

Я разработал робота в формате CAD и распечатал его на 3D-принтере. Сложить все вместе было непросто, так как это был путь к сложности с тремя уровнями, которые я мог разделить.

Встречайте Soccer Bro!

Первые шаги - Получите видеопоток на моем ПК

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

После некоторого поиска я обнаружил, что RPi-Cam-Web-Interface очень легко установить, следуя инструкциям на сайте, и предоставляет вам веб-интерфейс с прямой трансляцией. Если вы перейдете к IP-адресу своего Pi, вы увидите что-то вроде следующего.

Нет инструкций о том, как использовать python для просмотра видеопотока, но через некоторое время в инструментах разработчика Chrome я обнаружил, что браузер вызывает следующий URL-адрес несколько раз в секунду. URL-адрес возвращает изображение, которое затем используется для обновления видеопотока на сайте.

http://192.168.0.11/html/cam_pic.php?time=1549542272770&pDelay=200000

Мы можем сделать это на Python, используя OpenCV!

Таким образом, приведенный ниже код загружает изображение, преобразует его в массив numpy, преобразует его в изображение OpenCV, изменяет размер изображения до правильного размера, а затем показывает изображение. Затем он делает это снова и снова.

import numpy as np
import cv2
import urllib.request


while True:
    url = "http://192.168.0.11/html/cam_pic.php"
    with urllib.request.urlopen(url) as url:
        image = np.asarray(bytearray(url.read()), dtype="uint8")
        image = cv2.imdecode(image, cv2.IMREAD_COLOR)

    image = cv2.resize(image, (1920, 1080))

    cv2.imshow("Image", image)

    cv2.waitKey(100)

Итак, образ у нас есть! Но выглядит неважно. Итак, что мы можем сделать, это перейти в веб-интерфейс и изменить несколько параметров, а именно:

  • ISO: 100
  • Качество предварительного просмотра: 100
  • Ширина предварительного просмотра: 1920

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

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