{%hackmd @ZZRT/CSS %}
# <span class="block"> Lesson 3 </span>
---
### 操作底盤方式介紹
----
這次要介紹兩種操作方式,分別是
- arcade drive
- tank drive
---
## ARCADE DRIVE intro
----
此操作中分為兩個關鍵部分,分別是
- 速度(speed)
- 轉向程度(rotation rate)
----
我們學校是用xbox中的一個搖桿來操作,
也可以用兩個來控制速度和轉向...
----

一正一負,範圍為 -1 ~ 1
----
情境模擬:
----

----

----
有人有想到一個問題嗎? :thinking_face:
----
他可以原地自轉嗎???
----

不行,因為速度為0
----
而怎麼用程式寫呢?....
---
## ARCADE DRIVE code
----
我們要使用的是```DifferentialDrive```(class)裡面的```arcadeDrive(xSpeed, zRotation);```(方法)
----
我們今天要同時控制左邊的兩個馬達和右邊的兩個馬達,所以要把它變成一個群組```MotorControllerGroup(MotorA, MotorB)```
----
實作(DriveSubsystem):
```java
private final DifferentialDrive drive;
drive = new DifferentialDrive(
new MotorControllerGroup(leftFrontMotor, leftRearMotor),
new MotorControllerGroup(rightFrontMotor, rightRearMotor)
);
//創一個物件drive
public void arcadeDrive(double xSpeed, double zRotation) {
drive.arcadeDrive(xSpeed, zRotation);
}
//使用drive裡面的arcaseDrive方法
```
----
實作(RobotContainer):
```java
private final DriveSubsystem driveTrain = new DriveSubsystem();
driveTrain.setDefaultCommand(
new RunCommand(() ->
driveTrain.arcadeDrive(-xboxController.getRightY(), xboxController.getRightX())
, driveTrain
));
```
----
範例影片(5:20):
https://www.youtube.com/watch?v=ihO-mw_4Qpo
---
## TANK DRIVE intro
----
和坦克一樣的操作方法,分別操作左、右半邊的馬達
----
我們學校是用xbox中的兩個搖桿來操作...
----

一正一負,範圍為 -1 ~ 1
----
情境模擬:
----

----

----
有人有想到一個問題嗎? :thinking_face:
----
他可以原地自轉嗎???
----
**他可以~**

----
而怎麼用程式寫呢?....
---
## TANK DRIVE code
----
我們要使用的是```DifferentialDrive```(class)裡面的```drive.tankDrive(leftSpeed, rightSpeed);```(方法)
----
我們今天要同時控制左邊的兩個馬達和右邊的兩個馬達,和前面的arcade drive一樣要用group裡
----
實作(DriveSubsystem):
```java
private final DifferentialDrive drive;
drive = new DifferentialDrive(
new MotorControllerGroup(leftFrontMotor, leftRearMotor),
new MotorControllerGroup(rightFrontMotor, rightRearMotor)
);
//創一個物件drive
public void tankDrive(double leftSpeed, double rightSpeed) {
drive.tankDrive(-leftSpeed, rightSpeed);
}
//使用drive裡面的tankDrive方法
```
為什麼要有負號呢??
----
實作(RobotContainer):
```java
private final DriveSubsystem driveTrain = new DriveSubsystem();
driveTrain.setDefaultCommand(
new RunCommand(() ->
driveTrain.tankDrive(-xboxController.getRightY(), xboxController.getRightX())
, driveTrain
));
```
----
{"metaMigratedAt":"2023-06-16T22:47:04.726Z","metaMigratedFrom":"YAML","title":"Lesson 3","breaks":true,"slideOptions":"{\"transition\":\"fade\",\"parallaxBackgroundSize\":\"2100px 1000px\",\"defaultTiming\":120}","contributors":"[{\"id\":\"a41c05df-55bf-44dc-9b5f-6e53858b0a77\",\"add\":3514,\"del\":470}]"}