Протокол Extension v9.0
Точное описание обмена для собственного клиента. Сначала прочитайте жизненный цикл сессии; размеры, смещения и диапазоны полей приведены в регистрах. Идентификатор инструкции и селектор блока — разные поля пакета, даже когда их числовые значения совпадают.
Этот раздел задаёт точный формат обмена между хостом и сервоприводом и предназначен для подключения собственного ПО.
Формат сообщений и кодирование чисел
Сообщение — пакет байтов с адресатом, командой, данными и контрольной суммой для обнаружения ошибок передачи. Extension использует стандартный STS-формат:
Request: FF FF ID LENGTH INSTRUCTION PARAMETERS... CHECKSUM
Response: FF FF ID LENGTH LEGACY_ERROR EXT_STATUS DATA... CHECKSUM
- В запросе
LENGTH = parameter_bytes + 2. - В ответе
LENGTH = data_bytes + 3; статус Extension занимает первый параметр ответа отдельно от обычного байта Legacy-ошибки. CHECKSUM = ~(ID + LENGTH + instruction_or_error + all_parameter_bytes) & 0xFF. В сумму ответа входятEXT_STATUSи данные.- В многобайтном поле младший байт передаётся первым (little-endian). Например, 256 в двух байтах —
00 01. u8,u16,u32— неотрицательные целые числа размером 1, 2 и 4 байта.i16иi32занимают 2 и 4 байта и допускают отрицательные значения. Знаковые значения Extension используют дополнительный код: например, −1 вi16—FF FF. Это отличается от Legacy-кодирования знаковых чисел.- Q8 означает умножение на 256 перед передачей для представления дробей целыми числами. При чтении делите на 256. Например, позиция 1000 отсчётов передаётся как 256000, коэффициент 4.5 — как 1152.
- Позиция выражается в отсчётах энкодера, скорость — в отсчётах/с. Преобразования в углы суставов, включая направление и нулевую позицию, выполняет хост.
- Unicast адресует один сервопривод. Broadcast использует ID
0xFEи приходит всем сервоприводам. Широковещательные Extension-команды никогда не вызывают ответов.
Пример чтения 8-байтового блока capabilities у сервопривода ID 1:
FF FF 01 04 90 90 08 D2
Селектор обозначает целый блок регистров, например конфигурацию или обратную связь. Для доступа используйте Extension READ/WRITE с точным размером блока ниже. Частичное чтение или запись не поддерживаются; Legacy READ/WRITE не имеют доступа к этим блокам.
Инструкции
Указанные размеры параметров не включают заголовок и контрольную сумму. EXT_STATUS сообщает результат Extension-команды отдельно от обычного байта ошибки LEGACY_ERROR. Успешное чтение добавляет данные после EXT_STATUS; запись, другие команды и неудачное чтение дополнительных данных не содержат.
| Инструкция | Имя | Параметры | Broadcast |
|---|---|---|---|
0x90 |
READ | selector:u8, count:u8 |
Полезного ответа нет |
0x91 |
WRITE | selector:u8, block... |
Не принимается |
0x99 |
GRAVITY | 6 байт, см. ниже | Не принимается |
0x9A |
TARGETS | session:u16 + 1–6 записей по 9 байт |
Принимается |
Инструкции 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98 и селекторы 0xA1, 0xA3, 0xB0, 0xBA, 0xE0, 0xF0 зарезервированы; использовать их нельзя.
| Статус Extension | Значение |
|---|---|
0 |
OK |
1 |
Неверная длина, селектор или значение поля |
2 |
Команда не может быть принята в текущем состоянии |
3 |
Зарезервировано |
4 |
Зарезервировано |
5 |
Неподдерживаемая инструкция |
Несовпадение сессии возвращает ошибку состояния. Проверяйте и Legacy-ошибку, и статус Extension.
Сессии и номера последовательности
Хост назначает сессии номер от 1 до 65535 и включает его в управляющие команды. Так сервопривод проверяет принадлежность команды текущей сессии. Для каждого запуска выбирайте новый номер; номера подготовки не сохраняются постоянно.
Номер последовательности считает принятые команды по порядку и позволяет выявить пропуски, повторы и перестановки.
У TARGETS отдельный счётчик движения для каждого сервопривода; у GRAVITY — свой счётчик. Оба начинаются с нуля при запуске управления через torque enable; обычно первой отправляют 1. После 65535 следует 0 без завершения сессии. Пропуски разрешены: после 10 может быть принята 12, даже если 11 потерялась или была отклонена. Равный или старый номер отклоняется без изменения текущей команды.
Точное сравнение: distance = (incoming − accepted) & 0xFFFF. Команда новее только при 1 ≤ distance ≤ 32767. Скачок ровно на 32768 неоднозначен и отклоняется. Разрыв с последней принятой командой должен быть меньше 32768. Если история неизвестна, выключите удержание, подготовьте новый ID сессии и включите снова. Не используйте оставшиеся в очереди пакеты прежней сессии или предыдущего оборота счётчика.
Принятие также требует корректных полей, актуальных измерений и выполнимого движения. Отклонённая команда не продвигает счётчик. Команды заменяют абсолютные цели, а не формируют очередь путевых точек. Чтобы пройти каждую точку, дождитесь прибытия перед следующей целью.
После групповой цели прочитайте обратную связь каждого сервопривода и проверьте принятый номер. Решение о принятии каждый принимает независимо: один может отклонить цель, пока остальные уже движутся.
TARGETS — 0x9A
Первые два байта параметров содержат общую сессию. Каждая последующая запись имеет структуру ниже; смещения считаются от начала записи:
| Смещение | Тип | Поле |
|---|---|---|
| 0 | u8 |
ID сервопривода, 1–253 |
| 1 | u16 |
Более новый номер движения для этого сервопривода |
| 3 | i32 |
Целевая позиция, отсчёты Q8 |
| 7 | u16 |
Максимальная скорость, отсчёты/с, не ноль |
Длина параметров — 2 + 9 × entry_count, не больше 56 байт. ID должны быть уникальны. Каждый сервопривод проверяет формат и обязательные поля всех записей перед обработкой собственной. Если его нет в списке, он ничего не делает. Указанный в списке проверяет сессию, номер, готовность и возможность остаться в пределах. Принятая цель запускается сразу и действует до замены или отключения сессии. Значения ограничиваются настроенными пределами, как описано в разделе S-образного движения.
GRAVITY — 0x99
| Смещение | Тип | Поле / ограничение |
|---|---|---|
| 0 | u16 |
Текущая сессия |
| 2 | u16 |
Более новый номер гравитации |
| 4 | i16 |
Желаемая компенсация; модуль ≤ настроенного предела воздействия |
Длина параметров — ровно 6 байт. Требуются запущенная сессия с включённым мотором, готовое оборудование, отсутствие зарегистрированной неисправности и свежие показания датчиков. Команда не изменяет счётчик движения. Запрошенное значение действует до замены или отключения сессии.
Проверка реализации клиента
Проверяйте длину, checksum, Legacy-ошибку и Extension-статус раздельно. Подтверждайте групповую TARGETS по обратной связи каждого перечисленного мотора: успешная отправка broadcast не является подтверждением приёма. После потери истории счётчиков выключите удержание и подготовьте новую сессию; не продолжайте старую очередь пакетов вслепую.
Для разбора и кодирования существующий драйвер использует host/servo-driver/registers/ArmCodec.js и host/servo-driver/bus/ArmExtension.js. Формат на стороне прошивки реализован в firmware/app/arm_extension.c.
Главная раздела · Версия исходников: a995f77. Extension 9.0.
