Введение
На этой странице собраны ключевые материалы для изучения автономного движения и программирования в соревнованиях First Tech Challenge (FTC). Мы адаптировали стиль документации, аналогичный популярным библиотекам Pedro Pathing и Road Runner, чтобы вам было удобно ориентироваться и погружаться в тему.
Pedro Pathing позиционирует себя как «самая популярная библиотека для автономного движения FTC»【874685033525736†L4-L7】. Она позволяет создавать траектории, управлять их выполнением и оптимизировать автономные программы.
Road Runner — ещё одна мощная библиотека. Авторы отмечают, что в версии 1.0.0 были внесены крупные изменения в процесс настройки и интерфейс【548242034180099†L138-L143】, поэтому важно опираться на актуальные материалы.
Что такое FTC?
FIRST Tech Challenge (FTC) — это робототехническая программа для учащихся 7–12 классов, в рамках которой команды проектируют, собирают и программируют роботов для участия в матчах союзов【241877734153801†L186-L200】. Соревнования проходят в несколько этапов: от локальных отборочных турниров до региональных чемпионатов и мирового чемпионата. Роботами управляют с помощью Android‑совместимого контроллера, а код пишут на Java, Kotlin, языке блоков или других Android‑средах【241877734153801†L202-L205】.
Каждый год в сентябре проходит Kickoff, на котором раскрываются тема и правила нового сезона【241877734153801†L195-L200】. После этого команды начинают проектировать и программировать свои машины, проводят исследования и делятся знаниями со своим сообществом. Таким образом, FTC учит инженерным навыкам, командной работе и публичным выступлениям.
Программирование TeleOp
После 30‑секундного автономного периода начинается двухминутный этап, в котором роботом управляют операторы с помощью геймпадов【241877734153801†L288-L295】. Этот режим называется TeleOp. В это время программа постоянно считывает значения стиков, триггеров и кнопок, преобразуя их в действия робота. Выбор правильного ввода для механизма важен: аналоговые элементы (джойстики и триггеры) возвращают плавающие значения, позволяя плавно регулировать скорость, а кнопки и «крестовина» предоставляют логические сигналы для выполнения дискретных операций【203463488283174†L68-L79】.
Ниже приведён простой пример TeleOp‑режима c пояснениями. Наведите курсор на строку кода, чтобы узнать её назначение.
@TeleOp(name="SimpleTeleOp", group="Примеры")
public class SimpleTeleOp extends LinearOpMode {
private DcMotor leftMotor;
private DcMotor rightMotor;
@Override
public void runOpMode() {
leftMotor = hardwareMap.get(DcMotor.class, "left_drive");
rightMotor = hardwareMap.get(DcMotor.class, "right_drive");
waitForStart();
while (opModeIsActive()) {
double forward = -gamepad1.left_stick_y;
double turn = gamepad1.right_stick_x;
double leftPower = forward + turn;
double rightPower = forward - turn;
leftMotor.setPower(leftPower);
rightMotor.setPower(rightPower);
}
}
}
В приведённом примере реализован «сплит‑аркадный» тип управления: левый джойстик отвечает за движение вперёд/назад, а правый — за вращение робота. Вы можете адаптировать формулы под свой привод, реализовать механум или танковое управление и добавить управление механизмами с помощью кнопок и триггеров.
Программирование Autonomous
В автономном режиме роботы выполняют заранее запрограммированные действия без вмешательства оператора в течение первых 30 секунд матча【241877734153801†L288-L295】. Задача вашей программы — точно позиционировать робот и взаимодействовать с игровыми элементами. Для этого используются датчики, таймеры и алгоритмы планирования траекторий. После завершения автономии водительский режим может быть автоматически загружен при помощи параметра preselectTeleOp в аннотации @Autonomous【408459302428974†L2113-L2171】.
Ниже приведён простой пример автономной программы, которая включает моторы на заданное время. Наведите курсор на строки для подсказок.
@Autonomous(name="SimpleAuto", group="Примеры")
public class SimpleAuto extends LinearOpMode {
private DcMotor leftMotor;
private DcMotor rightMotor;
@Override
public void runOpMode() {
leftMotor = hardwareMap.get(DcMotor.class, "left_drive");
rightMotor = hardwareMap.get(DcMotor.class, "right_drive");
leftMotor.setDirection(DcMotor.Direction.REVERSE);
waitForStart();
leftMotor.setPower(0.5);
rightMotor.setPower(0.5);
sleep(1000);
leftMotor.setPower(0);
rightMotor.setPower(0);
while (opModeIsActive()) {
idle();
}
}
}
Для более сложных автономных программ обратитесь к библиотекам Pedro Pathing и Road Runner, которые позволяют строить траектории и следовать им с высокой точностью.
PID контроллеры
PID‑контроллер — это распространённый алгоритм обратной связи, состоящий из пропорциональной, интегральной и дифференциальной составляющих【962263862007062†L511-L552】. Пропорциональный (P) член стремится снизить текущую ошибку положения, дифференциальный (D) — уменьшить скорость изменения ошибки, а интегральный (I) — компенсировать накопленную во времени ошибку【962263862007062†L549-L552】. Сумма этих компонентов формирует управляющий сигнал, который подаётся на мотор или другой исполнительный механизм.
В FTC для изменения PID‑коэффициентов используется расширенный интерфейс DcMotorEx. REV Robotics Control Hub позволяет задавать коэффициенты отдельно для каждого канала и режима работы двигателя【408459302428974†L1796-L1804】. Обратите внимание, что изменения не сохраняются при перезагрузке контроллера, поэтому значения необходимо переустанавливать при инициализации【408459302428974†L1806-L1810】.
Пример кода для настройки PID‑коэффициентов:
import com.qualcomm.robotcore.hardware.DcMotor;
import com.qualcomm.robotcore.hardware.DcMotorEx;
import com.qualcomm.robotcore.hardware.PIDCoefficients;
DcMotorEx motor;
motor = (DcMotorEx) hardwareMap.get(DcMotor.class, "left_drive");
PIDCoefficients pidOrig = motor.getPIDCoefficients(DcMotor.RunMode.RUN_USING_ENCODER);
PIDCoefficients pidNew = new PIDCoefficients(2.5, 0.1, 0.2);
motor.setPIDCoefficients(DcMotor.RunMode.RUN_USING_ENCODER, pidNew);
Настройка PID требует экспериментирования: начните с небольших значений и постепенно увеличивайте коэффициенты, чтобы добиться плавного и точного движения без колебаний.
Pedro Pathing: локализация и Pinpoint
Для высокоточной навигации Pedro Pathing поддерживает локализатор Pinpoint. Документация описывает предварительные требования: необходимо подключить два одометрических энкодера к модулю Pinpoint и соединить сам Pinpoint с REV Hub по I2C【710653403063226†L70-L74】.
Ниже приведён пример конфигурации Pinpoint с интерактивными подсказками:
public static final PinpointConstants PINPOINT =
new PinpointConstants.Builder()
.setOffsets(0.0, 0.0)
.setEncoderDirections(PinpointConstants.EncoderDirection.REVERSED, PinpointConstants.EncoderDirection.FORWARD)
.setWheelDiameter(2.0)
.setTicksPerRev(8192)
.build();
follower = new FollowerBuilder(hardwareMap)
.pinpointLocalizer(PINPOINT)
.build();
Данный код основан на примере из официальной документации Pedro Pathing【710653403063226†L75-L103】. Параметры (смещения, направление, диаметр, число тиков) необходимо подобрать в соответствии с конструкцией и сенсорами вашего робота. После настройки локализатора вы можете использовать TrajectoryBuilder для создания траекторий и выполнять их через созданный Follower.
Road Runner: обновлённый интерфейс
Road Runner — ещё одна популярная библиотека для построения и следования траекториям. В версии 1.0.0 разработчики полностью переработали процесс настройки и API, поэтому важно пользоваться актуальными руководствами【548242034180099†L138-L143】.
Основные шаги при настройке Road Runner:
- Создайте проект в Android Studio и подключите библиотеку.
- Определите кинематические параметры робота и откалибруйте PID‑коэффициенты.
- Используйте
TrajectoryBuilder для создания желаемых траекторий.
- Следуйте траекториям с помощью методов
drive.followTrajectory() или drive.followTrajectorySequence().
Подробные инструкции, примеры и советы по оптимизации представлены на сайте Learn Road Runner.
Сезоны FTC
Каждый сезон FTC посвящён новой тематике и игровому заданию. На ежегодном Kickoff в сентябре FIRST представляет тему и правила сезона; после этого команды проектируют и строят роботов, планируют стратегии и готовят презентации【241877734153801†L195-L200】. Отборочные турниры и региональные чемпионаты проходят с октября по март【241877734153801†L271-L274】, а затем лучшие команды отправляются на мировой чемпионат.
Текущий сезон 2025–2026 называется DECODE™ presented by RTX. Организаторы предлагают «исследовать силу артефактов мира и раскрывать тайны»; каждая находка рассказывает историю, а инновации связывают нас с прошлым【761115085449377†L194-L199】. Команды используют научные знания и командную работу, чтобы глубже разобраться в открытиях, что делает участие в сезоне по‑настоящему увлекательным.
Основы FTC SDK
Что такое FTC?Для начинающих
FIRST Tech Challenge (FTC) — это робототехническая программа для учащихся 7–12 классов, в рамках которой команды проектируют, собирают и программируют роботов для участия в матчах союзов【241877734153801†L186-L200】. Соревнования проходят в несколько этапов: от локальных отборочных турниров до региональных чемпионатов и мирового чемпионата. Роботами управляют с помощью Android‑совместимого контроллера, а код пишут на Java, Kotlin, языке блоков или других Android‑средах【241877734153801†L202-L205】.
Каждый год в сентябре проходит Kickoff, на котором раскрываются тема и правила нового сезона【241877734153801†L195-L200】. После этого команды начинают проектировать и программировать свои машины, проводят исследования и делятся знаниями со своим сообществом. Таким образом, FTC учит инженерным навыкам, командной работе и публичным выступлениям.
OpModesДля начинающих
В FTC SDK существуют два типа операционных режимов: OpMode и LinearOpMode【490617985111319†L228-L240】. Выбор класса определяет структуру вашей программы: LinearOpMode имеет единственный метод runOpMode(), который выполняется последовательно после нажатия кнопки INIT, тогда как OpMode делит код на методы init(), init_loop(), start() и loop()【490617985111319†L256-L269】. Методы waitForStart() и opModeIsActive() помогают организовать цикл и ожидать запуска.
LinearOpMode чаще используется новичками благодаря простоте: код после waitForStart() выполняется один раз и может содержать циклы. OpMode даёт больше контроля над фазами и позволяет разделять инициализацию, запуск и периодическую логику. Для обучения достаточно освоить LinearOpMode, а затем экспериментировать с OpMode для более сложных задач.
TeleOpДля начинающих
После 30‑секундного автономного периода начинается двухминутный этап, в котором роботом управляют операторы с помощью геймпадов【241877734153801†L288-L295】. Этот режим называется TeleOp. В это время программа постоянно считывает значения стиков, триггеров и кнопок, преобразуя их в действия робота. Выбор правильного ввода для механизма важен: аналоговые элементы (джойстики и триггеры) возвращают плавающие значения, позволяя плавно регулировать скорость, а кнопки и «крестовина» предоставляют логические сигналы для выполнения дискретных операций【203463488283174†L68-L81】.
Ниже приведён простой пример TeleOp‑режима c пояснениями. Наведите курсор на строку кода, чтобы узнать её назначение.
@TeleOp(name="SimpleTeleOp", group="Примеры")
public class SimpleTeleOp extends LinearOpMode {
private DcMotor leftMotor;
private DcMotor rightMotor;
@Override
public void runOpMode() {
leftMotor = hardwareMap.get(DcMotor.class, "left_drive");
rightMotor = hardwareMap.get(DcMotor.class, "right_drive");
waitForStart();
while (opModeIsActive()) {
double forward = -gamepad1.left_stick_y;
double turn = gamepad1.right_stick_x;
double leftPower = forward + turn;
double rightPower = forward - turn;
leftMotor.setPower(leftPower);
rightMotor.setPower(rightPower);
}
}
}
В приведённом примере реализован «сплит‑аркадный» тип управления: левый джойстик отвечает за движение вперёд/назад, а правый — за вращение робота. Вы можете адаптировать формулы под свой привод, реализовать механум или танковое управление и добавить управление механизмами с помощью кнопок и триггеров.
AutonomousСредний
В автономном режиме роботы выполняют заранее запрограммированные действия без вмешательства оператора в течение первых 30 секунд матча【241877734153801†L288-L295】. Задача вашей программы — точно позиционировать робот и взаимодействовать с игровыми элементами. Для этого используются датчики, таймеры и алгоритмы планирования траекторий. После завершения автономии водительский режим может быть автоматически загружен при помощи параметра preselectTeleOp в аннотации @Autonomous【408459302428974†L2113-L2171】.
Ниже приведён простой пример автономной программы, которая включает моторы на заданное время. Наведите курсор на строки для подсказок.
@Autonomous(name="SimpleAuto", group="Примеры")
public class SimpleAuto extends LinearOpMode {
private DcMotor leftMotor;
private DcMotor rightMotor;
@Override
public void runOpMode() {
leftMotor = hardwareMap.get(DcMotor.class, "left_drive");
rightMotor = hardwareMap.get(DcMotor.class, "right_drive");
leftMotor.setDirection(DcMotor.Direction.REVERSE);
waitForStart();
leftMotor.setPower(0.5);
rightMotor.setPower(0.5);
sleep(1000);
leftMotor.setPower(0);
rightMotor.setPower(0);
while (opModeIsActive()) {
idle();
}
}
}
Для более сложных автономных программ обратитесь к библиотекам Pedro Pathing и Road Runner, которые позволяют строить траектории и следовать им с высокой точностью.
PID контроллерыСредний
PID‑контроллер — это распространённый алгоритм обратной связи, состоящий из пропорциональной, интегральной и дифференциальной составляющих【962263862007062†L511-L552】. Пропорциональный (P) член стремится снизить текущую ошибку положения, дифференциальный (D) — уменьшить скорость изменения ошибки, а интегральный (I) — компенсировать накопленную во времени ошибку【962263862007062†L549-L552】. Сумма этих компонентов формирует управляющий сигнал, который подаётся на мотор или другой исполнительный механизм.
В FTC для изменения PID‑коэффициентов используется расширенный интерфейс DcMotorEx. REV Robotics Control Hub позволяет задавать коэффициенты отдельно для каждого канала и режима работы двигателя【408459302428974†L1796-L1804】. Обратите внимание, что изменения не сохраняются при перезагрузке контроллера, поэтому значения необходимо переустанавливать при инициализации【408459302428974†L1806-L1810】.
Пример кода для настройки PID‑коэффициентов:
import com.qualcomm.robotcore.hardware.DcMotor;
import com.qualcomm.robotcore.hardware.DcMotorEx;
import com.qualcomm.robotcore.hardware.PIDCoefficients;
DcMotorEx motor;
motor = (DcMotorEx) hardwareMap.get(DcMotor.class, "left_drive");
PIDCoefficients pidOrig = motor.getPIDCoefficients(DcMotor.RunMode.RUN_USING_ENCODER);
PIDCoefficients pidNew = new PIDCoefficients(2.5, 0.1, 0.2);
motor.setPIDCoefficients(DcMotor.RunMode.RUN_USING_ENCODER, pidNew);
Настройка PID требует экспериментирования: начните с небольших значений и постепенно увеличивайте коэффициенты, чтобы добиться плавного и точного движения без колебаний.
Pedro Pathing
Локализация PinpointСредний
Для высокоточной навигации Pedro Pathing поддерживает локализатор Pinpoint. Документация описывает предварительные требования: необходимо подключить два одометрических энкодера к модулю Pinpoint и соединить сам Pinpoint с REV Hub по I2C【710653403063226†L70-L74】.
Ниже приведён пример конфигурации Pinpoint с интерактивными подсказками:
public static final PinpointConstants PINPOINT =
new PinpointConstants.Builder()
.setOffsets(0.0, 0.0)
.setEncoderDirections(PinpointConstants.EncoderDirection.REVERSED, PinpointConstants.EncoderDirection.FORWARD)
.setWheelDiameter(2.0)
.setTicksPerRev(8192)
.build();
follower = new FollowerBuilder(hardwareMap)
.pinpointLocalizer(PINPOINT)
.build();
Данный код основан на примере из официальной документации Pedro Pathing【710653403063226†L75-L103】. Параметры (смещения, направление, диаметр, число тиков) необходимо подобрать в соответствии с конструкцией и сенсорами вашего робота. После настройки локализатора вы можете использовать TrajectoryBuilder для создания траекторий и выполнять их через созданный Follower.
Road Runner
Обновлённый интерфейсСредний
Road Runner — ещё одна популярная библиотека для построения и следования траекториям. В версии 1.0.0 разработчики полностью переработали процесс настройки и API, поэтому важно пользоваться актуальными руководствами【548242034180099†L138-L143】.
Основные шаги при настройке Road Runner:
- Создайте проект в Android Studio и подключите библиотеку.
- Определите кинематические параметры робота и откалибруйте PID‑коэффициенты.
- Используйте
TrajectoryBuilder для создания желаемых траекторий.
- Следуйте траекториям с помощью методов
drive.followTrajectory() или drive.followTrajectorySequence().
Подробные инструкции, примеры и советы по оптимизации представлены на сайте Learn Road Runner.
Сезоны FTC
Обзор сезонаДля начинающих
Каждый сезон FTC посвящён новой тематике и игровому заданию. На ежегодном Kickoff в сентябре FIRST представляет тему и правила сезона; после этого команды проектируют и строят роботов, планируют стратегии и готовят презентации【241877734153801†L195-L200】. Отборочные турниры и региональные чемпионаты проходят с октября по март【241877734153801†L271-L274】, а затем лучшие команды отправляются на мировой чемпионат.
Текущий сезон 2025–2026 называется DECODE™ presented by RTX. Организаторы предлагают «исследовать силу артефактов мира и раскрывать тайны»; каждая находка рассказывает историю, а инновации связывают нас с прошлым【761115085449377†L194-L199】. Команды используют научные знания и командную работу, чтобы глубже разобраться в открытиях, что делает участие в сезоне по‑настоящему увлекательным.