Сообщения используются на участках ПК–телефон и телефон–контроллер для передачи команд и сигналов с сенсоров.
Связь между телефоном и контроллером будет реализована посредством Bluetooth, поэтому, возможно управление контроллером непосредственно с ПК.
cXXXX, где c – идентификатор сообщения (всегда 1 ASCI символ), XXXX – значение сообщения – знаковое или беззнаковое число в шестнадцатиричном представлении от 0000 до FFFF (всегда 4 символа).
L [left] – команда задания скорости и направления левому двигателю
R [right] – команда задания скорости и направления правому двигателю
D [drive] – команда задания одинаковой скорости и направления обоим двигателям
H [horizontal] – команда поворота головы на заданный угол в горизонтальной плоскости
V [vertical] – команда поворота головы на заданный угол в вертикальной плоскости
E [error] – сообщение об ошибке
F [face] – команда смены настроения
I [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
Далее, описывая значения некоторых команд, я не буду упоминать нулевые значения одиночных команд и трёхкратные повторения, но это не значит что их нет.
F0002 – счастливое лицо
F0003 – грустное лицо
F0004 – злое лицо
F0005 – лицо тяжело больного робота
F0102 – хочется играть (прыгает, на сколько это позволяет платформа)
F0103 – сильно расстроен (грустно и повесил голову)
E0001 – Неверное сообщение – возникает, если сообщение не удалось разобрать на команды/событие и значение
E0002 – Неизвестная команда
E0003 – Недопустимая команда в РобоСкрипт
E0004 – Неверная последовательность команд в РобоСкрипт
E0005 – Невозможно выделить необходимый объём памяти
E0006 – Попытка выхода за границы выделенной для РобоСкрипт памяти
E0007 – Недопустимая команда вне РобоСкрипт
r01хх – Старт записи программы на РобоСкрипт. xx задаёт номер записываемой программы (от 00 до 0A)
r02xx – Служебная, не использовать. Формируется в скетче robo_body и передаётся в RoboHead для сигнализации об окончании режима записи РобоСкрипта
Zxxxx – Если xxxx больше 0, то команда выполняет выделение оперативной памяти для записи и временного хранения программы на РобоСкрипт. xxxx – количество действий в РобоСкрипте. Действие – это всегда две команды: команда на выполнение роботу и команда, определяющая задержку до следующего действия (W).
Z0000 – Признак окончания программы на РобоСкрипт.
Wxxxx – Задержка в миллисекундах до выполнения следующего действия.
Подробней о РобоСкрипте можно почитать здесь.
Связь между телефоном и контроллером будет реализована посредством Bluetooth, поэтому, возможно управление контроллером непосредственно с ПК.
Формат сообщения
Длина сообщения всегда 5 символов (байт).cXXXX, где c – идентификатор сообщения (всегда 1 ASCI символ), XXXX – значение сообщения – знаковое или беззнаковое число в шестнадцатиричном представлении от 0000 до FFFF (всегда 4 символа).
Идентификаторы сообщения
Заглавная литера – сообщение с числовым значением (скорость, угол поворота, значение с сенсора и т.д.). Строчная литера – разовое сообщение (кивнуть, повилять хвостом и т.д.).L [left] – команда задания скорости и направления левому двигателю
R [right] – команда задания скорости и направления правому двигателю
D [drive] – команда задания одинаковой скорости и направления обоим двигателям
H [horizontal] – команда поворота головы на заданный угол в горизонтальной плоскости
V [vertical] – команда поворота головы на заданный угол в вертикальной плоскости
E [error] – сообщение об ошибке
F [face] – команда смены настроения
I [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 – Задержка в миллисекундах до выполнения следующего действия.
Подробней о РобоСкрипте можно почитать здесь.
система команд нравится, особенно идея с жестами.
ОтветитьУдалитьУ меня сомнения по поводу формата. почему шеснадцатеричная система ? Ардуино же не поймет, придется переводить = больше кода, также это дополнительная трудность для начинающих.
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
Ага, про Амарино принято, изучим.
УдалитьПро 2 байта на значение – это задел не под сенсоры Ардуино, а под сенсоры телефона. Информация об ориентации телефона, например, тоже такими командами пойдёт.
А на Си перевести текстовый hex в целое проблем не составит.
а как выглядят значения сенсоров ? какой диапазон ?
УдалитьПо-моему, там double. Сейчас точно не помню. Но, конечно, точно больше чем 0..65535. Но 66 тыс., думаю, хватит с головой для компаса.
УдалитьПочему не "-999" до "+999"? :)
1. Программно это не сложнее точно;
2. Чёртова жадность! =)
прочитал вступление (20стр) к Амарино. - готовый манифест для Робо-хобби
Удалитьвсе еще не уверен нужен ли он в нашей системе, но проект точно заслуживает внимания
Почитал про Амарино. Сразу признаюсь, по диагонали. Так что моё мнение очень вероятно может быть ошибочным. Первое что насторожило: википедия про него не знает. Ни наша, ни en-ская. Это странно. Второе - описание замечательное и очень подробное, но в нём честно говорится: речь только об Android и Arduino. Я поискал в инете - нет ничего про использование под Windows, Windows Phone, iOS или Linux. Похоже, проект не был подхвачен энтузиастами. Протокол не так уж и прост, чтобы его реализовывать под Windows, например, нужна какая-то оправданная мотивация. Либо можно реализовать только часть протокола, но это уже будет не Амарино.
УдалитьМитин протокол элементарен и пока вполне достаточен. Если в предыдущем абзаце нет грубого недопонимания Amarino, то пока я бы рекомендовал остаться на Митином протоколе.
Кстати, документ в pdf от августа 2010 года - 2 года прошло, а картина, кажется, не поменялась. По-моему, этот проект не взлетел.
Удалитьи еще, считаю стоит рассмотреть Firmata. для полноты картины.
ОтветитьУдалитьПосмотрел Фирмату.
УдалитьЧто не понравилось:
1. Похоже очень заточено на контроллер.
2. Он может передавать пакеты (несколько предложений), если я правильно понял. Это здорово, но необходимости пока нет. И это усложение ИМХО.
3. Побитовая информация. Сложно выуживать.
Плюсы наших текстовых команд в том, что управлять роботом можно даже из окна терминала. Я этим пользовался при тестировании.