在研究FRC組合鍵(Hotkeys)之前,我們先來了解FRC所用來控制的Network Table如何運作。
在地端,我們的主要控制車子馬達的程式使用JAVA,這是因為目前在FRC上跑的處理器確定支援JAVA與C++,然後把JAVA的程式放在車子上的NI roboRIO,然後local的server透過Python程式將Network Tables放入與取出,來告訴JAVA程式用以控制車子。
執行FRC動作控制的JAVA程式如下:
public class swerveControlPID extends CommandBase {
public swerveControlPID(DriveTrain subsystem) {
m_motor_R_LB = new CANSparkMax(Constants.PORT_MOTOR_RA, MotorType.kBrushless);
m_encoder_R_LB = m_motor_R_LB.getEncoder(); // 取得車子的encoder
m_pidController_R_LB = m_motor_R_LB.getPIDController(); // 取得控制權
m_pidController_R_LB.setFeedbackDevice(m_encoder_R_LB); // 透過encoder獲取訊息
}
@Override
public void execute() {
// 從Network Tables取得控制訊息,將控制訊息傳給FRC
double rotations = SmartDashboard.getNumber("Set Rotations R", 0);
m_pidController_R_LB.setReference(rotations, CANSparkMax.ControlType.kPosition);
}
}
然後透過Python程式提供networktables讀取與寫入的library,可以方便取得與寫入Network Tables,
首先 pip install pynetworktables
程式碼如下:
import sys
import time
from networktables import NetworkTables
ip = "xxx.xxx.xxx.xxx"
NetworkTables.initialize(ip)
sd = NetworkTables.getTable("SmartDashboard")
i = 0
while True:
print("time : ", time.time())
sd = NetworkTables.getTable("SmartDashboard")
print("NetworkTables._tables : ", sd.getKeys())
sd.putNumber('Set Velocity D', i)
print(sd.getNumber('Set Velocity D', 0))
i += 1
time.sleep(1)
if i > 100:
i = 100
(以上為夥伴麒麟、岡山高中學生、與成大學生嘉軒提供)
並後續在JAVA程式上寫一連串動作的定義指令,而該指令由Python那頭寫入NetworkTables。