Files

4.8 KiB
Raw Permalink Blame History

FIFO-приоритет для FRI

Зачем это нужно

FRI передаёт позиционную команду каждый цикл. При выбранном периоде 10 мс новый пакет должен обрабатываться примерно каждые 10 мс. Обычный планировщик Linux может задержать поток другим процессом. В журнале это видно по сообщениям:

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:

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

Затем полностью выйдите из графического сеанса и войдите снова либо перезагрузите компьютер. Открытый терминал не получает новую группу и лимиты.

Проверка

В новом терминале проверьте группу и лимиты:

id -nG | tr ' ' '\n' | grep -x realtime
ulimit -r
ulimit -l

Ожидаемый результат: первая команда выводит realtime, вторая — 99, третья — unlimited.

Запустите FRI без движения робота и убедитесь, что в журнале есть:

FRI worker uses FIFO priority 80

После запуска можно дополнительно посмотреть политики всех потоков процесса:

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.

Откат

Чтобы удалить настройку, выполните:

sudo rm /etc/security/limits.d/99-ros2-realtime.conf
sudo gpasswd -d "$USER" realtime

После повторного входа процессы снова будут работать с обычным планировщиком Linux.

Подробнее о лимитах и приоритете controller_manager — в документации ros2_control.