# FIFO-приоритет для FRI ## Зачем это нужно FRI передаёт позиционную команду каждый цикл. При выбранном периоде 10 мс новый пакет должен обрабатываться примерно каждые 10 мс. Обычный планировщик Linux может задержать поток другим процессом. В журнале это видно по сообщениям: ```text Could not enable FIFO RT scheduling: Operation not permitted Overrun might occur ... Read time: 11500 us ``` `SCHED_FIFO` — политика планировщика Linux для потоков с фиксированным приоритетом. В проекте `controller_manager` запрашивает приоритет 50, а FRI-поток — 80. Поток FRI получает более высокий приоритет, чтобы вовремя принять пакет KUKA и отправить ответ. Настройку выполняют **на компьютере с ROS 2**, с которого запускается `cobot run`. Sunrise Cabinet и `cobot-setting.yaml` менять для этого не нужно. ## Настройка Ubuntu 24.04 Выполните на компьютере с ROS 2 под пользователем, который запускает `cobot`: ```bash sudo groupadd -f realtime sudo usermod -aG realtime "$USER" sudo tee /etc/security/limits.d/99-ros2-realtime.conf >/dev/null <<'EOF' @realtime soft rtprio 99 @realtime soft priority 99 @realtime soft memlock unlimited @realtime hard rtprio 99 @realtime hard priority 99 @realtime hard memlock unlimited EOF ``` Затем полностью выйдите из графического сеанса и войдите снова либо перезагрузите компьютер. Открытый терминал не получает новую группу и лимиты. ## Проверка В новом терминале проверьте группу и лимиты: ```bash id -nG | tr ' ' '\n' | grep -x realtime ulimit -r ulimit -l ``` Ожидаемый результат: первая команда выводит `realtime`, вторая — `99`, третья — `unlimited`. Запустите FRI без движения робота и убедитесь, что в журнале есть: ```text FRI worker uses FIFO priority 80 ``` После запуска можно дополнительно посмотреть политики всех потоков процесса: ```bash PID=$(pgrep -n ros2_control_node) ps -L -p "$PID" -o pid,tid,cls,rtprio,pri,comm ``` Для потоков реального времени в столбце `CLS` будет `FF`; у FRI-потока `RTPRIO` равен 80, у основного цикла `controller_manager` — 50. !!! warning "Перед первым движением" Сначала проверьте успешное подключение FRI и строку `FRI worker uses FIFO priority 80`. Затем выполните короткое перемещение на скорости 0.1 при наблюдении оператора. FIFO уменьшает jitter компьютера, но не отменяет контроль сети, ограничений робота и рабочей зоны. ## Если настройка не сработала - Если `realtime` отсутствует в выводе `id`, выйдите из системы и войдите снова. - Если `ulimit -r` меньше 80, проверьте файл `/etc/security/limits.d/99-ros2-realtime.conf` и наличие `pam_limits.so` в конфигурации PAM. - Если лог всё ещё сообщает `Operation not permitted`, убедитесь, что `cobot run` запущен тем же пользователем, для которого выполнен `usermod`. - В Python virtualenv дополнительных действий не требуется: права задаются пользователю и наследуются процессом Python. - Для Docker нужны права контейнера: `--cap-add=sys_nice --ulimit rtprio=99 --ulimit memlock=-1`. ## Откат Чтобы удалить настройку, выполните: ```bash sudo rm /etc/security/limits.d/99-ros2-realtime.conf sudo gpasswd -d "$USER" realtime ``` После повторного входа процессы снова будут работать с обычным планировщиком Linux. Подробнее о лимитах и приоритете `controller_manager` — в [документации ros2_control](https://control.ros.org/jazzy/doc/ros2_control/controller_manager/doc/userdoc.html#determinism).