テスト用ドライブベースプログラムの作成 (Java/C++/Python)
すべてをインストールできたら、ロボットプログラムを作成することが出来ます。WPILibには複数のロボットプログラムテンプレートがあります。初心者にはこれらのテンプレートの利用をおすすめしますが、上級者はゼロからロボットのコードを書いても構いません。この記事では、基本のロボットを動かすコードが既に書かれているテンプレートを利用してプログラムを作成していきます。
重要
This guide includes code examples that involve vendor hardware for the convenience of the user. In this document, PWM refers to the motor controller included in the KOP. The CTRE tab references the Talon FX motor controller (Falcon 500 motor), but usage is similar for TalonSRX and VictorSPX. The REV tab references the CAN SPARK MAX controlling a brushless motor, but it's similar for brushed motor. There is an assumption that the user has already installed the required vendordeps and configured the device(s) (update firmware, assign CAN IDs, etc.) according to the manufacturer documentation (CTRE / REV).
新規WPILibプロジェクトの作成 (Java/C++)
Ctrl+Shift+P を押してVisual Studio Codeのコマンドパレットを開きます。そして、出てきたプロンプトに「WPILib」と入力します。そうすると、WPILibのVS Codeコマンドの一覧が出ます。その中から、「Create a new project」を選びます。

すると、「New Project Creator」ウィンドウが表示されます。

New Project Creator ウィンドウのそれぞれの要素の説明は以下です。
Project Type: 作成するプロジェクトの種類。この例では、 Example を選択します。
Language: プロジェクトで利用する言語 (C++またはJava)。
Project Base: これは、プロジェクトを生成するベース・クラスまたはサンプル・プロジェクトを選択するために使用します。この例では、 Getting Started を選びます。
Base Folder: ロボットプロジェクトを配置するフォルダ。
Project Name: プロジェクト名。「Create New Folder」と書かれたチェックボックスを選択した場合は、プロジェクトのフォルダの名前にもなります。
Create a New Folder: 前の項目で指定されたフォルダ内に新しくプロジェクトのフォルダを作るかどうか。チェックされた場合はフォルダを新しく作成し、 されていない場合は 直接配置されます。フォルダが空でなくチェックもされていなかった場合エラーが発生します。
Team Number: プロジェクト用のチーム番号。プロジェクト内のパッケージ名やロボットにデプロイするために利用されます。
Enable Desktop Support: ユニットテストやシミュレーションを行うかどうか。WPILibはこれをサポートしていますが、サードパーティソフトウェアライブラリはそうとは限りません。ライブラリがデスクトップをサポートしていなかった場合、コンパイルが不可能であったりクラッシュしたりする可能性があります。ユニットテストやシミュレーションが必要で、すべてのライブラリがサポートしていない限りチェックするべきではありません。この例では、チェックしません。
上記項目を設定したら、「Generate Project」をクリックします。そうするとロボットのプロジェクトが作成されます。
注釈
プロジェクト作成のエラーは、画面の右下隅に表示されます。
警告
OneDriveのキャッシュがビルドシステムに干渉するため、OneDrive上でのプロジェクトの作成はサポートされていません。Windowsのインストールによっては、デフォルトでOneDriveに「ドキュメント」と「デスクトップ」フォルダが置かれています。
新しいプロジェクトを開く

プロジェクトの作成後、VS Codeは上記のようにプロジェクトを開くかどうかの選択肢を表示します。Yesを選択するか、後ほど Ctrl+K を押してから Ctrl+O を押し(macOSでは単に Command+O ) 、プロジェクトを保存したフォルダを選択します。

はい、作成者を信頼します をクリックしてください。
プロジェクトを開くと、左の方にプロジェクト階層が表示されます。ファイルをダブルクリックするとエディタにてファイルを表示できます。

C++の設定 (C++のみ)
C++プロジェクトでは、IntelliSenseをセットアップしなければなりません。プロジェクトを開くと、右下隅にC++の設定をリフレッシュするかを聞くポップアップが出現します。「はい」をクリックしてIntelliSenseをセットアップします。

新規WPILibプロジェクトの作成 (Python)
robotpy init コマンドを実行すると、新規ロボットプロジェクトが初期化されます:
py -3 -m robotpy init
python3 -m robotpy init
python3 -m robotpy init
そうすると、 robot.py と pyproject.toml ファイルが作成されますが、既存のファイルは上書きされません。
robotpy syncコマンドを実行することで、pyproject.tomlファイルに含まれているプロジェクトの依存関係がダウンロードされ、インストールされます。robot.pyファイルは、Robotクラスを配置する場所です。
基本ドライブベースの例
最初に、PWM制御モーター(SparkMaxなど)を使ったドライブトレインの簡単なコードを示します。
注釈
以下のPythonの例はここから引用しています: https://github.com/robotpy/examples/tree/main/GettingStarted
1// Copyright (c) FIRST and other WPILib contributors.
2// Open Source Software; you can modify and/or share it under the terms of
3// the WPILib BSD license file in the root directory of this project.
4
5package edu.wpi.first.wpilibj.examples.gettingstarted;
6
7import edu.wpi.first.util.sendable.SendableRegistry;
8import edu.wpi.first.wpilibj.TimedRobot;
9import edu.wpi.first.wpilibj.Timer;
10import edu.wpi.first.wpilibj.XboxController;
11import edu.wpi.first.wpilibj.drive.DifferentialDrive;
12import edu.wpi.first.wpilibj.motorcontrol.PWMSparkMax;
13
14/**
15 * The methods in this class are called automatically corresponding to each mode, as described in
16 * the TimedRobot documentation. If you change the name of this class or the package after creating
17 * this project, you must also update the manifest file in the resource directory.
18 */
19public class Robot extends TimedRobot {
20 private final PWMSparkMax m_leftDrive = new PWMSparkMax(0);
21 private final PWMSparkMax m_rightDrive = new PWMSparkMax(1);
22 private final DifferentialDrive m_robotDrive =
23 new DifferentialDrive(m_leftDrive::set, m_rightDrive::set);
24 private final XboxController m_controller = new XboxController(0);
25 private final Timer m_timer = new Timer();
26
27 /** Called once at the beginning of the robot program. */
28 public Robot() {
29 SendableRegistry.addChild(m_robotDrive, m_leftDrive);
30 SendableRegistry.addChild(m_robotDrive, m_rightDrive);
31
32 // We need to invert one side of the drivetrain so that positive voltages
33 // result in both sides moving forward. Depending on how your robot's
34 // gearbox is constructed, you might have to invert the left side instead.
35 m_rightDrive.setInverted(true);
36 }
37
38 /** This function is run once each time the robot enters autonomous mode. */
39 @Override
40 public void autonomousInit() {
41 m_timer.restart();
42 }
43
44 /** This function is called periodically during autonomous. */
45 @Override
46 public void autonomousPeriodic() {
47 // Drive for 2 seconds
48 if (m_timer.get() < 2.0) {
49 // Drive forwards half speed, make sure to turn input squaring off
50 m_robotDrive.arcadeDrive(0.5, 0.0, false);
51 } else {
52 m_robotDrive.stopMotor(); // stop robot
53 }
54 }
55
56 /** This function is called once each time the robot enters teleoperated mode. */
57 @Override
58 public void teleopInit() {}
59
60 /** This function is called periodically during teleoperated mode. */
61 @Override
62 public void teleopPeriodic() {
63 m_robotDrive.arcadeDrive(-m_controller.getLeftY(), -m_controller.getRightX());
64 }
65
66 /** This function is called once each time the robot enters test mode. */
67 @Override
68 public void testInit() {}
69
70 /** This function is called periodically during test mode. */
71 @Override
72 public void testPeriodic() {}
73}
1// Copyright (c) FIRST and other WPILib contributors.
2// Open Source Software; you can modify and/or share it under the terms of
3// the WPILib BSD license file in the root directory of this project.
4
5#include <frc/TimedRobot.h>
6#include <frc/Timer.h>
7#include <frc/XboxController.h>
8#include <frc/drive/DifferentialDrive.h>
9#include <frc/motorcontrol/PWMSparkMax.h>
10
11class Robot : public frc::TimedRobot {
12 public:
13 Robot() {
14 wpi::SendableRegistry::AddChild(&m_robotDrive, &m_left);
15 wpi::SendableRegistry::AddChild(&m_robotDrive, &m_right);
16
17 // We need to invert one side of the drivetrain so that positive voltages
18 // result in both sides moving forward. Depending on how your robot's
19 // gearbox is constructed, you might have to invert the left side instead.
20 m_right.SetInverted(true);
21 m_robotDrive.SetExpiration(100_ms);
22 m_timer.Start();
23 }
24
25 void AutonomousInit() override { m_timer.Restart(); }
26
27 void AutonomousPeriodic() override {
28 // Drive for 2 seconds
29 if (m_timer.Get() < 2_s) {
30 // Drive forwards half speed, make sure to turn input squaring off
31 m_robotDrive.ArcadeDrive(0.5, 0.0, false);
32 } else {
33 // Stop robot
34 m_robotDrive.ArcadeDrive(0.0, 0.0, false);
35 }
36 }
37
38 void TeleopInit() override {}
39
40 void TeleopPeriodic() override {
41 // Drive with arcade style (use right stick to steer)
42 m_robotDrive.ArcadeDrive(-m_controller.GetLeftY(),
43 m_controller.GetRightX());
44 }
45
46 void TestInit() override {}
47
48 void TestPeriodic() override {}
49
50 private:
51 // Robot drive system
52 frc::PWMSparkMax m_left{0};
53 frc::PWMSparkMax m_right{1};
54 frc::DifferentialDrive m_robotDrive{
55 [&](double output) { m_left.Set(output); },
56 [&](double output) { m_right.Set(output); }};
57
58 frc::XboxController m_controller{0};
59 frc::Timer m_timer;
60};
61
62#ifndef RUNNING_FRC_TESTS
63int main() {
64 return frc::StartRobot<Robot>();
65}
66#endif
1#!/usr/bin/env python3
2#
3# Copyright (c) FIRST and other WPILib contributors.
4# Open Source Software; you can modify and/or share it under the terms of
5# the WPILib BSD license file in the root directory of this project.
6#
7
8import wpilib
9import wpilib.drive
10
11
12class MyRobot(wpilib.TimedRobot):
13 def robotInit(self):
14 """
15 This function is called upon program startup and
16 should be used for any initialization code.
17 """
18 self.leftDrive = wpilib.PWMSparkMax(0)
19 self.rightDrive = wpilib.PWMSparkMax(1)
20 self.robotDrive = wpilib.drive.DifferentialDrive(
21 self.leftDrive, self.rightDrive
22 )
23 self.controller = wpilib.XboxController(0)
24 self.timer = wpilib.Timer()
25
26 # We need to invert one side of the drivetrain so that positive voltages
27 # result in both sides moving forward. Depending on how your robot's
28 # gearbox is constructed, you might have to invert the left side instead.
29 self.rightDrive.setInverted(True)
30
31 def autonomousInit(self):
32 """This function is run once each time the robot enters autonomous mode."""
33 self.timer.restart()
34
35 def autonomousPeriodic(self):
36 """This function is called periodically during autonomous."""
37
38 # Drive for two seconds
39 if self.timer.get() < 2.0:
40 # Drive forwards half speed, make sure to turn input squaring off
41 self.robotDrive.arcadeDrive(0.5, 0, squareInputs=False)
42 else:
43 self.robotDrive.stopMotor() # Stop robot
44
45 def teleopInit(self):
46 """This function is called once each time the robot enters teleoperated mode."""
47
48 def teleopPeriodic(self):
49 """This function is called periodically during teleoperated mode."""
50 self.robotDrive.arcadeDrive(
51 -self.controller.getLeftY(), -self.controller.getRightX()
52 )
53
54 def testInit(self):
55 """This function is called once each time the robot enters test mode."""
56
57 def testPeriodic(self):
58 """This function is called periodically during test mode."""
59
60
61if __name__ == "__main__":
62 wpilib.run(MyRobot)
では、コードの色々な部分を見てみましょう。
Imports/Includes
1import edu.wpi.first.util.sendable.SendableRegistry;
2import edu.wpi.first.wpilibj.TimedRobot;
3import edu.wpi.first.wpilibj.Timer;
4import edu.wpi.first.wpilibj.XboxController;
5import edu.wpi.first.wpilibj.drive.DifferentialDrive;
6import edu.wpi.first.wpilibj.motorcontrol.PWMSparkMax;
5#include <frc/TimedRobot.h>
6#include <frc/Timer.h>
7#include <frc/XboxController.h>
8#include <frc/drive/DifferentialDrive.h>
9#include <frc/motorcontrol/PWMSparkMax.h>
8import wpilib
9import wpilib.drive
import edu.wpi.first.wpilibj.TimedRobot;
import edu.wpi.first.wpilibj.Timer;
import edu.wpi.first.wpilibj.XboxController;
import edu.wpi.first.wpilibj.drive.DifferentialDrive;
import com.ctre.phoenix6.hardware.TalonFX;
#include <frc/TimedRobot.h>
#include <frc/Timer.h>
#include <frc/XboxController.h>
#include <frc/drive/DifferentialDrive.h>
#include <ctre/phoenix6/TalonFX.hpp>
import wpilib # Used to get the joysticks
import wpilib.drive # Used for the DifferentialDrive class
import phoenix6 # CTRE library
import com.revrobotics.CANSparkMax;
import com.revrobotics.CANSparkLowLevel.MotorType;
import edu.wpi.first.wpilibj.TimedRobot;
import edu.wpi.first.wpilibj.Timer;
import edu.wpi.first.wpilibj.XboxController;
import edu.wpi.first.wpilibj.drive.DifferentialDrive;
#include <frc/TimedRobot.h>
#include <frc/Timer.h>
#include <frc/XboxController.h>
#include <frc/drive/DifferentialDrive.h>
#include <frc/motorcontrol/PWMSparkMax.h>
#include <rev/CANSparkMax.h>
import wpilib # Used to get the joysticks
import wpilib.drive # Used for the DifferentialDrive class
import rev # REV library
import edu.wpi.first.wpilibj.TimedRobot;
import edu.wpi.first.wpilibj.Timer;
import edu.wpi.first.wpilibj.XboxController;
import edu.wpi.first.wpilibj.drive.DifferentialDrive;
import com.ctre.phoenix.motorcontrol.can.WPI_TalonSRX;
#include <frc/TimedRobot.h>
#include <frc/Timer.h>
#include <frc/XboxController.h>
#include <frc/drive/DifferentialDrive.h>
#include <ctre/phoenix/motorcontrol/can/WPI_TalonSRX.h>
import wpilib # Used to get the joysticks
import wpilib.drive # Used for the DifferentialDrive class
import ctre # CTRE library
Our code needs to reference the components of WPILib that are used. In C++ this is accomplished using #include statements; in Java and Python it is done with import statements. The program references classes for XBoxController (for driving), PWMSparkMax / TalonFX / CANSparkMax / WPI_TalonSRX (for controlling motors), TimedRobot (the base class used for the example), Timer (used for autonomous), and DifferentialDrive (for connecting the Xbox controller to the motors).
サンプルロボット用の変数の定義
19public class Robot extends TimedRobot {
20 private final PWMSparkMax m_leftDrive = new PWMSparkMax(0);
21 private final PWMSparkMax m_rightDrive = new PWMSparkMax(1);
22 private final DifferentialDrive m_robotDrive =
23 new DifferentialDrive(m_leftDrive::set, m_rightDrive::set);
24 private final XboxController m_controller = new XboxController(0);
25 private final Timer m_timer = new Timer();
50 private:
51 // Robot drive system
52 frc::PWMSparkMax m_left{0};
53 frc::PWMSparkMax m_right{1};
54 frc::DifferentialDrive m_robotDrive{
55 [&](double output) { m_left.Set(output); },
56 [&](double output) { m_right.Set(output); }};
57
58 frc::XboxController m_controller{0};
59 frc::Timer m_timer;
60};
12class MyRobot(wpilib.TimedRobot):
13 def robotInit(self):
14 """
15 This function is called upon program startup and
16 should be used for any initialization code.
17 """
18 self.leftDrive = wpilib.PWMSparkMax(0)
19 self.rightDrive = wpilib.PWMSparkMax(1)
20 self.robotDrive = wpilib.drive.DifferentialDrive(
21 self.leftDrive, self.rightDrive
22 )
23 self.controller = wpilib.XboxController(0)
24 self.timer = wpilib.Timer()
25
26 # We need to invert one side of the drivetrain so that positive voltages
27 # result in both sides moving forward. Depending on how your robot's
28 # gearbox is constructed, you might have to invert the left side instead.
29 self.rightDrive.setInverted(True)
public class Robot extends TimedRobot {
private final TalonFX m_leftDrive = new TalonFX(1);
private final TalonFX m_rightDrive = new TalonFX(2);
private final DifferentialDrive m_robotDrive =
new DifferentialDrive(m_leftDrive::set, m_rightDrive::set);
private final XboxController m_controller = new XboxController(0);
private final Timer m_timer = new Timer();
12 public:
13 Robot() {
17 // We need to invert one side of the drivetrain so that positive voltages
18 // result in both sides moving forward. Depending on how your robot's
19 // gearbox is constructed, you might have to invert the left side instead.
20 m_right.SetInverted(true);
21 m_robotDrive.SetExpiration(100_ms);
22 m_timer.Start();
23 }
private:
// Robot drive system
ctre::phoenix6::hardware::TalonFX m_left{1};
ctre::phoenix6::hardware::TalonFX m_right{2};
frc::DifferentialDrive m_robotDrive{
[&](double output) { m_left.Set(output); },
[&](double output) { m_right.Set(output); }};
frc::XboxController m_controller{0};
frc::Timer m_timer;
class MyRobot(wpilib.TimedRobot):
def robotInit(self):
"""
This function is called upon program startup and
should be used for any initialization code.
"""
self.leftDrive = phoenix6.hardware.TalonFX(1)
self.rightDrive = phoenix6.hardware.TalonFX(2)
self.robotDrive = wpilib.drive.DifferentialDrive(
self.leftDrive, self.rightDrive
)
self.controller = wpilib.XboxController(0)
self.timer = wpilib.Timer()
# We need to invert one side of the drivetrain so that positive voltages
# result in both sides moving forward. Depending on how your robot's
# gearbox is constructed, you might have to invert the left side instead.
self.rightDrive.setInverted(True)
public class Robot extends TimedRobot {
private final CANSparkMax m_leftDrive = new CANSparkMax(1, MotorType.kBrushless);
private final CANSparkMax m_rightDrive = new CANSparkMax(2, MotorType.kBrushless);
private final DifferentialDrive m_robotDrive =
new DifferentialDrive(m_leftDrive::set, m_rightDrive::set);
private final XboxController m_controller = new XboxController(0);
private final Timer m_timer = new Timer();
12 public:
13 Robot() {
17 // We need to invert one side of the drivetrain so that positive voltages
18 // result in both sides moving forward. Depending on how your robot's
19 // gearbox is constructed, you might have to invert the left side instead.
20 m_right.SetInverted(true);
21 m_robotDrive.SetExpiration(100_ms);
22 m_timer.Start();
23 }
private:
// Robot drive system
rev::CANSparkMax m_left{1, rev::CANSparkMax::MotorType::kBrushless};
rev::CANSparkMax m_right{2, rev::CANSparkMax::MotorType::kBrushless};
frc::DifferentialDrive m_robotDrive{
[&](double output) { m_left.Set(output); },
[&](double output) { m_right.Set(output); }};
frc::XboxController m_controller{0};
frc::Timer m_timer;
13class MyRobot(wpilib.TimedRobot):
14 def robotInit(self):
15 """
16 This function is called upon program startup and
17 should be used for any initialization code.
18 """
19 self.leftDrive = rev.CANSparkMax(1, rev.CANSparkMax.MotorType.kBrushless)
20 self.rightDrive = rev.CANSparkMax(2, rev.CANSparkMax.MotorType.kBrushless)
21 self.robotDrive = wpilib.drive.DifferentialDrive(
22 self.leftDrive, self.rightDrive
23 )
24 self.controller = wpilib.XboxController(0)
25 self.timer = wpilib.Timer()
26
27 # We need to invert one side of the drivetrain so that positive voltages
28 # result in both sides moving forward. Depending on how your robot's
29 # gearbox is constructed, you might have to invert the left side instead.
30 self.rightDrive.setInverted(True)
public class Robot extends TimedRobot {
private final WPI_TalonSRX m_leftDrive = new WPI_TalonSRX(1);
private final WPI_TalonSRX m_rightDrive = new WPI_TalonSRX(2);
private final DifferentialDrive m_robotDrive = new DifferentialDrive(m_leftDrive1::set, m_rightDrive2::set);
private final XboxController m_controller = new XboxController(0);
private final Timer m_timer = new Timer();
12 public:
13 Robot() {
17 // We need to invert one side of the drivetrain so that positive voltages
18 // result in both sides moving forward. Depending on how your robot's
19 // gearbox is constructed, you might have to invert the left side instead.
20 m_right.SetInverted(true);
21 m_robotDrive.SetExpiration(100_ms);
22 m_timer.Start();
23 }
private:
// Robot drive system
ctre::phoenix::motorcontrol::can::WPI_TalonSRX m_left{1};
ctre::phoenix::motorcontrol::can::WPI_TalonSRX m_right{2};
frc::DifferentialDrive m_robotDrive{
[&](double output) { m_left.Set(output); },
[&](double output) { m_right.Set(output); }};
frc::XboxController m_controller{0};
frc::Timer m_timer;
13class MyRobot(wpilib.TimedRobot):
14 def robotInit(self):
15 """
16 This function is called upon program startup and
17 should be used for any initialization code.
18 """
19 self.leftDrive = ctre.WPI_TalonFX(1)
20 self.rightDrive = ctre.WPI_TalonFX(2)
21 self.robotDrive = wpilib.drive.DifferentialDrive(
22 self.leftDrive, self.rightDrive
23 )
24 self.controller = wpilib.XboxController(0)
25 self.timer = wpilib.Timer()
26
27 # We need to invert one side of the drivetrain so that positive voltages
28 # result in both sides moving forward. Depending on how your robot's
29 # gearbox is constructed, you might have to invert the left side instead.
30 self.rightDrive.setInverted(True)
The sample robot in our examples will have an Xbox Controller on USB port 0 for arcade drive and two motors on PWM ports 0 and 1 (Vendor examples use CAN with IDs 1 and 2). Here we create objects of type DifferentialDrive (m_robotDrive), XboxController (m_controller) and Timer (m_timer). This section of the code does three things:
Robotクラスのメンバとして、変数を定義します。
変数を初期化します。
注釈
C++の変数初期化はプログラム下部の private セクションで行われています。これは、クラス(Robot)でプライベートであるということです。C++コードでは、モーター安全期限を0.1秒に設定し(0.1秒以上命令がないとドライブベースは停止します)、自動制御用に Timer を開始しています。
ロボットの初期化
27 /** Called once at the beginning of the robot program. */
28 public Robot() {
29 // We need to invert one side of the drivetrain so that positive voltages
30 // result in both sides moving forward. Depending on how your robot's
31 // gearbox is constructed, you might have to invert the left side instead.
32 m_rightDrive.setInverted(true);
33 }
12 public:
13 Robot() {
14 // We need to invert one side of the drivetrain so that positive voltages
15 // result in both sides moving forward. Depending on how your robot's
16 // gearbox is constructed, you might have to invert the left side instead.
17 m_right.SetInverted(true);
18 m_robotDrive.SetExpiration(100_ms);
19 m_timer.Start();
20 }
def robotInit(self):
The Robot constructor for our sample program inverts the right side of the drivetrain. Depending on your drive setup, you might need to invert the left side instead.
シンプルなAutonomousの例
38 /** This function is run once each time the robot enters autonomous mode. */
39 @Override
40 public void autonomousInit() {
41 m_timer.restart();
42 }
43
44 /** This function is called periodically during autonomous. */
45 @Override
46 public void autonomousPeriodic() {
47 // Drive for 2 seconds
48 if (m_timer.get() < 2.0) {
49 // Drive forwards half speed, make sure to turn input squaring off
50 m_robotDrive.arcadeDrive(0.5, 0.0, false);
51 } else {
52 m_robotDrive.stopMotor(); // stop robot
53 }
54 }
25 void AutonomousInit() override { m_timer.Restart(); }
26
27 void AutonomousPeriodic() override {
28 // Drive for 2 seconds
29 if (m_timer.Get() < 2_s) {
30 // Drive forwards half speed, make sure to turn input squaring off
31 m_robotDrive.ArcadeDrive(0.5, 0.0, false);
32 } else {
33 // Stop robot
34 m_robotDrive.ArcadeDrive(0.0, 0.0, false);
35 }
36 }
31 def autonomousInit(self):
32 """This function is run once each time the robot enters autonomous mode."""
33 self.timer.restart()
34
35 def autonomousPeriodic(self):
36 """This function is called periodically during autonomous."""
37
38 # Drive for two seconds
39 if self.timer.get() < 2.0:
40 # Drive forwards half speed, make sure to turn input squaring off
41 self.robotDrive.arcadeDrive(0.5, 0, squareInputs=False)
42 else:
43 self.robotDrive.stopMotor() # Stop robot
AutonomousInit メソッドは別のモードからAutonomousモードに変化した瞬間に実行されます。このプログラムでは、 Timer をリスタートしています。
AutonomousPeriodic はロボットがAutonomousモードの間、特定の間隔で何回も実行されます。 TimedRobot クラスでは間隔は一定で、デフォルトで20msです。この例では、タイマーが2秒以下であるかをチェックし、もしそうなら DifferentialDrive クラスの ArcadeDrive メソッドを用いて半分のスピードで前進します。2秒経過したら、ロボットの動きを止めます。
Teleopでのジョイスティック操作
56 /** This function is called once each time the robot enters teleoperated mode. */
57 @Override
58 public void teleopInit() {}
59
60 /** This function is called periodically during teleoperated mode. */
61 @Override
62 public void teleopPeriodic() {
63 m_robotDrive.arcadeDrive(-m_controller.getLeftY(), -m_controller.getRightX());
64 }
38 void TeleopInit() override {}
39
40 void TeleopPeriodic() override {
41 // Drive with arcade style (use right stick to steer)
42 m_robotDrive.ArcadeDrive(-m_controller.GetLeftY(),
43 m_controller.GetRightX());
44 }
45 def teleopInit(self):
46 """This function is called once each time the robot enters teleoperated mode."""
47
48 def teleopPeriodic(self):
49 """This function is called periodically during teleoperated mode."""
50 self.robotDrive.arcadeDrive(
51 -self.controller.getLeftY(), -self.controller.getRightX()
52 )
Like in Autonomous, the Teleop mode has a TeleopInit and TeleopPeriodic function. In this example we don't have anything to do in TeleopInit, it is provided for illustration purposes only. In TeleopPeriodic, the code uses the ArcadeDrive method to map the Y-axis of the left thumbstick of the XBoxController to forward/back motion of the drive motors and the X-axis to turning motion.
テストモード
66 /** This function is called once each time the robot enters test mode. */
67 @Override
68 public void testInit() {}
69
70 /** This function is called periodically during test mode. */
71 @Override
72 public void testPeriodic() {}
73}
45 void TestInit() override {}
46
47 void TestPeriodic() override {}
54 def testInit(self):
55 """This function is called once each time the robot enters test mode."""
56
57 def testPeriodic(self):
58 """This function is called periodically during test mode."""
Testモードはロボットの機能のテストのために使われます。 TeleopInit と同様に、 TestInit や TestPeriodic は説明のために記述されています。