Monthly Archives: November 2019

Pi:Co製作(マイクロマウス研修)Part8(宇野)

前回のジグザグ走行でたまに反対に曲がる原因を調べる為に色々弄っていたら、

逆に悪化して元に戻せなくなってしまったので

このままさらに調整して直して行く事にしました。

これ(↑)が諸悪の根源です。

比較的帰りに逆曲がりする事が多い気がします。

ズレの蓄積で誤動作すると思われるので、細かい数値調整で改善を模索していましたが

いくらやっても良くなった感がなく、ちょいちょいぶつかるので一度動画を撮り

何度も見返して、どこが悪いかを考えてみました。

移動距離をこれまで弄っていましたが、こうやって見ていると

毎回不安定な動きをするのは曲がる時のスピードが速い様な気がしてきました。

 

という事で、スピードを落としつつ細かい調整をしていこうと思います。

軽く弄った現段階でもまだぶつかってないので(動きはまだ安定しませんが)

この方向性での調整を続けます。

 

続きを読む ›

Posted in Pi:Co Classic3 製作記


マイクロマウス研修(kora編)[37] STM32F7のFlashにマップデータを保存する

こんにちは。koraです。

前回までの投稿で迷路探索ができるようになりました。今回は迷路の壁情報をFlashメモリに書き込む方法についてまとめます。
マイコンのRAMに保存されている情報は電源を切ると消えてしまいますが、Flashメモリに保存しておけば電源を入れなおした後でも読み込むことができます。

STM32のFlashメモリの基本的な使い方は、idさんのブログを参考にさせていただきました。

STM32F7のFlashメモリについて

私のマウスはSTM32F7を使用しているので、公式のマニュアルを参照します。68ページ目にFlashのSector表が記載されていました。STM32F732には、全部で7つのSectorがあり、Sector 0~3は16Kbyte、Sector 4は64Kbyte、Sector 5~7は128Kbyteのサイズになっていることがわかります。

ただし、どのSectorでも自由に使えるというわけではなく、Sector 0にはシステムによって割り込みベクタテーブルが配置されるそうです。なので、Sector 1にマップデータ、Sector 2以降に実行プログラムが書き込まれるようにリンカスクリプトを編集します。

リンカスクリプト

STM32CubeMXとSW4STM32を使った環境では、プロジェクトディレクトリの直下にある.ldファイルがリンカスクリプトです。

MEMORYコマンド

リンカスクリプトではMEMORYコマンドでメモリ領域を定義しています。デフォルトではRAM領域とFLASH領域のみ定義されていますが、まずこの部分を変更します。
RAM領域はそのまま、新たにFLASH_SECTOR0とFLASH_SECTOR1を追加します。また、元のFLASH領域の開始アドレスをSector 0の0x80000000からSector 2の0x8008000に変更し、領域のサイズを512Kから480Kに変更します。

SECTIONコマンド

次に以下のSECTIONSコマンドを変更します。

.isr_vectorは割り込みベクタテーブルを表していて、STM32CubeMXで生成されたコード内で定義されています。先ほどFLASH領域をSector 2~7に変更したので、割り込みベクタテーブルがSector 0に配置されるようFLASHをFLASH_SECTOR0に変更します。

.backup_flashが今回マップデータを保存するセクションです。これをFLASH_SECTOR1に配置します。また、_backup_flash_startという変数にこのセクションの開始アドレスを代入します。この変数は実際にFlashへ書き込む際に使用します。

マップデータの書き込み・読み込み

大まかな流れは次の通りになります。ソースコードはidさんのものとだいたい同じになるのでここでは割愛します。

書き込みの流れ

  1. あらかじめRAM上にマップデータ受け渡し用の領域を確保しておく
  2. マップデータをRAM上の一時領域に展開
  3. HAL_FLASH_Unlock関数でFlashの制御を許可
  4. HAL_FLASHEx_Erase関数でFlash上の指定Sectorのデータを消去
  5. HAL_FLASH_Program関数でRAMに展開されたマップデータをFlashにコピー
  6. HAL_FLASH_Lock関数でFlashの制御をロック

読み込みの流れ

  1. memcpy関数でFlash上のデータをRAM上の領域にコピーする
  2. コピーしたメモリから、マップデータの構造体に落とし込む

おわり

これで探索後のマップデータを保存できるようになりました。電源を入れなおしても重ね探索や最短走行にトライできるので、かなり便利になりました。

続きを読む ›

Posted in DCマウス研修


マイクロマウス研修(しおたに)その8[滑らかに曲がる⑤]

こんにちは、しおたにです。

前回、最短走行で等速円運動スラロームを試し、信地旋回と比べ大幅にタイム短縮できました!
一見滑らかに曲がれているしこれで終了…とはいきません。

等速円スラローム中の角速度変化をグラフにすると下図のような感じになります。

モータにへの速度指令はこんな感じです。

実際にはこの通りに速度変化はできません。摩擦や慣性が働いているからです。

身近な例でいえば自動車は止まった状態から急に100km/hで動くことは出来ません。
目標の速度めがけて徐々に加速するしかないのです。

角加速度変化をみるとこの通り

スラローム前後で一瞬無限大の入力(インパルスな入力)になっていることがわかります。

つまり現状ではモータに無理を強いて曲がっていることになります。
Pi:Coはステッピングモータを搭載していますので、急激に速度を変えると脱調します。
また、加速度が大きいためタイヤがスリップしやすく、走行経路の誤差が大きくなります。

これを解決するのが台形加速です(下図)。

ご覧の通り角速度を台形状に変化させて加減速します。
時間をかけて加減速するため角加速度の変化も抑えられます。

モータへの速度指令はこんな感じです。

これで曲がれば今までより無理なく滑らず曲がれるはず…
今後はこの台形加速を使ったスラロームを試していきます。

今回はここまで。

 

そういえばスラローム、スラロームとよく言っていますがこれは蛇行走行など指す言葉で、正しくは緩旋回(かんせんかい)と言うそうですね。
マイクロマウス界隈ではスラロームのほうが伝わるみたいですので私はこのままいきます。

ではまた次回。

続きを読む ›

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


shotaのマイクロマウス研修26 九州・中部地区大会に参加しました(写真多め)

こんにちは、shotaです。
社員研修として、オリジナルマウスを製作しています。

[前回の記事]では、ようやくマウスが完成しました。
筐体ができただけで、プログラムは書いてません。

そして今日の記事では九州地区大会・中部地区大会に参加し、全国大会出場権を獲得したことを書きます。

※マウス製作記事と大会報告記事には2,3ヶ月ぐらい時差があります。

続きを読む ›

Posted in DCマウス研修, ブログ, 大会情報, 研修


Pi:Coで斜め走行する – 元Web屋のマイクロマウス製作記 Part.10

ししかわです。

社員研修の一環で、マイクロマウスキット「Pi:Co Classic3」を使ってマイクロマウスの大会に出場します。

全日本大会に向けて、マイクロマウスの「斜め走行」を実装中です。

ベースの部分が実装できたので、走っている様子の動画とともに紹介します。

斜め走行とは、図のように右旋回と左旋回が交互に連続する区間を斜めに直進する走り方です。

最短経路走行をより速く走るためには必須の課題です。

まずはうまく走れた動画を見てください!

※走る前にメロディを鳴らしているのはデバッグ目的です(走行パターンに応じて違う音を出しています)。

開始直後の右旋回→左旋回を斜め45度で走行できました。

斜め走行をするために、Pi:Coのサンプルプログラムを元に次の3つの実装を加えました。

  • 走行パターンを最初にまとめて生成する処理
  • 走行パターンを変換する処理
  • 新しい走行パターン(45度旋回)について走行する処理

走行パターンを最初にまとめて生成する

Pi:Coのサンプルプログラムでは、ゴールまでの経路を逐次計算しながら「直進して左右どちらかに曲がるまでをループ処理」しています。
言い方を変えると、「曲がるまで次の経路がわからない状態」で走っています。
一方、斜め走行するためには「右旋回、左旋回、右旋回…」が交互に連続していることを先に知る必要があります。

そこで、ゴールまでにどのように走ればよいかの走行パターン情報を、最初にまとめて生成します。

簡単な例として、次のような一本道の迷路を考えます。Sがスタート、Gがゴールです。

この迷路の最短経路を「半区画直進」と「左右90度緩旋回」の走行パターンで表現すると次のとおりになります。

走行パターンを変換する

次に、生成した走行パターンを変換して、斜めを含む効率良い走行パターンに変換します。
たとえば「直進、右90度、左90度、直進」のパターンに一致した箇所を「右45度、左45度」に置き換えます。

このとき変換対象の前後に直進を含めているのがポイントです。
「右90度」の区画に入ってから斜めに曲がり始めても、マウスが斜め走行のセンターラインに乗らないため、半区画前から余裕を持って旋回を始めます。

 

右45度と左45度の間に直進を挟めば、斜め走行のパターンが完成します。

余談ですが、90度旋回も次のように「大回り90度旋回」に変換できます。

半区画前から曲がり始めることで旋回半径を大きくでき、その分スピードを落とさず曲がれます。

新しい走行パターン(45度旋回)で走行する

「45度旋回」や「大回り90度旋回」の走行パターンに対応する走行処理を実装します。

以前作ったスラロームシミュレータ(koraさんの記事を参照)を使って、目的の場所、角度へ向かって走るための角加速度などを算出します。

今回紹介した走行パターン以外にも、自在に斜め走行をするためには「斜め135度旋回」「斜め90度旋回」を追加する必要があります。
(こちらは未実装。大会までにがんばります。)

詳しくは「マイクロマウスで始めよう ロボットプログラミング入門」p.198 「斜め走行」を参照ください。

ここまでで最小限の斜め走行ができるようになりました。

これから大会までに、他の走行パターンの実装と調整を進めていきます。

目下の課題として、斜めに曲がるタイミングがかなりシビアです。
Pi:Coは元々機体が大きめなこともあって、少しでも曲がる位置がずれると柱にぶつかってしまいます。
これに対して旋回時や斜め直進時もセンサ値をもとにモータの制御をするなど考えられますが、
限られた時間で何を優先するかは悩ましいところです。

多分来週はブログ投稿無しで、大会向けの調整に集中します。
全日本大会でお会いしましょう!

続きを読む ›

Posted in Pi:Co Classic3


Pi:Co製作(マイクロマウス研修)Part7(宇野)

今回は等速円運動スラロームが出来る様になったので

調整に入ったお話しをします。

 

今まで通りの走行スピードで試走すると

どうも良い具合に走らなくて、変なぎこちなさが残るので

基本スピードと旋回スピードを上げてみると少し噛み合ってきました。

しかし安定感がなく毎回違うズレが発生するので、

微調整しても誤差で良くなったのか判らないという状態に陥りました。

 

こうなると下手に詰めても進まない気がしたので、

気分転換に最短走行に等速円運動をそのまま入れてみました。

すると、曲がらず真っすぐ突っ込む現象が再発しました。

通常の探索では曲がるのに、なぜ最短に入れると曲がらないのか

 

という謎をしばらく探っていましたが、解った結果としては

等速円運動前の短い直進での目標速度(変数)が一定以上じゃないと曲がらない

というものでした。

 

曲がるようになったは良いのですが、直線の距離によりスピードが違ってくるので

ほぼほぼまともに曲がれず、ある程度ちゃんと走るには色々弄る必要がありそうです。

 

と、この段階で気分転換を終了し、探索モードでの等速円運動を再開しました。

それなりに調整しても中々安定したとは言えないバラつきを見せていたのですが

何故か

この様な櫛だけ綺麗な位置で纏まる謎現象が起きています。

 

これはどちらかと言うと良い事なので問題ないのですが

1つよろしくない現象が起きて原因を探っています。

迷路がジグザグの場合、途中で反対方向に曲がり壁にぶつかってしまいました。

再現性は高くないようですが、どこが悪いのか各所見直しが必要そうです。

 

続きを読む ›

Posted in Pi:Co Classic3


マイクロマウス研修(しおたに)その7[滑らかに曲がる④]

こんにちは、しおたにです。

これまで、その5でタイヤのゴムズレ対策をし、その6でパラメータ調整を行ったので、以前より安定して曲がれる機体になったと思います。

今回は等速円運動スラロームを試してみます。

等速円運動スラロームとは速度を変えずに円弧を描きながらカーブを曲がるスラローム走行です。
ざっくり説明すると、外側のタイヤの速度を速く、内側のタイヤの速度を遅く指定することで曲がります。

こちらに詳細にまとめられています。

参考にさせていただきました。

どれくらい速く/遅くすればよいかというと、外側のタイヤと内側のタイヤの旋回中心を一致させるようにすればOKです。

 

今回はロボット中心の旋回半径を60mm、中心速度が400mm/sになるように曲がることにします。
まず、旋回半径をr、円弧の接線方向の速度をvとし、角速度ωを求めると
式は ω=v/r
ω = 400/60 = 6.6666… ≒ 6.67[rad/s]
となります。

 

次に各タイヤの速度を求めます。
トレッド幅は67.7mmなので、外側のタイヤの旋回半径は60+67.7/2[mm]、内側は60-67.7/2[mm]となります。
この旋回半径と角速度から外側のタイヤ速度Voutと内側のタイヤ速度Vinを求めると、
式は v = rω
Vout = 93.85*6.67 ≒ 626[mm/s]
Vin = 26.15 * 6.67 ≒ 174[mm/s]
となります。

 

また、移動距離はロボット中心が描く円弧長なので
2π*r*90[°]/360[°]
から
2*π*60*1/4 ≒ 94[mm]
になります。

 

続きを読む ›

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


shotaのマイクロマウス研修25 基板発注と実装とアートワーク作業の振り返り

こんにちは、shotaです。
社員研修として、オリジナルマウスを製作しています。

[前回の記事]では、GitHubを使用した大会振り返り方法について書きました。

[前々回の記事]では、アートワークが完了しました。
今回はアートワークの最終記事です。

部品実装の話と、大反省会です。

続きを読む ›

Posted in DCマウス研修, ブログ, 研修


マイクロマウス研修(kora編)[36] 迷路探索

こんにちは。koraです。

前回はモーター制御を実装して、軌道に追従できるところまでやりました。今回は実際に迷路を探索させてみます。

軌道生成

探索中は、1区画ごとに「直進」あるいは「90度スラローム」の軌道を生成して迷路内を走ります。複数区間をまたがるような複雑な軌道を作ることも考えられますが、今回は確実に完走することを目指してこの2つだけに限定しました。

ちなみに「直進」の場合は角速度ゼロで直進方向のみ台形加速、「90度スラローム」の場合は一定速度で角速度のみ台形加速にします。

迷路探索

探索アルゴリズムは足立法を実装しました。ソースコードはHM-StarterKitのサンプルプログラムを参考にしています。

これで1区画ごとに、

  1. 壁を認識
  2. マップを更新
  3. 次の軌道を決定
  4. 軌道に追従
  5. (以下ループ)

という順でプログラムが実行されるようになります。

テスト

軌道追従のパラメータとモータ制御のパラメータを調整して、実際に迷路を探索させてみた動画です。
4×4の小さな迷路ではありますが、ゴールして戻ってくるまで動いてくれています。
本番の大会に向けて、もっと速度と安定性を上げていきたいと思います。

続きを読む ›

Posted in DCマウス研修


Pi:Co製作(マイクロマウス研修)Part6(宇野)

今回タイトルに音編がついてない通り、一旦音鳴らしは中断しました。

何故中断に至ったかというと、息抜きで旋回を弄っていたら

等速円運動スラロームに成功したからです。

 

自分はプログラムには疎く、学生時代に少しプログラムをやっていましたが、

今ではサンプルプログラムのパラメーター弄りで精一杯なので、

信地旋回以上となると、サンプルプログラムを読み解き理解した上で

どんどん追加をしていかねばならず、

とても一朝一夕で出来るものではないと諦めを感じていました。

 

しかし、音鳴らしにひと段落ついて、気分が乗っていたので

旋回のプログラムをゆっくり読み解いていました。

それまで一瞬曲がる挙動に入るかと思ったら、

そのまま真っすぐ壁に突撃していたマウスが

ふと、閃いた1文をプログラムに書き込むと

曲がりました。

むしろ、曲がり過ぎてそのまま壁にぶつかるまで曲がって行きました。

が、曲がってくれさえすれば、後はパラメーターを弄れば改善出来るので

パパっとぶつからない程度に走れる様、調整をしました。

 

等速円運動は諦めていたので信地旋回で最短走行を調整していましたが、

これで等速円運動を安定させられれば、等速円運動での最短走行が視野に入ってきます。

 

昔プログラムを齧っていた頃の楽しさが蘇った気分です。

この調子で進めて行こうと思います。

 

続きを読む ›

Posted in Pi:Co Classic3