【世界最大の中高生ロボコン】FRCのプログラムについて~Grabber関係~

この記事は[こちら](https://qiita.com/amidaandhero02/items/59c69d8facd2335f96ce)の記事の一部です。まずはこちらをご覧ください。

##FIRST
最初に。
Grabberっていうのは、ロボットの前に付いてるここの部分です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/281181/998f0ca6-6a00-b3d0-1fb5-1a0835d1dcac.png)
ここでボールとか板を扱います。

前の方の<font Color = "gray">灰色</font>とか後ろの方の<font Color = "green">緑</font>とかのローラーを回してボールを回収&発射します。
![ezgif.com-video-to-gif (1).gif](https://qiita-image-store.s3.amazonaws.com/0/281181/86c20403-877c-d55b-d5d2-2340c67c7635.gif)


実は板には真ん中に穴が空いているのですが、そこに手前の白い棒をはめて鉤爪みたいなのを広げて回収します。
![ezgif.com-video-to-gif.gif](https://qiita-image-store.s3.amazonaws.com/0/281181/0eb99d56-84fd-0374-7de6-80075e94de08.gif)

##このクラスに必要なこと
・直径33cmのボールを回収し、保持、任意のタイミングで発射できる
・板を取ったりつけたりできる
・アーム(上の操作を行う機構)をしまえる
  　　⇒ルール的に最初は閉まっていなければならない&ボールを発射するときに邪魔

##変数
<details><summary><font Color = "Blue">VictorSP</font> rollerMotor </summary><div>
ボールを回収するためのローラー。一つのモーターで全部動くようになってる。
</div></details>

<details><summary><font Color = "Blue">Solenoid</font> barSolenoid</summary><div>
板を回収するときに棒を開くためのもの
[ソレノイド](https://qiita.com/amidaandhero02/items/b26be2c552e8a40192cb#%E3%82%BD%E3%83%AC%E3%83%8E%E3%82%A4%E3%83%89)というのは、電気ではなく空気を使ったモーターみたいなもの
</div></details>

<details><summary><font Color = "Blue">Solenoid</font> armSolenoid</summary><div>
アームをしまうためのもの
</div></details>

<details><summary><font Color = "Blue">boolean</font> is_RollerMoving</summary><div>
ローラーが回っているか。あまり使い所は...
</div></details>

<details><summary><font Color = "Blue">boolean</font> is_retractingArm</summary><div>
アームがしまわれているか。あまり使い所は...
</div></details>


##関数一覧
<details><summary><font Color = "purple"></font>Grabber() 
</summary><div>
引数...
・<font Color = "Blue">VictorSP</font> rollerMotor 
・<font Color = "Blue">Solenoid</font> barSolenoid
・<font Color = "Blue">Solenoid</font> armSolenoid
 
>引数のモーター、ソレノイドをクラスのフィールドに渡す。
</div></details>

<details><summary><font Color = "purple">public void </font> applyState()</summary><div>
引数...
・<font Color = "blue">State</font>state 
 
>Stateから情報を受け取りモーター、ソレノイドに代入する。
</div></details>

<details><summary><font Color = "purple">private void </font> holdCargo()</summary><div>
引数...
なし
 
>ボールを回収する。
</div></details>

<details><summary><font Color = "purple">private void </font> releaseCargo()</summary><div>
引数...
なし
 
>ボールを発射する
</div></details>

<details><summary><font Color = "purple">private void </font> stopRoller()</summary><div>
引数...
なし
 
>ローラーを止める。何も操作されてないときにこうする。
</div></details>

<details><summary><font Color = "purple">private void </font> setRollerSpeed()</summary><div>
引数...
なし
 
>ローラーのスピードを設定する。
ここの処理をコメントアウトすればローラーは動かなくなる。
</div></details>

<details><summary><font Color = "purple">public boolean </font> is_RollerMoving()</summary><div>
引数...
なし

>ローラーが動いているか。
</div></details>

<details><summary><font Color = "purple">private void </font> holdPanel()</summary><div>
引数...
なし
 
>板を回収する
</div></details>

<details><summary><font Color = "purple">private void </font> releasePanel()</summary><div>
引数...
なし
 
>板を設置する
</div></details>

<details><summary><font Color = "purple">private void </font> retractArm()</summary><div>
引数...
なし
 
>アームをしまう
</div></details>

<details><summary><font Color = "purple">private void </font> releaseArm()</summary><div>
引数...
なし
 
>アームを出す
</div></details>

<details><summary><font Color = "purple">public boolean </font> is_retractingArm()</summary><div>
引数...
なし
 
>アームがしまわれているか。
</div></details>

##関数説明
自明なものは省略。
<details><summary>applyState()</summary><div>
まず、アーム関係。
Stateがアームをしまうって言ってたらしまう。
また、クライム(後述)中もしまっておきたいので、しまう。

また、ボールを抱えてアームをしまうとボールが飛び出てしまうので保持するように若干ローラー回してます。

ボール関係。
switchで、Stateの`cargoState`によって処理を分ける。
`kHold`なら`holdCargo()`
`kRelease`なら`releaseCargo()`を呼び出す。

板関係。
Stateがパネルをつかめって言ってたらつかむ。
</div></details>

##LAST
最後に。

ここはDriveとかに比べるとかなり簡単だった。

では。

前の記事⇒[Lift関係](https://qiita.com/amidaandhero02/items/f90c21aab867a3e2b4b2)
次の記事⇒[Climb関係](https://qiita.com/amidaandhero02/items/611ac2392c25917845f1)