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

プロジェクトを作成する

プロジェクトを作成する

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

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で実行する方法を説明します。