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)
なんだかとてもぐちゃぐちゃした説明の記事となってしまいましたが今日はここで終了とします。
次は走行系で書き忘れてたことがあればそれを書くか、センサー(チャージ発光)か左手法あたりを書こうと思ってます。
ここまで汚い文章をお読みいただきありがとうございました。
(^.^)/~~~
.
JASALMAのプログラム解読Part1 走行系1
お久しぶりです。
やばいテストを4日後に控えて余裕がないのに現実逃避するために書いているブログです(-_-;)
さて、今日は前々から書こ書こうと思っていたJASALMAのプログラム解読、そのPart1として走行関連、主に台形加速付近までを書ければと思っています。
注意
ブログ名でも記しているように独り言ブログなので、あくまでも自分個人の考え、実装であり正しいor最適なものだとは1ミリも思っておりませんのでその点はあらかじめご了承ください。
というかこうしたほうがいいんじゃない?等々あればコメントでも見かけたときにでもTwitterにでも書いて教えてください。
まずJASALMAで使用しているモータはステッピングモーター(オリエンタルモーターさんのPKE243A-L)です。
ステッピングモーターの詳しい原理等は省きますが簡単に言うとパルス波が入力されると定められた角度変化するよ、というものだそうです。(ほんまか?)
このパルス波形の生成にはMTUを用いました。
MTUの初期設定やその仕組み(?)等々に関してはデータシート読んでもらえればと思います。
(自分は沢山先輩に助けていただいたので偉そうなこと言えませんが・・・)
書いてあるのはピン設定・カウントのタイミング(ここではMPΦ/1でカウント)・カウントのタイミング・TCNTのクリアのタイミングの設定・割り込み許可・モード2に設定etcです。
そんなこんなでMTUで矩形波が出せるようになるとモータが回るのももう少しです。(ホンマか?)
さあさあ、ここから実際にモータを動かすためのプログラムを解読していきます。
まず大前提としてこのプログラムではCMTで1msごとに速度や壁制御の制御量等々を計算し、その値をMTUの割り込みのタイミングでTGRAの値を変更することでモーターの回転速度を変更しています。
↓↓↓
つまり、任意の速度を入力した際にその速度に対応したモーターの回転速度となるようなTGRAの値を出力させる計算式が必要!
そのためにすごく参考になったサイト(pdf)がこちら。
(正直上のリンクですべて事足りるのでは?とも思いますが頑張って書いていきます・・・)
それでは自分の計算用紙を載せとくので説明は省略します。
はい、ごめんなさい、これでわかるわけないですよね。
(↑書いた本人もわかってないです...)
まずTGRBの値はステッピングモーターがパルスを認識するのにに必要な時間が確保できる最小の値に固定しておきました。
このソースコードでは内部クロック(25[MHz])のタイミングでカウントしています。
つまり1カウントあたりにかかる時間は0.00000004[s]です。
また、1パルスで0.9°回転するモーターであるためステップ距離[mm/1パルス]は
ステップ距離=直径×π×(0.9/360)[mm/1パルス]
で求められます。ここでタイヤの直径を51.0とすればこの値は0.400…となります。
また上記のサイトよりパルス周波数をfとすればこれは
f=速度/ステップ距離[1/s] -①
となります。
さらにパルス周波数とはTGRAによって生じるパルスの周期の逆数によって与えられるものであるためその値は以下のように与えられます。
f=1/(0.00000004×TGRA) -②
ここで①と②よりTGRAの値について整理すれば
TGRA=ステップ距離/(0.00000004×速度)
≒10013/速度 ←なんか3桁くらいずれてる説あります、ご注意ください
程度となります。のちのちタイヤ径の調整をすることも考えられますからその値は変数として変更できるように書いておくといいかと思います。
(その計算はお任せします)
さあ、これで任意の速度でモーターを回転させることができるようになりました。
加減速についてです。
台形加速とはその名の通り(?)時刻t-速度vのグラフの概形が台形となるように速度を変化させることを指しています。
なぜそんな加速のさせかたをしなければならないかというと、ステッピングモーターが急激な速度変化に対応しきれずに脱調を起こしてしまうためです。
つまりいきなり全速力では走り出せないからしっかり遅い速度から加速してやろうな!、という話です。
基本的に加減速等の流れとしてはCMTの割り込みの度に速度を計算し、この計算によって得られた値をMTU割り込みにタイミングで先ほど求めた式に突っ込んであげる、という形です。
まず速度の計算には
v=v0+αt
の式を用います。(厳密にはこの積分としてのしての考え方のほうが近いと思います)
CMTの割り込みを1[ms](=0.001[s])毎と設定しているため速度vは
v+=0.001×α
と表現できると思います。
これで任意の加速度で速度を変更出来るようになったと言えるでしょう。
さらにここからは台形加速や三角加速についてです。
・・・と言いたいところですがもう疲れたのと皆さんが突っ込みたいことも溜まってきたころだと思うので今回のブログはここまでとします。
それではまた(^.^)/~~~
G
P.S. そういえばテスト前とか書いてましたが、気づいたらテスト終わってました。
明日はcheese杯に向けtの調整、明後日以降はまた新作の設計をやろうと思っています。
Mice総会の振り返り(個人的)
/※この記事は自分の所属している知的ロボットサークルMiceのイベントMice Advent Calendar 2017 - Adventarの3日目の記事となっております。※/
皆さんこんにちは!
もう12月ですね。
いやー、もうほんと時が過ぎるのは早いなと感じる今日この頃です。
さてさて、今回のブログでは本日行われたMiceの総会の個人的な復習をしていこうと思います。
まず何と言ってもこれでしょう…
自分、Miceの次期部長だってよ!!
(ええぇぇ・・・)
正直自分は人格的にも技術的にもとても未熟な人間なので部長なんて大役がこなせるかわかりませんが任された以上精一杯頑張ってやっていこうと思います。
なのでこのブログをご覧の皆様、今後様々なところでご迷惑等おかけするかもしれませんがどうぞこれからもよろしくお願いします。色々と助けてくださいな!
他の役職に関してはここでどこまで言っていいのかわからないので具体的なことを書くつもりはないですが頼れるメンツが揃っていると感じています。
役職任された人もそうじゃない現役生も
これから一緒に頑張っていこうな!!
(老害の方々はこれからも色々と頼ってしまうと思いますがよろしくお願いします)
後はSlackの導入とか中々に重い話が沢山ありました。
この辺の細かいお話はこの辺?を参照してください。(ほんまか?)
ほんと老害の方含め先輩方皆さんしっかりしててこんなふうになれるのだろうか、と言う感じです。
(あれ?意外と早く終わってしまった・・・?)
ここからは総会関係ない個人的なお話を少々。
- まず現在設計中(設計準備中)の新作について
クラシックサイズマウス
DCモーター:1717
コンセプト:初のDCモーターマウスなので基本的には標準的に
来年の大会で走ることが第一
(可能ならフルオートスタートの実現)
マイコン:RX631
ジャイロ:ICM20648(?)
その他:吸引やりたい、JASALMAで使えなかったスピーカーのリベンジ、
センサーは5つ
といったことを考えております。
こうしたほうが、ああしたほうがいいよというような意見お待ちしております。
どしどしご応募ください。
今後の予定としてはまずCADの操作法を覚えながら、外形、回路等を組んでいくことです。
できるだけ早く終わらせたいな~といった感じで。
- JASALMAのソースコード解読について
これは前回のブログで書いたことなのですがJASALMAのソースコード解読を来年以降の新入生のため自分のためにやりたいやりたいと思っているのですがなかなか時間が取れずできる見込みがついていないという現状です。
今後、全然進まない新作の設計の隙間にやっていきたいと思います。
さて、とりあえず書きたいことは一通り書けたので今日はここまで!
皆様、ここまでお読みいただきありがとうございました。
/※この記事は自分の所属している知的ロボットサークルMiceのイベントMice Advent Calendar 2017 - Adventarの3日目の記事となっておりました
昨日のブログはこちらとなっております。
大会前すごくデバッグ手伝って頂き感謝と申し訳なさしかない先輩です。
(ただ翌日の投稿者がドМとか言ってるのはよくわかんないですね(。´・ω・)?)
明日のブログは今日老害の仲間入りを果たしてしまった元副部長さんです。
内容は未定とのことですが噂でちらっと聞いた話通りならとても興味深そうな内容でした。
※/
それではまた(^_^)/~
P
2017年度公式戦終了のお知らせ
本日、全日本マイクロマウス大会が終了いたしました
いやー、とりあえず皆さまお疲れさまでした🍻
個人としてはフルオートスタートを目指し、超信地探索はコケないだろうと過信した結果2回目の探索で失敗し、その後のモード選択でも慌てて同じモード(2回探索&3回最短)を選択してしまい、時間が足りず最短は出来ませんでした…orz
そもそもクラシック・フレッシュマンの予選も同じモードで挑み、一度最短を決めたものの加速させられるだけの直線もなく、超信地の速度も上げずの最短で予選通過30人中28位とヒヤヒヤな結果でした…(結果発表の間ほんとに胃がキリキリしてました(;・∀・))
いやー、フレッシュマン、レベル高いな、って感じですほんとに。
まあ2回目のモード選択でミスったところは悔いが残るけど、それ以外ではやり切った感があるのでよかったかな、と思います。
それでもやっぱり頑張って入れて調整したスラロームも直線加速もお披露目できず悔しい・・・
この悔しさは来年晴らすためにまた一年間頑張ろうと思います。
次の機体に関しては自分の中で7:3くらいで決まっております。
まあこれに関しては決まり次第報告したいと思います。
というわけで今後はJASALMAでやり残したこと(斜めとか壁切れとか?)を実装できる範囲で実装し、同時並行で新作の設計も進めていこうと思います。(あ~、CAD無理、教えてください...)
それと今後このブログでJASALMAに書き込んであるソースコードの解読を行っていく予定です。(来年以降後輩に教えるときに見返すようにね)
自分でもわかるクソなやつやん!(宮川大輔風)って感じのソースコードではあるので突っ込みどころが多々あるとは思いますが温かい心で見守っていただければ幸いです(指摘は随時受け入れております。)
ほいじゃ、今日のとことはこんなところで(^_^)/~ C
(P.S. ブログタイトル変更しました
前半部の名前の由来については需要があればそのうち書くかも・・・?
後半はその名の通り書きたいことを書いてるので、って感じです。
書き手の名前がないって話に関しては特に名前を付けず行こうかなと考えております(どうせ見てくれるのはTwitter経由の人たちだけだろうし))
はじめまして
はじめまして 〈名称不明〉です。
東京理科大学に通う学生です。
自分はMiceというサークルでマイクロマウスというものを作成しており、それを作る際にオリエンタルモーターさんからモーターを無償提供して頂きました。
その無償提供の条件がブログの開設だったのでこのようなブログを作ってみました。
(それにサークル内の伝統?文化?風習?としてブログを書こう!というもがありましたのでそれも理由の1つ)
基本的にはマイクロマウス関連を中心に書いて行く予定ですがいかんせん低スペックポンコツマンなので書いてる事が正しいとは思わないでください。
(ご指摘、ご指導お待ちしておりますのでお願いします)
最初の投稿としてはこんなところですかね?
不定期で書きたくなったら更新しますのでよろしくお願いします。
(直近だと東北大会とか東日本の話とかになるんですかね?)
P.S.サークルの先輩の方々あだ名というかニックネームセンスありすぎじゃないですか?
全然思い浮かばなくて困ります。
何かいい案があれば命名してください...