Contents
とりあえず第一回として、自律移動ロボットに最低限必要な層を説明します。
この記事の目的
残念ながら、
「この関数一つで自律移動できるんだぜ」
という魔法の関数はありません。
一番近いのはROSだと思うので、詳しくはググってください。
ROSを使おうが使わなかろうが、複数の層の積み重ねでロボットが動くことに変わりはないわけです。基本的には
と、ロボットはいい感じに動きます。
図にするとこんな感じ
(間違いだらけな気がする。オドメトリの結果の行き先とか特におかしい気がするよ。)
各層の詳しい説明はいずれします。今は簡単な説明だけ。
自動ロボットの一番偉い部分です。
移動→ペットボトル投げる→移動→ペットボトル投げる→……
といったように、試合をする上で必要な指示を出す部分のことです。
「移動を指示して、目的の位置に到着したら次の移動先を指示」
のような指示する部分と考えてください。
例えば
『スタートゾーン下のフェンスの位置を原点として、ロボットの中心が(x方向に○mm, y方向に●mm, △rad旋回した状態)にいる』
ことを計算で求めることです。長いので、(x,y,θ)とでもします。
これがわからないということは、CNCフライスの原点出しを間違えているのと同じです。明後日の方向にロボットが進んでいきます。
これ求めるのとても大変です。
外部のセンサや、下で出てくるオドメトリなどで逐次更新します。
ロボットの位置をさっき求めました。行き先はコントローラから指示されています。
さて、「どれくらいの速度v、旋回角速度ωでロボットが動けばいいのでしょうか」
これを決める部分です。遠いから速度は高め?目標地点は真反対だから角速度ωは大きくして一気に旋回?目的地が近いから速度vは小さめ?
のような判断をする部分です。
速度や角速度を決めたなら、それを現実の物理量に変換しないといけません。その準備をします。
タイヤの直径やギヤ比のパラメータから、目的の速度、角速度を実現できるモータの回転数を計算します
まず、駆動輪のモータはエンコーダ付きのものを使いましょう。エンコーダのパルスを読み込んでモータの回転数を計測します。目的の値になるように、PWMを制御してあげれば、狙い通りの回転、つまり狙い通りの速度でロボットを動かすことができるわけです。
この時、エンコーダの回転量からロボットの速度を求めて逐次足し合わせていくことで、ロボットの移動量を求めることができます。これを「オドメトリ」と言います。(図の赤いところ右)
モータの回転量を渡す必要があるので、赤い部分と同じ回路と同じ回路に組み込んだ方がいいと思います。
かなりおおざっぱな説明となりましたが、ここで大事なのは
層(色の違う部分)間のデータの受け渡し内容、受け渡し方法をしっかりと決めて分離しましょう。開発も更新もやりやすくなります。ということ。
下の層から説明していきたいと思います。
エンコーダの読み取り方、モータ制御、オドメトリの計算方法くらいまでは詳しく説明したいです。
偉大なる渡辺先生に感謝