手動操控

本頁將解釋持續 2 分 15 秒的手動機器人控制(Teleop)。本文檔將參考與提到 Manual Drive Class 和 RobotContainer。可以在 here 找到更多有關於 RobotContainer 的信息。

操縱

機器有兩種主要的移動類型:Field Oriented Driving 和 Robot Oriented Driving。

Field Oriented Driving的移動放式可以使機器在面向場地任何一邊時平移向各個方向。 例如,當機器人面朝東方時將操縱桿向前推機器人會向北移動。

與Field Oriented Driving相比,Robot Oriented Driving 的操縱桿的移動將與機器 相關,而不是與場地相關。例如,當機器人面朝東方時將操縱桿向前堆,機器人就會向東移動。

Field/robot-oriented driving comparison
Field vs robot-oriented driving

Field-oriented

Robot-oriented

需要 IMU

要(會有誤差積累*)

操縱桿的移動

相對於場地

相對於機器

* IMU 誤差積累又可能會造成 Field Orientation Driving 有些微的不準確

以下是 field-oriented control 的示範:

驅動程式

因為我們使用 command based programming,所以需要驅動程式來控制機器。

Constructor

 1private final Swerve mSwerve;
 2private final XboxController mController;
 3
 4public ManualDrive(Swerve drive, XboxController controller) {
 5    mSwerve = drive;
 6    mController = controller;
 7
 8    // 加入 swerve 為這條命令的必要條件
 9    addRequirements(mSwerve);
10}

Parameters:

  1. drive - a swerve object for the drive

  2. controller - a XboxController method for the controller

必須創建驅動命令才能手動操控機器人。調用構造函數將創建驅動命令,然後在 RobotContainer 中使用它。

execute

當 drivecommand 被叫到時,execute method 會一直執行,所以操控程式要寫在這裡。

1@Override
2public void execute() {
3    // Drives with XSpeed, YSpeed, zSpeed
4    // True/false for field-oriented driving
5    mSwerve.drive(mController.getLeftY(), mController.getLeftX(), mController.getRightX(), true);
6}

執行驅動程式

Drive command 需要再 RobotContainer 裡被叫到。

 1// 創造一個新的 ManualDrive instance, 給他 Swerve 跟 Controller 當 parameters
 2private final ManualDrive mManualDriveCommand = new ManualDrive(mSwerve, mController);
 3
 4public RobotContainer() {
 5    // 配置按鈕綁定
 6    configureButtonBindings();
 7
 8    // 設置 ManuelDrive 在手動操控中執行
 9    mSwerve.setDefaultCommand(mManualDriveCommand);
10}

創建了一個新的 ManualDrive instance,它也創建了 drive command。為了要在 RobotContainer 中使用 drive command,Swerve object 的原始設置為手動驅動。 當 Teleop 啟動時,ManualDrive 命令將自動執行。

備註

在我們的 Github 上查看我們在這些文檔中使用的代碼!