# 物件宣告與物件導向 ## <font color="#00a0c8 "> 一、什麼是物件宣告Object Declaration?</font> 一種物件導向語言,物件的宣告分為「建立變數」與「初始化(建構)」兩個步驟: ```java // 語法格式 類別名稱 變數名稱 = new 類別名稱(建構子參數); ``` 舉例: ```java Joystick driverController = new Joystick(0); ``` --- ### 常見 FRC 物件宣告實例 1. 馬達控制器(TalonSRX / CANSparkMax) ```java WPI_TalonSRX shooterMotor = new WPI_TalonSRX(5); // 5 為 CAN ID (透過Phoenix Tuner X看) SparkMax intakeMotor = new SparkMax(6, MotorType.kBrushless); // brushless 需指定 / ID由 REV Hardware 看 ``` 2. 控制器(Joystick / XboxController) ```java Joystick driverStick = new Joystick(0); // 0 為 USB 順序(可透過driverstation查看) XboxController operator = new XboxController(1); ``` 3. 感測器(Encoder ) ```java Encoder wheelEncoder = new Encoder(0, 1); // 使用 DIO 通道 0 和 1 ``` 6. 常用儀表板輸出(SmartDashboard) ```java SmartDashboard.putNumber("Encoder Value", wheelEncoder.get()); ``` --- ### 宣告建議放置位置 變數宣告:通常放在 Robot 類別或 Subsystem 類別的 class 內部,方便共享。 初始化(new):可在 robotInit() 或 constructor 中執行。通常會在constructor中執行。 ```java public class Robot extends TimedRobot { private Joystick stick; private WPI_TalonSRX motor; @Override public void robotInit() { stick = new Joystick(0); motor = new WPI_TalonSRX(0); } } ``` --- ### 附註與技巧 - 如果是 PWM 裝置要對照 RoboRIO 上的 PWM 通道插入正確位置,Digital Input亦同 - CAN 裝置需事先用 Phoenix Tuner X / REV Hardware Client 設定好 CAN ID - Joystick 順序由電腦識別的 USB 順序決定(可用 Driver Station 確認) --- ### 延伸資源 WPILib Hardware API 教學: https://docs.wpilib.org/en/stable/docs/software/hardware-apis/index.html 控制器與輸入裝置(Joystick)教學: https://docs.wpilib.org/en/stable/docs/software/basic-programming/joystick.html --- ## <font color="#00a0c8"> 二、什麼是物件導向 Object-Oriented Programming(OOP)</font> 物件導向是一種程式設計方式,強調以「類別與物件」來建構程式結構,具備以下四大核心概念: | 概念 | 說明 | FRC 中的例子 | |----------|------|--------------| | 封裝 | 把資料與操作包在一起 | Subsystem(.java/.cpp) 管理單一模組 | | 繼承 | 子類別擁有父類別功能 | `TimedRobot` 是 `RobotBase` 的子類 | | 多型 | 同一函式有不同表現 | `motor.set()` 可以設 float 或 double | | 抽象 | 定義架構不定義實作 | `CommandBase` 中只定義 `execute()` 方法 | --- ## 基本結構:類別與物件 ```java // 類別定義 public class Shooter { private SparkMax shooterMotor; public Shooter(int canID) { shooterMotor = new SparkMax(canID); } public void shoot(double speed) { shooterMotor.set(speed); } } ``` ```java // 物件創建與使用 Shooter shooter = new Shooter(5); shooter.shoot(0.8); ``` --- ## FRC 中的 OOP 實作範例 #### 1. Subsystem 類別(定義、代表一個物件的模組) ``` java public class DriveSubsystem extends SubsystemBase { private TalonFX leftMotor = new TalonFX(0); private TalonFX rightMotor = new TalonFX(1); public void drive(double speed) { leftMotor.set(speed); rightMotor.set(speed); } } ``` #### 2. Command 類別(代表行動) ```java public class DriveCommand extends CommandBase { private final DriveSubsystem drive; private final Joystick controller; public DriveCommand(DriveSubsystem subsystem, Joystick joystick) { drive = subsystem; controller = joystick; addRequirements(drive); } @Override public void execute() { drive.drive(-controller.getRawAxis(1)); } @Override public void end(boolean interrupted) { drive.drive(0); } } ``` #### 3. RobotContainer 管理所有物件、整合 ```java public class RobotContainer { private final Joystick controller = new Joystick(0); private final DriveSubsystem driveSubsystem = new DriveSubsystem(controller); private final DriveCommand driveCommand = new DriveCommand(driveSubsystem); public RobotContainer() { driveSubsystem.setDefaultCommand(driveCommand); } } ``` --- ### 學習 - 初學者:從 Robot.java 與 Joystick 控制開始,理解 class 與 new 的用法。 - 中階者:學習 Command-based 架構,拆解子系統、命令、控制器三者結構。 - 進階者:嘗試加入PID、Parallel Command(同時執行多個命令)等進階架構。 --- #### 常見錯誤與提醒: - NullPointerException 多因為 robotInit() 沒有正確 new - USB 控制器號碼與 Driver Station 不符 - CAN ID 沒設定或線沒接好導致 motor 不動 - 當功能越來越多時,記得把 Subsystem、Command 拆成不同檔案,保持程式整潔 --- ### 官方資源與延伸閱讀 WPILib OOP 架構教學(Command-based) https://docs.wpilib.org/en/stable/docs/software/commandbased/index.html WPILib Java 教學首頁 https://docs.wpilib.org/en/stable/docs/software/basic-programming/index.html FRC Example Projects(完整物件導向) https://github.com/wpilibsuite/allwpilib/tree/main/wpilibNewCommands --- ### <font color="#f50"> ! 都看完了,我要回家 ! </font> ## [好](https://hackmd.io/ACI3uWclSO6rAX9mMNIxcQ)
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up