皆さんこんにちはRevolution_includeのネタ&制御担当の太鼓の暇人(@Taikono_Himazin)です。 
今回もRoboCup Junior Soccer 2017 japan Openに出場したロボットの紹介です。
ロボット紹介(センサー編)

IMG_3427[1]

今回はこのロボットのセンサー類について紹介していきます。

このロボットにはこんなセンサーがついてます。
  • ジャイロ
  • コンパス
  • IRセンサー(赤外線センサー)
  • ラインセンサー
  • 超音波センサー
  • ボールキャッチセンサー
ではセンサーの性質について説明していきます。(あくまで個人の感想です。)
使い方やプログラム上での扱い方についてはまたいつか。

ジャイロセンサー&コンパスセンサー

この二つは原理は全く違いますが、ほとんど同じような働きをするセンサーです。

ジャイロとコンパス


コンパスセンサーは、地球の地磁気を感知して自分が向いている方向を出力するセンサーです。つまり方位磁針です。

北が90°右に見えるから 90°
北が60°左に見えるから -60°(300°)
北が150°左に見えるから -150°(210°)

コンパスセンサーの気持ちになるとこんな感じだと思います。(北を基準にしているかは知らない)


メリット・デメリットは
メリット
  • 地磁気の乱れが少ない状況では高精度
  • 途中で狂わない
  • 処理が軽い(一秒間に取得できる回数が多い)
  • 簡単
  • 小さい
  • ネットに資料がたくさんある。
デメリット
  • 地磁気が乱れていると全くダメ
  • 大電流が流れている物や磁気を帯びている物の近くにおけない(モーターや電源線の近く)


ロボカップの場合一つ目の欠点が大きいです。当日になるまでフィールドの磁気の状況が分からないことが多いので、本番勝負になってしまいます。
2つめは体験談です。なぜか動き始めると向きが無茶苦茶になってしまっていたときがあって、それは電源線が近くに通っていたのが原因でした。(ちなみにスマホも結構なノイズを出しているようで、スマホを近づけても高速回転します。)


一方ジャイロセンサーは、自分の回転や加速度を積分していって現在の自分の向いている方向を出力するセンサーです。積分なんて難しい言葉を使ってみましたけど、つまりは自分がどっちに向いたのかをどんどん足していって今の向いている方向を検出するセンサーということです。
最初 0°
10°左に行ったから 10°
36°右に行ったから -26°(334°)
89°左に行ったから 63°
90°左に行ったから 153°
5°右に行ったから 148°
ジャイロはこんなことを考えていると思います。

ジャイロセンサーのメリット・デメリットは

メリット
  • 会場に全く影響されない
  • 周りに何があろうと関係ない。乗せれば勝ち
デメリット
  • 振動に弱い
  • センサーの検出上限を超えて回転すると狂う(正確に足し算できないから)
  • ドリフトがある(時間がたつと動かなくてもちょっとずつ値がずれていく)
  • 遅い
  • 大きい
  • ネットの資料がやや少ない



コンパスは『繊細な優等生』ジャイロは『じゃじゃ馬だけど頑丈』というイメージです。
誤差の修正が出来るならどこでも使えるジャイロが強いと思いますよ。

今回は会場でコンパスがダメだったときにジャイロで動かせるように、どちらも載せていました。結局公式試合でジャイロは使わず、瀬戸内オープンでだけ使いました。
結局公式戦では使いませんでしたが『じゃじゃ馬』ジャイロセンサーと格闘するのもなかなか楽しいので、ロボカップで何か挑戦しようと思っている人はジャイロセンサーを使ってみるのもいいかもしれませんね。


IRセンサー(赤外線センサ)

このIRセンサーというのは簡単に言うとボールを追うためのセンサーです。
RCJ2017の場合ボールから赤外線が出ているのでそれを見るためのセンサーです。RCJ2018からはopenがオレンジボールになるらしいのでIRセンサーは使えません。あくまで専用のボールを見るためのセンサーです。

使っていたセンサーはTSSP58038です。
F7730382-01[1]
これはなかなか優秀でした。デジタルピンにつないでpulseInで読んであげれば結構いい値が出ます。
IRセンサー

使った基板の裏はこんな感じでした。


僕たちの場合はこんな風に円形に45度ごと配置した8個のセンサーを使ってボールの方向と大体の距離を検出していました。(赤丸がセンサーです)
IRセンサー



どうやってボールの角度を求めるのかというと、僕たちの場合はこんな風に数字をすべて振って
IRセンサー2
それぞれのセンサーの値に三角関数を使ってX軸とY軸上のベクトルに直して、それをすべて足してできたベクトルを合成してボールの方向と距離を求めていました。

まあこんな難しいことをしなくても一番値が大きいセンサーと2番目に値が大きいセンサーの間にボールがあるという求め方をしてもロボカップに必要な精度は出ると思いますよ。

僕たちは8個でやりましたがチームによっては4個というチームもあります。なんと3個というチームもありました。

ラインセンサー

ラインセンサーはロボットの裏側についている部品です。実はこのロボットの電子部品の中で一番大きかったりします。
ラインセンサー

このLEDはすべて一枚基板の上に乗っています。
これは没基板です。
ラインセンサー2

大きさが分かっていただけたでしょうか。大きい故にトラブルが勃発した基板でもあります。
四国ブロック大会の時は半分ぐらいの値が滅茶苦茶で、ライン出まくりでした。Japan openまでに大改修(2日かかりました)をして、ラインから出なくなりました。

使った光センサーはNJL7302L-F3です。 LEDの地面からの反射光の強さでラインを読み取ります。ラインセンサーは地面に近ければいいというわけでもないようです。5mmぐらいの高さがないと明るすぎて値が変わらなくなってしまっていました。


超音波センサー

超音波センサーはざっくり言うと距離センサーです。
このセンサーで超音波を発射して壁に反射して帰ってくるまでの時間が分かるので、それを2で割って音速をかけてあげると距離が出ます。

BlogPaint

このロボットは前後左右に4つ搭載しています。

ここで小ワザを一つ。

このセンサーは元々4ピン(5V,GND,TRIG,ECHO)なのですが
超音波センサー
この写真のようにTRIGとECHOを1kΩぐらいの抵抗でつないで、TRIGをArudinoにつなぐとなんと3ピンで運用できます。やったね、超音波センサーが増えるよ!


その場合のプログラムはこんな感じになります。

#define pin 10
void setup() {
}
void loop() {
pinMode(pin, OUTPUT);//pinをアウトプットモードに
digitalWrite(pin, LOW);
delayMicroseconds(2);
digitalWrite(pin, HIGH);
delayMicroseconds(10);
digitalWrite(pin, LOW);//音を発射
pinMode(pin, INPUT);//pinをインプットモードに
uint16_t Distance=pulseIn(pin, HIGH,10000) / 58;//単位はセンチ
}


pinModeを変えてあげるのがキモですね。(だれか超音波センサーを8個ぐらい付けた超音波まき散らしマシンを作ってくれないかな…)

ただ、超音波センサーは距離を測定するのに時間がかかるのですこし使いづらい感じです。超音波センサー専用のArduinoを用意した方がいいと思います。

ボールキャッチセンサー

ボールキャッチセンサーはドリブラーの下についてる緑色に光っている部品と、その対角線上にある部品です。
BlogPaint
ボールキャッチセンサー


これですね。

光っている方はただのLEDで、光っていない方はラインセンサーと同じ光センサーです。
この間にボールが入ることで、LEDからの光が遮られて光センサーの値が変わるのでそれを検出します。
小さくて単純な機構ですが、これがないとバナナシュートが出来ないので大事な部品です。


まとめ

終盤息切れしてしまいました。スミマセン。余裕があったらまた追記しようかな。
  • センサーの種類は意外と少ないけどそれをうまく扱うことは難しい
  • ジャイロもコンパスもどっちもどっち
  • ラインセンサーは最重要
  • ドリブラーかキッカーを付けるなら、ボールキャッチセンサも必要
  • ボールキャッチセンサの固定方法は設計段階から考えておいた方がいい
  • 超音波センサーはお手軽かつ安いが、遅い
  • IRセンサーはチームによって使い方がバラバラ
なるべく読みやすく書いたつもりなんだけど、読みにくかったらスミマセン。(;^^)ヘ..