自動操縦

測量系の座標

GPSの経度・緯度の値を直交座標に変換すると、X,Y座標で位置を表すことができます。
ただし、測量系では緯度(南北)の変化がXの値に、緯度(東西)の変化がYの値になります。
数学の座標は一般に縦軸がY、横軸がXなので、地図の見方と同じにするためにXとYを入れ換えたほうが多分良いと思います。

相対値を使う

GPSでコースを設定する時に、使用する範囲の近くに基準点を決めておくと良いでしょう。
測量の直交座標の値は大きな値であったり、負の値の場合もあります。
基準点を決めて、そこを(0,0)にした値(相対値)で計算すると勘違いを防ぐことができるでしょう。
また、CLAS方式では地殻変動でGPSの値は変化します。GPSの値をそのまま使用すると毎年少しずつズレが蓄積していくことになります。
相対値の座標でコースを決めておけば、基準点のズレの分だけ補正すればそのままコースの座標を使用する事ができます。

コースと操縦

次にコースと機械の操縦について考えます。
機械のコースとなる直線の座標がAからB、機械の座標をMとします。
機械が座標Aにある(M=A)とすると、座標Bに向かって真っすぐに移動するのが理想です。
しかし、何らかの理由でコースを外れた時に直線ABからMがどれ位ズレているかを計算する必要があります。ズレはMから直線ABまでの垂線の長さで求まります。
このズレを計算する関数式があるのでそれを使います。 また、機械がコースのどちら(左・右)側に外れたかを知る必要があります。ズレを計算する関数式はどちらに外れたかを符号で表してくれるので便利です。
また、コースは座標AからBと言っていますが、機械がAに向かって逆走するかもしれません。
そのため、機械の向き(BとMとの距離)も調べる必要もあります。

コース切換えタイミング

コースがA->B->Cとなっている場合、A->BからB->Cに切り替えの判定が必要です。
例えば、GPSからの信号が1秒毎だとすると、機械が1秒間に移動する距離が求まります。
その1秒間(観測周期)で切り替えのタイミングを考えることになります。
(BとMとの距離)<(機械が1秒間に移動する距離)の場合、1秒後では機械はBを超えてしまいます。
コースが直角の場合などは内回りでないといけない場合も考えられます。

車体の向き

機械のハンドルで向きを変える場合、ハンドルを戻す必要があります。ハンドルを戻すまでの時間を遅くするとより大きくコースが変わります。機械の位置が変わるだけでなく車体の向きも変わります。ハンドルを直進に戻しても、車体の向きはそのままです。
クローラーにより方向を変える場合は、ハンドルを戻す必要が無いので少し制御がしやすいかもしれません。
しかし、機械の位置が変わったら車体の向きも変わるのは同じです。コースの向きに対して車体の向きが分かっていないと適切にハンドルを切る事ができません。

下の図で移動後の位置と車体の向きの関係を説明します。

「出発点」から車体を真上に向けて右にハンドルを切って動かします。
右にハンドルを切っているので、その軌道は円弧を描くと仮定します。
一定の時間後に車体が「移動先」に到達しました。
「出発点」と「移動先」を結ぶ直線の傾きと、円弧の接線(車体の向き)が違うことが分かります。

このように、移動先がコース上だとしても、その後の車体の向きが「出発点」と「移動先」を結ぶ直線とは異なるので、思わない方向に進んでしまいます。

最近のGPS制御のトラクターは2つの受信装置を持っています。それはトラクターの車体の向きを知るためのようです。
GPS受信装置が1個の場合は、ハンドルを直進に戻して少し前進する事で車体の向きを知る事ができますが、無駄な移動が発生してしまいます。
前進時にハンドルを切って少し移動し、ハンドルを直進に戻して少しバックする事で車体の向きを取得して大回りを防げるかもしれません。

1秒後の位置と車体の向き

車体の向きの制御を(左、直進、右)と単純化します。
左へ1秒間移動した位置と向きを記録します。同様に直進、右も記録します。
それは多分扇形になるでしょう。



その扇形を(車体の向きを合わせて)つなぐことで2秒後の位置を推測する事ができます。

さらに扇形をつなげば3秒後の位置も推測できます。
このようにして数秒後の機械の位置を推測する事で、右直角に曲がる時などにどの向きの制御がよりコースに近いかを知る事ができます。
直進→直進→右では遅すぎるでしょう。右→直進→右かもしれないし、右→右→左かもしれません。

計算方法は3次元グラフィックで使う計算式を使います。Z軸で任意の角度αに回転した位置の点を計算する事ができます。
X' = X * COS(α) - Y * SIN(α)
Y' = X * SIN(α) + Y * COS(α)