Monthly Archives: December 2018

マイクロマウス研修(kora編)[12]自律走行の解説

こんにちは。koraです。

ジャイロやエンコーダの値を反映してマウスを自律走行をできるようにしたいので、今回はサンプルプログラムでどのようになっているのか確認します。

サンプルプログラムの確認
割り込み

まず、サンプルプログラムStep7のinterrupt.cファイルのint_cmt0関数を見てみましょう。これはタイマ割り込みによって1msおきに実行される関数です。最初のif文によって、グローバル変数run_modeごとに、実行される内容が異なることがわかります。
簡単のため、まずはrun_modeがSTRAIGHT_MODEの場合に着目します。これは台形加速(一定の加速度で加速した後、一定の速度で走行し、最後に一定の加速度で減速する走り方)で直進するモードです。

1.目標速度生成

目標速度tar_speed [m/s]に加速度accel [m/s^2]を加算して、徐々に加速します。ちなみに、加速度accel [m/s^2] を1000で割っているのは、この処理が1秒間に1000回実施されるからです。

2.横壁センサによる目標角度生成

壁制御をONに設定している場合、割り込みint_cmt1関数で更新される光センサの値sen_r.value、sen_l.valueをもとに、目標角速度tar_ang_vel [rad/s]を生成します。なお、右壁が無い場合sen_r.errorに0が、左壁が無い場合sen_l.errorに0が入るので、両壁が無い場合は壁制御の影響が無くなります。

3.目標速度と目標角角度の積分

I_tar_speedとI_tar_ang_velは、それぞれ目標速度の積分値と目標角速度の積分値です。積分値が大きくなりすぎないようになっています。

4.目標速度の偏差から出力電圧にフィードバック

目標速度と現在の速度の差、および目標角速度と目標角速度の差をもとに、PID制御で出力電圧を計算しています。

5.出力電圧からモータの回転方向を決定

モータドライバには、回転方向と電圧をそれぞれ別に指定する仕様になっているので、計算した電圧をもとに反映します。

6.出力電圧の制限

出力が大きくなりすぎてモータやモータドライバが壊れないように、出力電圧に制限をかけています。

7.モータへ出力

最後に、計算した電圧を出力に反映します。出力電圧とバッテリー電圧に対する比に、240を掛けた値をPWMに設定します。

以上をまとめると、加速度accel [m/s^2]と最高速度max_speed [m/s]を指定すれば、随時目標速度tar_speed [m/s]が計算され、それに追従するようモータの電圧が制御されます。また、壁があればそれに沿って進むための目標角速度tar_ang_vel [rad/s]が計算され、それに追従するようモータの電圧が制御される、というプログラムになっています。

走行の設定

では、accelとmax_speedをどのように設定するのか調べるため、run.cの中身を見てみましょう。straight関数とturn関数が用意してありますので、straight関数に着目します。

1.グローバル変数に値を代入

積分値のリセットや、走行モードの設定など、制御に使用するグローバル変数の設定をしています。

2.モータ出力をON

モータ出力をONにすると、int_cmt0関数の制御がマウス本体に反映されます。
なおこれ以降は、直進の最後に停止する場合と停止しない場合に分かれていますが、とりあえず停止する場合を考えます。

3.加速、定速走行

細かい制御はint_cmt0の割り込みでされるので、straight関数では減速が開始されるまで待機するだけです。目標距離len_target [mm]と現在距離len_mouse [mm]の差が、減速に必要な距離より大きい間、whileでループします。(少し補正してlen_targetを-10しています。)ちなみに減速に必要な距離は、なつかしの等加速度運動の公式 v1^2 – v0^2 = 2*a*xから計算します。(v1がtar_speed、v0がend_speed、aがaccel、xが求めたい距離です。)

4.減速

加速・等速走行のwhileループから抜けたら、加速度accel [m/s^2]を反転して減速を開始します。減速も細かい制御はint_cmt0任せです。目標距離len_target [mm]が現在距離len_mouse [mm]より大きい間、whileでループします。(少し補正を入れてlen_targetを-1しています。)
ただし、目標距離に届く前に速度が0になってしまうと、いつまでたってもループから抜け出せなくなるので、最低速度 MIN_SPEED を下回らないように補正しています。
そして目標距離に達したら、今度は速度speed [m/s]が0になるまでループです。

5.終了処理

以上で直進が終了します。

次回

自律走行で直進する流れがわかったので、次回は実装して走らせてみたいと思います。

続きを読む ›

Posted in DCマウス研修


shotaのマイクロマウス研修8[2018年の振り返り]

こんにちは、shotaです。

社員研修として、弊社が販売するマイクロマウス[Pi:Co Classic3]を動かしています。

前回は全日本マイクロマウス大会の結果について書きました。

[前回の記事はこちら]

 

今回は2018年度のマイクロマウス活動を振り返ります。(10月から始めたので2か月だけですが・・・)

まず、大会直前にやったこと/実装した機能の反省です。[詳しい内容はこの記事にまとめています]

その後、2カ月全体の振り返りをします。振り返りにはKPTを使います。

KPTはプロジェクトを振り返るための手法の一つで、

  • Keep(成功しておりこれからも継続すること)
  • Problem(問題があり改善が必要なもの)
  • Try(問題解決のために挑戦すること)

を軸に活動を分析します。

[KPTとは]

 

大会直前にやったことの振り返り

大会直前にやることリストを作成したので、ドタバタしたマウス作業になってしまいました。(反省)[こちらを参照]

次回からは、余裕を設けてやることリストを作成したいです。

全日本大会の申し込みをする

大会2週間以上前に申し込みできたのでOK。

running_maze_Dataflash_usbをベースに新規作成

壁情報をフラッシュメモリに保存できたのでOK。探索走行を終えた後にマウスの電源を切ることができると、心が穏やかになります。

Git管理を開始する

管理を開始できたのでOK。WindowsのGit環境に慣れていないので、使いやすい環境を用意するか、Linuxでマイクロマウス作業ができるようにしたいです。

探索・最短走行中断処理を入れる

走行中にボタンを長押しすることで、走行モードを抜ける処理を追加しました。しかし、探索を中断する直前の壁情報を消す機能は未実装なので、次回に取り入れます。

ゴール座標設定モードを追加

ボタン操作でゴール座標を変更できたのでOK。プログラムを書き直さなくてもいろんな迷路で練習できるようになりました。

直線走行_最高速度・加速度設定モードを追加

速度・加速度をそれぞれ5段階で変更できるようになりました。残念ながら大会本番では走行に失敗したので、速度・加速度を上げることはできませんでした。

センサ閾値半自動設定モードを追加

ボタン操作でセンサ閾値を設定できるようになりました。しかし、全日本大会ではセンサ閾値を変更すると走行に失敗するようになりました・・・バグがあるかもしれないのでプログラムを見直します。

探索時、既知の区間を走るときは加速度を上げる

既知区間加速は、今やるべきことではない。

 

続きを読む ›

Posted in Pi:Co Classic3 製作記, ブログ, 研修


マイクロマウス研修(kora編)[11]光センサの利用

こんにちは。koraです。

今回はHM-StarterKitの光センサを使えるようにします。

AD変換の準備

HM-StarterKitには、壁を検出するための4つのLEDと4つの光センサが搭載されています。それぞれの光センサに対し、壁から跳ね返ってくる光量を電圧に変換して出力しています。電圧をマイコンから読み取るためにADC(Analog to Digital Converter)という機能を使います。ADCでは、リファレンス電圧である 3.3V と 0Vを基準として、電圧を12bit(0~4095)の値に変換します。

init.c

サンプルプログラムのStep7からio_init関数とsensor_init関数をコピーして、自作プロジェクトのinit.cのinit_all関数から呼び込むようにします。io_init関数は、光センサとセットになっているLEDの初期設定です。

mh_hm_starterkit.c

Step3のmain関数の一部をコピーして次のようにします。

AD変換のテスト

TeraTermで出力されたセンサー値を表示すると、次のようになります。


壁なしの値


壁ありの値

ちなみに、HM-StarterKitはバッテリーの電圧もAD変換で測定できるように配線されていますが、バッテリー電圧がマイコンの動作電圧の3.3Vより高いので、抵抗で分圧して半分にしてから読み取るようになっています。

AD変換を割り込みで利用する

前回ジャイロセンサとエンコーダをタイマ割り込みで処理したように、今回も一定間隔でAD変換を行い、壁の情報を更新するようにします。

intprg.c

以下を追加します。

そして、void Excep_CMT1_CMI1(void){ } を次のように書き換えます。

mytypedef.h

新しくファイルを作り、壁の情報を保存する構造体を作ります。

interrupt.c

先ほど作った構造体をインクルードします。

また、サンプルプログラムのStep7からint_cmt1関数をコピーします。なお、int_cmt1関数の割り込みは4kHzで発生しますが、その都度4つのセンサうち1つを読んでおり、トータルでは1kHzで更新しています。

glob_var.h

光センサ用と電源監視用のグローバル変数を追加します。

portdef.h

光センサのLEDを操作しやすいように次のマクロを追加します。

paramters.h

センサ関連のパラメータを追加します。
マウスが壁に近づけば光センサの値は大きくなり、逆に遠ざかれば小さくなります。これを利用して迷路の壁を頼りに走行を制御することを壁制御といいます。REF_SEN_R・Lは、マウスが迷路の中央を走るために参照します。TH_SEN_R・L・FR・FLは、マウスの右・左・前に壁があるか判断するための閾値です。CONTH_SEN_R・Lは右壁・左壁を壁制御に反映するかどうかの閾値です。今回の例では壁があると判断したら即、壁制御に反映するようになっています。

実際走行する際には、これらの値を環境に合わせて調整します。

init.c

サンプルプログラムのStep7からinit_parameters関数をコピーします。ここではparameters.hで指定したパラメータを光センサ用の構造体に代入しています。

また、忘れずにinit_all関数からinit_parameters関数を呼ぶようにします。

my_hm_starterkit.c

テスト用にmain関数を次のように書き換えます。

割り込みのテスト

実行した結果をTeraTermで表示すると次のようになります。右・左・右前・左前の光センサの値がそれぞれTH_SEN_R・L・FR・FLで指定した値より大きければ、壁の有無を1・0で出力します。

次回

ジャイロ、エンコーダ、光センサの値を読み込めるようになりました。これでマウスの自律走行が可能になります。次回はこれを実装したいと思います。

続きを読む ›

Posted in お知らせ


shotaのマイクロマウス研修7[Pi:Co Classic3 全日本大会に出場]

こんにちは、shotaです。

社員研修として、弊社が販売するマイクロマウス[Pi:Co Classic3]を動かしました。

前回は、マイクロマウス全日本大会に向けてやることリストを作りました。

[前回の記事はこちら]

今回は全日本大会の結果を書きます。やることリストの反省は次回書きます。

 

全日本大会に出場しました

2018年12月1日、2日に開催された[第39回全日本マイクロマウス大会]に出場しました。

競技者はゼッケンをつけます。私はB競技台の7番目に走ります。

初日は会場で練習できます。会場が明るいのでセンサ値が心配でしたが走行できました。本番も期待できそう・・・

練習後はマウスパーティに参加しました。ものすごい人数と料理の数です。

マウスパーティ恒例の田代杯です。ハーフマウスを走らせるイベントです。

シンプルに見えるけども、エンコーダの誤差が蓄積するので意外と難しい迷路(通路)。

 

2日目が大会本番です。クラシックマウスのB競技台で走行しました。

クラシックマウス競技では5分間で5回までマウスを走らせます。私のPi:Coはこのように走りました。

  1. 迷路探索
  2. 最短走行(失敗)
  3. 最短走行(失敗)
  4. 最短走行(成功
  5. 時間切れのため走行なし

ギリギリセーフで最短走行を成功できました。結果は30.8秒です。A競技台では5秒台で迷路を走行しています。それと比べるとまだまだ改善できそうです。

大会の動画はこちらでご覧頂けます。

大会の結果はこちらに記載されています。

[マイクロマウス2018大会結果]

これからの活動について

大会も終わったので研修も終わり・・・ではなく、むしろここからが研修の本番です。2019年の大会に向けて、例年通りDCモータを使ったオリジナルマウスを作成します。

ハーフマウスにするのか、クラシックマウスにするのかは決まっていません。まずは、今回の大会を反省して、良かった点や改善点をまとめようと思います。

 

続きを読む ›

Posted in Pi:Co Classic3, ブログ, 研修


DCマウス研修(inukai編)[23] マイクロマウス全日本大会

こんにちは!
inukaiです。

タイトル通りマイクロマウス全日本大会に参加してきました!
試走会や懇親会など大会の雰囲気はこちらから。

まずは試走会ですが、探索走行はできたもののなかなか最短走行ができない状態でした。
社内の迷路と大会の迷路では迷路の塗料の違いからかタイヤのグリップ変わっており、調整しておいたMAXのパラメータではターンで滑ってしまいます。

吸引力を増やしてグリップを稼ごうとするも、ジャイロにノイズが乗ってしまいそちらもうまくいきません。
(吸引ファンの出力は、電源の容量やノイズ、振動によるジャイロのノイズを考慮して抑えて走っていました。)

走行しているうちに試走会も終わりが近づいてきたころ、最後の試走で左後側のホイールとスパーギアが外れるというトラブルが発生。

ギアをよく見ていると削れているのが確認できます。

試走会の失敗で壁に衝突を何度かした時にタイヤがロックしてギアに負担がかかっていたようです。

懇親会の後、宿で予備パーツに交換をしました。

以前のこともあり念のためピニオンギアも一度外して再圧入の上接着しました。

宿で再度組み上げおよび調整を行い大会に備えます。

そして大会当日。
結果としては、15.063と無事最短走行をすることができました。
ただ非吸引での記録となり、吸引での最短走行は失敗してしまいました。

一回だけ吸引で走り切ったものの時間オーバー、時間を縮めることができたものの準備してきたパラメータは出し切れず。

とはいえ地区大会でできていなかった最短走行ができ、無事研修として区切りをつけれたかと思います。
今後は、機体について簡単にまとめて研修はいったん終了すると思います。
前日の故障や速度を出し切れなかったことなど悔しい気持ちもあるので、来年は本機体を改良して個人的に出場したいです。

ちなみに大会の様子は下記リンクの動画からご覧いただけます。
(リンクはクラシックマウスのB競技台の午前です。リンク先のチャンネルに午後の部やA競技台もあります。自分の走行は12:30程度から)

それではまた次回!

続きを読む ›

Posted in DCマウス研修, DCマウス研修(吸引編), 研修


マイクロマウス研修(kora編)[10] 全日本マイクロマウス大会

こんにちは。koraです。

今回は、12月1日から2日にかけて東京工芸大 厚木キャンパスで開催されました「第39回全日本マイクロマウス大会」の報告です。

大会1日目

1日目は試走会です。選手控室と会場に練習用のフィールドが設置してあり、何度かトライさせていただきました。会場でマウスを落っことしてしまったり、気が付いたらセンサが曲がっていたりして焦る場面はありましたが、少しの調整で復活してくれました。HM-StarterKitの設計者曰く頑丈さを重視して作ったそうで、ここで頑丈さをいかんなく発揮してくれたことに感謝です。

 

試走会の後の懇親会では、マイクロマウスの全国大会の熱気を感じながらおいしい料理をいただきました。エキシビジョンの田代杯にも挑戦したのですが、本番会場と照明環境が大いに異なることもあって苦戦してしまいました。初めてのフィールドでも即走れるように、環境光の影響を極力下げたり、その場でキャリブレーションといった対策を将来的に盛り込んでいきたいです。

大会2日目

2日目、いよいよ本番です。

ちなみに今年のマイクロマウス競技はファイナルとセミファイナルに分かれて行われました。地区大会で3ポイント以上獲得した方、あるいは入賞された方がファイナルへ出場することになっていたそうです。私は11月の記録会でかろうじて出場権を得たばかりなので、セミファイナルへの出場となりました。

選手控室の練習フィールドでは光センサの動作が安定せず、一抹の不安を残しての挑戦でしたが、本番フィールドでは当初の不安はなんのその、安定した動作で時間内に5走を走り切りました。

 

1走目:探索+戻り探索
2走目:最短走行
3走目:重ね探索
4走目:最短走行
5走目:速度を上げたパラメータで最短走行

結果として、セミファイナル2位の記録を残すことができました!

一方、ファイナルは観客席の後ろから眺めるだけでしたが、非常にレベルの高い走りを見せていただきました。32×32マスのフィールドで探索自体が難しいにもかかわらず、安定した探索と目にもとまらぬ最短走行で、これがいわゆる宇宙人かと圧倒されてしまいました。来年の大会ではキットではなくハードウェア自作に挑戦したいと考えているので、少しでも追いつけるよう大いに参考にしたいと思います。

続きを読む ›

Posted in DCマウス研修