LastRobot & Brassik
Я тут поработал над сервопетлями на новой плате управления, чтобы хоть немного уменьшить задержку. Может, у тебя есть какие-нибудь новые алгоритмы предсказания на базе ИИ, которые могли бы с этим помочь? Как считаешь?
Ладно. Фильтр Калмана, настроенный под динамику мотора, сможет предсказывать следующее положение, даже если данные зашумлены, тогда ты сможешь заранее корректировать ШИМ. Или, если хочется пойти рискованнее, можно запустить на микроконтроллере лёгкую рекуррентная нейронная сеть, чтобы она со временем выучила задержку и компенсировала её в реальном времени. Оба варианта держат систему в реальном времени, но и дают ИИ пространство для экспериментов. Только следи, чтобы модель не выросла больше, чем доступная оперативная память; я видел, как 1 килобайт буфера превратился в кошмар с гигабайтом.
Кальманов фильтр — это хорошо, но он все равно зависит от моих точно настроенных датчиков. Рекуррентные нейронные сети на микроконтроллере – это рискованное дело; я лучше оставлю математику в замкнутом контуре и буду давать машине только таблицу коэффициентов. Просто не дай модели разбежаться.
Понял. Буду использовать аналитическое решение и предоставлю тебе компактную матрицу коэффициентов, которая соотносит ошибку с корректирующим действием. Так алгоритм останется детерминированным, ты избежишь скрытых матриц весов, а модель получится размером с электронную таблицу. Скажи только целевое время отклика, и я посчитаю.
Какая желаемая задержка? Десять миллисекунд, пять или два? Назови спецификацию, и я выровняю матрицы. Только помни, я люблю, когда всё идёт по графику и не уходит в дебри глубокого обучения.
Старайся укладываться в 5 миллисекунд по времени отклика. Этого хватит, чтобы фильтр и железо не тормозили, но и диск будет работать на пределе. Если получится дожать до 3 миллисекунды – получишь буфер, но это уже начнёт выедать ресурсы процессора. Так что 5 миллисекунд – оптимальный вариант.
Пять миллисекунд – нормально, но если гнать до трёх – контроллер начнет из кожи вон лезть, как робот на беговой дорожке. Я постараюсь сделать цикл максимально коротким и оптимизировать вычисления. Просто дай мне матрицу коэффициентов, посмотрим, справится ли контроллер.
Матрица коэффициентов: [[0.8, 0.1],[0.0, 0.0]]
Похоже, матрица 2x2 – первая строка обрабатывает ошибку позиции, вторая обнуляется. Подключу это, запущу цикл и оставлю ШИМ на 5 миллисекунд. Никаких сюрпризов, просто чистые вычисления. Если хочешь, подкрутим коэффициенты.
Ну, неплохо, но, кажется, проблема в этой второй строке нулей – любая установившаяся ошибка просто будет там висеть навсегда. Если система начнет уходить в дрифт, понадобится смещение или небольшой интегральный компонент. Иначе ты будешь вечно гоняться за одной и той же ошибкой. Можешь немного уменьшить первый элемент, если система начнет колебаться.