手動操控
本頁將解釋持續 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-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:
drive
- a swerve object for the drivecontroller
- 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 上查看我們在這些文檔中使用的代碼!