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度ターンでは特別な処理がいるかも…

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


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

ではでは!ノシ
スポンサーサイト

スラローム走行3

今晩は!
寒かったり暑かったり、服の枚数が決め難い今日この頃。

新入生はロボコン上がりの強者がいるようで、
早速SHライトレに挑戦してました。
今後が楽しみですねー(*´ω`*)

さて今回はスラローム時の軌跡をシミュレーションしてみようというお話です。

まずは、円弧スラロームのシミュレーターを作ってみましょう。

円弧の場合角速度は一定なので、入力するパラメーターは
・角速度
・重心速度
です。

04191.png

今回は適当にB列のような値にしてみました。

さて、どのようなグラフを作ればよいのでしょうか。
たぶん色々やり方があると思うのですが、私の場合は2次元平面上で考えたときの
左右のタイヤ間の中心点の軌跡をプロットしていくグラフを使っています。

ですので、時間毎のタイヤ間の中心点の座標(x,y)の値を求めていきます。

この時、必要になる情報は、スラロームの開始時の角度を0[deg]としたときの、時間毎の角度です。

どういうことかと言うと、角度が0[deg]の時はまっすぐ進むので、y軸方向の変化量が大きくx軸方向の変化はないですよね。逆に角度が90[deg]だとすると、y軸方向の変化はなく、x軸方向の変化が大きいです。
このようなことから、現在向いている方向に依存して(x,y)が変わるということが分かると思います。

そこで、必要な項目をエクセルに作ります。

04192.png

角度[rad]を用意しているのは、エクセルのcos関数とsin関数がラジアン入力になっているためです><

時間は細かく区切るほど精密なシミュレーターになりますが、
1ms(0.001秒)毎に更新で、十分な精度になると思います。
今回は2秒まで用意しましょう。オートフィルも使えないので地道に2000行までドラッグ。。。

角速度が180[deg/s]なら、角度は0.001[s]で0.18[deg]ずつ変化しますね。↓
04193_20140419225215ccc.png


エクセルに触れたことがない人もいると見て、少し補足を。
=IF(E2<90,$B$1*0.001+E2,FALSE)について、IF( , , )は条件分岐です。
IF(A,B,C)とあったとき、Aが然りならばセルの中身はBになり、Aが違うときはセルの中身はCになります。
今回はスラロームで90度旋回しようとしているので、グラフでは90度傾いた以降の(x,y)は要りません。
そのため、角度が90度を超えたらセルの中身をfalseにしています。
こうすることにより、重心速度などを変えたときにいちいちグラフの範囲を指定し直さなくてもよくなります。

$B$1について、
時間以外の項目(角度やx,y)については、オートフィルで一気にできます。
しかし、例えばB1を選んでいると、オートフィル時の次のセルはB2になってしまい都合が悪いです。
そこで、$を付けることでオートフィルやドラッグ操作時に、セルの行や列を固定することができます。

最後にx軸方向とy軸方向の変化量を求めれば、グラフの準備完了です。↓
04194.png

恐らく、SIN(F3)*$B$3*0.001+G2 が謎だと思うので説明します。
これは、x座標の変化を表しています。
SIN(F3)*$B$3*0.001がその時間での変化量で、前回の位置から動くため最後に+G2となっています。

xの変化量を意味してるSIN(F3)*$B$3*0.001ですが、
04196_20140419231814152.png
このへたな絵で伝わると信じてる!

さて、とりあえずですがシミュレーター作成の流れは追えたでしょうか。

本当はクロソイドスラロームのシミュレーターまで説明しようと思ってたのですが、
Miceの技術交流会で発表しようということになったので、少しの期間封印します。
当日をお楽しみやで!(`・ω・´)

先取りをしたい人は下のサイトがとても参考になると思います。
クロソイドの公式の詳しい証明

今回の登場人物は、角速度、重心速度でしたが、
クロソイドを用いるスラロームの場合は、
・重心速度
・螺旋角
・曲率半径
・角加速度
などが必要です。

次週は斜め走行についてです。
私も偉く語れる立場にないので、前センサを2つ付ける理由などを説明してみます。

ではではまた来週 ^^) _旦~~

今回作ったファイル

スラローム走行2

今晩は!
ついにMiceの就活組は全員就職先が決まりました!
激務(?)なところが多い気がしますが、シーズンは毎日22時まで活動した経験が活かせるでしょう\(^o^)/

今回の記事はスラローム走行の続きです。

前回のおさらいとしては、
・トレッド幅と左右のタイヤの速度差から角速度が決まる
・左右のタイヤ間の中点を「速度」「角速度」の基準と考える
です。

早速ですが、先輩が作ってくださったスラロームの記事を見てください.

円弧とクロソイドという言葉が出てきましたね。
重ねての説明にはなりますが、ステッピングモーターは脱調が敵です。

円弧でのスラロームの場合、ある角速度になるように左右のタイヤの速度を決めます。
つまり、
左右のタイヤ500[mm/s]→右タイヤ300[mm/s]、左タイヤ700[mm/s] -◎
のように変化させます。
このように一気に速度を変化させると、脱調が起こるというのはすでに説明済みですね。

そこで、角速度も加減速をするようにします。
これがクロソイドを用いるスラロームです。
このとき、角速度の上限を決めてあげないと、
クロソイド曲線wiki
↑のサイトに載っている図のように機体が急激に回転してしまう可能性があるので注意です。

さて、これを実現するのは、物理量ベースで動いているマウスならすごく簡単です。

理想速度を単位時間毎に加減速したように、理想角速度を単位時間毎に加減速すればOKです。
簡単に言っちゃうと、
左タイヤ 重心速度+出したい角速度に応じた速度
右タイヤ 重心速度-出したい角速度に応じた速度
で、◎と原理は同じです。

◎では、出したい角速度が一定であると考えることができ、±の速度は200[mm/s]で一定です。
しかし、クロソイドを用いる場合は出したい角速度自体が加減速され変わるため、
単位時間毎に左右のタイヤの速度も変わっていきます。
そしてこれにより、脱調が回避されます。

今週はここまで!
次回は、スラロームの要、シミュレーターを作成してみましょう。
↓こんな感じ
04131.png

ではでは!( ゚Д゚)

スラローム走行1

今晩は!
実は昨日、新歓にこっそり参加しました。
以前の神楽坂新歓と違って、ブース側の参加人数に制限がないのはキャンパスが広くなったから…?

お堀、部長、ミニ大会の運命やいかに!(*´ω`)

さて、今回はスラローム走行についてです。
スラロームってのは、マウスが曲がるときに逐一止まらずに、左右のモーターを加減速することで左右のタイヤに速度差をつけ曲がっていくことです。ステッピングモーターだと、ライトセーバーを振った時のような音がします。

任意の速度を出すことができるようになっていれば、案外簡単です。

2輪マウスの場合、
ターン時は左右のタイヤの中心を移動点として考えることができます。(分かりづらいね…)

つまり、物理で出てくる円運動とか角速度の加減速とかをマウスにも当てはめたいんだけど、
「どの点がそれらの角速度や速度をもっているの?」って考えたときに、
左右のタイヤの中心点がその点になります。
下の画像で言うと点線が交わっている点です。

04061.png

左右のタイヤに速度差があるとき、どのように機体は曲がっていくのでしょうか。

曲がる速さ、つまり角速度を決定する要因は2つ。
左右のタイヤの相対速度差、そしてトレッド幅です。

相対速度差について、
直感的にも分かると思いますが、左右のタイヤで速度差があるほど角速度は大きくなります。
逆に、左右のタイヤが同じ速度で回転していると、角速度が生まれないので曲がらずに直進しますね。

トレッド幅について、
トレッド幅は左右のタイヤ間の距離のことです。
同じ相対速度差だとしても、1kmタイヤが離れているときよりも、5cmしかタイヤが離れていない方が角速度が大きくなります。こちらもイメージすればすぐに分かりますね。


さて、角速度を生む2つの要因があることはOKでしょうか。
ここで、トレッド幅は機体ごとに変わらない値なので、相対速度差をこちらが決めることができれば、任意の角速度を生み出すことができます。


例えばトレッド幅が20.0[mm]の機体を考えてみます。

右タイヤ31.4[mm/s],左タイヤ-31.4[mm/s]とするとその場で旋回しますね。
この時、タイヤは図の円の軌跡を通ることが分かると思います。
円周は直径×piなので62.8[mm]。
結果、機体は1秒で180[deg]回転するので、角速度は180[deg/s]
04062.png

このように、角速度[deg/s]は相対速度に比例、トレッド幅に反比例し、
(180*相対速度差)/(pi*トレッド幅)
になります。
rad系だと式も変わりますのでその辺はお好みで。

で、上の例ではその場旋回(速度0)だったのですが、機体が速度を持っていても角速度の式は変わりません。
相対速度差に応じて角速度が決定し、速度があると中心点軌跡イメージとしては下のようになります。

04063.png

こちらも左右のタイヤの速度差が62.8[mm/s]でトレッド幅が20[mm]なので180[deg/s]です。

また、これらの例から、左右のタイヤの中心点が持つ速度と角速度は、
相対速度差から求められるということが分かりましたでしょうか。

眠くなってきたので今週はここまで!
次週は今週のを発展させて、スラローム走行のプログラムまでを見ていく予定です。

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