1. Настройка системы реального времени (PREEMPT_RT) и среды разработки для робототехники
Настройка системы реального времени (PREEMPT_RT) и среды разработки для робототехники
Почему робот, который отлично работает в симуляторе, начинает пропускать шаги, терять ориентацию и врезаться в стены при переносе на реальное железо? Ответ почти всегда один: стандартное ядро Linux не гарантирует, что планировщик задач выполнит ваш код точно вовремя. Когда навигационный стек Nav2 отправляет команду скорости, а ядро в этот момент решает заняться дефрагментацией памяти или обслуживанием сетевого стека, робот получает команду с задержкой — и вот уже траектория сбита, costmap устарел, а контроллер пытается компенсировать ошибку, которой можно было избежать. Именно поэтому первый шаг к надёжной автономной навигации — это не установка ROS, а настройка системы реального времени.
Зачем роботу реальное время
Обычный Linux использует планировщик CFS (Completely Fair Scheduler), который оптимизирует пропускную способность: все процессы получают справедливую долю процессорного времени. Но «справедливость» здесь означает «в среднем хорошо», а не «гарантированно в срок». Для веб-сервера это нормально — задержка в 50 миллисекунд никого не убьёт. Для робота, который едет со скоростью 0.5 м/с и должен реагировать на препятствие за 100 мс, задержка в 50 мс — это 2.5 сантиметра неконтролируемого движения. А если рядом стена или человек — это уже проблема безопасности.
PREEMPT_RT — это патч к ядру Linux, который превращает его в мягкую систему реального времени (soft real-time). Он не делает Linux жёстким RTOS вроде VxWorks, но снижает максимальную задержку (worst-case latency) с десятков миллисекунд до единиц — с 30–50 мс до 1–5 мс на типичном оборудовании. Этого достаточно для управления мобильным роботом с циклом управления 20–50 Гц.
Установка PREEMPT_RT на Ubuntu
На Ubuntu 22.04 (Jammy) и 24.04 (Noble) патч PREEMPT_RT доступен через стандартный репозиторий. Установка занимает три команды:
После перезагрузки убедитесь, что загрузилось именно RT-ядро:
Если в репозитории пакета нет (например, на ARM для Raspberry Pi), придётся собирать ядро вручную: скачать исходники ядра, применить патч с kernel.org и сконфигурировать с опцией CONFIG_PREEMPT_RT=y. Это занимает 1–3 часа на современном ПК, но даёт полный контроль над конфигурацией.
Настройка приоритетов и изоляции CPU
Установка RT-ядра — это только половина дела. Без настройки приоритетов процессов и изоляции ядер вы не получите реального выигрыша. Представьте себе скорую помощь с сиреной, которая застряла в общем потоке машин — приоритет есть, но инфраструктура не позволяет его реализовать.
Назначение RT-приоритетов
В Linux RT-процессы получают приоритеты от 1 до 99, где 99 — наивысший. Навигационные ноды Nav2 нужно запускать с повышенным приоритетом:
Флаг -f указывает планировщик SCHED_FIFO — задача выполняется до завершения или пока не будет вытеснена задачей с более высоким приоритетом. Альтернатива SCHED_RR (round-robin) добавляет кванты времени, что полезно, когда несколько задач имеют одинаковый приоритет.
Изоляция ядер CPU
Для критических задач можно выделить отдельные ядра, которые не будут обрабатывать обычные процессы. В файле /etc/default/grub добавьте параметр:
После обновления GRUB (sudo update-grub) ядра 2 и 3 будут доступны только для процессов, явно привязанных к ним:
Это особенно важно на встраиваемых платформах вроде Jetson или Raspberry Pi, где каждый процент CPU на счету.
Настройка limits и групп управления
Даже с RT-ядром и изоляцией ядер, обычный пользователь не может создавать RT-процессы — система это блокирует из соображений безопасности. Нужно явно разрешить это через PAM limits:
Затем добавьте вашего пользователя в группу realtime:
Добавьте sourcing в .bashrc:
Рабочее пространство и colcon
colcon — это система сборки для ROS 2, аналог catkin из ROS 1. Флаг --symlink-install позволяет редактировать Python-скрипты и XML-файлы без пересборки — критически удобно при настройке behavior tree и параметров.
Проверка окружения
Верификация RT-настроек
Чтобы убедиться, что система реального времени работает корректно, используйте утилиту cyclictest из пакета rt-tests:
Ключевые параметры: приоритет 80, 5 потоков, интервал 200 мкс, 100 000 итераций. Обратите внимание на значение Max — это максимальная задержка за весь прогон. На RT-ядре с правильной настройкой оно должно быть , на стандартном ядре может достигать .
| Параметр | Стандартное ядро | PREEMPT_RT | |---|---|---| | Средняя задержка | 15–30 мкс | 5–10 мкс | | Максимальная задержка | 10–50 мс | 50–200 мкс | | Стд. отклонение | Высокое | Низкое |
Если Max превышает 500 мкс, проверьте: не запущены ли фоновые задачи с высоким приоритетом, не работает ли irqbalance (его лучше отключить: sudo systemctl stop irqbalance), и правильно ли изолированы ядра.
Теперь у вас есть полностью подготовленная среда: RT-ядро гарантирует предсказуемое планирование, изолированные ядра дают dedicated-ресурсы для критических нод, а ROS 2 с Nav2 и Gazebo позволяют разрабатывать и тестировать навигацию в симуляции перед переносом на реального робота.