Введение

На этой странице собраны ключевые материалы для изучения автономного движения и программирования в соревнованиях 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:

  1. Создайте проект в Android Studio и подключите библиотеку.
  2. Определите кинематические параметры робота и откалибруйте PID‑коэффициенты.
  3. Используйте TrajectoryBuilder для создания желаемых траекторий.
  4. Следуйте траекториям с помощью методов 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:

  1. Создайте проект в Android Studio и подключите библиотеку.
  2. Определите кинематические параметры робота и откалибруйте PID‑коэффициенты.
  3. Используйте TrajectoryBuilder для создания желаемых траекторий.
  4. Следуйте траекториям с помощью методов 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】. Команды используют научные знания и командную работу, чтобы глубже разобраться в открытиях, что делает участие в сезоне по‑настоящему увлекательным.

Добро пожаловать в учебный хаб OZGE

Здесь вы найдёте структурированные уроки по программированию и автономному движению в FTC. Выберите интересующую вас категорию и начинайте обучение.

Основы FTC SDK

Pedro Pathing

Road Runner

Сезоны FTC