Robot and CommandOpMode

Robot and CommandOpMode

Tổ chức chương trình robot dựa trên CommandOpMode.

Tổ chức chương trình robot dựa trên CommandOpMode.

Level

Advanced

Source

Source

Author

Author

FTC Lib

FTC Lib

Translator

Translator

FTC26749 aDudu

FTC26749 aDudu

Date Published

Date Published

Jan 18, 2026

Jan 18, 2026

Tổ chức mã nguồn với lớp Robot và CommandOpMode

LƯU Ý: Chúng tôi khuyến nghị sử dụng CommandOpMode cho việc triển khai mô hình command-based, vì nó thân thiện hơn rất nhiều với các chương trình FTC.

The Robot Class

Lớp Robot

Lớp Robot giúp việc sử dụng CommandScheduler trở nên đơn giản hơn rất nhiều trong mã nguồn của người dùng. Tương tự như WPILib, lớp Robot cho phép xây dựng một mô hình Robot (Robot paradigm).

Mô hình này cho phép:

  • Tạo nhiều OpMode cùng liên kết tới một đối tượng Robot duy nhất

  • Làm nền tảng cho việc vô hiệu hóa robot (disable robot)

Việc vô hiệu hóa robot có nghĩa là:

  • Ngắt (interrupt) các command đang chạy

  • Không cho phép schedule command mới

Điều này được thực hiện thông qua hai phương thức tĩnh:

// disable the Robot
Robot.disable();
// enable the Robot
Robot.enable();
// disable the Robot
Robot.disable();
// enable the Robot
Robot.enable();

Creating a Robot Class

Tạo lớp Robot

Bước đầu tiên để sử dụng mô hình Robot là tạo một lớp con (subclass) của Robot.
Lớp này sẽ:

  • Quản lý toàn bộ command

  • Quản lý toàn bộ subsystem mà bạn muốn sử dụng

Ngoài ra, bạn vẫn có thể:

  • schedule() command

  • register() subsystem

từ bên ngoài lớp Robot.

Hạn chế lớn của Robot class

Một nhược điểm lớn của lớp Robot là:

  • chia sẻ chung command và subsystem cho mọi OpMode

👉 Khuyến nghị:

  • Tạo một enum bên trong Robot để phân biệt TeleOpAutonomous

  • Khi khởi tạo Robot, sử dụng enum này để chọn CommandScheduler phù hợp

Ví dụ minh họa

// ... trong MyRobot.java (extends Robot)
// enum để chỉ định loại opmode
public enum OpModeType {
    TELEOP, AUTO
}
// constructor với loại opmode cụ thể
public MyRobot(OpModeType type) {
    if (type == OpModeType.TELEOP) {
        initTele();
    } else {
        initAuto();
    }
}
/*
 * Khởi tạo teleop hoặc autonomous tùy theo loại
 */
public void initTele() {
    // khởi tạo scheduler dành riêng cho teleop
}
public void initAuto() {
    // khởi tạo scheduler dành riêng cho autonomous
}
// ... trong opmode của bạn
// đối tượng robot
Robot m_robot = new MyRobot(MyRobot.OpModeType.TELEOP);
// ... trong MyRobot.java (extends Robot)
// enum để chỉ định loại opmode
public enum OpModeType {
    TELEOP, AUTO
}
// constructor với loại opmode cụ thể
public MyRobot(OpModeType type) {
    if (type == OpModeType.TELEOP) {
        initTele();
    } else {
        initAuto();
    }
}
/*
 * Khởi tạo teleop hoặc autonomous tùy theo loại
 */
public void initTele() {
    // khởi tạo scheduler dành riêng cho teleop
}
public void initAuto() {
    // khởi tạo scheduler dành riêng cho autonomous
}
// ... trong opmode của bạn
// đối tượng robot
Robot m_robot = new MyRobot(MyRobot.OpModeType.TELEOP);

Nhược điểm không thể khắc phục hoàn toàn

Vấn đề vẫn tồn tại khi:

  • Bạn muốn chạy nhiều OpMode khác nhau

  • Nhưng lại dùng cùng một tập subsystem

👉 Đây chính là lúc CommandOpMode phát huy tác dụng, và nó làm cho mô hình command-based phù hợp với FTC hơn rất nhiều.

Running the Robot in Your OpMode

Chạy Robot trong OpMode

Việc chạy robot trong OpMode khá đơn giản, chỉ cần vài dòng mã và gọi phương thức run().

// giả sử ta đã tạo enum OpModeType như phần trước
Robot m_robot = new MyRobot(MyRobot.OpModeType.AUTO);
// chạy command scheduler gắn với instance robot đó
while (opModeIsActive() && !isStopRequested()) {
    m_robot.run();
}
m_robot.reset();    // reset instance của scheduler
// giả sử ta đã tạo enum OpModeType như phần trước
Robot m_robot = new MyRobot(MyRobot.OpModeType.AUTO);
// chạy command scheduler gắn với instance robot đó
while (opModeIsActive() && !isStopRequested()) {
    m_robot.run();
}
m_robot.reset();    // reset instance của scheduler

CommandOpMode

CommandOpModetrung tâm của mô hình command-based theo phong cách FTC.

Ưu điểm:

  • Làm mọi thứ đơn giản hơn rất nhiều

  • Giảm đáng kể số dòng code cần viết

  • Gắn trực tiếp với từng OpMode, không dùng chung subsystem như Robot class

Khác với Robot class:

  • CommandOpMode không lưu reference chung tới subsystem

  • Nếu muốn, người dùng có thể tự tạo map quản lý hardware

    • Đây chưa phải tính năng chính thức của FTCLib

    • Nhưng hoàn toàn được hỗ trợ

Người dùng có thể:

  • Override các phương thức của CommandOpMode

  • Vô hiệu hóa CommandOpMode bằng các phương thức tĩnh
    (thực chất là disable Robot class – vì CommandScheduler tham chiếu Robot để xử lý runsWhenDisabled())

Initializing your Hardware

Khởi tạo phần cứng

CommandOpMode là một abstract class, vì vậy người dùng bắt buộc phải tạo lớp con để triển khai.

Phương thức duy nhất bắt buộc phải override là:

initialize()
initialize()

Nhiệm vụ của initialize():

  • Khởi tạo toàn bộ hardware

  • Khởi tạo và schedule toàn bộ command

Lưu ý:

  • CommandOpMode đã tự implement runOpMode()

  • Scheduler được chạy tự động

  • Khi OpMode kết thúc hoặc có yêu cầu stop:

    • Scheduler singleton được reset

    • Instance mới sẽ được tạo khi gọi getInstance()

👉 Cách này khá khó hiểu (non-intuitive), nhưng nó hoạt động đúng như thiết kế.

Ví dụ triển khai CommandOpMode

// trong lớp triển khai CommandOpMode của bạn
@Override
public void initialize() {
    // khởi tạo hardware
    // schedule toàn bộ command
    schedule(commands...);
    // register các subsystem chưa được đăng ký
    register(subsystems...);
}
// trong lớp triển khai CommandOpMode của bạn
@Override
public void initialize() {
    // khởi tạo hardware
    // schedule toàn bộ command
    schedule(commands...);
    // register các subsystem chưa được đăng ký
    register(subsystems...);
}

👉 Chỉ cần như vậy là đủ.
Mọi thứ còn lại đều được FTCLib xử lý nội bộ cho người dùng.

Bạn có thể tìm project mẫu sử dụng CommandOpMode tại tài liệu của FTCLib ở đây:link

ADUDU

A proud team of passionate Robotics Enthusiasts competing in nation-wide Technology competitions in Vietnam, the FIRST Tech Challenge and the FIRST Robotics Competition.

Copyright ©

, all rights reserved

Made by aDudu's Programming Department

made by aDudu

made by aDudu

Robot and CommandOpMode