d-satoのマイクロマウス研修

リファクタリングとスラローム走行 – d-satoのマイクロマウス研修 Part13

d-satoのマイクロマウス研修

d-satoです。(記事一覧

前回は社内大会に参加しました。今回は社内大会前後に実施したソフトウェアのリファクタリングについてと、スラローム走行の調整についてまとめます。社内大会後は2022年3月12日に開催された「第42回全日本マイクロマウス大会」に向けてさらなる調整を進めていました。

リファクタリング

タイトルには「リファクタリング」と書いたものの、実際には構造自体にはほとんど手を加えず、以下の変更を加えました。時間もあまり確保できない中で構造自体に手を加えると動作確認に必要な時間が増えてしまうため、以下の変更を加えました。

  • 変数名は自分がわかりやすい表記に統一する
  • 長い処理にはコメントを適宜入れて何をしているかわかるようにする
  • 関数にはDoxygenフォーマットでコメントをつける

1つずつ説明します。

※現状のソフトウェアはサンプルプログラムをベースにしています。サンプルプログラムは学習用の教材という側面も持ち合わせているため、説明はソフトウェア解説マニュアルに丁寧に記載があります。これは教材としては資料読み進めながら理解していけるので便利なのですが、私のように数カ月ぶりに触る人にとっては思い出すのに時間がかかってしまいます。リファクタリングしなくても時間を空けすぎずに学んでいけば大きな支障はないものと思われます。

変数名は自分がわかりやすい表記に統一する

わかりやすさは人それぞれだと思うので詳しくは省略しますが、以下の変更を加えました。

  • 状態管理用のグローバル変数にはg_のプレフィックスをつける
  • 速度などのパラメータにはコメントで単位を書く
  • Visual Studio Codeを用いて入力補完できるようにしているため省略表記(speedをspと書くなど)を用いない
  • clang-formatを適用して体裁を整える
  • 調整に必要なパラメータを定義する場所はまとめておく

長い処理にはコメントを適宜入れる

例えば、加減速をしながら滑らかに直線走行をするためのstraight()関数では直線走行開始から終了までを1つの関数で処理しており、長めです。またその間の処理についてグローバル変数にアクセスしている部分もあります。こういった処理においてグローバル変数と関連する関数についてコメントに書いておくことで影響範囲や処理内容を確認しやすくなります。

関数にはDoxygenフォーマットでコメントをつける

Doxygenフォーマットで以下のようにコメントを書きました。関数の入出力の関係と留意点について明記しています。

Visual Studio CodeとC/C++のプラグインを入れている場合、関数にカーソルをあてるとDoxygenフォーマットのコメントを参照してその場でオーバーレイ表示してくれます。

個人的にはこのDoxygenフォーマットのコメントが非常に助かりました。

Doxygen
Doxygen は、C++、C、Java、Objective-C、Python、IDL (Corba、Microsoft 風) 向けのドキュメンテーションシステムです。 PHP、C#、Dにもある程度対応しています。

Visual Studio Codeでコンパイルから書き込みまでできるようにする方法は以下の記事に書いています。あわせて使うと便利です。RXマイコン使っている方はよかったら参考にしてみてください。

スラローム走行

現状の走行

現状の走行は四分円の軌跡を描きながら角を曲がるような走行になっていました。

私が実装したのは雰囲気でパラメータを決め打ちした走行でしたが、shotaさんの記事ではこの計算内容が詳しく紹介されています。

しかし今回の実装には課題がありました。モータが脱調しないように直前の直進区間と同じ車体の移動速度で走るのが難しいということです。円弧を描くような旋回時には左右のモータの回転数に差をつけて車体を進めつつ方向を変えています。(現状の走行だと)直進区間から旋回区間に切り替わったタイミングで、左右両方のモータの回転速度を切り替える必要がありました。Pi:Co Classic 3ではステッピングモータが採用されているため、急にモータの回転速度を変化させると脱調してしまいます。そのため、社内大会参加時は旋回時、車体の速度をある程度落とし、左右のモータの回転速度が直進時と大きく変わりすぎないように調整していました。

改善版の走行

社内大会でうまく走れなかった反省をふまえ、旋回に加減速の処理を追加して脱調しないで走らせられるように調整しました。モータへの速度指令と車体の移動速度、旋回速度の関係についてはしおたにさんの記事が詳しいです。

社内迷路の設置が悪く、段差を超えられずに途中で止まってしまいましたが、直線区間から大幅に減速することなく旋回しながら走ることができました。

調整にあたっては先人にならい、スプレッドシートでシミュレータを作成しました。
(最終的に実機に書き込んだプログラムで指定した値を記載しています。シミュレータとは言いつつも、実機で動かしてみるとスリップしたり等この図の通りにはならなかったのでもっと改善の余地がありそうです。)

Pi:Co Classic3のサンプルだと旋回時もタイヤの速度・加速度で旋回を司令することになります。ステッピングモータが脱調しないように気を使うという点ではよかったですが、慣れてくると旋回時は車体の角速度で計算できたほうが楽になりそうだなと思いました。Pi:Co Classic3を使ったマイクロマウス研修の後は自作マウス研修に進みます。そのときには旋回時は車体の角速度を指定して曲がれるような設計にしたいなと思いました。

次回は全日本マイクロマウス大会参加レポートを投稿予定です。

参考サイト

shotaのマイクロマウス研修4 [Pi:Co Classic3 スラローム走行の計算]
こんにちは、shotaです。 社員研修として、弊社が販売するマイクロマウスを動かしています。 前回はテキトーなパラメータを設定してスラローム走行をしました。 今回は、スラローム走行の制御パラメータを計算します。 角速度の台形...
なめらかなスラロームの設計① スラローム概要
はじめに今回はマイクロマウスにおけるスラローム走行のお話です。私が使っているスラローム走行の概要とその軌道の生成方法などを紹介します。特にマイクロマウスを例に話を進めますが、2輪車両の軌道生成方法として汎用的に使える内容です。
タイトルとURLをコピーしました