2010年 10月 08日 ( 1 )

プログラムについて

どのようなコードを書けばいいかという具体的なことには触れませんが考え方を説明したいと思います
僕のロボットの基本的な動きを説明します
方位センサーで正面を向いていなければどちらかに回転させ正面を向くようにする
(左側に向いていたら右回転、右側に向いていたら左回転)
正面を向いた時点で
どこにもボールがなければ左右の壁の距離をみながらゴール中央へバックする
右の壁が40センチ以下だったら斜め左へバック
左の壁が40センチ以下だったら斜め右へバック
上記2つを満たしていなければそのままバック
後ろの距離が20センチ以下になったらストップ
ボールがあればある方向へ進む(この後で説明しています)
但し、真後ろにあった場合ボールを避けてバックする(真後ろのセンサーは狭い範囲を見るセンサーがお勧め)
左右の壁の距離を見て距離の大きい側に横移動する(この時はウエイトをおいて移動)
横に移動したらこんどはバックする(ウエイトをおいてバック)
これをdo loopで繰り返します
ボールの検出は10個のセンサー値を比較し、一番高い方向へ行くようにしていました
TJ3で言うところの50%だったらこう動くとかというのではなくどこが一番高い値を示しているのかです
これはプログラムの基本的なところなのでちょこっと説明します
センサーの位置はCN1は前・CN2は右横・CN3は左横・CN4は後ろとします
まずボールの動きを決めておきます
B=0だったらボールなし・B=1だったら前・B=2だったら右横・B=3だったら左横・B=4だったら後ろというように決めておきます
AにCN1のセンサーの値を入れます
そしてCN1だと前にボールがあるということなのでBはB=1にします
つぎにA(CN1の値)とCN2のセンサーの値を比べます
A(CN1の値)よりCN2が高ければA=CN2のセンサーの値としBはB=2にします
つぎにA(CN2の値)とCN3のセンサーの値を比べます
A(CN2の値)の値が高ければそのまま次に行きます
というように繰り返します
最後に残ったAの値が1%以下だったらB=0にします
最終的にBがB=0かB=1かB=2かB=3かB=4で動きが決まります
ここで最初に書いていた外光をプログラムで補正する方法を説明します
最後に残ったAの値が1%以下だったらというところをボールがない状態での外光値より少し高い値を入れます
それで外光値分カットされます(当然ボールの検出は悪くなります)
全体が高い場合はこれでいいですがCNによって値が高い場合はセンサー値を比べるときに値を引いて比べてください
例)IF A<CN2-外光値より少し高い値
これで個別のセンサー値が補正されます
これでもだめな場合がありますねたとえば
どれかのセンサーの外光値が70%以上の値だった場合です
70以下をカットしてしまうとほとんどボールは検出できません
・・で、とんでもない方法をとりました
それは、センサーを絶縁テープとかで覆う方法です(ソフトを直すより手っ取り早い)
後ろの外光が強いのであれば後ろを覆います
横は?・・・横ばっかり行くようであれば覆います
ボールを検出しなければバックというプログラムを入れていればバックするのであとは、前のセンサーに期待しましょう
一番やっかいなのは前です。前に窓があったりする場合は・・・・あきらめましょう
(あきらめるんかい!?って・・・すみません)
その場合は後半にかけます。もし後半のコートがそのようなコートになるのであれば、前半でがんばりましょう
全てのセンサーで高い値が出るのであればもうどうしようもないですね
主催者側と相談し、外光対策をお願いすることも考えないといけないですね

距離センサーで壁なのか相手のロボットなのか判別はできないので左右の距離センサー
の整合性をみていました(結構当たり前のことですね)
両方とも距離が20センチなんていうことはありえないのでどちらかにロボットがいることになります
では、どちら側にロボットがいるのかということになりますね
僕は自分がどちらの方向から移動してきたのかを記憶させ、整合性がなければどちらの方向から
来たのが確認し、左から来たのであれば壁は右側、ロボットは左側にあると処理させていました
正解率は90%くらいでしょうか・・・
プログラムはとっても簡単です。フラグを立てる方法です。
右に移動処理するときは変数CをC=1にします左の移動処理の時はC=0にします
整合性がなかったらそのフラグCが1なのか0なのかで判断します
フラグを立てるというやり方を僕はプログラムの中でよくやっています
たとえば・・・キックをしたあとコンデンサーに電気が溜まるまではキックしないようにするとか
壁があって前に進めないのにフルパワーでモーターを回すと壊れるのでモーターのパワーを落とすとか
do loopで全体のプログラムを回している時の条件の分岐・判断にフラグという考え方はお役立ちアイテムです
プログラムに広がりが出てパズルを組み立てるようにとても面白くなります
[PR]
by apionlego-soccer | 2010-10-08 21:17 | マサ屋の不思議発見