FTC プログラミング マニュアル
はじめに
このマニュアルについて
プログラミングマニュアルの目的
このプログラミングマニュアルは、まずFTCのロボットプログラミングを始めるに当たって何から始めたら良いのか、何を見たら良いのかを紹介するためのものです。 そのため、基本情報の解説をメインとして作成されています。
FTC プログラミングを始めるために必要な事
FTCにおけるプログラミングは何を行うのか?
FTCにおけるプログラミングは、ゲームで設定されたミッションを達成するためにロボットを制御するためのものです。
たとえば、2023〜2024シーズンでは、「Pixel」を探し、取得し、バックドロップに配置するという動作が求められています。
このような具体的な目標を達成するためにプログラミングを行います。何のためにプログラムを書いているのかを常に意識しながら取り組むことが重要です。
FTCのロボットプログラミングするための3つの方法
FTCロボットのプログラミングを行う方法は3つあります。
- ブロックプログラミング
- Scratchのようなブロックを使用してプログラミングを行う
- OnBot Java
- JavaをFTCのController上で直接Javaを書いてプログラミングを行う
- Android Studio (Java or Kotlin)
- Android Studio(IDE)を使用してプログラミングを行う
各プログラミング手法の詳細は、以下のページを参考にしてください。
Choosing a Programming Tool
このマニュアルでは、Android Studioを使用する前提で、解説を行っていきます。
環境構築
Android Studioを使用したプログラミングを始めるために必要な物
このWikiではAndroid Studioを使ったプログラミングを行う前提で解説をしていきます。
用意する物
- プログラムを書くためのパソコン(Windows,MacBook,LinuxどれでもOK)
- メモリは16GB以上を推奨
- 必要なソフトウェア
- Android Studio
- Git
- Java(JDK)
- プログラムをテストするときに使用するもの
- Driver Hub
- Control Hub
- コントローラー
必要な知識・スキル
- パソコンでタイピング等が出来るスキル
- Java,Kotlinの基本文法の知識
Gitのインストール
1. Gitとは?
Gitは、ファイルの変更履歴を管理するためのツールです。プログラムやドキュメントの変更を追跡し、過去の状態に戻したり、複数人での共同作業を簡単にしたりできます。
- 変更履歴の追跡: ファイルがいつ、誰によって、どのように変更されたかを記録します。
- バージョン管理: 以前のバージョンに戻すことができます。
- 共同作業: 複数の人が同時に作業しても、変更内容を統合して管理できます。
2. GitHubとは?
GitHubは、Gitで管理されたプロジェクトをインターネット上で保存し、共有するためのサービスです。GitHubを使うことで、簡単に他の人とプロジェクトを共有し、共同作業ができます。
- リモートリポジトリ: プロジェクトをオンライン上に保存して他の人と共有します。
- 共同作業: チームメンバーと一緒にプロジェクトを進め、変更内容を確認・統合します。
- 公開・共有: プロジェクトを公開して、他の開発者やユーザーと共有できます。
3. GitとGitHubの違い
- Git: ファイルの変更履歴をローカル(自分のコンピュータ上)で管理するツール。
- GitHub: Gitを使ったプロジェクトをインターネット上で共有・管理するためのサービス。
つまり、Gitはバージョン管理の仕組みで、GitHubはその仕組みをオンラインで活用するための場所です。
Gitのインストール
Gitは以下のウェブサイトからダウンロード出来ます。
https://git-scm.com/
インストールの方法は以下のリンクのウェブサイトを参考にしてください。
【Mac】Gitの環境構築をしよう!の①〜④
【Windows】Gitの環境構築をしよう!の①〜④
Android Studioのインストール
Android Studioのインストール
1.Android Studioのダウンロードサイトに行き、自分のパソコンに対応したものをダウンロードします。
自分のパソコンにあった物をダウンロードしてください
ダウンロードしたファイルを元に、インストールを終え、初回の起動を行うと、SDK(開発に使うツール)のダウンロード画面が出てきますので、ダウンロードを行います。
詳しい手順は以下をご覧下さい。
Android Studio をインストールする - Android Decelopers
ADBコマンドのインストール
Control Hubに接続して、プログラムをデプロイするには2つの方法があります。
1つはUSBで接続する方法で、2つ目はWi-Fiを使用して接続する方法です。
USBは接続するだけなので簡単ですが、ロボットの場合ポートが刺しにくかったり、ロボットとパソコンが離れている可能性があるので、現実的ではありません。
そこで、Wi-Fi経由でのプログラムのデプロイを行います。
そのためには、adbコマンドが実行できる必要があるので、インストールを行います。
Windowsにインストールする方法
以下を参照
Windows10 adbコマンドを実行できるようにする - Qiita
Macにインストールする方法
Home Brewがインストールされているのであれば、以下のコマンドでインストール可能。
brew install --cask android-platform-tools
それ以外の場合は、以下を参照。
MacBookにadbをインストール・使えるようにする方法 - Qiita
プログラムの動かし方
ベースとなるプログラムのダウンロード
GitHubからソースコードをダウンロードする
FTCのロボットをプログラミングするには、ベースとなるプログラムをダウンロードする必要があります。
https://github.com/FIRST-Tech-Challenge/FtcRobotController
プログラムは上記のページで見ることが出来ます。
まず、Android Studioを立ち上げます
立ち上げたら、「Get from VCS」をクリックします。
「Repository URL」で「URL」に上記のGitHubのURLを入力します。
入力出来たら、「Directory」でダウンロード先を指定し、右下の「Clone」をクリックします。
「Trust and Open Project...」と出るので、「Trust Project」をクリックします。
以下の様な画面が表示されたら、ダウンロード完了です。
プロジェクトの構造
Android StudioのUI
Android Studioの画面は上記の様になっています。
① ツールバー:アプリの実行や Android ツールの起動など、さまざまなアクションを実行します。
② ツール ウィンドウ バー: IDE ウィンドウの外側にあるボタンを使用して、個々のツール ウィンドウを展開または折りたたみます。
③ ツール ウィンドウ:プロジェクト管理、検索、バージョン管理などの画面にアクセス出来る。(この場合はプロジェクトのファイル管理画面)
④ エディター ウィンドウ:実際にプログラムを書くためのエディターが表示される。
プロジェクトの構造
プロジェクトは主に「FTC Robot Controller」と「Team Code」フォルダーに分かれています。
ロボットのプログラムを書く際は、「Team Code」に記載を行います。
Android Studioの画面で見ると、以下の様になります。
プログラムは基本的に、TeamCodeフォルダーの中に書いていくことになります。
Kotlinの有効化(任意)
Kotlinでプログラムを書くには、一手間加える必要があります。
まず、rootディレクトリのbuild.gradleを開き
以下の2行を追加します。
buildscript { ext.kotlin_version = '2.0.20' //この行を追加する repositories { mavenCentral() google() } dependencies { classpath 'com.android.tools.build:gradle:7.2.0' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" //この行を追加する } } allprojects { repositories { mavenCentral() google() } } repositories { mavenCentral() }
次に、TeamCodeディレクトリのbuild.gradleを開き、
以下の1行を追加します。
apply from: '../build.common.gradle' apply from: '../build.dependencies.gradle' apply plugin: 'kotlin-android' //この行を追加する android { namespace = 'org.firstinspires.ftc.teamcode' packagingOptions { jniLibs.useLegacyPackaging true } } dependencies { implementation project(':FtcRobotController') annotationProcessor files('lib/OpModeAnnotationProcessor.jar') }
追加出来たら、「Sync Now」をクリックして、エラーが出なければOKです。
最初のプログラム
最初のプログラムを書く
それでは、最初のプログラムを書いてみましょう。
プログラムファイルの作成(Java)
まずは、Team Codeフォルダーに新しいJavaファイルを作成します。
Classを選択し、「Main」という名前で作成します。
ファイルを作成すると、「Gitに追加しますか?」と出てくるので、「Add」を押します。
無事作成出来ると、以下の様なエディター画面が表示されます。
今回はサンプルのファイルを提供するので、以下のコードを貼り付けてください。
GitHub Gistで見るにはこちら
package org.firstinspires.ftc.teamcode;
import com.qualcomm.robotcore.eventloop.opmode.OpMode;
import com.qualcomm.robotcore.eventloop.opmode.TeleOp;
@TeleOp(name = "Main OpMode", group = "Main")
public class Main extends OpMode {
/*
* ドライバーがINITを押した際に、1度だけ実行されます。
*/
@Override
public void init() {
telemetry.addData("Status", "Initialized");
}
/*
* ドライバーがINITを押した後、PLAYを押す前に繰り返し実行するコード
*/
@Override
public void init_loop() {
}
/*
* プログラム開始時に一度だけ実行される
*/
@Override
public void start() {
telemetry.addData("Status", "Started");
}
/*
* Enableの間ずっと実行される
* while (opModeIsActive()) と同じ
*/
@Override
public void loop() {
}
/*
* コードが停止されるときに一度だけ実行される
*/
@Override
public void stop() {
telemetry.addData("Status", "Stopped");
}
}
プログラムファイルの作成 (Kotlin)
まずは、Team Codeフォルダーに新しいKotlinファイルを作成します。
Classを選択し、「Main」という名前で作成します。
ファイルを作成すると、「Gitに追加しますか?」と出てくるので、「Add」を押します。
無事作成出来ると、以下の様なエディター画面が表示されます。
今回はサンプルのファイルを提供するので、以下のコードを貼り付けてください。
GitHub Gistで見るにはこちら
package org.firstinspires.ftc.teamcode
import com.qualcomm.robotcore.eventloop.opmode.OpMode
import com.qualcomm.robotcore.eventloop.opmode.TeleOp
@TeleOp(name = "Main OpMode", group = "Main")
class Main : OpMode() {
/*
* ドライバーがINITを押した際に、1度だけ実行されます。
*/
override fun init() {
telemetry.addData("Status","Initialized")
}
/*
* ドライバーがINITを押した後、PLAYを押す前に繰り返し実行するコード
*/
override fun init_loop() {
}
/*
* プログラム開始時に一度だけ実行される
*/
override fun start() {
telemetry.addData("Status","Started")
}
/*
* Enableの間ずっと実行される
* while (opModeIsActive()) と同じ
*/
override fun loop() {
}
/*
* コードが停止されるときに一度だけ実行される
*/
override fun stop() {
telemetry.addData("Status","Stopped")
}
}
プログラムのデプロイ
Control Hub への接続
プログラムをデプロイするには、Control Hubに接続する必要があります。(Control Hubのセットアップの説明はこちら)
まず、コンピューターのWi-FIの設定を開き、「FTC-xxxx」と書かれたWi-Fiを探します。
パスワードを要求された場合は、「password」を入力します。
次に、Android Studioの左下から「Terminal」を開きます。
Macの場合、以下のような画面が表示されていれば、OKです。
Windowsの場合、以下の様な画面が表示されていれば、OKです。
Wi-Fiに接続した状態で、以下のコマンドを打ち込みます。
adb connect 192.168.43.1
打ち込んだ後、以下の様な表示になったことを確認します。
そうしたら、Android Studioの右上を確認し、「REV Robotics Control Hub v1.0」と表示されていたら接続完了です。
デプロイ
接続が出来たことが確認出来たら、「Team Code」と書かれたところの右側の「再生ボタン」又は「リロードのようなアイコン」をクリックします。
クリックすると、右下に「Gradle Build Running」と表示されるので、完了するまで待ちます。
右下に「Install successfully f」と出たら、インストール完了です。
Control HubとDriver Hubの接続
デプロイしたプログラムを実行するには、Control HubとDriver Hubを接続する必要があります。
まず、Driver Hubの設定を開きます。
Wi-Fiの設定を開き、「FTC-xxx」を探します。
デフォルトの場合のパスワードは「password」なので、入力して接続します。
「Connected」になれば、OKです。
プログラムの実行
デプロイが出来たら、「FTC Driver Station」を起動します。(通常は自動で立ち上がります)
「Robot Connected」となっていることを確認して、「TeleOp」と書かれた右側の三角形を押します。
プログラムが正常にデプロイ出来ていると、「Main OpMode」が出てくるので、タップします。
[](https://wiki.ftc.sakura-tempesta.or.jp/uploads/images/gallery/2024-09/gy0EXfkNRU07qNi2-image-1725191483279-51-15.png
「Main OpMode」と書かれていることを確認して、「INIT」をタップします。
「Status: Initialized」と出ていることを確認します。
スタートボタンを押したら、「Status:Started」となることを確認します。
ストップボタンを押したら、「Status: Robot is stopped」になることを確認します。
一連の流れが確認出来たら、正常にデプロイ出来ている証拠です。
FTCプログラミングー基礎編
プログラムの種類- LinearOpModeとOpMode
FTCのJava(Kotlin)プログラムにおいては、2種類のプログラム構造が存在します。
FTC Japan Wikiでは、基本的にOpModeを使用して解説を行います。
LinearOpMode
シーケンシャルな流れ: LinearOpMode は名前の通り、プログラムの流れが直線的(シーケンシャル)になります。コードは上から下へ順次実行され、ロボットの動作が順序立てて記述されます。
簡単に理解できる: ロボットの動作を順番に記述できるため、プログラムの動作を追いやすく、初学者やシンプルなロボット動作には適しています。
メソッド: runOpMode() メソッド内でロボットの初期化や操作が行われ、opModeIsActive() を使って動作が終了していないことを確認しながら動作を記述します。
OpMode
ループベースの制御: OpMode はイベント駆動型で、繰り返し実行されるループの中でロボットの動作を制御します。FTCアプリによって、init() メソッドで初期化が行われ、その後 loop() メソッドが繰り返し呼び出されます。
柔軟性: ループが継続的に実行されるため、リアルタイムでセンサーの値をチェックしたり、反応する動作をプログラムしたりするのに適しています。
継続的な更新: 操作中にロボットの挙動を継続的に更新し続ける場合に便利です。ゲームパッドからの入力を継続的に監視するような場合に適しています。
プログラムの基本構造
以下はOpModeのサンプルコードです。
主に使用する5個のメソッドが書かれています。
init()
ドライバーがINITボタンを押した際に、1度だけ実行されるメソッド。
主に、モーター等の初期化を行う。
init_loop()
ドライバーがINITボタンを押してから、STARTボタンを押すまでの間0.25秒ごとに実行されるメソッド。
start()
ドライバーがSTARTボタンを押した際に、1度だけ実行されるメソッド。
loop()
ドライバーがSTARTボタンを押してから、STOPボタンを押すまでの間0.25秒ごとに実行されるメソッド。
このメソッド内でコントローラーからの入力を受け取り、モーターなどへ指示出しを行う。
stop()
ドライバーがSTOPボタンを押した際に、1度だけ実行されるメソッド。
プログラムのライフサイクル
プログラムは以下の順序で動作していきます。
モーターに名前をつける
プログラムでモーターを使用する前に、モーターに名前をつける必要があります。
今回は、Control Hubのポート1番にGoBildaの5203イエロージャケットモーターを接続しました。
もし、接続出来ていない場合は、以下の動画を参考にしてください。
FTCプログラミングチュートリアル - ハードウェアのセットアップ
モーターに名前をつける
モーターに名前をつけるには、まずDriverHubを立ち上げます。 立ち上げたら、左上の3点ボタンを押します。
次に「Configure Robot」を押します。
「New」をタップします。
「Control Hub Portal」をクリックします。
今回はControl Hubに刺したので、Control Hubを選択します。
「Motors」をクリックします。
今回使用するモーターはGoBildaの5203モーターなので、「GoBILDA 5202/3/4 series」を選び、「motor」と名前をつけます。
正しく記入が出来たら、「Done」を複数回押し、最後に「Save」を押します。
名前の入力を求められるので、「practice」と入力します。
保存出来たら、「Activate」を押し、左下の戻るボタンを押して、ロボットが再起動するのを待ちます。
モーターを回してみよう
それでは、実際にモーターを回してみましょう。
モーターを回すプログラム
モーターを回すプログラムをステップバイステップで解説していきます。
モーターの定義
まずは、モーターを定義します。
モーターを定義する場所は、以下の場所です。
public class Main extends OpMode {
//ここにモーターの定義を行う
@Override
public void init() {
} ...
}
モーターを定義するには、以下のプログラムを書きます。
// 変数の型 変数の名前
DcMotor motor;
今回使用するモーターはDcMotorなので、DcMotorの型の変数を定義しましたが、Servoなども同様に定義できます。
モーターの初期化
モータの初期化を行います。
初期化は、原則として、initメソッドの中で行います。
//定義した変数名 モーターの型 モーターの名前
motor = hardwareMap.get(DcMotor.class, "motor");
モーターの回転
モーターを回転させるプログラムは、loopメソッドの中に書きます。
モーターに指示を出すPowerは-1から1の範囲で指定します。
//モーターのパワーを0.1(1割)に設定する
motor.setPower(0.1);
書けたらプログラムを実行し、モーターが回転することを確認します。
今回完成したプログラムは以下です。
package org.firstinspires.ftc.teamcode;
import com.qualcomm.robotcore.eventloop.opmode.OpMode;
import com.qualcomm.robotcore.eventloop.opmode.TeleOp;
import com.qualcomm.robotcore.hardware.DcMotor;
@TeleOp(name = "Main OpMode", group = "Main")
public class Main extends OpMode {
//ここにモーターの定義を行う
DcMotor motor;
/*
* ドライバーがINITを押した際に、1度だけ実行されます。
*/
@Override
public void init() {
motor = hardwareMap.get(DcMotor.class, "motor");
telemetry.addData("Status", "Initialized");
}
/*
* ドライバーがINITを押した後、PLAYを押す前に繰り返し実行するコード
*/
@Override
public void init_loop() {
}
/*
* プログラム開始時に一度だけ実行される
*/
@Override
public void start() {
telemetry.addData("Status", "Started");
}
/*
* Enableの間ずっと実行される
* while (opModeIsActive()) と同じ
*/
@Override
public void loop() {
motor.setPower(0.1);
}
/*
* コードが停止されるときに一度だけ実行される
*/
@Override
public void stop() {
telemetry.addData("Status", "Stopped");
}
}
コントローラーの入力を元にモーターの回転速度を変える
前のページでは、モーターを一定のスピードで回しました。
今回は、コントローラーからの入力を元に、スピードが変わる様に改変してみましょう。
コントローラーのボタン
コントローラーは1と2の2つ接続することができ、各ボタンの名称・配置は以下の様になっています。
出典:gm0
今回は、左のスティックの上下(Left Joystick Y)を使いたいと思います。
コントローラーからの入力を受け取る
まずは、コントローラーが正常に接続されていることをDriver Hubから確認しましょう。
今回はA(1)のコントーローラー差し込み口に挿したコントローラーを使うので、User 1が光っていることを確認します。
前回のプログラムを修正する
前回のプログラムでは、以下の様に0.1という値を直にいれていました。
motor.setPower(0.1);
それを、コントローラーからの値に変更します。
motor.setPower(gamepad1.left_stick_y);
コントローラーのスティック(gamepad1.left_stick_y)の値はモーターが期待している-1.0〜1.0を返してくれるので、特に値の変換などはする必要はあります。
プログラムが書けたら、実行してみて、スティックの値に応じてモーターの回転速度が変化すれば、成功です。
今回のプログラム(全体)
package org.firstinspires.ftc.teamcode;
import com.qualcomm.robotcore.eventloop.opmode.OpMode;
import com.qualcomm.robotcore.eventloop.opmode.TeleOp;
import com.qualcomm.robotcore.hardware.DcMotor;
@TeleOp(name = "Main OpMode", group = "Main")
public class Main extends OpMode {
//ここにモーターの定義を行う
DcMotor motor;
/*
* ドライバーがINITを押した際に、1度だけ実行されます。
*/
@Override
public void init() {
motor = hardwareMap.get(DcMotor.class, "motor");
telemetry.addData("Status", "Initialized");
}
/*
* ドライバーがINITを押した後、PLAYを押す前に繰り返し実行するコード
*/
@Override
public void init_loop() {
}
/*
* プログラム開始時に一度だけ実行される
*/
@Override
public void start() {
telemetry.addData("Status", "Started");
}
/*
* Enableの間ずっと実行される
* while (opModeIsActive()) と同じ
*/
@Override
public void loop() {
motor.setPower(gamepad1.left_stick_y);
}
/*
* コードが停止されるときに一度だけ実行される
*/
@Override
public void stop() {
telemetry.addData("Status", "Stopped");
}
}