FC2ブログ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

ターン自動化

こんにちは!

さあさあ早くも5月です。
大会シーズンまで3,4か月と考えると、ここらの時期の頑張りが物を言う?

今日はターンの自動化について考えていきましょう。
早速ですが、実装のために必要な前提があります。

・機体の軌跡をシミュレーションできる

シミュレーションの精度が良いほど、自動化されたターンも精巧なものとなります。
逆に、決め打ちでターンを作っていた人は、まずはシミュレーションからという形になります。

何もない状態で説明されても分かりにくいので、技術交流会用に作ったシミュレーションを置いておきます。
注意点として、これは考慮していない要素が多く不完全なものです。
説明用と考えてもらえれば、ありがたいです。

説明用シミュレーター

まずはプログラムの仕様を決めていきましょう。
他の方のプログラムを見たことがないので私の主観ですが、
なるべく機体にとって優しいターンを作ることが良いと思います。

混乱を避けるために、まずは自分の仕様を紹介して、その後に手順をまとめたいと思います。

・自分の仕様
私が用意したシミュレーションでは、速度、目標角度、曲率半径が入力項目になっています。
このうち、速度と目標角度は定数になるので、プログラムでは曲率半径が変化していきます。
良い値の曲率半径が見つかったら、それに対応する各種値を保存
→ターンの出番で読みだす、といった感じです。

値の読出しには、それ用に作った型:ターン型を用いています。
参照:構造体

この構造は、速度→ターンの種類→パラメータ
というような構造で、例えば速度1000[mm/s]の右135度ターンの角加速度を保存するときは

V1000.R135.alfa=80;
のようにプログラムをループさせて見つけた値を保存していきます。
(うーん、分かりづらいね。。)

この利点は読み出しです。
各種ターンが持つパラメーターの種類は同じなので、1つの関数を通すことで、
パラメーターに応じたターンとなります。仮にこの関数を doturn() としましょう。

以下の文で、ターン型:turnで、速度1000[mm/s]:V1000を宣言したとします。
turn V1000;

そして最短走行関数:SAITAN に引数としてターン型をぶち込みます。
SAITAN(turn){---}に
SAITAN(V1000);

最短走行関数で右135度ターンの出番が来たとすると
SAITAN(turn){
   ---
   doturn(turn.R135);
   ---
}

となって、V1000.R135が読みだされます。
このように、速度が変わっても同一の最短走行関数が使えることが利点です。
同様に、後に説明する、ターンのパラメーター決定関数も1つになります。

何が言いたいかというと、ターン自動化では、構造を工夫しないと関数の数が大幅に増えてしまうので注意です。(苦戦したから蛇足かと思いつつ説明しました。)


・手順の確認
①各種ターンのパラメーターを求める
②最短走行で読み込む



●各種ターンのパラメータを求める
これができれば自動化は成ったも同じです。

ここで、使う物理式による違いが出てきます。
私は曲率半径を変化させて値を決めますが、曲線長を変化させる人や、クロソイド定数を変化させる人を知っています。
たぶん一番良いって方式はないので、好きなのを使うといいと思います。

共通して必要なポイントは
・ターン始点
・ターン終点
・ターン途中に柱にぶつかるか(または規定の領域に侵入するか)
これらの情報があれば、そのパラメータでのターンが成り立つかどうかが判断できます。

最初のほうに、なるべく機体にとって優しターンを作ると書きました。
これはどんなターンでしょうか。

まあ予想できるでしょうが、なるべく急旋回しない(角速度の小さい)ターンです。
実は急旋回する方がタイムは早くなるのですが、その要素は無視しましょう!w

そこで、曲率半径をディクリメントするループによって、
なるべく曲率半径が大きいかつ、柱にぶつからない、
始点終点が壁切れに間に合う位置になるというターンをつくりましょう。

例として1番簡単な大回りターンを考えます。

05041.png

このターンでは、y軸方向へは最大で180mm、x軸方向へも最大で180mm以内の軌跡としなければいけないと分かります。
なので、下のようなターンは採用できません。
05042.png

実際のプログラムではシミュレーションと同様の計算をして、
・ターン始点
・ターン終点
・ターン途中に柱にぶつかるか(または規定の領域に侵入するか)
を導きます。

自分で組む達成感を奪ってもいけないのでヒントまでですが、
例えば下のようなターンは柱にぶつからず、始点終点もOKです。
05043.png

このとき、壁切れを読んでからすぐにこのターンをしてしまうとy軸方向へは足りませんね。
なので、ターン前に余分に走ることになりますが、柱の距離との関係は…
左右のタイヤが柱と…、180度ターンでは特別な処理がいるかも…

では問題です。
各種ターンが保存すべきパラメータたちは、なんでしょう?
これが分かれば、めでたく完成です!(*´ω`*)


とまあ参考程度にしかなりませんが、以上にターン自動化のヒントを書いていきました。
私も機体の完成を急がねば!(`・ω・´)

ではでは!ノシ

コメントの投稿

非公開コメント

時計
カテゴリ
最新記事
12月14日開始
RSSリンクの表示
リンク
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。