- 新增 Command架構
- 新增 讀取Gryo參數Function
- 新增 PID控制器旋轉補償
- 新增 常用公式 => Constrain,Boolean_To_Int etc.
- 新增 PID控制器自動介入及解除
- 修正 常用公式Bug => Boolean_To_Int
- 新增 Timer至PID控制器自動介入及解除
- 新增 搖桿雙重比率控制系統 Google能力很重要!!
FRC Programming Done Right FRC Control System
語言技術:Java Gossip Java程式語言教學 Java Tutorial
package frc.robot;
import edu.wpi.first.wpilibj.TimedRobot;
import edu.wpi.first.wpilibj.Joystick;
import edu.wpi.first.wpilibj.SpeedControllerGroup;
import com.ctre.phoenix.motorcontrol.can.WPI_TalonSRX;
import edu.wpi.first.wpilibj.drive.MecanumDrive;
import edu.wpi.first.wpilibj.Timer;
import edu.wpi.first.wpilibj.VictorSP;
import edu.wpi.first.wpilibj.Solenoid;
public class Robot extends TimedRobot{
private Joystick m_stick;
WPI_TalonSRX lf;
WPI_TalonSRX lr;
WPI_TalonSRX rf;
WPI_TalonSRX rr;
MecanumDrive robot_Drive;
VictorSP lift;
VictorSP arml;
VictorSP armr;
VictorSP intake;
SpeedControllerGroup arm;
Timer m_timer;
Solenoid claw;
public void robotInit()
{
lf = new WPI_TalonSRX(1);
lr = new WPI_TalonSRX(2);
rf = new WPI_TalonSRX(4);
rr = new WPI_TalonSRX(3);
robot_Drive = new MecanumDrive(lf, lr, rf, rr);
m_timer = new Timer();
lift = new VictorSP(6);
arml = new VictorSP(4);
armr = new VictorSP(0);
arml.setInverted(true);
arm = new SpeedControllerGroup(arml, armr);
m_stick = new Joystick(0);
claw = new Solenoid(0);
intake = new VictorSP(1);
}
public void autonomousInit()
{
m_timer.reset();
m_timer.start();
}
public void autonomousPeriodic()
{
}
public void teleopInit()
{
}
public void teleopPeriodic()
{
robot_Drive.driveCartesian(m_stick.getRawAxis(1) * -0.5, m_stick.getRawAxis(0) * 0.5, m_stick.getRawAxis(4) * 0.3);
lift.set(m_stick.getRawAxis(5)*0.5);
if(m_stick.getRawAxis(3) > 0.3)
{
arm.set(m_stick.getRawAxis(3)*0.5);
}
else if(m_stick.getRawAxis(2) > 0.3)
{
arm.set(m_stick.getRawAxis(2) * -0.5);
}
else
{
arm.set(0);
}
if(m_stick.getRawButton(4))
{
claw.set(true);
}
else if(m_stick.getRawButton(1))
{
claw.set(false);
}
if(m_stick.getRawButton(2))
{
intake.set(1);
}
else if(m_stick.getRawButton(3))
{
intake.set(-1);
}
else
{
intake.set(0);
}
}
}
- radio, custom circuits, and IP vision cameras
- encoder
- CAN device
- CAN Talon SRX has been removed from WPILib
- 3rd library
- some code examples
- Phoenix Software
- 已停產
- PWM
- PWM interface
- Brake mode or Coast mode
- 物件導向設計中,物件並不是憑空產生的,您必須先定義您的物件,您要一個規格書,這個規格書稱之為類別(Class)。
- 在Java中使用"class"關鍵字來書寫類別(規格書),您使用類別來定義一個物件(object)時,您考慮這個物件可能擁有的「屬性」(Property,在Java中則是用Field)與「方法」(Method)。屬性是參與物件內部運算的資料成員,而方法則是物件與外界互動的動態操作。
- 您使用類別定義出物件的規格書,之後根據這個規格書來建構物件,然後透過物件所提供的操作介面來與程式互動。
class Vehicle {
private int speed; // Object Variable
private String direction; // Object Variable, direction is a reference to String Object
private static int numVehicle = 0; // Class Variable
public Vehicle() { // Constructor, called when new a Object
this(0,"north"); // call another constructor to do initialization
}//overload
public Vehicle(int s, String dir) { // Another Constructor. Use overloading to define two constructors
float speed; // define a local variable
speed = s; // the speed here refers to the above local variable
this.speed = s; // If we want to set object variable, use this.speed to refer object variable speed
direction = dir; // dir is a reference to object, not the object itself
numVehicle++; // increase the Vehicle number
}
protected void finalize() { // Destructor, called when the object is garbage collected by JVM
System.out.println("finalize has been called");
numVehicle--;
}
void setSpeed(int newSpeed) { // Object Method
this.speed = newSpeed;
}
void setDir(String dir) { // Object Method
this.direction = dir;
}
int getSpeed() { // Object Method
return speed;
}
String getDir() { // Object Method
return direction;
}
public static int totalVehicle() { // Class Method
return numVehicle;
}
}
public class Example {
public static void main(String[] argv) {
Vehicle v1 = new Vehicle(50, "west"); // new 敘述用來產生物件. 物件產生時需要呼叫Constructor來初始化物件
Vehicle v2;
v1.setSpeed(30);
v1.setDir("north");
System.out.println("V1: speed is "+v1.getSpeed()+", direction is "+v1.getDir()+".\n");
v2 = new Vehicle(40, "south");
System.out.println("There are "+Vehicle.totalVehicle()+" Vehicles in the world.\n");
v1 = v2; // let reference v1 point to where v2 is pointing
System.out.println("V1: speed is "+v1.getSpeed()+", direction is "+v1.getDir()+".\n");
System.gc(); // force system to do garbage collection, the object previously pointed by v1 shall be destroyed
System.out.println("There are "+Vehicle.totalVehicle()+" Vehicles in the world.\n");
}
}
- public:可用在class前面表示此class可以供其他package裡的類別使用。同一個目錄下的class均可視為屬於同一個package。 object or class member前面, 表示所有的class均可存取此member。
- private:可用在object or class member前面, 表示只有定義這些member的class才可存取。
- static:可用在member前面。如果member前面有static, 表示該member屬於class,否則屬於object。不論系統創造了多少object,class variable只有一個;而每個object都有其object variable。存取class method的語法是ClassName.classMethod();存取object method時,則必須以reference.objectMethod()來呼叫。在Object Method裡,可用this表示目前的物件。但在Class Method裡就不能存取object member了。
package cc.openhome;
public class Main {
public static void main(String[] args) {
cc.openhome.util.Console.writeLine("Hello World");
}
}
- 原始碼檔案要放置在與package所定義名稱階層相同的資料夾階層
- package所定義名稱與class所定義名稱,會結合而成類別的完全吻合名稱(Fully qualified name)
- 位元碼檔案要放置在與package所定義名稱階層相同的資料夾階層
- 要在套件間可以直接使用的類別或方法(Method)必須宣告為public
package cc.openhome;
import cc.openhome.util.Console;
public class Main {
public static void main(String[] args) {
Console.writeLine("Hello World");
}
}
- break與continue還可以配合標籤使用,例如本來break只會離開for迴圈,設定標籤與區塊,則可以離開整個區塊。
back : {
for(int i = 0; i < 10; i++) {
if(i == 9) {
System.out.println("break");
break back;
}
}
System.out.println("test");
}
BigDecimal a = new BigDecimal("0.1");
BigDecimal b = new BigDecimal("0.1");
System.out.println(a == b); // 顯示false
System.out.println(a.equals(b)); // 顯示true
- 程式中使用a == b,就是在問,a牌子綁的物件是否就是b牌子綁的物件?答案「不是」,也就是false的結果,程式中使用a.equals(b),就是在問,a牌子綁的物件與b牌子綁的物件,實際上內含值是否相同,因為a與b綁的物件,內含值都是"0.1"代表的數值,答案「是」,也就是true的結果。
- 變數或函數從屬於類別(Class),不屬於物件(Object)