ベンチトップテストプログラムの作成

プロジェクトを作成する

プロジェクトを作成する

インポート/インクルード

C++

#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>

Java

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;

Kotlin

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 ++のみ)。

 

サンプルロボット変数の定義

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;

Java

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();

Kotlin

 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つのことを行います。

  1. Robotクラスのメンバーとして変数を定義します。
  2. 変数を初期化します。
注:C ++の変数の初期化は、プログラムの下部にある「プライベート」セクションにあります。これは、クラス(ロボット)に対してプライベートであることを意味します。
また、C ++コードは、モーターの安全期限を0.1秒に設定します。(0.1秒ごとにコマンドを入力しないと、ドライブはシャットダウンし、自律に使用されるタイマーを開始します)

ロボットの初期化

 

C++

void RobotInit() {}

Java

 @Override public void robotInit() {}

Kotlin

 override fun robotInit() {}

RobotInitメソッドは、ロボットプログラムの起動時、ただしコンストラクターの後に実行されます。

サンプルプログラムのRobotInitは、LiveWindowインスタンスへのポインターを取得します(これは、以下で説明するテストメソッドで使用されます)。

このメソッドはコードから省略されています。

つまり、デフォルトバージョンが実行されます。(ここで何かを実行したい場合は、上記のコードを提供してデフォルトをオーバーライドできます)

シンプルな自動制御コード

C++

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);
}
}

Java

 @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
}
}

Kotlin

 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秒以上経過した場合、コードはロボットドライブを停止します。

遠隔操作のためのジョイスティック制御

C++

 void TeleopInit() override {}
void TeleopPeriodic() override {
// Drive with arcade style (use right stick) 
m_robotDrive.ArcadeDrive(m_stick.GetY(), m_stick.GetX()); 
}

Java

 @Override
public void teleopInit() {
}
@Override
public void teleopPeriodic() {
m_robotDrive.arcadeDrive(m_stick.getY(), m_stick.getX());
}

Kotlin

 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軸を回転運動にマップします。

テストモード

 

C++

void TestPeriodic() override {}

Java

@Override public void testPeriodic() { }

Kotlin

override fun testPeriodic() {}

テストモードは、ロボット機能のテストに使用されます。TeleopInitと同様に、TestPeriodicが提供されています。

 

次のステップ

次の記事では、このプログラムをRoborRIOで実行する方法を説明します。