忍者ブログ

[PR]

2024年04月19日
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

スラロームによる移動距離近似、その3

2017年04月14日
ようやく3回目です。
まだイントロが終わった段階でしかありませんが。
これまでの記事は1回目の目次からどうぞ。

というわけで数式をいじりながら移動距離を求めていきます。
全部やると長くなりそうなので、今回は円弧部分を求めるところまで。


文字の定義


計算に移る前に以降使う文字の定義を決めておきましょう。
前回の記事からスラロームパラメータとは、「角加速度、目標角度、加速角度、重心速度」だとわかりました。これらをそれぞれ以下のように置くことにします。

また、機体の角度をθと置くことにします(下図参照)。



すると、スラロームの各要素は、それぞれθが以下の範囲内であると表せます。

※ここでは、角減速は角加速と同じように行うとする。つまり、角加速度の絶対値が同じであり、かつ角減速し角速度0になるまでに必要な角度は加速角度θAと等しい。




円弧の移動距離


まず、簡単な円弧部分の移動距離について求めていきます。
スラロームから円弧部分のみを取り出したのが下図になります。



ここで、円弧の曲率半径をRと置きました。
また、移動距離を考えるので、座標軸としてxy軸を追加し円の中心をその原点とします。

θAθT-θAが何故このように決まるのかわからない人は接線をひいて考えることで理解の助けとなるかもしれません。

さて、では円弧の移動距離を考えていきます。


よって、円弧のx軸方向とy軸方向への移動距離をそれぞれ求めることができました。
式(3)、式(4)からパラメータと移動距離の関係を知ることができます。

また、式(3)、式(4)は円弧を決める変数R人間が決めるパラメータθTθAによる関数の積の形で移動距離を表すことができています。
よって、将来的には、移動距離とパラメータから曲率半径を求める(円弧の軌跡を求める)ことができそうだと予想されます。
とはいえ、それができるかはクロソイドがどう表されるかによりますが。

まとめ


というわけで、今回はここまで。
今回わかったことは円弧の移動距離は以下のように表されます。



次回はついにクロソイドに入りたいと思います。



PR

スラロームによる移動距離近似、その2

2017年04月13日
第2回です。第1回(導入)はこちら
今回は具体的な数式とかをいじる前に何を求めればよいかとかを整理したいと思います。
実質的に導入その2。



パラメータを決めるために必要なもの


スラロームについてのおさらい


具体的に近似計算とかの話に移る前に、まずはスラロームについておさらいしておきましょう。
基本的には
クロソイド曲線 ⇒ 円弧 ⇒ クロソイド曲線
でした。
忘れてる方やそもそもスラローム知らないとかいう人は、昔書いた記事読んでください(宣伝)。




スラロームの軌跡の中で重要な要素


スラロームとは先ほどの図のような軌跡を描くカーブのことです。
では、私たちがこの軌跡において最も重視しているものは何でしょうか?

それはスラロームによる移動量のはずです。
つまり、スラロームが終わった後に、どの位置にいるかということです。
(壁や柱にぶつからない軌跡を通ることも大事ですが、始点位置と終点位置が合っていれば無茶な軌跡を通ることはないとします。[要出展])

ここで、移動距離の観点で考え、先ほどの図を少し変更しましょう。



この図より、クロソイドと円弧のそれぞれの縦横方向の移動距離(それぞれの長方形の縦横の長さ)がわかれば、スラローム全体で移動する距離を表すことができそうです。
つまり、これらとスラロームパラメータとの対応を求めれば、始点と終点を決めればスラロームパラメータを決めることができます。


スラロームに必要なパラメータは?


具体的に移動距離を求める前に、スラロームに必要なパラメータについて考えておきましょう。

スラロームをするためには、角速度が以下の図のように変化する必要がありました。


このグラフを描くために必要な情報が、スラロームを行うために必要なパラメータになります。
それを図中に書き入れたものが下図になります。

 
※この図では、パラメータとしての取り扱いの関係から横軸を時間から機体の角度に変更しています。

図中に赤字で示した
 目標角度(何度のターンをするのか)
 加速角度(何度まで角加速するのか)
 角加速度
がわかれば、図のような台形加速を行うことが可能なはずです。(最大角速度は角加速度と加速角度より求めることができるので、パラメータとしては選択しないことにします。)
そして、これらに機体の重心速度を加えたものがスラロームに必要なパラメータとなります。
※前距離、後距離と呼ばれるスラローム前後のオフセットについては連載後半で触れます。


まとめ


やりたいこと
「始点と終点の位置からスラロームパラメータを求める」

そのために必要なこと
「円弧とクロソイドによる移動距離が、スラロームパラメータによってどのように表されるか知る」

スラロームパラメータって?
「目標角度、加速角度、角加速度、重心速度」



次回は移動距離を求めていきます。ついに数式が登場!…のはず。

スラロームによる移動距離近似、その1

2017年04月12日
こんにちは、
マウスに触れなくなって久しいのでリハビリを兼ねてこの記事を書くことにします。

内容は、近似を用いてスラロームによる移動距離を見積もることについてです。
結構長くなりそうなので、連載記事にするつもり。失踪せずに書き上げたい…!

また、前提として、積分とか微分とかマクローリン展開とかの数学の知識を必要とするのでご了承ください。


目次

一連の連載記事の目次にしたい
  1. 導入(この記事)
  2. 移動距離推定には何が必要か(導入その2)
  3. 円弧部分の移動距離について
  4. クロソイド部分の移動距離について
  5. スラローム全体の移動距離について
  6. 残る問題点とその解決法(予定)
  7. まとめ(予定)



導入

スラロームのパラメータを決めるのって難しいよね?


※本記事では、単純な クロソイド⇒円弧⇒クロソイド のスラロームを考えています。

タイトルにもなっているスラローム走行について考える。
スラローム走行をマイクロマウスで実装するには様々なパラメータを決める必要がある。
例えば、角加速度であったり、最大角速度であったりといったもの。

今回は、スラローム実装についての詳しい話をするつもりはないので、気になる人は各自このへんから調べてほしい。

話をもどして。
しかしながら、こういったパラメータを決めるのは、なかなか難しい。
何故なら、スラローム走行をする際に、私たちは望む軌跡を通ってほしいが、これらのパラメータとの対応関係がわからないからだ。



どうして対応関係がわからないのか、という理由はスラロームを行うために必要なクロソイド曲線と呼ばれる部分が解析的に解けないことに起因している。
が、その辺の話は主題から少しずれるので、美少女のブログを参考にしてほしい。

ここで覚えておいてほしいのは、軌跡からパラメータを推定するのは難しい
その理由は、数式はわかるけど積分が解析的に解けないから。


じゃあ皆はどうやってパラメータを決めてるの?

とはいえ、皆は平然とスラロームしているわけで。
スラロームをしているということは、何かしらの方法でパラメータを決めているわけで。

じゃあどうやっているのか?
自分の知る限り、Miceでは二通りの方法がある。
・別途シュミレータを作り、パラメータに対応する軌跡を数値計算で求め、それを確認しながらパラメータを探す
・マイコン内で、パラメータを少しづつかえ、ループをまわし、数値計算により軌跡の移動量を求め、パラメータを決める

これらの方法は、マウスの中で行うか外で行うかの違いだけで、本質的にはどちらも同じことをしている。と思う。
つまり、解析的に解けない積分を数値計算することで軌跡を推定し、そのパラメータ毎に推定した軌跡の中から求めるものを選択する、ということを行っている。
この方法なら、数値計算による微小な誤差はあるものの、求める軌跡を描くパラメータを求めることができる。

しかし、ループを回すためパラメータ推定にはある程度の時間がかかり、実質的に走行前に臨む軌跡のパラメータを決め打ちすることとなる。
例えば、走行中に壁によってるから小回りの軌跡でターンしようとかは難しい。

あとシュミレータだとパラメータ振るのがめんどい。。。


この記事の目的

では、この記事では何をするのか?という点である。

上で紹介した方法では、スラロームパラメータ同定が困難であるという問題を
解析的に解けないから数値計算する
といった方法で解決していた。

そこで、本記事では
数値計算ではなく近似解を用いる
ことを提案する。
近似解を用いて、マウスで動かすのに妥当な範囲で、数式でパラメータと軌跡の対応がわかれば求める軌跡から簡単にパラメータを決めることができる。かもしれない。

近似計算といっても美少女が紹介している研究レベルの難しい近似ではなく、マクローリン近似で行う。


というか、やってみたら意外とうまくいきそうなので紹介しますというのが本音。


次回は、スラロームをするためには何を求める必要があるのか考えていきたい。


全日本大会で探索ができなかった話

2016年11月22日

こんにちは
久しぶりの更新になります。

全日本マイクロマウス大会の感想でも書きます。

まずは、選手の皆さま、並びに運営を担当したスタッフの皆さまお疲れさまでした。
おかげさまで、とても楽しい大会でした。

マウスパーティや技術交流会では、去年一昨年以上にいろいろな人とおしゃべりでき、(Twitter)上での知り合いもたくさん増えました。
この調子でもっと友達を増やしていきたい。

Miceとしては後輩も同期も先輩も受賞し、益々勢いを増している感じでしたね。
Miceの一員として鼻が高いです。





で、僕はというとハーフエキスパートに出場しました。



鯉住です。




肝心の結果ですが、

第1走 R
第2走 R
第3走 R
第4走 R
第5走 R

はい、死亡です。
探索すらできませんでした。
Miceの一員として肩身が狭いです。。。

一応、備忘録代わりに、もうちょっと詳しく残しておきます。
どうやらセンサ値がよろしくなかったらしく、安定するための前壁制御で発信するという体たらく。
一応小細工として、その場でLEDとセンサの向きをずらしてみましたが、やはりダメ。
壁キレを読み間違えて(6,7)をゴールと認識して帰ってきてしまいました。

完全な調整不足ですね。

とはいえ、去年よりは探索できてるので、来年こそは最短できると信じて頑張りたいです。
まずは電通大のプチ大会で鯉住をびゅんびゅんさせてあげたいところです。

皆さん1年間お疲れさまでした。
また来年お会いしましょう。

情弱でもSTM32が使いたい! その2

2016年08月13日



こんにちは。
書こう書こうと思っているうちに気づけばこんなに時間が経ってしまいました。

というわけで第2回書き込み編です。
第1回開発環境編はこちら


System Workbench for STM32の設定について


では書き込みへ、と行く前に少しSystem Workbench for STM32の設定をいじっておきましょう。
System Workbench for STM32はデフォルトの設定ではビルドした後に .binファイルが生成されます。
しかし、これから導入する書き込み方法では .motファイルしか書き込めないので設定を変更する必要があるのです。

System Workbench for STM32を起動すると画面右側にProject Explorer があり、そこに自分が作ったプロジェクトが表示されていることかと思います。
そのプロジェクトを選択した状態で右クリックを押して、そこからPropertiesを開いてください(画像参照)。



一番下のやつですね。
次に開いたPropertiesの中にある C/C++ Build > Setting を開いてください。
下の画像みたいになってればOKです。




この中段にある Post-build steps の中の Command をいじります。
現在は

arm-none-eabi-objcopy -O binary "${BuildArtifactFileBaseName}.elf" "${BuildArtifactFileBaseName}.bin"; arm-none-eabi-size "${BuildArtifactFileName}

となっているはずなので

arm-none-eabi-objcopy -O srec "${BuildArtifactFileBaseName}.elf" "${BuildArtifactFileBaseName}.mot"; arm-none-eabi-size "${BuildArtifactFileName}"

としてください。
赤字になっている部分が変更点です。
これで右下のOKから設定を保存すれば.motファイルが生成されるようになったはずです!
ビルドしてご確認ください。


いざ書き込みへ


書き込むためには書き込みソフトが必要です。というわけで、こちら
はい、皆様ご存知マウス界の宇宙人ことこじまさんのプログラムです。
せっかくですので偉大なる先人の功績をありがたく使わせていただきましょう。

導入方法や使い方はリンク先のページに書いてあります。
何はともあれ最初は使用環境を構築しましょう。
リンク先の説明に従って python と pyserial をインストールしてください。

これで使う準備は整いました!
後は説明を読んでパパッと書き込んじゃいましょう!!


…といってできるなら情弱と言われていないわけですね、はい。

リンク先の説明を読んでもよくわからないし、ピンとこないですよね?

よくわからないですよね…?



えっ、もしかして僕だけ?


wirte_main.pyの使い方


皆さんはともかく僕はわからなかったので、軽く使い方を説明しておきます。
大丈夫そうな方は読み飛ばしちゃってください。

まずは、"write_main.py"と"write_static.py"をワークスペースのプロジェクトフォルダの直下にコピーしてください。Debugやsrcフォルダ同じ階層に来てればOKです。

write_main.pyの設定

次に設定を整えましょう。プロジェクトにコピーした”write_main.py"をメモ帳等のテキストエディタで開いてください。


ポーレート
ポーレート設定をしましょう。9行目あたりの baudrate = "xxx" のxxx部分をお望みのポーレートに設定してください。
例:baudrate = "230400"


書き込みポート
次は書き込みポートです。13行目あたりの port = "xxx" のxxx部分を適したポートにしましょう。
Linuxや他のOSを使用している方は15行目、17行目の分岐先の部分を書き換えましょう。
例:port = "com3"
ちなみにWindows場合、ポート番号は コントロールパネル>ハードウェアとサウンド>デバイスマネージャー から調べることができます。


motファイルの指定
続いて書き込むmotファイルを指定してあげましょう。
20行目あたりにあるmot_files = os.path.join("xxx", "yyy", "zzz.mot") のxxxとyyyとzzzを指定してあげます。
これらは"write_main.py"からの相対pathを表しています。これだったら、xxxフォルダの中のyyyフォルダの中にあるzzz.motファイルを書き込むということですね。
今、"write_main.py"はワークスペースのプロジェクトの直下にあるはずなので、以下のようにすれば大丈夫なはずです。
mot_files = os.path.join("Debug", "ProjectName.mot")

※ProjectNameは皆さんが決めたプロジェクトの名前という意味です。僕の場合はプロジェクト名をhalf_mouseにしたので"half_mouse.mot"になります。


ターミナルソフトの起動
このプログラムは書き込み後自動でターミナルソフトが起動するようになっているので、最後にその設定を行います。
27行28行目あたりの termsoft = "xxx.exe" のxxx部分を起動したいターミナルソフトのPathに書き換えましょう。64bitの方は27行目をコメントアウトして28行目のコメントアウトを外しましょう。コメントアウトは#です。
例:termsoft = "C:/PROGRA~2/Renesas/teraterm/ttermpro.exe"

めんどくさかったら56~62行目をコメントアウトしてください。ターミナルソフトの起動自体がなくなるはずです。

write_main.pyの実行

では、設定も終わったことですし、いよいよ書き込んでみましょう!

コマンドプロンプトから"write_main.py"を実行すれば良いそうです。

Linuxを使ってる方はともかく、Windowsだけしか使わない方はコマンドプロンプトにあまりなじみがないのではないでしょうか?
本題からそれてしまうので、コマンドプロンプトやそのコマンドについて説明することはやめておきます。そもそも僕もよく知りません。

ともかく、このプログラムを使うだけなら簡単です。まず、"write_main.py"があるフォルダを開いてください。何も選択していない状態で「Shift+右クリック」です。すると、「コマンドウィンドウをここで開く」が出てくると思います。



これを選択してください。黒い画面が出てきましたね? そこで"write_main.py"と打ち込んでEnterで実行(書き込み)です!



無事書き込めた方はおめでとうございます。
残念ながらうまくいかなかった方は「Ctrl+C」で中断して、何が間違っているのか探す旅を始めましょう。頑張ってください。


おわりに

これで皆さん書き込めるようになったはずです。…はずですよね?
わからないことや間違っていること等あれば、コメントからお願いします。

次回はいよいよプログラム。IOでも叩けたらいいですね。
それでは、ほどほどに期待してお待ちください。