#include <frc/Joystick.h>
#include <frc/PWMVictorSPX.h>
#include <frc/TimedRobot.h>
#include <frc/Timer.h>
#include <frc/drive/DifferentialDrive.h>
#include <frc/livewindow/LiveWindow.h>
import edu.wpi.first.wpilibj.Joystick;
import edu.wpi.first.wpilibj.PWMVictorSPX;
import edu.wpi.first.wpilibj.TimedRobot;
import edu.wpi.first.wpilibj.Timer;
import edu.wpi.first.wpilibj.drive.DifferentialDrive;
import edu.wpi.first.wpilibj.Joystick
import edu.wpi.first.wpilibj.PWMVictorSPX
import edu.wpi.first.wpilibj.TimedRobot
import edu.wpi.first.wpilibj.Timer
import edu.wpi.first.wpilibj.drive.DifferentialDrive
コードは、使用されるWPILibのコンポーネントを参照する必要があります。
C++ではこれは「#include」ステートメントを使用して実行され、Java,Kotlinでは「import」ステートメントを使用して実行されます。
プログラムは、Joystick(コントローラー)、PWMVictorSPX(モーター制御用)、TimedRobot(この例で使用される基本クラス)、タイマー(自律用)、DifferentialDrive(モーターへのジョイスティック制御の接続用)、およびLiveWindowのクラスを参照します(C ++のみ)。
class Robot : public frc::TimedRobot
{
public:
Robot() {
m_robotDrive.SetExpiration(0.1);
m_timer.Start();
}
private:
// Robot drive system
frc::PWMVictorSPX m_left{0};
frc::PWMVictorSPX m_right{1};
frc::DifferentialDrive m_robotDrive{m_left, m_right};
frc::Joystick m_stick{0};
frc::LiveWindow& m_lw = *frc::LiveWindow::GetInstance();
frc::Timer m_timer;
public class Robot extends TimedRobot {
private final DifferentialDrive m_robotDrive = new DifferentialDrive(new PWMVictorSPX(0), new PWMVictorSPX(1));
private final Joystick m_stick = new Joystick(0);
private final Timer m_timer = new Timer();
val m_robotDrive: DifferentialDrive =DifferentialDrive(PWMVictorSPX(0),PWMVictorSPX(1)))
val m_stick:Joystick = Joystick(0)
val m_timer:Timer = Timer()
この例のサンプルロボットには、アーケードドライブ用のUSBポート0にJoystickがあり、PWMポート0および1に2つのモーターがあります。
ここでは、DifferentialDrive(m_robotDrive)、Joystick(m_stick)、time(m_timer)タイプのオブジェクトを作成します。
コードのこのセクションでは、次の3つのことを行います。
void RobotInit() {}
@Override public void robotInit() {}
override fun robotInit() {}
RobotInitメソッドは、ロボットプログラムの起動時、ただしコンストラクターの後に実行されます。
サンプルプログラムのRobotInitは、LiveWindowインスタンスへのポインターを取得します(これは、以下で説明するテストメソッドで使用されます)。
このメソッドはコードから省略されています。
つまり、デフォルトバージョンが実行されます。(ここで何かを実行したい場合は、上記のコードを提供してデフォルトをオーバーライドできます)
void AutonomousInit() override {
m_timer.Reset();
m_timer.Start();
}
void AutonomousPeriodic() override {
// Drive for 2 seconds
if (m_timer.Get() < 2.0) {
// Drive forwards half speed
m_robotDrive.ArcadeDrive(-0.5, 0.0);
} else {
// Stop robot
m_robotDrive.ArcadeDrive(0.0, 0.0);
}
}
@Override
public void autonomousInit() {
m_timer.reset();
m_timer.start();
}
@Override
public void autonomousPeriodic() {
// Drive for 2 seconds
if (m_timer.get() < 2.0) {
m_robotDrive.arcadeDrive(0.5, 0.0); // drive forwards half speed
} else {
m_robotDrive.stopMotor(); // stop robot
}
}
override fun autonomousInit() {
m_timer.reset()
m_timer.start()
}
override fun autonomousPeriodic() {
if(m_timer.get()<2.0){
m_robotDrive.arcadeDrive(0.5,0.0)
}else{
m_robotDrive.stopMotor()
}
}
AutonomousInitメソッドは、ロボットが別のモードから自律モードに移行するたびに1回実行されます。
このプログラムでは、タイマーをリセットしてからこのメソッドで開始します。
AutonomousPeriodicは、ロボットが自律モードにある間、周期ごとに実行されます。
TimedRobotクラスでは、期間は固定時間であり、デフォルトは20ミリ秒です。
この例では、定期的にコードはタイマーが2秒未満であるかどうかを確認し、2秒未満である場合、DifferentialDriveクラスのArcadeDriveメソッドを使用して半分の速度で前進します。
負のY軸の値はスティックを自分から遠ざける(前方)ことに対応するジョイスティックの規則により、値は前方への移動では負になります。
2秒以上経過した場合、コードはロボットドライブを停止します。
void TeleopInit() override {}
void TeleopPeriodic() override {
// Drive with arcade style (use right stick)
m_robotDrive.ArcadeDrive(m_stick.GetY(), m_stick.GetX());
}
@Override
public void teleopInit() {
}
@Override
public void teleopPeriodic() {
m_robotDrive.arcadeDrive(m_stick.getY(), m_stick.getX());
}
override fun teleopInit() {}
override fun teleopPeriodic() {
m_robotDrive.arcadeDrive(m_stick.getY(),m_stick.getY())
}
Autonomousと同様に、TeleopモードにはTeleopInitおよびTeleopPeriodic機能があります。
この例では、TeleopInitで行うことは何もありません。説明のためだけに提供されています。
Teleop Periodicでは、コードはArcadeDriveメソッドを使用して、ジョイスティックのY軸を駆動モーターの前進/後退運動にマップし、X軸を回転運動にマップします。
void TestPeriodic() override {}
@Override public void testPeriodic() { }
override fun testPeriodic() {}
テストモードは、ロボット機能のテストに使用されます。TeleopInitと同様に、TestPeriodicが提供されています。
次の記事では、このプログラムをRoborRIOで実行する方法を説明します。
This website uses cookies.