2009年8月31日月曜日

迷路解析ルーチン

 中部地区初級者大会で試走できることを期待して,とりあえず迷路を走れる状態にすることを目指している.今年はハーフには出場しないものの,32*32の迷路に対応した探索ルーチンと経路計算ルーチンを半年前くらいにつくったのだが...半年も経つと自分で書いたソースを読んでもよくわからない.参った.

 確か,大きな変更点は最短経路計算のときに,「ターンでは重みを大きくする」というターンに対してペナルティを与えるという考え方から,「直進は長いほど加速できるから時間距離が短くなる」という考え方に変更した.計算時間が長くなるかもしれないが.

 でも結局最後は迷路との相性になるし,賢いアルゴリズムを考えてもそれほど大きく変わるとは思えないし(既にある程度の水準に達しているし),見ている人からはよくわからない部分というのが悲しいかな.

2009年8月30日日曜日

DCモータの制御(フィードフォワード)

 マウスにおいて最大のパフォーマンスを発揮するためには等加速度の加減速をすることが必要.わりときっちり制御しないと,過剰なトルクがかかってスリップなんてことになってしまう.

今,加速度aで加速(もしくは減速)したいとすると,必要なタイヤのトルクT_tireは
   T_tire = a /2 * d
   T_tire = m * a / 2 * r_tire
となる.mは機体質量,r_tireはタイヤ半径であり,2で割っているのはタイヤが左右で2つある場合を考えているから.モータが出力すべきトルクT_motorはギヤ比をr_gearとして,
   T_motor = T_tire / r_gear.
モータのカタログにのっているトルク定数k_mを用いれば,モータに流すべき電流Iは
   I = T_motor / k_m.
そのために必要なモータの両端の電圧Vは
   V = R * I + V_r
である.Rはモータの巻線抵抗,V_rはモータに発生する逆起電力で,カタログの発生電圧定数k_eを用いれば,
   V_r = k_e * n
となる.ただし,nはモータの回転数であり,一定時間のエンコーダのカウント値からわかる.
実際にモータを制御する際にはPWM波のduty比r_dutyを変化させる.電源電圧をVsとして,
   r_duty = V / Vs
である.これで今モータに与えるべきduty比を計算することができる.

 以上はフィードフォワード制御をする場合に役に立つ.というかこれなしではレスポンスが遅すぎて制御しにくいと思う.実際にはこれに加えて目標値とのずれを埋めるためにフィードバック制御もする.

2009年8月26日水曜日

いわゆるシミズのタイヤ

 マイクロマウスではいつからか有名になったシミズ金型のミニッツレーサー用のタイヤ.特にKiatさんが長く使っているというPS-300.ここ数年製造中止になって入手できなかったが,ここを見て販売が再開されているのを知る.さっそく売り切れる前に(売り切れるか?)発注.もちろん5000円を超えるようにたくさん...

 さてこれでようやくずっと気になっていた,タイヤのグリップの差を確認できる.

 また,今年はグリップ剤の使用が禁止されることもあり,グリップに関する条件の都合がいい.トップ層との差をつくるものが減った.

2009年8月24日月曜日

数学関数

 こじまうすでは今まで浮動小数点を使ってこなかった.今年もつかうつもりはない.

 それはまあどうでもいいとして,少数ながら数学関数を使いたくなることがある.絶対値をとるABS(x)や符号をとるSIGN(x)はマクロで実装している.それ以外ではデッドレコニングなどに三角関数を使うので,sine(x),cosine(x),tangent(x),cotangent(x)の関数を定義している.
sineについてはuradの単位で角度を受け取り,テーブルを参照してsin(x)の1000倍の値を返す.cosineは角度をπ/2ずらしてsineのテーブルを参照.tangentとcotangentはsineとcosineの割り算の結果を返す.

 整数演算だけだと精度の確保とオーバーフローの回避のために掛け算と割り算が計算式の中にたくさんはいってくる.使う単位はなるべくミリやマイクロといった指数が3の倍数となるようにしてバグが埋まるのを回避しているが,それでもたまに桁を1000倍間違ってとんでもない動きをする.

2009年8月23日日曜日

ジャイロ出力から角速度

 ジャイロセンサはドリフトがあり,ゼロ点がきっちり決まらないという点でやや使いにくい.角速度が知りたいだけなら問題にならなくても本当にほしい情報はその積分値である角度なので,ゼロ点のずれはわりと効いてくる.
 電圧出力のジャイロの場合,AD変換によって得られた値sから角速度ωを計算するには,
   ω = k * (s - s0)
となる.kは比例定数,s0はω=0(マウスが停止している状態)におけるAD変換値.10bit分解能のAD変換器を使うとs0は500程度の値を示すが,真の値が499.8だった場合0.2の誤差が生じ,積分すると相当な大きさになることがある.
 この場合には,
   ω = k/10 * (s*10 - 4998)
とするなどして十分な精度を確保する.

 これはジャイロセンサに限った話ではないが,エンコーダの場合は速度0でカウント0を示すし,積分しなければちょっとずれていても問題にならないからジャイロ特有といってしまってもよく,わりと見落としがちかもしれない.

バグとり

 5号機のソフトもなんとなくかたちができてきた.というよりも4号機から整理しつつ移植する作業が進んでいる.そうするとひたすらバグをとる時期が来る.ほんの数週間前に自分で書いた計算式の意味がわからない.ソフトは書いたらすぐに動作確認するのが理想的だが,特殊な場合しか実行されないコードのバグは発見が遅れる.

2009年8月21日金曜日

ジャイロ

 こじまうすでは,3号機からジャイロセンサを搭載している.実際に有効に使えたのは4号機からで,4号機では探索,最短走行ともにスラローム旋回と直進走行両方の安定度が増した.

 ただし,優秀なジャイロを使わないとあまり効果は得られないらしい.要求されるのは,
  • レンジが広い(1000deg/sくらい)
  • 応答が速い
  • 比例係数の経時変化が小さい
などだろうか.こうしたことを考えると使える素子は決まってきて結局みんなADXRS300もしくは同等品を使うことになる.優秀だから.高価だけども.

 しかし,思ったほど簡単には使えず効果を発揮するには時間がかかった.