SKY Crew Lab

RoboCup Junior(ロボカップジュニア)参加チーム、SKY Crew(スカイクルー)の技術ブログ。
技術の共有・伝達を目的に、ロボットに関するいろいろな情報やガイドを載せていきます。

2017年大会でRescue Line(レスキューライン) 世界3位、2018年大会でSoccer Lightweight(サッカーライトウェイト) 世界総合5位を獲りました!

カテゴリ: ソフトウェア

篠川です。今回はカメラに関する記事ですが、まず実践的なカメラ導入の注意点を先に説明します。

ちなみにカメラはSKY CrewがRoboCupJunior Soccerに参加すると決めた時から「載せよう」と考えていた、ある種のアイデンティティです。

今までの大会でそれなりにいろいろなノウハウを積んできたので、これからもなんとかこういった記事は出していきたいです。(忙しかったりなんだり、ちょくちょく更新止まるけど許して)

なぜカメラ?

詳しくは約半年前の記事にも書きましたが、 簡単に言えば主に以下の理由からです。

  • 戦略の幅が増える
  • ほかのチームと差がつけられる

当たり前といえば当たり前ですが、ほかのチームと勝つためには、アイデアで差をつける必要があります。

別に特別なことをしなくても、お高い部品を積んで、アウトオブバウンズや故障をせず、きっちりボールを追うなどのことをこなしていれば、関東、日本と勝ち上がることは可能でしょう。

しかし、それだけでよいのでしょうか?

「いいモーターを積んだチームが勝つ」というようなつまらない競技にはしたくないですよね。

しかも、それで仮に日本大会を勝ち上がったとしても、上に行けば行くほどいい部品を積んだロボットは増えてきます。

つまり、(当たり前ですが)誰でもできることだけやっていても、勝てないのです。

どんなロボット競技でもそうですが、結局ものをいうのはアイデアだと私たちは信じています。

そんな方向性のSKY Crewにとって、「敵よけ」「FW・GK入れ替わり」はサッカー参入の時から目指していた夢であり、それらを実現しているのがカメラなのです。

積み方のバリエーション

「さあ、カメラを積もう!」となった時にまず考えるのが、普通に載せる全方位かですよね。

それぞれの特徴や利点などを説明していきます。

1. 普通に載せる(直置き)

  • 全方位ミラーを作るのが大変
  • 最初からいきなり全方位カメラをプログラムすることはリスクが大きい
  • ミラー・周辺部品はそれなりに重い

こういった理由から、Lightweightなら多くの場合は前向き、もしくは後ろ向きにカメラを取り付けることが多いでしょう。

ただし、Openではオレンジボールを認識するために、全方位カメラは必須です。

それからこの場合重要なのが、FW機には前向きGK機には後ろ向きに取り付けることです。(理由は後述)

メリット1. 簡単

簡単であるということは、設計の上で結構大切なポイントです。しっかり動作することを保証するには、やはり複雑にしすぎないことは大切ですよね。

それから、OpenMVの場合Pythonでプログラミングすることになります。

Pythonを使ったことがない場合はその分の学習コストも(そこまで高くはありませんが)必要ですし、バグのリスクもあります。

いきなり全方位を搭載するのはそれなりに大変です。ある程度の慣れ、練習はあってよいでしょう。

メリット2. GKが自陣ゴールとの位置関係を楽に計算できる

全方位ミラーを通して見ると、視界はゆがんでしまします。

しかし、直接カメラを後ろ向きに取り付けると、「ゴールから横に出すぎていないか」「前に出すぎていないか」といった判定がとても手軽にできてしまいます。

全方位でももちろん可能ですが、後方の視界を確保し、安定性を高めるという点で直置きは大変やりやすいです。

メリット3. ゴールがはっきりと、大きく見える

360°ではなく180°のみの視界であり、ミラーのゆがみなどの心配もないことから、カメラにとってはゴールがより大きく、きれいに見えることになります。

2. 全方位カメラ

カメラを真上に向けて、円錐またはドーム状のミラーを取り付けて360°見回せるようにしようというものです。

オープン機はオレンジボールを認識するため、必ず取り付けることになるでしょう。

ミラーの作り方や形状については別記事でゆくゆく解説します。

メリット1. 相手ゴールと自陣ゴールを同時に認識

これの何がうれしいかというと、マルチプルディフェンスを完全に防げるようになります。

割と知名度は低めかもしれませんが、最新ルール(日本語版)には このようなことが書かれています。ご存知でしたか?

マルチプルディフェンスが繰り返された場合、ロボットは故障として扱われます。単一の中断されていないチャンクの間に、3 回以上空いている中立点に移動させられたロボットは、故障したとみなされます。

注:ここでチャンクとは、何らかの理由(例えば、試合の前半が終わったとき、故障したとみなされたとき、またはアウトオブバウンズとなったとき)でロボットが 1 度フィールドから撤去されてから、次にフィールドから撤去されるまでを指します。

長いですが、要するにマルチプルディフェンスに対する罰則が明確に定められているのです。(しかも割と厳しめに)

ちなみにこれは2018年の世界大会になって追加されたルールです。ルール変更はちょくちょくありますから、気を付けましょう。

(逆に言うと、それまではマルチプルディフェンスがどこまで行ったら故障なのか、はっきり定められていませんでした。被害を受けたのが私たちで、2018日本大会の試合中かなり言い合いになってしまったことがあります。)

話を戻すと、このマルチ対策というのが割と難しいんです。距離センサーを後ろ向きに取り付ければ距離は測れますが、自陣ゴールよりも横にずれているときやGK(キーパー)がいるときに問題になります。

しかし、カメラがあれば全く問題が起きません。FWも相手ゴールと同時に自陣ゴールの距離・位置関係までわかるからです。

日本大会においてマルチで危なっかしい思いをしたことが、私たちが全方位にした大きな理由の一つです。

メリット2. 斜めを向いていても対象との位置関係が正確にわかる

このメリットは主にGKに発生します。

先ほど直置きのメリット2.で「自陣ゴールとの位置関係を計算できる」と書きましたが、(ジャイロセンサーを積んでいる限りあまり起きないことですが)何らかの理由でGKが斜めを向いてしまったときに問題が発生します。

ゴールが斜め向きに写るわけです。

これに正しく対処するのはそれなりに面倒です。

しかし、全方位であればミラーは円形ですから、いくら斜めを向いていようと関係ありません。

まあジャイロセンサーで正面を向いてから位置関係を計算すればよい話ですが。

(今回の記事とは関係ありませんが、ジャイロセンサーの記事もゆくゆく書く予定です)

メリット3. FW・GK入れ替えの夢

これを実現するためには、「FWになったら前のゴールを(メインで)見て、GKになったら後ろのゴールを見て」とするわけですから、全方位カメラは必要です。

割とこれは楽しかったですよ。

ちなみにここまで「FW機とGK機に分担する」前提で書いてきましたが、もちろん「両方FW」という戦略もなしではありません。

ただし、ボールの取り合いマルチプルディフェンス、相手のキッカーによるシュートマカオシュートなども考えると、やはりGKも作ったほうが安心ですね。

これも余談ですが、FWとGKの入れ替えは、マカオシュートを使うチームに対して特に有効でした。

マカオシュートを放った直後というのは、たいていスキが生じるものだからです。

最後に、それぞれのカメラに写る様子の写真を貼り付けておきます。

cam1

cam2

設計時に気を付けること

主なものを2つ取り上げます。

向き

カメラの視野は(多分どのカメラも)横長の長方形です。

直置きなら長いほうが水平になるように、全方位ならミラーをちょっと大きめにしてコートの縦の向きに長い辺が来るように置くことで、見える範囲を最大化できます。

視界を隠さない

特に全方位の時ですが、視界を遮るものをできるだけなくしましょう。

不透明なハンドルやフレームによって、カメラの後ろ斜め下が隠れてしまい、GKが自陣ゴールに近づいた時にゴールの下のほうが写らなくなってしまうことがあります。

これは距離を測るときに致命的になるので、注意してください。

試合中に気を付けること

こちらも2つ。

干渉

うっかり相手が青色LEDを使っていたり、見える範囲に黄色い部品をつけていたりすると、それをゴールと認識して突進していくことになってしまいます。

試合が始まる前にしっかりチェックして、干渉しないか時間をとって確かめてください。審判も待ってくれるはずです。

見つけたら指摘して、LEDを切ってもらったり、黒いペンで塗りつぶしてもらったりして対策してもらいましょう。

試合中に気づいた場合も、すぐに審判にコールできます。

ちなみに、白色LEDでも写り方によっては青と認識されることがあります。それはある程度までは認識プログラム側の責任ととられうるので、気をつけてください。

調整

ゴールの形や色合いは、たいていコートによって様々です。

しっかり調整しないと、FWがぐるぐるその場で回りだしたり、GKが自陣ゴールにぶつかりっぱなしになったりします。

各試合前には早めにコートに向かって、調整しましょう。


こんな感じでカメラを搭載したところで、今回の記事は以上です。

今回は余談多めでしたが、最後まで読んでくださりありがとうございます。

今度はプログラマの出番です。画像認識のやり方や全方位ミラーの設計・作成もただ今(本当に)執筆中で、日本大会までに出したいと思っているので、よろしくおねがいします。

こんにちは。SYです。今回は前回の続き、敵よけアルゴリズムについてです。

前回のおさらい

敵よけにはカメラ距離センサなどが不可欠!

ゴール前の敵目の前の敵をそれぞれよける!

ゴールが空いた一瞬を狙ってシュート!

アルゴリズム その1 ~敵よけ編~

敵よけアルゴリズムは4段階に分けられます。

図で表すと、下のような感じになります。

敵よけの説明

距離センサで敵を検知

まず、距離センサで敵がいることを検知する必要があります。

敵は凸凹していて距離センサがきちんと反応しにくいため、一瞬でも近いと検知したら敵がいるとし、一定時間遠いままであれば敵がいないとすることにしました。

回転して敵をよける

一番左の図にあるように、敵がいるとなった場合、最初にゴールがある方向へと前進しながら大きく回転します。

こうすることで、ゴールの方向へと進みつつ、相手の捕捉ゾーンからボールを奪い取ることが可能となります。

横に移動して敵をよける

中央の図にあるように、一定の角度以上回転した場合、ゴールがある側へ斜め方向に動きます。

すでに機体がある程度回転しているため、斜め方向に動くことでゴールに対しほぼ横移動することができ、ボールを捕捉ゾーンに入れたまま敵をよけることができます。

開いた瞬間を狙ってシュート!

一番右の図にあるように、敵がいなくなった場合、ゴールがある方向に向きつつ前進し、ゴールが空いていたらシュートします。

こうすることで、ゴールが空いた一瞬を狙って正確にシュートすることができます。

一つ一つの動きは単純に見えますが、これがあるとないとではボールを取り合うような状況になったときの戦況が大きく変わります。このような敵よけを行うことで、私たちはより高確率でシュートまでたどり着けるようになりました。

アルゴリズム その2 ~シュート編~

シュートするかどうかは、捕捉センサ距離センサカメラの3つを併用して判断しています。

まず大前提として、捕捉センサが反応していて、ボールが捕捉ゾーンに入っている、つまりキッカーで蹴れる位置にボールがあることが必要です。

次に、距離センサによって目の前に敵がいないことを確認します。もし敵がいれば、シュートはせずに先ほどの敵よけを行うことになります。

そして、最も重要なカメラによる判断です。カメラでは、正面の一定の方向がゴールの方向の範囲に含まれていればシュートを打つ、としています。言葉ではわかりづらいのでいくつかの例を挙げて説明します。

敵よけの説明2

黄色の方向が正面の方向、赤色の方向がゴールの見える範囲を表し、○がシュートできる場合、×がシュートできない場合です。

左上ではGKがいるためゴールが斜め方向に見え、前方向にゴールがないためシュートできませんが、右上ではGKがずれているため前方向(黄色)の範囲がゴールの範囲(赤色)に完全に含まれています。

また、左下ではFWがいるためゴールが斜め方向に見えシュートできませんが、右下では敵よけをして自分が斜めを向いているため、相対的にゴールは正面にあり、シュートができると判断されます。

これら3つを組み合わせることで、一瞬を狙った正確なシュートが可能になります。

まとめ

これらのアルゴリズムを組み合わせることで、最初に見せたような敵よけが可能になります。合わさると複雑かもしれませんが、一つ一つの動きは単純なので、そこまで難しくはないと思います。

また、この敵よけもまだ発展途上なため、これからも改善を続けていく予定です。

疑問点や質問、意見等あればブログのコメントにてお願いしますm(_ _)m

では、また次回の記事で!(´∀`)ノシ

こんにちは。SYです。今回は要望の多かった敵よけをどうやって行うかについてです。

敵よけって?

そもそも敵よけとはどのようなものかについては、言葉で長々と説明するよりも実際に見てもらったほうが早いと思うので、関東大会での動画をのせておきますね。

簡単にいうと、ボールを持った時にどのように目の前の敵をよけ、シュートに向かうかということです。

ドリブラーがなくても、敵よけをするだけでシュートが入る確率は格段に変わります。

何が必要か

敵よけをうまく行うために必要なものはいくつかあります。

  • カメラ(全方位か前向き)
  • ジャイロセンサやコンパスセンサ
  • 前向きの距離センサ(超音波センサやPSDセンサなど)
  • ボール捕獲センサ
  • キッカー
  • ドリブラー(なくても全然いい)

関東機では、以下の製品を使用しました。

  • カメラ:OpenMV Cam M7
  • ジャイロセンサ:MPU6050
  • 距離センサ:GP2Y0E03
  • ボール捕獲センサ:NJL7302L-F3 (受光素子)、OSG58A3131A(LED)
  • キッカー用ソレノイド:CB1037100

もちろんLightweightなのでドリブラーをのせるほどの重量の余裕はありませんでしたが、Openの方はドリブラーの併用により、よりスムーズに敵よけが行えると思います。

いかにして敵をよけるのか

認識できる敵には大きく分けて二種類あります。

  • ゴール前に居座っている敵(主にGK)
  • ゴールから離れて自機の前にいる敵(主にFW)

1つ目の敵はカメラで認識し、2つ目の敵は距離センサで認識することで、うまく敵をよけることが可能になります。

また、敵よけの流れを簡単にまとめると次のようになります。

  1. ボールを捕捉エリアに入れる(ボール捕獲センサが必要)
  2. ゴール前の敵を事前によける(カメラが必要)
  3. 自機の前にいる敵をよける(ジャイロセンサ、距離センサが必要)
  4. ゴールが空いたらシュート!(キッカーが必要)

1についてはまた別の記事で、2についてはカメラのアルゴリズムのほうの記事で詳しく話したいと思います。

2での動きは、カメラから送られてきたゴールの方向へとロボットの向きを変えながら前進するだけなので、カメラによるゴールと敵の認識さえできればそこまで難しくありません。

ちなみに、ボールへの回り込みを正確にするために、ボールを持っていないときはジャイロで姿勢制御(真正面を向く)、ボールを持っているときや前方近くにあるときはカメラで姿勢制御(ゴールの方向を向く)、というように状況に応じて使い分けています。

次回へつづく。。。

長くなりそうなので今日はここまで。

今回は、敵よけの流れと概要を紹介しました。

次回は3、4の具体的なアルゴリズムを紹介したいと思います。

お楽しみに!

こんにちは。ソフト担当のSYです。

今回は、以前紹介したエンジェルリングの解説のつづきを話していきたいと思います。

前回のおさらい

エンジェルリングとは
・・・ ラインセンサを隙間なく円形に並べたもの

ラインの位置が正確に分かる!
→→→ 単純なアルゴリズムと動き間違えることなくライン内に戻れる!!

ラインの位置の変化が分かる!
→→→ 外のボールを取りに行くことができる!!

どんなアルゴリズム?

ここでは、実際にどのようなプログラムを書いたかを簡単に説明していきたいと思います。

下記のリンクは世界大会で使ったラインセンサ処理とほぼ同じプログラムの該当部分です。
ラインセンサ処理のソースコード

1.明るさを読み取る

それぞれのラインセンサの値を読み取り、値に応じて白いライン上・緑のコート上・暗い空中のどれなのかを判別します。 具体的には、ライン上(明るい)かどうかとロボットが持ち上げられている(暗い)かどうかを入れたラインセンサの個数分の配列をつくっています。

また、何個が明るく何個が暗いかも計算しています。

2.審判の持ち上げに対応

暗いと判断したセンサが一定個数以上あればロボットが持ち上げられていると判断し、何回か連続で持ち上げられている場合はコート内に戻ったと判断します。 これは押し出しでコート内に戻されたときに対応するためのものです。

3.ライン上のときは・・・

まず、明るいと判断したラインセンサの間隔を調べます。 すると、間隔が最も広い部分の真ん中の方向がコートの方向とわかるので、その方向に行けばコート内に戻れるとわかります。

次に、直前のコートの方向と先ほど計算したコートの方向を比較します。 180度近く変化していた場合、ロボットが半分以上外に出たとわかり、先ほど計算したコートの方向に180度を足したものが正しい現在のコートの方向になります。

また、現在のコートの方向が出た後に、直前のコートの方向との平均を出してコートの方向の急激な変化を抑えています。

4.ライン上でなかったら・・・

ライン上でなく、空中でもない場合は、コート内にいるほぼ完全に外に出たかのどちらかです。 なので、ロボットが半分以上外に出たかどうか=ほぼ完全に外に出たかとなります。 ほぼ完全に外に出たとなった場合は、先ほど計算した現在のコートの方向へ進めばよいということになります。

このようにして、条件分岐もほとんどなく簡単に、アウトオブバウンスを防ぐことができます。

実際のプログラムでは・・・

少し専門的な話になりますので、読み飛ばしてもらっても構いません。 ラインセンサ処理のソースコードをもとに実際のプログラムの説明を行っていきたいと思います。

1.明るさを読み取る

qtyILB は暗いと判断した個数、qtyILW は明るいと判断した個数で、QTY_LINE 回のループでセンサの値を読んでいます。

そして、isLineBlack[] にそれぞれが暗いかどうかの真偽、isLineWhite[] にそれぞれが明るいかどうかの真偽を入れています。

	int qtyILB = 0;
	int qtyILW = 0;
	for(int numLine = 0; numLine < QTY_LINE; numLine ++) {
		//ライン読み取り
		valueLine[numLine] = analogRead(P_LINE[numLine]);
		isLineBlack[numLine] = valueLine[numLine] >= BORDER_BLACK_LINE;
		isLineWhite[numLine] = valueLine[numLine] <= BORDER_WHITE_LINE;
		if(isLineBlack[numLine]) {
			qtyILB ++;
		}
		if(isLineWhite[numLine]) {
			qtyILW ++;
		}
	}

2.審判の持ち上げに対応

countIIA は何回連続で持ち上げられているか、countIIA MAX_CIIA 以上になるとコート内に戻ったと判断し、isOutsideLine isHalfOut dirInside といったラインの方向に関する変数を初期化します。

そして、isLineBlack[] にそれぞれが暗いかどうかの真偽、isLineWhite[] にそれぞれが明るいかどうかの真偽を入れています。

	if(qtyILB >= BORDER_IS_IN_AIR) {
		//持ち上げられている
		countIIA ++;
		if(countIIA >= MAX_CIIA) {
			countIIA = MAX_CIIA;
			isOutsideLine = false;
			isHalfOut = false;
			dirInside = -1;
		}

3.ライン上のときは・・・

まず、posILW[] に何番目のラインセンサがライン上にあるかを入れていき、intvLine[] に連続する2つのposILW[] の差、つまりライン上のラインセンサの間隔の大きさを入れていきます。

	}else {
		//ライン上
		countIIA = 0;
		isOutsideLine = false;
		//白の番号を調べる
		int posILW[qtyILW];
		int numILW = 0;
		for(int numLine = 0; numLine < QTY_LINE; numLine ++) {
			if(isLineWhite[numLine]) {
				posILW[numILW] = numLine;
				numILW ++;
			}
		}
		//白の間隔を調べる
		int intvLine[qtyILW];
		for(int numLine = 0; numLine < qtyILW - 1; numLine ++) {
			intvLine[numLine] = posILW[numLine + 1] - posILW[numLine];
		}
		intvLine[qtyILW - 1] = posILW[0] - posILW[qtyILW - 1] + QTY_LINE;

次に、intvLine[] の値を順々に比べていくことで、どの間隔が一番広いかがわかり、posMaxIntvL に間隔の場所、maxIntvL に間隔の大きさを入れています。これによって、ロボットが戻る方向が計算でき、その結果をdirInside に入れています。

ちなみに、simplifyDeg()は角度を0度~360度に収めるための自作の関数なので気にしないでください。

		//ラインの方向を調べる
		int maxIntvL = 0;
		int posMaxIntvL = 0;
		for(numILW = 0; numILW < qtyILW; numILW ++) {
			if(maxIntvL < intvLine[numILW]) {
				maxIntvL = intvLine[numILW];
				posMaxIntvL = numILW;
			}
		}
		double numDirInside = posILW[posMaxIntvL] + maxIntvL * 0.5;
		dirInside = simplifyDeg(numDirInside / QTY_LINE * 360);

次に、dirInside prvDirInside + 110 prvDirInside + 250 の範囲にあれば半分以上外に出たとわかり、isHalfOut は半分以上外に出ているかどうかを表しています。prvDirInsideには事前に直前のdirInside を入れておきます。

		//前回と比較
		if(prvDirInside >= 0) {
			//半分以上外か
			isHalfOut = false;
			if(insideAngle(dirInside, prvDirInside + 110, prvDirInside + 250)) {
				dirInside = simplifyDeg(dirInside + 180);
				isHalfOut = true;
			}

最後に、誤差等を減らすためにprvDirInsidedirInside の平均値的なものを計算します。

			//平均値計算
			if(abs(dirInside - prvDirInside) <= 180) {
				dirInside = prvDirInside * MULTI_AVG_DI + dirInside * (1 - MULTI_AVG_DI);
			}else {
				dirInside = prvDirInside * MULTI_AVG_DI + dirInside * (1 - MULTI_AVG_DI)
								+ 360 * (dirInside >= prvDirInside ? MULTI_AVG_DI : 1 - MULTI_AVG_DI);
			}
			dirInside = simplifyDeg(dirInside);
		}
	}

4.ライン上でなかったら・・・

countIIA を初期化し、isOutsideLine というライン外かどうかの変数にはisHalfOut という半分以上外に出ているかどうかの変数をそのまま入れます。

dirInside という戻るべき方向を示す変数には、ライン外ならprvDirInside を入れて直前のままにし、ライン内なら-1 を入れて戻るべき方向は存在しないとします。

	}else if(qtyILW <= 2) {
		//ライン上でない
		countIIA = 0;
		isOutsideLine = isHalfOut;
		dirInside = isOutsideLine ? prvDirInside : -1;

以上でプログラムの説明は終わりです。お疲れさまでした( ´∀` )ノ

エンジェルリングのここがよくない...(´・ω・`)

配線が大変

円形上にセンサを配置するため、特にプリント基板の場合は配線をきれいに行うのが難しいです。

重い

センサも多く、センサそれぞれに抵抗をつける必要もある上、円形なので基板自体のサイズも大きいことから、普通より重くなってしまうという欠点があります。

モーターとの物理的干渉を考慮しないといけない

隙間なくセンサを配置する必要があるため、モーターの内側か下にセンサを配置できるような設計が必要です。

まとめ

エンジェルリングはハード的には欠点もいくつかありますが、うまくいけば大変有能な武器になってくれると思います。

何かわかりにくいところや質問があればTwitterの質問箱やブログのコメントにてよろしくお願いしますm(_ _)m

それではさようなら!(´∀`)ノシ

こんにちは。二人目のソフト担当のSYです。ラインセンサや戦略といった全体的なプログラミングをしています。

今回は、SKY Crewの世界大会機の最大の特徴の一つである、円形ラインセンサ(エンジェルリングについて話していきたいと思います。

エンジェルリングを用いることで、絶対にアウトオブバウンスせず(理論上)、さらにラインの外のボールもとれるようになるのです!

エンジェルリングって何?

そもそもエンジェルリングとは、下の写真のようにラインセンサを隙間なく円形に並べ、ライン上では常にどれかしらのラインセンサが反応するようにしたものです。

世界大会では20個のラインセンサ素子と20個のLEDを半径約5㎝の円周上に並べました。

エンジェルリング

何ができるの?

1. ラインの位置が正確に分かる!

まず、エンジェルリングを用いることで、ロボットの向きがどうであろうと、どのような状態でライン上に乗っているかを正確に知ることができます。

下の図1のように、十字状に並べたラインセンサでは(ジャイロなしでは)自分が角にいるかなどはわからず、ラインの位置も大雑把でしかわからないため、アウトオブバウンスしてしまうことがあります。

また、場合分けなども多くなってしまい、動きが複雑になってしまいます。

十字ラインの説明

一方、エンジェルリングでは、下の図2のように線の形や位置を明確に区別することができ、どちらに進めばライン内に戻れるかを間違えることは(おそらく)絶対にありません。

さらに、円形であるのでジャイロセンサや距離センサを使わずとも、単純なアルゴリズムと動きでライン内に戻れます。

エンジェルリングの説明

2. ラインの位置の変化が分かる!

エンジェルリングを使えば、ロボットのどの部分が線の外に出ているのかを連続的に知ることができます。

そして、どのようにラインの位置が変化しているかが分かれば、ラインセンサが反応する間はロボットが完全に外に出ていないと分かるので、その間は外のボールを取りに行くことができるのです。

エンジェルリングの説明2

最後に

後編では、実際にはどのようなプログラムを書いたのか、エンジェルリングの改善点や欠点といったことについて話そうと考えています。

何かわかりにくいところや質問があればTwitterの質問箱やブログのコメントにてよろしくお願いします。

それでは後編をご期待ください!(´∀`)ノシ

↑このページのトップヘ