Перейти к статье

Протокол Extension v9.0

Проверено 2026-11-01

Точное описание обмена для собственного клиента. Сначала прочитайте жизненный цикл сессии; размеры, смещения и диапазоны полей приведены в регистрах. Идентификатор инструкции и селектор блока — разные поля пакета, даже когда их числовые значения совпадают.

Адресный запрос и ответ протокола Extension

Этот раздел задаёт точный формат обмена между хостом и сервоприводом и предназначен для подключения собственного ПО.

Формат сообщений и кодирование чисел

Сообщение — пакет байтов с адресатом, командой, данными и контрольной суммой для обнаружения ошибок передачи. 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.