JASALMAのプログラム解読Part2 走行系2
こんにちは。
昨日はCheese杯でした。
運営された方、参加された方、本当にお疲れ様でした。
(結果は聞かないでください・・・)
さてさてJASALMAのソースコード解読第二弾です。
(ふとプログラムとソースコードの違いが気になったので強い人是非教えてください)
今日は前回の続きということで走行系の2、です。
前回の部分で任意の速度を実現できるようになっています。
そのため今回は台形加速についてです。
(あくまでも個人の考えだよ、という点は変わらずですが、それに加えて今日からの内容では自作の関数や変数が出てきます。そのネーミングセンスはないと自覚しているのでそっとしておいてください&名前は自分で変更することを強くオススメします)
台形加速のざっくりとしたイメージは前回のブログで書いてるので省略します。
まず台形加速を考えて行く前に三角加速を説明させていただきます。
台形加速するためには最低速度、最高速、加速度、走りたい距離(走行距離)、初速、終端速etcのパラメーターが存在します。
台形加速とは時間-速度のグラフが台形となる=最高速度に達しているということです。
では、走行距離が短くなっていったらどうなるでしょう?
台形の上辺(下辺もですがここでは気にしない)が短くなっていきある地点で上辺が0となることがイメージできると思います。
この時の走行距離の値より走行距離が大きくなれば速度が最低速まで達する前に減速することがわかるかと思います。
さあここでこの時のグラフの概形を考えてみましょう。
答えは必要ないですよね?
つまり台形加速を実装するためには同時に三角加速も実装する必要があり、そのためには走行距離(+その他のパラメーター)に応じてどちらの加速をすればいいのかを判断する必要があります。
この判定の条件は自分で考えてみましょう。
高校物理の知識があれば解けますから難しくないですし...
台形加速と三角加速の判断が出来てしまえばあとは加速区間、等速区間、減速区間の判断を導入してあげればよいでしょう。
この判定の仕方には距離、速度、時間などが使えると思います。
理論的にはどれを使っても問題ないはずです。
JASALAMAでは加速・等速の判定は速度、等速・減速の判定は距離、停止の判定は距離としました。
おっと、ここでさらっと距離を認識していると書いていますがその説明をしていませんでした。
距離は速度を時間積分すれば求められます...がここではそれをもう少し簡単に計算していきます。
速度を計算した時と同様に距離xはCMT割り込みの度に以下の計算をすれば現在の位置(距離)xを求められます。
x+=v×0.001
以上を踏まえれば台形加速は最高速に達するまで加速、その後等速として(走りたい距離)-(台形加速と三角加速の境界の距離の半分)まで走行、以降は走りたい距離に達するまで減速とすれば台形加速は完成です。
この時減速区間では速度が最低速以下にならないように気を付けましょう。
今更ですがマイクロマウスにおいて最低速は0ではなくある程度の値とする方が主流です。
JASALAMAでは180[mm/s]を最低速、最高速(探索速度)は500[mm/s]、加速度は1700[m/s^2]としていました。
上記のように加速区間、等速区間、減速区間を判定できるようになれば後はフラグとif文等を用いてCMT内の処理を変更し、速度を上げたり下げたりそのままにしたりすればいいでしょう。
これで基本的な台形加速は完成です。
ただしここまでで記した通りの台形加速を実装では停止状態から任意の距離走行し停止する、というパターンしか実現できないと思います。
これでもカクカクしながら走行することは可能でしょう。
というか初めて左手法を実装する際などはこの動きで十分とすら言えるかもしれません。
しかし、後々には停止状態から探索速度まで加速、探索速度から停止、探索速度を維持したまま走行、探索速度からさらに速い速度まで加速したのち探索速度に戻る、などの動作が必要になると思います。
そのため今の段階で様々な動きを実現できるような関数を作るのもありかもしれません。しかしそのためには関数の引数が多くする必要がありその入力がめんどくさくなるかと思います。
そのため引数を少なくして関数を多く作るというのもありかもしれません。
その時は今回作った台形加速の関数をコピペしてちょっといじってあげればいいと思います。
まあこの辺の考え方は宗教性があるところだと思うので自分の好きなようにしてください。
さて次は超信地旋回についてです。
超信地旋回とはその場でぐるぐる回ることを指しています。
これを実現するためには左右のタイヤを同じ速度で逆方向に回してあげればいいでしょう。
この時も台形加速を用いてあげればいいと思います。
そのためには任意の角度まわる際に左右のタイヤがどれだけの距離を進む(回転する)必要があるのかを知る必要があります。
超信地旋回ではタイヤの軌跡は左右のタイヤの中心を原点に左右のタイヤの間隔(=トレッド幅を)直径とした円を描くことがわかるかと思います。
(ほんとはわかりやすい絵を載せるべきなのかもしれませんか面倒くさかったいい絵が見つからなかったので割愛します)
つまり走りたい距離(i_distance)は走りたい距離(i_degree)に対して
i_distance=トレッド幅×3.14×i_degree/360
で求められると思います。
これを台形加速の関数に突っ込んで回転の向きだけ変更してあげれば回転させたい向きに任意の角度だけ回転させることができると思います。
JASALAMAのソースコードでは台形加速の関数に引数としてモードを選択できるようにしてその値に応じて直進、右折、左折、後進ができるようにしていました。
(もっとも後進は1度も使ったことありませんでしたがw)
なんだかとてもぐちゃぐちゃした説明の記事となってしまいましたが今日はここで終了とします。
次は走行系で書き忘れてたことがあればそれを書くか、センサー(チャージ発光)か左手法あたりを書こうと思ってます。
ここまで汚い文章をお読みいただきありがとうございました。
(^.^)/~~~
.