そのようなわけで、移動ロボットの代表例として、車輪移動の基礎を学びます。
以下では単純で代表的な2種類のロボット形態を示します。
この方式が広く使われているのは、
ロボットの制御は両輪の回転で行います。
右の図で一番上は、基本的な構成です。後輪2輪は車体を支えるためだけに自由に回るように取り付け、前輪の方向(ψ)を決めて、車輪を回転させて移動します。ただし、この場合、駆動機構をコンパクトに納めるのがたいへんなので、前輪の回転は自由に、後輪の一方を駆動輪にする場合もあります。
駆動のアンバランスを避けるためには、ディファレンシャルギアを搭載して両輪を駆動しますが、移動ロボットでそこまでやることはあまりみられません。
旋回中心は後輪の軸と前輪の軸が交わったところにできます。
二つ目は2輪にしてしまった構成です。数学的には、3輪と解釈されるよりも、この2輪モデルがよく使われるようです。
三つ目の図はよくある自動車の構成です。4輪にして前輪2個に操舵機構を設けます。
ここで注意することは、すべての車輪の軸が旋回中心で交わるために、前輪の操舵角が左右で異なることです。
内側の車輪がよりきつく曲がります。こうしないと滑りが発生するわけです。
そのため、自動車の場合は特殊なリンク機構(アッカーマンステアリング機構)などでこの関係が成り立つようにします。
また、向きは同じですが、この状態では後輪は左右で回転数が異なります。
内側に比べて外側の車輪が多く回転する必要があります。
ロボットならモータを独立につけることもありますが、自動車の場合にはエンジンは一個なので(電気自動車は別)、ディファレンシャルギア(デフ)でその回転数差を作り出します。デフは「入力の角速度×2=右の角速度+左の角速度」となる機構で、平均速度はそのままに差を作り出します。
もちろん、前輪駆動の場合も左右に回転数差があるので、デフは必要です
(蛇足:4輪駆動だと、前後各々の平均の間にも差があるので前後間にセンターデフが必要)
ロボットを外部の座標系で見た場合は
一つ目の例では両輪を同じ速度で加減速させています。
両輪に速度差がないので、真っ直ぐに走ります(旋回半径は無限大)。
参考:
ロボットの操作量は、一般に車輪の回転速度です。
トルクや位置制御をする場合もありますが、とりあえず速度で解析します(位置の場合は自己位置推定で詳述)。
左右各々の車輪の回転角度をφR、φLとすると、車輪の接地点での速度vR, vLは、車輪の半径をrとして
で得られます。
ここで、旋回中心回りの運動を考えます。
ロボットの旋回角速度をω、ロボット中心の速度をv、旋回半径をρとすると、
一方、中心から車輪までの距離をdとすると、それぞれの車輪の旋回半径はdだけ増減するため、
となります。この式を解いて
が得られます(ただしρの正方向は進行方向左、右に中心がある場合は負になる)。
vR=vL、両輪が同じ速度で回転する場合は旋回半径ρが無限大となります。
となり、ロボットの運動が両輪の回転角速度をもとに記述できることが確認できました。
上の数式を元に&次にやる自己位置推定の計算手法をもとに、ロボットの動きを画像・映像にしてみました。
図中、オレンジおよび黄色の矢印は車輪の速度、車輪についた赤の三角は車輪の回転を確認するための目印です。車体中央にあったり、そこから延びる赤紫の小円と棒はその時点での旋回中心、回転半径を示しています(ただし、半径無限大のときは半径0表示)。
二つ目の例では左右に一定の比率の速度差をつけています。
具体的には、右は左の約3倍(10:3)の速度です(後半は逆に1:2)。
上の回転半径の式より、d(10+3)/(10-3)でだいたい2dくらいになります。
また、速度比が一定なので、中心位置は変わりません。
映像だけの三つ目では、より複雑に車輪を加減速しています。
旋回半径が伸び縮みすることが見えますし、左右が逆回転する際には両輪の間に入っています。
このように小回りや複雑な運動をしやすいことが対向2輪型の特徴です。
映像のパラメータ
車輪径(2r) 100mm 車輪間隔(2d) 190mm 数値解析間隔 1/30秒 床面格子間隔 200mm
※ワールド系:カメラをワールド座標に固定。ロボット追跡系:ロボットの位置を基準に移動カメラを設置、ただしカメラの姿勢は固定。
(a) 車両の移動 |
(b) 円弧に近似 |
(c) 座標の移動 |
車両の運動は上述の通り、
時間Δtの間の移動を右図に示します。
左右の車輪の周速度をvL, vRとし、ロボット中心の移動速度をvとします。これら関係は上の通りです。
次に、図(b)に示すように、時間Δtで左右の車輪およびロボット中心がそれぞれΔLL、ΔLR、ΔL 移動したとします。
次に移動量を算出します。ロボットの位置、姿勢を制御周期iのときに xi,yi,θi、次の周期でxi+1, yi+1, θi+1 と表記します。
以上の演算を時々刻々と重ねていけば、ロボットの車輪の回転角度を測定すれば、ロボットの位置と姿勢を得ることができます。
この手法をデッドレコニングと呼びます(オドメトリなど他表記あり)。
※このページの映像は、車輪の左右の回転を決めて、本手法で位置を算出しています。
表計算ソフト(OpenOffice)上で時系列で生成した座標をCGモデルに反映させて映像化しています。
および
で表されます。
これを積分すれば x,y,θが得られますが、実在のロボットでは積分はできません。
積分は微少時間を扱うことが前提です。
またロボットを制御するプログラムは一般に一定の時間間隔で車輪の回転センサなどの情報を読み取り、モータを制御します。
CPUは複数のことを同時にはできないため、入力→演算→出力という処理を繰り返すためです。
そこで、積分する代わりに、この制御の1サイクルの時間Δtの間の運動を考えます。
なお、このΔtを制御周期と呼びます。またそのΔtの間の処理区間そのものも制御周期と呼ぶことがあります
または、車輪の回転角度に対して、
一般に、車輪につけるセンサは速度センサではなく、角度センサであるため、このΔLL、ΔLRはある制御周期で読み込んだ車輪の回転と、次に読み込んだ回転の差として得られます。
またこのΔtの間、速度は変化しないものとし、ロボットは一定の半径ρの円弧運動を行うとします。
Δtで旋回中心のまわりにΔθだけ回転したとすると、
なので、
となります。
まず、角度については、
です。位置については、Δθが十分に小さい場合は、
とかけます。
Δθ/2 を加えるのは、移動の前後のロボット角度の平均です。
それに対して、Δθ(の絶対値)がある程度大きいときは、右図(c)のΔL'をまじめに計算します。
始点終点と旋回中心でできる三角を半分にして考えると、
となります。これで、
と計算すれば、「Δtの間、円弧運動をしている」という仮定に対しては正確な演算結果が得られます。
なお、ここで注意すべき点は後者ではρが必要な点です。
もし、Δtの間に左右の車輪がすっかり同じ角度回転した場合、ρが無限大になります。
ソフトウエア上ではΔθ=0で割るため、大抵のシステムでは「0で割りました」エラーがでます。
そのため、ΔLL=ΔLRの場合は、ΔL'=ΔLと別扱いにする必要があります
(演算精度を考えると、Δθがある程度小さくなったら切り替える必要あり)。
上述の対向2輪型ロボットは両輪の回転を制御することで様々な運動ができます。 その中で、人間が直接操縦するのではなく、自律的な用途のうちで、主なものを考えると
ロボットを走行させる場合には、いくつかの方法があります。
この方法でも非常に多くの手法が提案されていますが、主に考慮されることは以下の二つです。
例をあげます。
右図に示すように、ロボットの中心から軌道までの距離をL、軌道の接線方向とロボットの進行方向の成す角をθとします。
この方法の難点は軌道の定義方法です。直線や円弧のような軌道であれば、Lを求めることは容易なのですが、複雑な軌道を作ろうとすると、どこが最近点なのかを求めることが難しくなります。
ここでK?は定数で、適宜設定します。
V は平均移動速度で、両輪の速度差ΔVでロボットの旋回成分を操作して走行します。
KLおよびKtの項はLとθがゼロになるようにするためのものです。
Lがゼロでないときは、ロボットの進行方向を線の向きに向ける必要があります。
KLDおよびKtDの項はLとθの速度を制御します。
例えば、ロボットが線に近づいてLが十分小さくなってきたとしても、ロボットが勢い良く線に近づいている場合(つまりθが大きいわけですが)にロボットの進行方向を変える必要があります。
パラメータが4つあって決めるのに困りそうですが、実はやってみると案外後半のθの項がなくてもそこそこ動くようです。
KLDとKtが似た性質を持っていることもあると考えられます。
また、極端にはKL以外が0でも使えることがあります。ただしこの場合は線を挟んでロボットが左右に蛇行することになり、スムーズに走らせるには微分項も含める必要があります。
まず、自己位置推定で得たロボットの位置と姿勢をもとに、移動する仮想ターゲットの位置をロボットの座標系上に変換します。
すると、ロボットから見て、ターゲットの位置を距離LTと方向θTで表せます。
これを元に、例えば
この方法はターゲットさえ移動させればいいので、かなり扱いやすい方法です。
また、ターゲットは仮想的なものである必要はないので、目標追尾型の動作にそのまま使えます。
ただし、原理的にはロボットがターゲットにたどり着くことはないので(そのまえにLTが小さくなることで速度が小さくなってしまう)、目標地点までターゲットを動かしただけでは目標にたどり着けないという問題点があります。
また、KV, Kt, KtDの各係数を大きくしすぎると制御が発散しかねませんが、小さくするとターゲットとロボットの間にすきまが開くため(よわいゴムひもで引っ張る感じ)、細かな経路計画をしてもおおざっぱにしかついてきません。
その結果、回りにぶつけたりすることがあり得ます。
とします。
この式の意味するところは、「平均的な車両速度はターゲットとの距離に比例」「車両の方向がターゲットの方向を向くように姿勢を回転させる」です。
ロボットの頭にゴム紐をつけて引っ張るようなイメージです。
一番原始的には、ロボットの軸に対称に、左右にセンサを取り付け、左のセンサが反応したら右に進路変更、右のセンサが反応したら左に進路変更、という方法があります。 これはライントレースのキットやおもちゃでも使われるような方法で、このくらい単純でもそれなりに動作します。ただし、ロボットは頭を激しくふりながら前進します。
ふれを小さくするにはセンサの間隔をつめることが解決策の一つです。
ただ、その場合はラインからはずれる確率も高くなるので、センサの数も増やします。
また、センサの間隔をラインの幅よりも狭めることで、複数のセンサでラインを読むようにして、読みとばしを避けると同時に、センサの出力を平均化することでセンサの数以上の細かさを得ることができます。
例えば、右の図で前方のセンサは右二つが線を踏んでいます。
5個のセンサにそれぞれ重みとして 2,1,0,-1,-2 を割り当てると、(-1*1-2*1)/(1+1)=-1.5 と計算できます。
2〜-2でセンサの数は5個ですが、1個か2個同時に踏む程度の間隔を設定すると、9段階の位置になります。
センサをオンオフだけではなく、アナログ的に処理するとさらに分解能をあげられます。
ふれを小さくするもう一つの方法はロボットの姿勢を反映することです。
最初に述べた方法のように、ロボットの姿勢をフィードバックします。
センサの数をけちる場合は、センサで読んだラインの位置の時間変化をフィードバックします(KLDに相当)。
センサを前後に並べることができる場合は、右図のように前後のセンサ群で検出したラインの位置から線の傾きを出し、それを反映させます(Kt項に相当)。
センサを倍つけなければならないようですが、このラインセンサによる方式ではセンサ群は車軸より前方にないとやっかいという性質があります(車軸から遠いほどなめらかに動く:原理を考えてみましょう)。
そのため、ロボットをバックさせるときは、後ろにもセンサがあったほうがいいわけです。
すると、車両の傾きを得るにも使えることになります。
この方法は工場での搬送車などに良く使われます。物理的なラインが存在するため、車輪の滑りなどにも強く、単純な制御方式(=信頼性を確保しやすい)で移動できるためです。
また、ラインセンサを流用すると停止線を読んだり、地面のバーコードを読み取って動作を変えたり様々な使い方ができます。
そのほか、高速道路での自動運転の研究でも、道路に磁石を埋めてそれを磁気センサで読み取る方式が進められています。
自動運転というとカメラを搭載して画像処理という方法がありがちですが、磁気センサの方が単純であるため、信頼性を確保しやすいといえます。
しかし、あまりに単純にこの方法をつかうと、センサの数が十分でないと動きががたがたしたり、精度が確保できなかったり、上二つの方法に比べて見た目は劣ります。 そこで、基本的には自己位置推定をベースに走行して、ラインを読みながらその補正を行う、という合成手法が使用される場合もあります。
さて、距離が測れるセンサがあったとして、ロボットの側面に、前部と後部に一個ずつつけます。
一般には左右にそれぞれつけるので、4個になりますが、図では左側面だけ描きました。
このセンサで壁までの距離 D1、D2を測定します。
なお、光のセンサの場合は図に示すように真っ直ぐ測れますが、超音波の場合には広がりがでるので、真っ直ぐは測れません。
ただ、結果に悪影響をだすようなずれはあまりでません。
この方法は壁までの距離を測ることができればよく、壁への衝突回避能力もついてくるのでお手軽です。ただし、壁がなめらかなところなら問題ないのですが、日本の一般的建築のように、壁がぼこぼこに入り組んでいる場合は距離が頻繁に変わって制御に失敗しやすくなります。
このとき、これまで同様に考えると、
というように、壁までのロボットの距離と、壁との傾きがわかります。
一般には、Dが目的の距離D0になるように、(D-D0)がゼロになるように制御します。
軌道を作る場合の数式も出るにもいくつかあります。
以上のような式を用いて、始点から終点まで障害物を避けるような軌道を立案して、その線に沿って、自己位置推定をしながら走るようにすれば、ロボットはかなりいろいろな仕事が出来るようになります。 移動できるようになると、障害物を知るためのセンシングが重要になってきます。 それはまた次の機会に。