以前のリビジョンの文書です
この記事ではスラローム走行について書きたいと思います。前提条件として、物理量ベースであることを要求します。 ちょっと物理量ベースの復習をしてみましょう。普通、物理量ベースというと下のような関数を使うと思います。
//**************************************// //関数名 void move(float v, float omega) // // // //引数: 速度 v [m/s] // // 角速度 omega [deg/sec] // // // //指定した速度と加速度で移動する関数 // //**************************************//
引数の単位系は別に同じでなくてもかまいません。物理量ベースになっているのなら、こんな感じの関数は自前で持っていると思います。ステッパでかつ二輪ならば左右のタイヤの回転数を調節することによって、所望の速度と角速度で走ることはさほど難しくないはずです。この辺は物理の話なのでよく分からない人は物理を勉強してください。 物理量ベースなので次のようなグローバル変数を持っていると思います
位置,速度,加速度 : x,v,a 角度,角速度,角加速度 : angle,omega,alpha
復習になりますが、物理量ベースというのは周期Tごとに上の変数たちを更新して、moveに代入みたいな感じです。全部書くのもつまらないので、この辺は自分で考えてください。ここに出ているものもあくまでもいろんな方法がある中の一つです。プログラムというのは同じ概念を実装するのに、無限の方法があります。要は自分で考えないとダメということです。
突然ですが、重心速度v,半径rでマウスを進ませることはできますか。これができればとりあえずスラローム走行ができると思います。しかし、この円弧によるスラロームには問題があります。それは直進から円弧に急に移ると角速度が不連続になるという問題です。だから、この欠点を補ったクロソイドという軌跡を使うことになります。しかし、速度がそんなに高くなかったら別にそこまで問題は無いでしょう。プログラム的には下のようになりますかね。
float pre; //スラローム前距離 float fol; //スラローム後距離 float v_turn //スラローム時の重心速度 float omega_turn; //スラローム時の角速度 angle = 0; //アングルの初期化 距離preを速度v_turnで進む; 角速度omegaを一定(適当)にし,重心速度v_turnにして,角度angleが90degになるまで積分する; 距離folを速度v_turnで進む;
これで、物理量ベースが問題なければとりあえずスラロームで90deg回ることはできると思います。前後に直進を設けるのはこのpreとfolを調節することによって軌跡の調節をしたいからです。円弧軌道だったら旋回半径はあらかじめ計算できると思いますが、適当に上のパラメータを弄ってトライアンドエラーにより軌跡を作ってもいいと思います。この円弧によるスラロームというのは、直進運動のときに等速度で走るっていうのでやったことを重心速度一定で、角度や角速度でやればいいわけですね。だから、等速度運動ができていて直進と回転が分離できていたら、すぐできると思います。
ところで、み