4.8 KiB
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.