воскресенье, 3 июня 2012 г.

Формат сообщений Робота Мити

Сообщения используются на участках ПК–телефон и телефон–контроллер для передачи команд и сигналов с сенсоров.
Связь между телефоном и контроллером будет реализована посредством Bluetooth, поэтому, возможно управление контроллером непосредственно с ПК.

Формат сообщения

Длина сообщения всегда 5 символов (байт).
cXXXX, где c – идентификатор сообщения (всегда 1 ASCI символ), XXXX – значение сообщения – знаковое или беззнаковое число в шестнадцатиричном представлении от 0000 до FFFF (всегда 4 символа).

Идентификаторы сообщения

Заглавная литера – сообщение с числовым значением (скорость, угол поворота, значение с сенсора и т.д.). Строчная литера – разовое сообщение (кивнуть, повилять хвостом и т.д.).
L [left] – команда задания скорости и направления левому двигателю
R [right] – команда задания скорости и направления правому двигателю
D [drive] – команда задания одинаковой скорости и направления обоим двигателям
H [horizontal] – команда поворота головы на заданный угол в горизонтальной плоскости
V [vertical] – команда поворота головы на заданный угол в вертикальной плоскости
E [error] – сообщение об ошибке
F [face] – команда смены настроения
[illumination] – команда управления фарами: I0001 – включить, I0000 – выключить
T [tail] – команда поворота хвоста на заданный угол
t [tail] – команда на виляние хвостом: t0001, t0002, t0000
y [yes] – команда кивания головой: y0001, y0000
n [no] – команда мотания головой: n0001, n0000
f [fire] – команда на выстрел (ИК пушка): f0001, f0000
h [hit] – сигнал попадания (ИК сенсор): h0001, h0000

Передача сообщений от ПК к телефону производится посредством UDP-датаграмм. Т.е. возможны потери пакетов. Сообщения управления двигателями и сервоприводами передаются постоянно – так устроено Windows-приложение. Поэтому потери отдельных пакетов не страшны. Однако, могут быть потеряны неповторяющиеся сообщения: y, n, f и т.д. Поэтому они передаются трижды подряд.

И ещё одно важное замечание. В Android-приложении для исключения повторного выполнения одинаковых команд применяется хэш-таблица. Ключ таблицы – идентификатор сообщения, значение – значение сообщения. Каждое обработанное сообщение сохраняется в хэш-таблице. Когда приходит новое сообщение, его идентификатор ищется в хэш-таблице, если находится и значение совпадает со значением нового сообщения, то новое сообщение игнорируется. Этот алгоритм работает при управлении двигателями и сервоприводами, но для одиночных команд (y, n, f...) требует пояснения. Для таких команд, сообщения передаются парами: сначала со значением "0001", потом "0000". Это делается специально для смены значения в хэш-таблице. А для передачи в UDP-датаграммах, из-за возможных потерь пакетов каждое сообщение в паре ещё и троекратно повторяется. Вот как передаётся команда на выстрел:

f0001
f0001
f0001
f0000
f0000
f0000

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

Команды смены настроения

F0001 – обычное выражение лица
F0002 – счастливое лицо
F0003 – грустное лицо
F0004 – злое лицо
F0005 – лицо тяжело больного робота
F0102 – хочется играть (прыгает, на сколько это позволяет платформа)
F0103 – сильно расстроен (грустно и повесил голову)


Сообщения об ошибках

На всех трёх уровнях могут возникать ошибки. Но если на уровне ПК вывод сообщения об ошибке сложностей не вызывает, то с уровней контроллера робота (тела) и с уровня Android-приложения (головы), информацию об ошибке надо ещё доставить на уровень ПК. Для этого используется событие "E". Ошибки уровня контроллера имеют вид "E00xx", где xx – код ошибки от 00 до FF. Ошибки уровня Android-приложения имеют вид "E01xx".

E0001 – Неверное сообщение – возникает, если сообщение не удалось разобрать на команды/событие и значение
E0002 – Неизвестная команда
E0003 – Недопустимая команда в РобоСкрипт
E0004 – Неверная последовательность команд в РобоСкрипт
E0005 – Невозможно выделить необходимый объём памяти
E0006 – Попытка выхода за границы выделенной для РобоСкрипт памяти
E0007 – Недопустимая команда вне РобоСкрипт

Команды РобоСкрипт

r00xx – Воспроизведение РобоСкрипта. xx задаёт номер программы (от 00 до 0A)
r01хх – Старт записи программы на РобоСкрипт. xx задаёт номер записываемой программы (от 00 до 0A)
r02xx – Служебная, не использовать. Формируется в скетче robo_body и передаётся в RoboHead для сигнализации об окончании режима записи РобоСкрипта
Zxxxx – Если xxxx больше 0, то команда выполняет выделение оперативной памяти для записи и временного хранения программы на РобоСкрипт. xxxx – количество действий в РобоСкрипте. Действие – это всегда две команды: команда на выполнение роботу и команда, определяющая задержку до следующего действия (W).
Z0000 – Признак окончания программы на РобоСкрипт.
Wxxxx – Задержка в миллисекундах до выполнения следующего действия.

Подробней о РобоСкрипте можно почитать здесь.

9 комментариев:

  1. система команд нравится, особенно идея с жестами.
    У меня сомнения по поводу формата. почему шеснадцатеричная система ? Ардуино же не поймет, придется переводить = больше кода, также это дополнительная трудность для начинающих.
    4 символа в десятичной - 10000 вариантов значений. 0000..9999 или -999..+999
    4 символа в шеснадцатиричной - 65000 вариантов значений. 0000..65000 или -4095..+4095
    вопрос - нужно ли нам больше, чем дает десятичная ? на двигатель или серву больше +-255 не отправить. с датчика ардуино считываем 0..1024.
    Может от датчиков Андройда более длинные данные ? но влезут ли они в 0..65000 (-4095..4095)?

    но это все легко менять на лету, да ?

    второй вопрос более фундаментальный - реализация:

    есть проект Амарино который кажется уже стал стандартом де-факто. эту систему команд можно реализовать поверх Амарино ( не знаю насколько это целесообразно, но очень хочу узнать.)
    У них наконец (спустя 2 года ) вышел PDF документ подробно описывающий нюансы коммуникации. давай почитаем вместе, обсудим. может возьмем за основу его, может почерпнем идей.
    у нас уже был такой разговор, но тогда не было документации. если решение хорошее, то стандартизация со всем миром - это большой плюс.
    http://www.amarino-toolkit.net/tl_files/thesis/amarino_thesis_kaufmann_2010.pdf

    ОтветитьУдалить
    Ответы
    1. Ага, про Амарино принято, изучим.

      Про 2 байта на значение – это задел не под сенсоры Ардуино, а под сенсоры телефона. Информация об ориентации телефона, например, тоже такими командами пойдёт.

      А на Си перевести текстовый hex в целое проблем не составит.

      Удалить
    2. а как выглядят значения сенсоров ? какой диапазон ?

      Удалить
    3. По-моему, там double. Сейчас точно не помню. Но, конечно, точно больше чем 0..65535. Но 66 тыс., думаю, хватит с головой для компаса.

      Почему не "-999" до "+999"? :)
      1. Программно это не сложнее точно;
      2. Чёртова жадность! =)

      Удалить
    4. прочитал вступление (20стр) к Амарино. - готовый манифест для Робо-хобби

      все еще не уверен нужен ли он в нашей системе, но проект точно заслуживает внимания

      Удалить
    5. Почитал про Амарино. Сразу признаюсь, по диагонали. Так что моё мнение очень вероятно может быть ошибочным. Первое что насторожило: википедия про него не знает. Ни наша, ни en-ская. Это странно. Второе - описание замечательное и очень подробное, но в нём честно говорится: речь только об Android и Arduino. Я поискал в инете - нет ничего про использование под Windows, Windows Phone, iOS или Linux. Похоже, проект не был подхвачен энтузиастами. Протокол не так уж и прост, чтобы его реализовывать под Windows, например, нужна какая-то оправданная мотивация. Либо можно реализовать только часть протокола, но это уже будет не Амарино.
      Митин протокол элементарен и пока вполне достаточен. Если в предыдущем абзаце нет грубого недопонимания Amarino, то пока я бы рекомендовал остаться на Митином протоколе.

      Удалить
    6. Кстати, документ в pdf от августа 2010 года - 2 года прошло, а картина, кажется, не поменялась. По-моему, этот проект не взлетел.

      Удалить
  2. и еще, считаю стоит рассмотреть Firmata. для полноты картины.

    ОтветитьУдалить
    Ответы
    1. Посмотрел Фирмату.

      Что не понравилось:
      1. Похоже очень заточено на контроллер.
      2. Он может передавать пакеты (несколько предложений), если я правильно понял. Это здорово, но необходимости пока нет. И это усложение ИМХО.
      3. Побитовая информация. Сложно выуживать.

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

      Удалить