センサの値からボールのある角度を求める(理論編)

IF文のプログラムの限界

 IF センサの値に反応したら

 ・・・

Else 反応しなかったら

 ・・・


というプログラムをまずは書いていると思います。ですがこれで制御するうちはどうしても「ガタガタ」動く、という状況ができると思います。



センサーのしきい値の境界で、ロボットが二つの命令を交互に行うような状態になるからです。

これは、制御で言えば、もっとも原始的なON/OFF制御です。

ある程度、思い通りにロボットが動くようになってきたら次の段階に進みましょう。

まずはセンサーの値ですが、IF/ELSEの判定では、どうやっても境界ができるので多少は改善できても根本的なガタガタは治りません。

ではどうしたらいいのでしょうか?

・・・思いつきますか?

隣り合ったボールセンサーの値を比較して、その差からだいたいの位置を割り出し、それを使うという方法が考えられます。

ただ、人間であればなんとなく位置の想像がつきますが、ロボットにどのように位置を伝えたらいいでしょうか。

実はそれを求めることができるとっても便利な「計算式」があります。

それが「三角関数」です。 ※関数というのは何かを求める計算式のことです。

三角関数とは何か

三角関数とは何か、調べてみましょう。

三角関数とは、直角三角形の辺の長さが決まれば、角度が決まる、角度が決まれば辺の長さが決まる、だからそれを求める式を作っておこう、というものです。


例えば、この図でいえば、一番長い辺の長さを1に決めて、一つの角の角度をきめてやれば、横と縦の長さはひとつに決まります。

逆に、縦と横の辺の長さが決まれば、角度がひとつ決まります。

ここまでは分かると思います。分からない人はもう一度読み直してみて下さい。それほど難しいことは何も言っていません。

ここまで理解したとして、ここからが重要なのですが、

記憶しておく必要などなにもなく、30度の時に、それぞれの長さってどうなるんだっけ?覚えておくのは面倒だから記号で書いておいて後で計算しよう、というものが三角関数です。

そして、それぞれ

横の長さ=cos(角度)  ※コサインと読みます。

縦の長さ=sin(角度)  ※サインと読みます。

と書きます。

30度の時の横の長さは 「cos(30度)」です。

昔は三角関数表というものを誰かが作っておいて、それを見ながら値を出していたみたいです。

そして今なら、その計算は面倒だからコンピュータに覚えておいてやらせてしまえばいいのです。だって、誰が計算しても結果は同じなのですから。

センサの値から角度を求める

今回はセンサの値から角度が求めたいです。
ですので、角度から長さを求めるコサインやサインは使えません。

長さから角度を求める式の

角度=arctan(縦の長さ/横の長さ) ※アークタンジェントと読みます。

を使います。

これは、縦の長さを横の長さで割った値(比率)が分かれば角度が決まる、ということを利用します。
計算はコンピュータにやってもらいますので、こちらは、縦の長さと横の長さを測定するだけです。
ではやってみましょう。



このように、二つのセンサの値から、ボールのありそうな角度を求めることができます。
その角度が分かれば、ロボットをどちらに動かせば良いのか、今までは前か横か、しかわからなかったのが、前のほう、横のほうだけではなく、前よりの斜めなのか、横よりの斜めなのか細かく分かるようになります。
これをロボットの動かすための情報として使えば、最初に行ったようなガタガタはなくせるでしょう。

次は、TJ3Bで三角関数をどうやったら使えるのかの実践編を書きたいと思います。


コメント

このブログの人気の投稿

センサー自作のための参考情報

TJ3BでHMC5883L(QMC5883L)を使う方法

TJ3Bにm5stck UnitV AI Cameraをつなぐ(暫定版)