2020-12-16

ログを使いやすくした話

はじめに

この記事は MicroMouse Advent Calendar2020 の 16 日目の記事です。

昨日は sshun さんの「HALがビミョーである理由の考察と改善案」でした。
いつも文句を言いながらも何となくで HAL  使ってますが、解説されるとなるほどー (理解できてない) という感じです。去年の「依存を考えて設計する」も参考になりました。

今回はマウスのログにまつわるお話です。21日の qtfdl94q さんが似たテーマっぽいですが、いつもすごいツールを作られてます。自分のノウハウなど後出しでは恥ずかしくて出せないので、先に書いてしまう作戦です。

ログを使いやすくする

マウスの調整作業で走行ログを取るとき、シリアルターミナルから Excel にログをコピペしてグラフ表示するのは誰もが通る道だと思います。

ですが何度もやってるとこれがやはり面倒なわけです。あるとき大会会場で Matlab つよつよ人がログをグラフ表示してるのを見かけて、かっこいいなー便利そうだなーと思って自分もやってみたというのが今回の話になります。
あ、自分は Matlab 使えないです。あとマイコンのプログラムはC言語です。

次の3つに分けて説明します。
自分はソフトのセンス・知識が足りてないのでいろいろアレな部分もあると思いますが、そういうところはやさしく突っ込んでくれるとうれしいです。

  1. ログの取得
  2. ログの受信と保存
  3. ログの表示

ログの取得

多くの人がそうだと思いますが、自分もマイコンの内蔵RAMに巨大配列としてログを保存し、それを UART で PC に送信しています。

欲しいログとして、ここでは次のようなログを取得することを考えます。

$LogStart
$CommentStart
drivePrmt.velocityMax =  1.299999, drivePrmt.velocityMaxDiagonal =  1.100000, drivePrmt.centrifugalMax =  2.700000, drivePrmt.accelMax =  4.300000
$CommentEnd
time[ms], velocityTarget ,velocity ,angleVelTarget ,anglVel ,position.X ,position.Y 
0,0,-0.000012,174.026153,-0.061883,0,-12.000012
10,0,0.00008,41.964691,27.368331,-0.000004,-11.998698
20,0,-0.000004,3.931732,46.66851,-0.000016,-11.996617
中略
6720,0,0.000427,0,-0.028064,718.998779,359.140747
6730,0,0.000258,0,0.00283,719.001831,359.140747
6740,0,0.000401,0,0.019516,719.005126,359.140747
$LogEnd

後半が csv の時系列データです。前半にもごちゃごちゃなんか書いてありますね。こんな特徴があります。

  • ログ全体を$LogStart と $LogEnd で挟む
  • 時系列データは変数名も記録する
  • 走行パラメータもコメントとして残す ($CommentStart, $CommentEnd で挟んだ部分)

ログをたくさん取ってると「このログ一体何のログだ…?」ということが起きてしまいます。そういうことがないように、ログの変数名と走行パラメータを一緒に残すようにしています。

ログを取る変数ってちょこちょこを変えたくなりますよね。私のマウスではどの変数を保存するかがハードコーディングされてるんですが、そのたびにソースコードを編集する箇所が多いと大変だしミスもしてしまいます。いじるコードは出来るだけ一か所にまとめたいです。数値データのほかに変数名も一緒に記録するには一工夫必要になる…ということで次のようなことをしています。

#define L(x)            (#x), ((float)x)
void saveLog(int16_t num, ...);

こんなマクロ関数とログ取り関数を作っといて、制御関連のコードの中で 1 制御周期に 1 回、例えばこんな感じで関数を呼び出します。

saveLog(6, L(velocityTarget), L(velocity), L(angleVelTarget), L(anglVel), L(position.X), L(position.Y));

saveLog は可変長引数の関数になっています。最初の 6 は保存する変数の数です。

L(x) という怪しいマクロの中身ですが、(#x) で引数xを文字列として取得することができます。怪しいですね。同時に ((float)x) で変数の中身も渡しています (全部 float にしちゃう)。L(velocity) なら、"velocity" (文字列) と (float)velocity の二つの引数になるわけです。そこはかとなくバッドノウハウ臭がしますが、気にしないことにします。

あとは saveLog 関数の中に、文字列と数値をそれぞれの配列に入れていくコードを書けばOKです。変数名は何回も保存する必要ないので、最初の一回だけでいいです。
これで saveLog の引数 (L() の中身) を書き換えるだけで保存する変数を変えられるようになりました。

仕上げに、UART で出力するときに走行パラメータを一緒に出したり、$LogStart とかを付ければ冒頭に書いたログの出来上がりです。

ログの受信と保存

Tera Term でログを受信するんですが、こんな感じの Tera Term マクロを実行します。ここでさっきの $LogStart、$LogEnd が出てきます。

while 1
getdir dir        ; マクロファイルのディレクトリを取得
changedir dir     ; カレントディレクトリをマクロファイルの場所に移動
wait "$LogStart"  ; ログのスタートを検知
getdate logname "%y%m%d-%H%M.csv"      ; ログの日時をファイル名に
logopen logname 0 0
wait "$LogEnd"    ; ログ終わりを検知
logclose
logViewer = "C:\hogehoge\LogViewer.exe"    ; ログビューワーの実行ファイル
strconcat logViewer " -f "       ; コマンドライン引数でログファイルを指定する
strconcat logViewer logname      ; ログファイル
exec logViewer
endwhile

これで $LogStart と $LogEnd で挟まれた部分が csv ファイルとして自動で PC に 保存されます。このマクロ実行して wait 状態のまま COM ポート切断すると大変なことになります。。。誰かたすけて。

問答無用でログは全部保存されるので鬱陶しいかなと最初は思いましたが、意外と後から「さっきのどうだったっけ?」と見たくなることがあったので、これはこれでという感じです。

ログの表示

ようやく一番ドヤりたいところまで来た…

csv で保存したログを表示するためのログビューアーを作りました。GUI の作成には Qt  (C++) を使いました。GUI フレームワーク何使うのがいいのか正直分かってません。

時間軸をズームしたり、複数のグラフにまたがってカーソルを出して現在値を表示したりできます。
位置座標をXYプロットとか、一つのグラフに2つ重ねてプロットなども可能です。どの変数をどのパターンでプロットするかは別途 config ファイルを作って指定しています。

先ほどの Tera Term マクロの後半には、csv ファイルをログビューアーに投げて開く処理が書いてあって、全部つなぐとこんな感じです。

ログを取得してから PC に保存してグラフ表示するところまで自動化することができました。これでログを使った調整作業がだいぶ快適になりました。

今の時点でも結構便利に使えてますが、あとは探索結果の壁情報を一緒に表示してもよさそうですね。

さいごに

ログの活用について自分のケースを紹介しました。ここは各人色々な工夫がありそうなので、色んな人の話が見たいなぁ。

明日はらっちさんの記事です。カレンダー2つも書くなんてすごい!

2020-01-12

プログラム用コネクタを洗濯ばさみにした話

この記事 の続きです。前回はタクトスイッチを無くしました。今回はプログラム用のコネクタを無くします。

---
多ピンのコネクタは場所を取りますし、物によっては抜き差しが固かったり壊れやすかったりします。できれば無くしたい部品です。


ということで無くしました。代わりにテストポイントを並べています。念のため金フラッシュ仕上げにしています (が実際必要だったかどうかは不明)。

ここにばねの入ったテストピンを当てることで PC と接続してプログラムします。自分はこれ↓を使いました。
https://www.amazon.co.jp/dp/B00SAVOMUA
IC や基板の製造工程で繰り返し使われることも想定している部品だと思うので、マウスに使うには信頼性も十分そうです。


で、こんな感じの小さい洗濯ばさみっぽい治具を作って…


こんな感じです。
治具の材質は DMM のアクリル (エクストリーム) です。なんかこれ熱に強いですよね。半田付けするとき、コテが触れてしまってもなんともなくて助かりました。

こんなん使えるんかいなと思われるかもしれませんが、結構安定して使えています。
とはいえ位置合わせには課題があります。今は外形で位置合わせしているのですが、正直これだとずれやすいです。ずれてしまったときでもピンがテストポイントを跨いでショートしてしまわないように、少し広めの 0.85mm ピッチにしています。
位置決めピンを使うなどしてずれを防止すればさらに狭ピッチにすることも出来そうです。

ぴったりの既製品のコネクタが見つからず選定に疲れたときはこんな方法を検討してみてもいいんじゃないでしょうか。自由度高いですよ。
2019-12-09

マイクロマウス2019

今年もお疲れさまでした。

この季節は Advent Calendar で色んなマウスブログが更新されて面白いですね。
このブログは今年もほぼ大会の結果を描くだけのものになりましたが、来年の自分のために今回も書いておきます。

機体

まずマシンのことを。
去年のマシンにカーボンのフレームを付けました。前後にお部屋が2つ増えたということでぷーちん号ぷち2 改め、ぷーちん号ぷち2LDK です。
シュッとして多少イケメンになった気がします。

  • 長さ:60mm
  • 幅:20mm
  • 高さ:13.7mm
  • 重量:3.7g

去年の段階で思いのほか速く走ってくれたので、色気を出してそれなりのタイムを狙った機体になっています。加減速時のピッチ方向のがたつきを抑え、直進で安定させることを意図しています。段差にも少し強くなった気がします。
代わりに当初の「ハーフサイズの半分のマイクロマウス」というコンセプトは半分失われてしまいました。

大会

初めての 32x32 迷路への挑戦です。
すでに記憶があやふやになってますがとりあえず結果を。(公式結果が公開されたら直すかも。)
1走目:まあまあ探索が進んだところでクラッシュ。探索失敗。
2走目:重ね探索。初めての 32x32 迷路完走。
3走目:安定パラメータで最短成功。帰りに探索。多分タイマで途中でストップ。
4走目:ちょっと速めの安定パラメータのつもりだったが直線でクラッシュ。
5走目:少し速度を落として完走。17秒464 で記録。

結果は 9位 でした。
4走目の失敗は想定外でした。10月の中部時点で直線の壁制御にバグがあったのですが、今回はそれを直して直進はもう大丈夫と思ってたのに。。。要修正。
あと探索でコケるのは相変わらずですねー。何とかしたいですが、今のところノーアイデア。

表彰式ではまさかのニューテクノロジー賞を頂きました。ニューテク賞はけり君だと思ってて完全に油断していたので、式ではキョドってしまいましたが。
ネタ機体にしては速く走ったね賞(意訳)とのことで、ありがとうございます。まあ実際ネタなんですけど、でも幅を狭くするのは一考の価値ありと思いますよ?単純に壁に当たりにくくなるし、攻めたターンもできるかもしれませんし、自由なライン取りもできるかもしれないし?

ということで

お疲れさまでした。近年は運営が非常にスムーズでありがたいです。工芸大のスタッフの皆様には頭が下がる思いです。

それと今年度は3月にD杯があるということで、なかなかシーズンが終わりませんね。この全日本直後のモチベーションを生かしてもう一つレベルアップしたいところ。
それでは皆さん、ひとまずはよいお年を。
2019-10-28

中部地区大会

中部地区大会に参加してきました。
前回の北信越大会でポイントは獲得しているので今回は気楽なもんだ。

と思っていたらモーターが壊れたり直ったりで不調に。全く動かないわけではなかったのでパラメータ調整で出来る範囲のことをしつつ、頼む動いてくれーーーということで本番。

で、地区大会では稀にみる高難易度迷路。「ぼくのかんがえたさいきょうのめいろ」感がある。
某氏のつぶやき。
今年最後の地区大会、ポイントが取れず倒れていく方を見るのは心が痛い。

1走目、全面探索の終盤でおそらくタイヤのほこりが原因と思われるクラッシュ。櫛歯に近いところだったのでうまい具合に櫛歯を避けた最短経路が出てくれるかなと思いきや、壁の読み間違いがあって2, 3走目リタイア。
4走目に探索しなおして、5走目の最短中にタイムアップ。
最終的には探索のみの記録となりました。

探索終盤のほこり対策は難しい。手作りの光学式エンコーダのせい?である一定の速度より遅く走るのが安定せず、探索速度を遅くする手が使いにくいんだよね。。。

あと、長い直線での安定性がやっぱり怪しい。デカい迷路が欲しい。。。会社で買ってるところが妬ましい。

全日本まであと一か月。頑張りましょう。
2019-09-25

東日本&北信越大会

東日本

月初めにあった東日本大会に出場してきました。
探索が安定せず、重ね探索を重ね続けてタイムアップ後にようやくゴール。
結果はリタイア。
はい次。

北信越

東日本ではポイントが取れず。
自分的例年どおりだと次は中部だが、中部は今年最後の地区大会なのでそこでミスると後がない。下手すると今年も全日本を見学するだけになってしまう、ということで急遽翌週にあった北信越大会に参戦。

一週間で細かい調整して、探索は大分安定するようになりました。1走目で探索を終わらせて、2走目の 7.078秒 がタイムとなって結果 2位 でした。
3,4,5走目の上のパラメータは全部16区画直進の姿勢制御が安定せずクラッシュ。家じゃ試せないよ。。。

とりあえずポイントはとれたのでよかったよかった。

鞄の用意してなかったのでお米 (3kg) 持ち帰るの重かった。。。
H川君の 10kg は予定されていたのかばっちりキャリーバッグに収まっていた。
2019-09-06

タッチセンサ


今更ながら自分のマウスのちょっと変わってるインターフェース周り(スイッチとかコネクタとか)の話を書いてみようと思います。
2年ぐらい前からやってることなので、会場でお話しした方も多いと思います。

---
以前の自分のマウスにはブートモード切替と決定ボタン兼用でタクトスイッチが最低1個は付いてました。でもタクトスイッチって小さいのは押しにくいし、壊れやすいし、小型といっても言うほど小さくないし、出来れば無くしたい部品です。

今作のマウスではマイコンの書き込みはSWDでやってるのでブートモードの切替スイッチは必要なくなりました。
決定ボタンは6軸センサや壁センサで代用しようと思えばできるでしょうが、誤爆のリスクが怖いです。環境が変わるとミスもしやすいもの、大会本番で操作ミスして1トライを無駄にすることもあるかもしれません。やはり決定ボタンは欲しいです。

誤爆しにくく、実装面積が小さく、操作しやすく、信頼性のあるインターフェースということで、静電容量式のタッチセンサを使うことにしました。
タッチセンサ回路を内蔵したマイコンであれば追加部品なしで簡単にできますし、そうでない場合も原始的なタッチセンサであればGPIO2本、抵抗1個で出来ます。自分がやったのは後者です。

これは自己容量式のタッチセンサですね。

さて、追加の部品は抵抗1個といっても、ある程度の面積の電極は必要です。電極サイズが小さすぎると容量変化が小さく、マイコンでうまくON/OFFを読み取れません。
実装面積を削減しようとしてるのに、そんな大きな電極を置くスペースなんてあるわけ…

あったーー!!! (yakudo風)

ということで、スライドスイッチ(電源スイッチ)のケースがタッチセンサの電極になってます。結構しっかり目に触れないと反応しないようにした(なった)ので、スライドスイッチ操作時に不意にタッチ入力してしまうことも起きていません。
モーターのケースも電極候補になりそうです。自分の場合はモーターはバッテリーの下に隠れてしまうので試しませんでしたが、もしかしたら使えるかもしれません。誰か試したら結果を教えてください。

あと上図のタッチセンサですが、マウスがアースされているかどうか(ケーブルでPCと繋がっているかどうか)で容量の変化の仕方が変わります。ケーブル接続の有り無しどちらでも使えるように調整には注意が必要です。

---
思ったより長くなったので、今回はタッチセンサの話だけ。
次回はプログラミングケーブルのコネクタについて。

2018-12-11

マイクロマウス2018 (再履)

今年はあまりにも不完全燃焼だったで、12月の中部支部月例会(&忘年会)にお邪魔して一人マイクロマウス2018を開催しました。

  • 迷路はセミファイナル、試走なし、5分間、5回走行のルールで出走。
    • 1, 2走目 - リタイア
    • 3走目 - 約24秒、行き帰りで探索成功
    • 4走目 - 8秒174
    • 5走目 - タイムアップ
完走しました。一人しかいないので優勝です。
本物のセミファイナルの優勝タイムより速いので出走できていればと思ってしまいますが、しょうがないことですね。
探索がこの調子だと出走できていたとしても完走できていたかはかなり怪しいし。

で、そのあとはタイムアタック。思いのほかよく走ってくれました。

この日のベストタイム↑ 5秒865。
ライン取りがだいぶ怪しいが、これもこの機体のメリットということで。
正直、構想・設計時点で想定していたよりもかなり速い。
最軽量マウスとしては個人的には割とやり切った感ある。

11月は結構頑張ってただけに、出走できなかったのはかなりしょんぼりだったんですが、元気に走る姿をみて大分テンション上がりました。
エントリー忘れの発覚後に改良を続けていた時はかなりむなしかったんですが、その甲斐がありました。これでなんとか今年も年が越せそうです。

ということで、今年の教訓:
全日本にエントリーし忘れた人は中部の月例会に行きましょう。
エントリーし忘れないようにしましょう。