Джойстик отпустили. Робот не в курсе

Стик уже в центре, событие нейтрали поступило, а обработчик отправляет прежний поворот. Перед этим он синхронно ждал ответ SDK на кнопку громкости. Сбой воспроизвели настоящим кодом с очередью ввода в памяти и тестовым приёмником команд.
Я Лев Ларин, инженер Unibot. Мы подключаем робота-доставщика Alfa Robotics SpeedyBot к своей платформе UNIBOT Fleet. Это девятая часть серии: задержки ручного управления.
Начало серии · ← Часть 8: Парк, я тебя отрендерил · Часть 10: Мечтают ли роботы о свободных ядрах? →
Откуда приходит ввод
Локальный Bluetooth-геймпад передаёт Linux события осей, кнопок и отключения. Бортовой обработчик преобразует их в задания скорости штатному SDK.
Геймпад на компьютере оператора читает браузерный Gamepad API. Оси идут через Fleet и Edge к тому же механизму управления на роботе. Этот путь дополнительно зависит от сети.

Отклонение стика задаёт пропорциональный запрос в пределах лимитов; нейтраль возвращает ручное задание к нулю. Команду, обратную связь колёс и движение корпуса измеряем раздельно:
Наблюдение | На какой вопрос отвечает |
|---|---|
Событие оси | Что пришло от источника ввода? |
Записанная команда скорости | Что программа попросила выполнить? |
Обратная связь колёс | Что сообщили приводы о вращении? |
Скорость корпуса по локализации | Как изменялось положение машины? |
Скорость корпуса в сохранённом разборе вычисляется по окну не менее 0,5 с. Для короткого движения она не заменяет мгновенную обратную связь колёс.
Устаревшая ось после кнопки
Обработчик уже прочитал отклонённую ось, затем стал ждать I/O кнопки громкости. Нейтраль поступила в очередь во время ожидания. После возврата из I/O программа сначала отправляла сохранённую старую ось и лишь затем читала новые события.

+0,8 на схеме — угловое задание тестового выхода, не скорость настоящего корпуса. Аналогично воспроизвели старый положительный запрос перед отрицательным, отключение источника и кнопочный STOP.
Перед следующей записью скорости добавили повторный проход существующего reader по уже готовым событиям. Будущего ввода он не ждёт, порядок кнопок и границ событий сохраняется. Нейтраль даёт ноль, смена направления — новое значение. Удерживаемый стик продолжает давать прежнее отклонение.
В одинаковой матрице локального и отдельного установленного ARM-процесса до правки провалились 12 случаев устаревших осей, три случая удержания прошли. После правки прошли все 15. Это проверка кода и порядка команд, без радио, физического контроллера и колёс.
Убрать I/O из чтения ввода
Дочитывание после I/O не помогает, пока сам вызов ещё ждёт. Поэтому обычные кнопочные SDK-операции перенесли в одного последовательного исполнителя. Чтение ввода и запись скорости остались у прежнего обработчика. Нейтраль больше не ждёт операции громкости или настроек; уже начатый SDK-вызов не отменяется, правила native-управления и STOP сохраняются.
Отдельно исправили ожидание общего RLock: получение блокировки использует оставшийся бюджет deadline, а не проверяет его после неограниченного ожидания. В двух изолированных проверках установленного кода при бюджете 50 мс получили таймауты примерно через 50,58 и 53,33 мс, до освобождения lock. Раньше вызовы ждали около 150 мс контрольного удержания. Это длительность этих вызовов с планированием ОС, не задержка от пальца до колёс.
Сетевая проверка
Времена браузера и робота нельзя прямо вычитать без синхронизации часов. Команды, обратную связь колёс и движение корпуса разбирали на часах робота; для участка браузер→робот сохраняли неопределённость часов.

Нейтральный Fleet-прогон проверял поток и завершение сессии без ненулевых команд. Фактический маршрут соединения проверяли отдельно: часть последующих серий использовала Wi-Fi. Работа локального Bluetooth не закрывает проверку PC→Fleet→LTE. Видео из третьей части помогает наблюдать машину, но не заменяет временные метки.
Что проверили физически
21 октября владелец подключил 8Bitdo SN30 Pro по Bluetooth к роботу и подтвердил удобство управления. В отдельном сохранённом окне есть реальные события устройства, команды, обратная связь колёс и изменение позы.
Физическое BT-управление подтверждено. Полный Fleet/PC→LTE этап к завершению этих работ оставался незакрытым; численного предела сквозной задержки эти проверки не дают.
Все 10 историй SpeedyBot
Робот доставщик дороже автомобиля, мокрая трава и открытый JDWP
Джойстик отпустили. Робот не в курсе — вы здесь.
KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.