新作の予定
お久しぶりです。
今までJASALMAのプログラム解読を行ってきましたが今回は新作のお話をしていきたいと思います。
(といいつつ皆様からのダメ出し・アドバイスが欲しい、というのも本心です)
というわけで回路や配線図など気になる点があればコメントやTwitterで教えてほしい所存です。
よろしくお願いします!!
まず機体名称から紹介します。
- BALTA
- BIJELA
- BIANCO
現状上記の3つが候補となっております。
(これ以外になる可能性もあり)
次に回路図ドーン!(追記:↓いくつか間違ってる可能性ありますが、少なくとも書き込み間違ってます)
その次に配線図ドーン!
- GND無し
- GND有
- GNDピックアップ
こう見るとGNDがペタでつながってないんですよね・・・
なんともやばい気がしないでもないんですけどどうなんでしょう、強い方々・・・
まだ初の配線率100%なのでやり直さなきゃなのかな~とは思ってるんですが
次に機体概形
色は適当です。
基板色は白にしようかな~と思っています。
がそれも未定。
最後にここまでで苦しんだことを
- モーターが高い
- 足回り設計難すぎ
- センサー置く位置いいのかこれで?
- 吸引ファンの機構がわかんない
- 部品選定難しい
- 部品集め難しい
ちゃんと全日本に出れるのか、って不安はあるのですが頑張って作り上げたい所存です。
ではでは(^.^)/~~~
.
P.S.
改めてですが「ここおかしいやろ!」みたいな批判お待ちしております。
それと強いハーフマウサーの先輩が勧めていた「よりもい(宇宙よりも遠い場所)」、めっちゃ良いです。
観てて止まらない感じがすごい。
毎回が神回、わかる気がします。
JASALMAのプログラム解読Part6 左手法
今日は左手法についてまとめていきます。
これは多くの場合初心者が一番最初に導入する探索法だと思います!
その理由は後程。
まず左手法とはなんぞや、ってところから話していきます。
左手法とはスタートから常に左壁に沿って進んで行く、というごくごく簡単なものです。(←一番最初に導入する一番の理由!!)
メリットとしては簡単である、というところです。
一方デメリットもあります。(←このデメリットが大きい)
それが「迷路によっては永遠にゴールできない」というものです。
マイクロマウスにおいてスタートは左下(0,0)に固定されていてゴールは迷路の内側に存在しているためゴールが浮いている(?)、島になっている(?)と延々にクルクル外周し続けてしまいます。(下図参照)
どんな迷路でもゴールできるようになるには次回以降で紹介する「足立法」なりを導入する必要があるかと思います。
では以下左手法の導入についてです。
まず探索走行の大前提としてセンサーで壁の有無を調べてその情報を用いて進路を決めていく必要があります。
(ここではJASALMAの例を紹介しますがこれよりももっといい方法もあるかもしれません)
そこでセンサー値を読むタイミングを決めてしまいます。
ここではそれを区画の境界(区画の入り口)で行うものとしています。
ここで前壁、左右の壁の有無を判定します。
その結果生じるパターンは以下の4パターンであり、それぞれにおいてとる動作は決まっています。
- 左壁無し
→左折
- 左壁有り&前壁無し
→前進
- 左壁有り&前壁在&右壁無し
→右折
- 左壁有り&前壁有り&右壁有り
→Uターン
ここまでで左手法の大まかな流れが理解できたと思います。
のでここからは探索走行の実装についてまとめていきます。
(ここからの話は足立法等でも使えるものです)
まず初めの段階では区画の入り口で停止しセンサー値をよんで壁を判断する、というのがいいと思います。
以下ではセンサーを読むときに停止&超信地旋回のパターンを紹介します。
- 区画の入り口に進み停止
- センサー値を用いて進路を決定
- 90mm進み停止
- 左折or待機or右折or180°旋回(Uターン)
- 90mm進み停止(区画の入り口に進み停止)
これを実現するのに必要な動作は
- 停止状態→90mm進む→停止
- 90°右・左旋回
- 180°旋回
のみです。
とても少ないですよね!
以上のもので左手法は完成できると思います。
これが出来たらセンサーを読むときに停止しない、直進時に区画中心で停止せずスルー出来るようにするなどで速度向上を図っていきましょう!
最終的にスラロームを導入すればスタートからゴールまでノンストップで進むことができます。
センサーを読むときに止まらない、などを実装する際には方向距離のリセット(プログラム的な)のタイミングによっては適切に走れないので距離が合わない場合にはここも考えてみましょう。
(この考えはスラローム走行時のオフセットの際にも用いられる考え方です)
では、本日はここまで!
ではでは(^.^)/~~~
R
P.S.
書こう書こう思っていて遅くなってしまったのですが、先日NTFから正式発表があったようにマイクロマウスのクラス分け・名称の変更がありました。
したがってマイクロマウスを作っていた(作った)つもりだったのですがそれがクラシックマウスとなってしました。
なんとなく悲しさあります・・・
(↑マイクロマウス(旧ハーフ)やればいいじゃん!って指摘は現状受け付けてません(笑))
JASALMAのプログラム解読Part5 壁制御2
昨日に引き続きまて壁制御のお話です。
昨日書き残していた壁があるか内科の判断基準のセンサー値(閾値)と吸い込まれ吸い込まれ対策についてです。
前回の記事で左右の壁の状態によって制御量の式を変えなければならない、という話をしました。
閾値(←しきいち派です)とは壁が有るか無いか判断するために使うセンサー値の基準値になります。
つまりセンサー値がある値(閾値)よりも小さければ壁は無い、それ以上ならある、って判断をするための値です。
この値をどう設定するかも宗教によるものだと思います。
例えば区画中心のセンサー値の半分とか?(←適当に言ってみました)
僕が先輩に聞いて、実装していたのは壁を30mm遠ざけた時のセンサー値を閾値とする、というものでした。
これは後々左手法や足立法において壁が有るかどうか判断するときにも使うものです。
さて、次は吸い込まれについて書いていきます。
・・・と思ったところで壁制御について書き忘れていたことに気が付いたので順序が悪いですがここで書いていきます。
それが制御量の計算をどこでやるのか、ってところです。
これは1ms毎に割り込まれるCMTで行っています。
そして求めた制御量(速度と同じ次元になっている)をMTU割り込みのタイミングで書くモーターに代入する速度に足す形にしました。
ここまでのことで壁制御は出来ると思います。
左右に寄せて直進を走らせてみましょう!
1区画くらいで中心に戻りましたか?
それで最後に吸い込まれ対策です。
吸い込まれとは壁が急になるところや櫛(くし)を走る場合にまっすぐ区画中心をはしらずふらふらしてしまう状態です。
以下でその原因と対策方法についてまとめていきます。
まずその原因についてですがその説明のためにMice Wikiの画像(↓↓)
用いて説明します。
これは急に壁がなくなった時のセンサー値を示しています。
黒が理想のセンサー値、赤が実際のセンサー値です。
閾値はこのグラフでいうHighとLowの間のどこかに設定されていると思います。
が、赤が示すセンサー値が閾値に到達するまで壁がなくなったほうに近づいて行ってしまいますよね。
これが吸い込まれの原因です。
これはセンサー値が閾値以下に落ちるまでに1ms以上の時間がかかってしまうために生じるものです。
そのためセンサー値の急激な変化を検知した瞬間に壁制御を止めてあげればいいと思います。
なので3msや5ms前のセンサー値と現在のセンサー値でいくつずれていたら壁制御を停止、などという処理を加えてあげましょう。
何ms前、どれだけの変化で止めるか、によって吸い込まれ対策の強さを変化させられると思います。
以上で壁制御の大まかな説明は終了!
後はプチ情報的な感じでいくつか
- 旋回させているときは壁制御OFF
- 機体と前壁の距離が近くなったら壁制御OFF
- 速度が遅くなったら壁制御OFF(ないし弱める)
- etc(なんかあるかも?)
以上、今日は終わります!
ではでは(^.^)/~~~
C
JASALMAのプログラム解読Part4 壁制御
皆様お久しぶりです。
最近は次作マウスの設計に追われていてブログを書く余裕がありませんでした。
今は少しの間実家に帰っており、製作ができない状況(部室じゃないと活動できないできない病)なので1回でも2回でもブログの更新ができればと思っております。
さてさて何を書こうかって感じはすごいあるんですけどやっぱりPart3で止まっているプログラム解読をやっていこうと思います。
前回までで走行系とバッテリー・センサーの基礎は書いたつもりなので、今回のPart4で何か書こうかな~と思った結果、思いついたのは左手法でした。
が、
書いてる途中に「あ、壁制御書いて無くね?」と思いまして、「まあ次かその次かに書けばいいか」と思っていたのですがそもそも左手法を書いていた下書きが保存できておらず、きれいさっぱり無くなっていたので本来の作成順の通り先に壁制御について書いていきます。
さて前置きが長くなりましたここから本題
「マウスを走らせていて区画の真ん中を走っていない!このままじゃ壁にぶつかってしまう!」そんな風に思ったことが一度はありますよね!(←マウス初心者向けに書いているつもりです・・・)
そんな時に便利なのがこれ!
”壁制御”
(↑マウス初心者向けに書いているつもりです・・・(重要なことなので2回言いました))
じゃあ壁制御とは何か
→センサー値を用いて自身の位置(区画中心との差)を認識し、その情報をもとに区画の真ん中を走るように調整するような制御です。
この制御はPID制御の中のP制御にあたるらしい(?)ですがその辺は詳しくないので強い方かGoogle先生に聞いてみてください。
壁制御の理屈がわかったところでどのようなプログラムが必要か考えて行きます。
簡単に書いてしまえば右に寄っていたら右のモータを早く回し、左に寄っていたら左のモータを早く回せばいいってだけになると思います。
さらに言えばどれだけモータを早く回すかっていうところをセンサー値に比例して決めてあげればいい(比例(P)制御?)という話になります。
そんな中壁制御について調べていたらMice Wikiにも壁制御のページがあったことを思い出したので貼っておきます。
ここにも書いてあるようにモータの速度に式は以下のようになります。
右モータ速度=重心速度+制御量
左モータ速度=重心速度ー制御量
じゃあ次に気になるのは制御量ってどうやって求めるのか?ってところだと思います。
ので以下では制御量の求め方について記していきます。
制御量を決めるのは左右の壁に対するセンサー値である、と言いました。
一方で左右の壁の有無は両壁有or無・左右のどちらかのみ有の4パターンがありそれらは区別してあげなければなりません。
(そうでないと左壁だけ有の場合に右のセンサー値が低くなりこれを基準値に戻そうとする制御が起こりどんどん右に流れて行ってしまいます。)
そのためパターン分けしたうえで制御量を求める式を書いていくこととします。
- 両壁有
制御量=Kp*(右センサー値-右基準値)-(左センサー値-左基準値)
- 左壁のみ
制御量=Kp*(-(左センサー値-左基準値)*2)
- 右壁のみ
制御量=Kp*(右センサー値-右基準値)*2
- 両壁なし
制御量=0
さて、新しい要素が2つ出てきました。
それがKpと基準値です。
基準値は説明すつほど大したものではないですが機体を区画中心(左右に寄っていない状態)にした際の左右のセンサーの値です。
制御量の式を見てもらえればわかるようにセンサー値が基準値と一致すれば制御量が0になることから壁制御によって目指すべき場所、という意味になります(?(←日本語が上手じゃない気がする・・・))
次にKpについて。
これは単に比例定数です。
この値によって壁制御の強さを変更できます。
小さすぎるとなかなか真ん中に戻らないし、大きすぎると振動する・・・?のかな?
まあまあとにかく程よい値にする必要があると。
程よいってのがどれくらいなのかは宗教によるものらしいので「何が正解!」とかはないと思います。
(僕が聞いたのは1区画くらいで真ん中に戻れるくらい、とかって感じでした)
そう考え試してみるとKpは0.2~0.5くらいの値になるのかな~と漠然と思っています。
ただセンサー値とかにもよるので個体差大いにあり、です。
んで、あと残っているのが壁があるかないかの判断基準のセンサー値、吸い込まれ対策、とかとかを書いてあげると壁制御ができると思います。
が、
疲れたし長くなってきたので今回はここでやめて残りはまた次回にまわします。
ではでは(^.^)/~~~
Q
2017年終了のお知らせとそのご挨拶
みなさんこんばんは!
ここ数回JASALMAのソースコード解読を行っていましたが今日は大晦日ということで年末の挨拶や今年の振り返り、来年のお話を少しだけ書いていきたいと思います。
まず今年の振り返りについてです。
やはり一番大きな出来事としてはMiceに入ってしまったということでしょう。
これによって自分の大学生活が大きく変わってしまったことは言うまでもありません。
(Miceに入っていなければ22時過ぎまで大学に残るような日々を送ることはなかったでしょう)
そのせいで1年目からマウスを完成させ、やりつくしたとは言えないものの完走させることができました。
あれはほんとに嬉しかったし、やってよかった!と強く感じた瞬間でした
同時に、沢山教えてもらったり助けてもらったりと先輩への感謝も感じた一年でした。
来年は自分もそうゆう先輩になりたいな、と思います!
さらに言えば基礎工生なのに部長に就任してしまいました。
経験が少ないですし技術的にはなにも教えられない部長になる気がしますが残り11ヶ月程の任期、一生懸命頑張っていこうと思います(`・ω・´)ゞ
次に(?)来年の話を少々
Miceの部長としては今年の先輩方と同様に新歓やプチ大会の開催などなどやらなきゃいけないことがたくさんあります...
さらに来年は理科大がマウス合宿担当ということで・・・
幹部共々なんとか成功させなきゃな、と思っております。
ので皆様の参加を心よりお待ちしております。
個人的な話としては新作をしっかり完成させてある程度の記録を残したいなと思っております。
負けたくない相手もいますしね
とりあえず早く設計を終わらせなきゃというところです。
わからないことだらけなので先輩方、沢山話を聞かせてください!
んー、話したいことはそれくらいですかね?
あとは兼サーしているテニスサークル(GRASS)のほうでも役職を持っているのでそっちも頑張らなきゃと思いつつ・・・
あー、なんとも忙しい一年になりそうです。
学業もおろそかにしないよう、落単しないように気を付けたいと思います。
それではみなさん今年一年間大変お世話になりました!
平成30年もよろしくお願いします!
ではでは(^.^)/~~~
R
JASALMAのプログラム解読Part3 センサーとバッテリー等々のその他&走行系の補足
こんにちは。
もう年の瀬ですね...
もうほんと早いな~と思いながらこんな話はまた明日、大晦日に残しておこうと思います。
さてさて、今回のブログではプログラムの細かい部分と走行系の補足についてです。
まず補足から行きましょう。(今後もまた何か思い出したら随時補足していきます。)
その中で任意の距離を走れるようになる!、という話をしたと思います。
そのためには基準となる点(区画の中心や境界)で走行距離をリセットするのがポピュラーなやり方なんじゃないかと思います。
このリセットのタイミングについて言及していなかったのでここで記していきたいと思います。
何も考えずにやるなら走り始めるタイミングでリセットをかける人が多いと思います。
(↑個人の独断と偏見)
ですが後々のことを考えると走行が終わったタイミングでリセットをかける(基準の点を出る時ではなく、到達した時)ようにしておいたほうがいいと思います。
これに関しては後々ある動きを実装しようとしたときに幸せを感じられるものだと思います。
のであえて理由は書かないでおきます。
さあ、いよいよ本題(?)の細々した部分について書いていきます。
まずはセンサー関連について、主にチャージ発光についてです。
(※書いてるのが雑魚なので詳しく知りたい人は自分で調べるかもっと強い人に聞いてみましょう)
(Miceの標準回路を使用していれば)センサー周りの回路内にLEDと並列でコンデンサがあると思います。
センサー用のLEDを点灯させる際はこのコンデンサに充電してあるエネルギーを使用しているらしいです。
そのため点灯からの時間によってその明るさが・・・変わる・・・?(ホンマか?)
つまりセンサーの値を取得する(AD変換する)際には1つづつ行う必要があります。
またチャージ発光とは少し違う話になりますがセンサー値の外乱を取り除く方法について記していきます。
この処理をしないと機体を180度回転させるだけで値が100ほどずれる場合もあるので是非行いましょう。
さて、外乱を取り除く方法ですがこれはLEDが点灯している時のセンサー値から消灯している時のセンサー値を引けばよいでしょう。
以上の2つを考慮してLED1つ1つを順々に”点灯→AD変換→消灯→AD変換→(次のLEDを点灯)”を行えばいいと思います。
また点灯からセンサー値が変化するまでにはラグが存在するのでその対策は忘れないようにしましょう。
JASALAMAではこれらの処理をCMT割り込みで行い、1ms毎にセンサー値の取得を行っておりました。
全日本大会の3日前までこの処理をしておらず(上手くできておらず)壁制御もセンサー値も安定していませんでしたがこの処理をしてから色々と安定し幸せになることができました。
なので是非
みんなには幸せになってほしい
と思う今日この頃です...
次にバッテリーの電圧測定についてです。
マイクロマウスで多く用いられているリポ(リチウムポリマー電池)は軽量、高電圧、大容量などとても優れた電池でドローン(マルチコプター)などにも用いられています。
一方でやばいことをしてしまうと発火してしまうなど、大きな危険性も孕んでいます。
やってはいけないこととして以下のようなものがあげられます。
- 過充電はしない
- 過放電はしない
- 保管中にショートしないようにする
- 充電は安全な場所で目を離さないように
- 充電終了後or異常が確認されたらすぐ充電器から外す
- 使用していないときには丈夫なケースに入れて保管する
以上より、動作中に起こりうるやばいことは過放電です。
そのためマウスでバッテリーの電圧を読んであげる必要があります。
標準の回路図を用いていればバッテリーを抵抗で分圧させてその電圧がマイコンに入力されているはずです。
つまり分圧のために用いている抵抗の値がわかればマイコンからバッテリーの電圧が読めるはずです。
そのために・・・
はんだ付けする前に分圧に使う抵抗の抵抗値を測定しておきましょう!
それさえやっておけばAD変換とその抵抗値を用いて電圧が読めるはずです。
それで電圧が読めるようになったらどうするか?
→ある値以下の電圧を示した段階で動作を終了し充電させる
この基準となる値に関しては詳しくないし適当なことも言えないのでもっと強い方に聞いてください。
JASALAMAでは電源を入れた時とモードを選択したときに10.9V(?)以下となっていたら無限ループに入るようなプログラムとなっています。
これで電圧が降下してきたら動かなくなるのですぐにわかります。
なのでリポはこのような形でなくてもいいですが過放電を起こさないような対策をしてから使うようにしましょう。
では今日はここらへんで失礼します。
何か指摘等あればお待ちしてます。
(^.^)/~~~
F
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)
なんだかとてもぐちゃぐちゃした説明の記事となってしまいましたが今日はここで終了とします。
次は走行系で書き忘れてたことがあればそれを書くか、センサー(チャージ発光)か左手法あたりを書こうと思ってます。
ここまで汚い文章をお読みいただきありがとうございました。
(^.^)/~~~
.