Skip to content

线性操作模式基础(BasicOpMode_Linear)​

约 1269 个字 52 行代码 预计阅读时间 5 分钟

BasicOpMode_Linear是 FTC SDK 中提供的一个基本线性操作模式(OpMode)示例类,展示了线性操作模式的标准结构和使用方式。

功能描述​

该类提供了:

  • 线性操作模式的基本框架和示例

  • 简单的坦克驱动(Tank Drive)实现

  • 展示了硬件初始化和控制器输入处理的标准方法

  • 适合新手团队学习 FTC 编程的入门示例

类关系​

  • 继承自LinearOpMode基类

  • 使用DcMotor类控制电机

  • 使用ElapsedTime类跟踪运行时间

  • 使用Range类限制电机功率值

  • 通过@TeleOp注解注册为遥控操作模式

  • 包含@Disabled注解以防止在实际比赛中显示

重要成员变量​

变量名 类型 描述
runtime ElapsedTime 用于跟踪操作模式运行时间的计时器
leftDrive DcMotor 左侧驱动电机
rightDrive DcMotor 右侧驱动电机

主要方法​

/**
 * 操作模式执行的主要方法
 * 初始化硬件,等待开始,然后执行遥控循环
 */
@Override
public void runOpMode()

方法详解​

runOpMode​

线性操作模式的主要执行方法,包含初始化和循环过程:

@Override
public void runOpMode() {
    // 初始化
    telemetry.addData("Status", "Initialized");
    telemetry.update();

    // 获取硬件映射中的电机
    leftDrive  = hardwareMap.get(DcMotor.class, "left_drive");
    rightDrive = hardwareMap.get(DcMotor.class, "right_drive");

    // 设置电机方向
    leftDrive.setDirection(DcMotor.Direction.REVERSE);
    rightDrive.setDirection(DcMotor.Direction.FORWARD);

    // 等待驾驶员按下开始按钮
    waitForStart();
    runtime.reset();

    // 运行直到驾驶员按下停止按钮
    while (opModeIsActive()) {
        // 计算电机功率
        double drive = -gamepad1.left_stick_y;
        double turn  =  gamepad1.right_stick_x;
        double leftPower  = Range.clip(drive + turn, -1.0, 1.0);
        double rightPower = Range.clip(drive - turn, -1.0, 1.0);

        // 设置电机功率
        leftDrive.setPower(leftPower);
        rightDrive.setPower(rightPower);

        // 显示遥测数据
        telemetry.addData("Status", "Run Time: " + runtime.toString());
        telemetry.addData("Motors", "left (%.2f), right (%.2f)", leftPower, rightPower);
        telemetry.update();
    }
}

1. telemetry 对象​

telemetry 是一个内置对象,用于在 Driver Station(驾驶站)上显示来自机器人控制器的信息。它是从 OpMode 类继承而来的,不需要显式创建。

主要用法:

*// 添加数据,格式为 (标签, 值)*
telemetry.addData("Status", "Initialized");

*// 更新数据,将数据发送到驾驶站显示*
telemetry.update();

这样可以在驾驶站界面上看到:

Status: Initialized

2. hardwareMap.get()方法​

hardwareMap 也是从 OpMode 类继承的内置对象,它使用了 Java 的泛型和反射机制来获取机器人硬件设备。

语法解析:

leftDrive = hardwareMap.get(DcMotor.class, "left_drive");
  • DcMotor.class:指定要获取的设备类型(这里是直流电机)

DcMotor.class:指定要获取的设备类型(这里是直流电机)

  • "left_drive":设备的配置名称,必须与机器人配置文件中的名称完全匹配(区分大小写)

"left_drive":设备的配置名称,必须与机器人配置文件中的名称完全匹配(区分大小写)

  • 返回值类型是 DcMotor,可以直接控制电机

返回值类型是 DcMotor,可以直接控制电机

这行代码的工作原理:

  • 在机器人配置文件中查找名为"left_drive"的设备

在机器人配置文件中查找名为"left_drive"的设备

  • 确认该设备是否为 DcMotor 类型

确认该设备是否为 DcMotor 类型

  • 如果找到匹配的设备,返回该设备的控制对象

如果找到匹配的设备,返回该设备的控制对象

  • 如果未找到或类型不匹配,将抛出异常

如果未找到或类型不匹配,将抛出异常

这种方式的优点:

  • 类型安全:编译时就能检查类型是否正确

类型安全:编译时就能检查类型是否正确

  • 灵活性:可以通过配置文件更改硬件设置,而不需要修改代码

灵活性:可以通过配置文件更改硬件设置,而不需要修改代码

  • 统一管理:所有硬件设备通过 hardwareMap 统一管理和访问

统一管理:所有硬件设备通过 hardwareMap 统一管理和访问

操作模式工作流程​

  • 初始化阶段:向驾驶站报告初始化状态从硬件映射获取电机引用配置电机方向,确保机器人正确移动

初始化阶段:

  • 向驾驶站报告初始化状态

  • 从硬件映射获取电机引用

  • 配置电机方向,确保机器人正确移动

  • 等待开始阶段:waitForStart()方法暂停代码执行,直到驾驶员按下开始按钮重置运行时间计时器

等待开始阶段:

  • waitForStart()方法暂停代码执行,直到驾驶员按下开始按钮

  • 重置运行时间计时器

  • 运行阶段:进入while (opModeIsActive())循环,循环将持续到驾驶员按下停止按钮在循环中不断读取游戏手柄输入根据输入计算电机功率设置电机功率,控制机器人移动更新遥测数据,提供实时状态信息手柄输入 → 数值转换 → 功率计算 → 电机控制↓ ↓ ↓ ↓摇杆值 drive/turn值 功率值 实际转动123

运行阶段:

  • 进入while (opModeIsActive())循环,循环将持续到驾驶员按下停止按钮

  • 在循环中不断读取游戏手柄输入

  • 根据输入计算电机功率

  • 设置电机功率,控制机器人移动

  • 更新遥测数据,提供实时状态信息

  • 手柄输入 → 数值转换 → 功率计算 → 电机控制↓ ↓ ↓ ↓摇杆值 drive/turn值 功率值 实际转动123

手柄输入  数值转换  功率计算  电机控制
                                  
摇杆值     drive/turn值   功率值    实际转动

注意事项​

  • 使用前需要在机器人配置中定义名为"left_drive"和"right_drive"的电机

  • 电机方向设置可能需要根据实际机器人构造调整

  • 在复制此示例创建自己的操作模式时,请移除@Disabled注解

  • 线性操作模式中的阻塞调用(如sleep())会暂停整个操作模式执行

  • 确保while (opModeIsActive())循环中的代码执行速度足够快,以保持响应性

颜色主题调整