Как сделать управляемую тележку

Материал из virt2real wiki
Перейти к: навигация, поиск

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

Содержание

Требуемое оборудование

Минимальная конфигурация

  • Любая подвижная платформа с двумя моторами. Гусеничная/колёсная тележка, машинка, танк. Что угодно.
  • Аккумулятор 5-16 Вольт


Расширенная конфигурация

  • Модуль камеры
  • Сервомотор для PanTilt привода камеры. Сервомоторов можно использовать один или два. Если сервомотор один - камера будет двигаться только по одной оси.
  • Светодиод (светодиодная лента) или лампочка накаливания для использования в роли "фары"


Софт для управления

Клиентский

Для управления тележкой можно использовать

  • Модуль в админке (Меню -> Эксперименты -> Telegue) по адресу http://192.168.1.128?telegue (дефолтный IP Виртурилки)

Управление из браузера, дискретное с клавиатуры или пропорциональное с помощью мыши. Видео - отдельным потоком, RTP (просмотр через GStreamer) вили MJPEG (просмотр в админке через флэш-плеер). Команды отправляются через WebSockets.

  • Приложение для iPhone/iPad (на данный момент ещё не адаптировано)
  • Приложение для Android (на данный момент ещё не адаптировано)
  • .Net приложение для Windows, для управления с помощью джойстика или игрового руля с педалями. Команды отправляются по UDP. Мониторинг состояния - по TCP соединению.


Серверный

Для примера, сервер команд управления, запускаемый на Виртурилке, написан на JavaScript (для NodeJS). Недостатков у данного типа приложений много, но преимущества - простота реализации множества функций, отсутствие необходимости в кросс-компиляции.

Второй вариант (приложение на языке Си, собранное под платформу ARM стандартными средствами кросс-компиляции SDK) ещё не полностью написан, пока не рассматриваем.


Сборка пепелаца

Сборка тележки производится кому как хочется. Основная задача - разместить на тележке все требуемые комплектующие, желательно - понадёжнее зафиксировав.

Для примера, покажу мою тележку. Совсем не идеальная, колхоз тот ещё. Но ездит.

IMG 4213.jpg

Виртурилка с установленным мезонином Wi-Fi и надетым сверху моторшилдом поместилась внутри тележки. Антенна выведена наружу через отверстие в корпусе тележки. Так как у этой тележки нет верхней части корпуса, пришлось вырезать пластину из оргстекла.

IMG 4215.jpg

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

IMG 4216.jpg

Передние фары сделаны из светодиодной ленты. Аккумулятор - Li-Pol 2S (6.6 - 8.2 В) 5000mAh. Довольно большой по габаритам, зато одного заряда надолго хватает.


Схема подключения

Telegue.png

Моторы гусениц подключаются к пинам разъёма J1 моторшилда. Левый мотор - к контактной паре 1, правый - к паре 2. Моторы должны быть не сильно мощными, моторшилд обеспечивает максимальный ток на 1.5А канал (кратковременно возможно повышение тока до 2А, при постоянном превышении нагрузки сработает защита и канал будет обесточен). Для моторов с потреблением до 3А можно параллельно подключить два канала, но каналы обязательно должны быть с PWM одного типа (т.е. или оба - PWM виртурилки, или оба - PWM моторшилда). Подробнее будет описано в статье по моторшилду - Работа с моторшилдом 2.0

Сервомоторы необязательны, служат лишь для поворота камеры. У меня только один установлен, но можно и два. Подключаются к разъёму J17. Контактная пара 1 - сервомотор, поворачивающий камеру в вертикальной плоскости. Контактная пара 2 - сервомотор для горизонтального поворота. Питание на сервомоторы подаётся с DC-DC преобразователя моторшилда (джампер J7 установлен в соответствующее положение), суммарный ток потребления серв до 6А.

Фара тоже необязательна. Подключается к контактной паре 8 разъёма J16.


Само собой, такая конфигурация самая простейшая. На моторшилде остаётся много незадействованых контактов. Но это - лишь простейший пример использования.


Скрипт сервера

Запуск сервера

Сначала необходимо инициализировать PWM чип на моторшилде. Подробно про это написано в статье Работа с моторшилдом 2.0.

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

Затем необходимо запустить скрипт сервера. Сервер находится в каталоге /opt/teleguejs , запускается файлом run.sh

В прошивке сервер запускается автоматически, скриптом S98teleguejs в каталоге автозапуска.

#!/bin/sh
export NODE_PATH=/usr/lib/node_modules
 
# starting gstreamer video server (gstd style)
gst-client create "v4l2src always-copy=false chain-ipipe=true ! \
capsfilter caps=video/x-raw-yuv,format=(fourcc)NV12,width=640,height=480,framerate=(fraction)30/1 ! \
queue ! dmaiaccel ! \
dmaienc_h264 ddrbuf=true encodingpreset=2 ratecontrol=2 intraframeinterval=5 idrinterval=50 targetbitrate=800000 ! \
rtph264pay ! udpsink port=3000 host=127.0.0.1 enable-last-buffer=false sync=false"
 
node ./index.js

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

Затем создаётся цепочка GStreamer с помощью Gstd (см. Управление цепочками GStreamer).

После этого, собственно, запускается сам сервер.


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


Используемые порты

Сервер команд принимает команды по трём каналам

  • UDP порт 1082 (основной канал управления)
  • TCP порт 1082 (на данный момент только отправка статусных сообщений для мониторинга состояния контроллера)
  • WebSockets (порт 1083 TCP)

Помимо приёма команд, сервер периодически отправляет подключившемуся клиенту (по сырому TCP или через WebSockets) сообщения о своём текущем состоянии (напряжение аккумулятора, уровень сигнала Wi-FI).

При подключении клиента по TCP сервер команд автоматически настраивает ранее созданную цепочку видео на IP-адрес клиента и запускает трансляцию по RTP. Порт фиксированный - 3000 (UDP).

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

Исходники сервера

Исходные коды сервера находятся в репозитории https://github.com/virt2real/telegue_nodejs

Исходные коды модулей виртурилки и моторшилда находятся в репозитории https://github.com/virt2real/virt2real_nodejs_modules


Подключение клиентского софта

Управление из админки

Описание

После включения Виртурилки надо зайти в админку и перейти в раздел Меню -> Эксперименты -> Telegue (или добавить ?telegue в конце адреса админки)


Рулилка в админке позволяет отправлять команды на Виртурилку с помощью вебсокетов (WebSockets). Данный протокол в настоящее время поддерживается практически всеми браузерами, так что проблем быть не должно.


При открытии страницы рулилки происходит подключение к серверу вебсокетов, порт TCP 1083.

Управление возможно как дискретное (с клавиатуры), так и пропорциональное - с помощью мыши.


Для управления используются клавиши:

Клавиша Действие
"вперёд" езда вперёд
"назад" езда назад
"влево" повернуть налево
"вправо" повернуть направо
"A" уменьшить скорость
"S" увеличить скорость
"Ctrl" включить/выключить фары

Также возможна комбинация данных клавиш, например езда вперёд с одновременным поворотом налево и т.д.


На странице рулилки есть визуальные элементы управления, которые можно перемещать мышкой. Например, ползунок скорости, переключение фар.


Для пропорционального управления используется виртуальный "джойстик" - серый квадрат на странице рулилки. Для управления движением тележки надо нажать левую кнопку мыши на сером квадрате и, не отпуская левую клавишу мыши, водить курсором по квадрату. Середина квадрата - нейтраль. По горизонтали - ось X, по вертикали - ось Y. Таким образом эмулируем управление реальным джойстиком.

Для пропорционального управления сервомоторами камеры используется этот же серый квадрат, только нажимать надо правую кнопку мыши. Также для управления подвесом камеры есть два ползунка - для оси X и для оси Y.


Видеотрансляция при этом способе управления возможна двумя способами.

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

Второй вариант - MJPEG. "MJPEG это не формат видео, это способ убить канал". При MJPEG идёт довольно большой поток, по этому при большом расстоянии от Виртурилки до роутера, когда происходит ухудшение качества сигнала, возможно сильное замедление потока. Для этого варианта надо запустить MJPEG сервер на порту 8888. Для этого на странице рулилки есть соответствующая ссылочка. После запуска надо открыть плеер, для этого на странице есть ссылочка с аналогичным названием.

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


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


Внешний вид

Telegue adminka.png


И то же самое, но с окошком отображения MJPEG картинки

Telegue adminka2.png


Описание элементов

Telegue adminka description.png




Управление геймпадом под Windows

Описание

Для управления тележкой с десктопа с помощью USB руля с педалями или геймпада с аналоговыми осями создано специальное приложение - "virt2real control".

Приложение написано на .Net (фреймворк версии 4.5) в Visual Studio Express 2013. Под другие операционные системы вряд ли будет работать, т.к. используется DirectInput API.

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

Под Linux, кстати, написать аналогичное приложение (только консольное) намного проще, но будет позже.

Приложение получает состояние выбранного USB игрового устройства, подключается к серверу команд по TCP для получения статусных сообщений от сервера, отправляет команды управления на сервер по UDP. Раз в секунду отправляет команду "alive" - для сообщения о том что подключение активно.

Видеонаблюдение при этом способе управления возможно с помощью обычного просмотра RTP трансляции Gstreamer'а. Только на Виртурилке запускать трансляцию не надо - она будет автоматически запущена при подключении клиента и приостановлена когда клиент отключится (или коннект пропадёт).


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

Файл /opt/teleguejs/device.js

/*
	TYPE - type of joystick
 
	= 0 - regular joystick
	= 1 - wheel and pedals
*/
var TYPE = 0;

Для управления с руля переменную TYPE необходимо установить в 1, для управления с джойстика - установить в 0 (по умолчанию). После изменения надо перезапустить сервер. Ну или рестартануть Виртурилку.

Разница в используемых осях. Для некоторых моделей джойстиков или рулей может потребоваться изменение файла обработки команд, но об этом позже. Возможно, удобнее будет выбор осей в клиентском приложении сделать, тут ещё подумать предстоит.

Внешний вид

Windows joycontrol.png
Windows joycontrol2.png



Ссылка для скачивания

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

Рабочее приложение http://files.virt2real.ru/soft/virt2real_control/virt2real_control-0.1.rar

Исходники http://files.virt2real.ru/soft/virt2real_control/virt2real_control-0.1.src.rar

Управление из iOS

Управление из Android

Протокол сервера команд