この記事は、「マイクロマウス Advent Calendar 2022 - Adventar」3日目の記事です。
こんにちは、なおフィスです。昨日は、ウメちゃんによる設計のノウハウ紹介でした。
タイヤに関し、運用含めノウハウが詰まった記事でしたね。単に、運動性能だけを語るのではなく、トレードオフを意識しつつ、運用も見据える。強者の目線ですね。
さて、今回は、昨年度から参戦をしているハーフサイズ競技における、システム構成について、大雑把ですが、語りたいと思います。
導入:利用しているマイコンの紹介
ESP32-S3という7x7mmサイズに、2コアが載ったマイコンを採用しています。 同シリーズを利用している人は非常に少ないですが、以下の魅力的な特徴があります。
- 開発環境の依存性が少ない。公式の開発環境ESP-IDFが提供されている。
- チップの単価が安い(300~400円程度)。昨年度の半導体不足の環境下で新作を量産。
- A/D変換を除くと、SPIなどの専用ポートなどの制約がないため、ピンアサインは対応するIC・部品に一番近いところを選べばよい。
- フラッシュ領域(最大8MB程度)はファイルシステムとして利用可能(ファイルの読み書きができ、迷路やパラメータを保存可能)
- メモリマネージャが利用可能(簡単に言うとヒープ領域に対し、動的なメモリ確保を「何度も」できる。STLのコンテナ(vectorなど)も使える)
- FeeRTOS対応
このように、様々な特徴を備えていますが、それを使いこなすには、良いソフトウェアシステムであることが求められると考えています。
それは「各機能の役割が明確」であり、「機能進化のための拡張性や互換性が保てる」ものであり、かつ、「実装しやすい」ものが理想と考えます。
今回、私が考案したシステム構成を紹介します。
システム紹介
以下、システム概要図
図は、Core0とCore1にタスクの配備状況、各タスクが担う役割と、データの流れの簡易的に表したものです。
以下、各タスクが有する機能の紹介です。
main_task
マウスの基本機能を実行するメインルーチンともいえるタスクです。
主には、足立法の実行や、必要なモーションを決め、動作が終わるまで待つといった、意思決定と要求を順序に沿って行います。
また、「調整値読込」では前述のファイルシステムの機能を用い、シリアル通信で送り付け保存したテキストファイル(jsonテキスト)を読むことで、タイヤ径などの値をソースコードではなく、フラッシュ内のファイル上の値を用いるようにしています。 これにより「再ビルドすることなく」調整したい値を反映・確認を可能にしており、調整作業の時短に繋げています。
読み込むパラメータはPIDのゲインなど様々な値があり、起動時に他のタスクが使うパラメータを更新するようにしているため、大会会場では原則再ビルドの必要はありません。
sensing_task
各センサーから値を取得します。このタスクはマウスがおかれている状況は把握してないため、扱うデータは基本生値(A/D変換の結果そのまま)としています。
- 壁センサー(IR_LED + IRセンサー)の値をA/D変換で取得。
- ジャイロセンサーの値をSPIで取得。
- バッテリー電圧をA/D変換で取得。
planning_task
main_taskからの動作要求に対し、置かれている状況を踏まえ、sensing_taskの結果を物理量に置き換えた値から、目標の状態を算出。 目標値偏差からFB制御(PID)や、FF制御(内部モデル制御(Internal Model Control))による制御量を算出し、モータに与える出力(Duty)として反映します。
logging_task
認識結果や制御、システムの状態をメモリに貯めこむタスクです。 走りながらファイルシステムにデータを保存することは性能上できませんが、300kByte超のRAMとSTLのコンテナによるお手軽な動的データ確保機能を活かし、複数のデータを記憶、csv形式で出力することで可視化ツールと連携し解析作業をしやすくしています。
まとめ
簡単ではありますが、システムの構成を紹介しました。 役割が不明確で、複雑でスパゲッティなシステムを作ると、何年もわたって進化させることが難しくなってしまうため、これから作る人・作り直したい人には是非、以下の観点を意識してみてください。
- タスクレベルで役割が明確であるか
- 図より相互関係は明確といえる
- 拡張性・互換性があるか
- タスク間を行き来するI/F(構造体)を拡張することで、容易に可能。
- 実装が容易であるか
最後に
明日は後輩の半田ディザスターの人こと、しろめ君です。
10月に、個人的に学生大会を見据えた講習をしたのですが、無事優勝を勝ち取ってくれたので、やった甲斐があったかなと勝手に満足していますw
そんな彼が、直前に何をしていたのでしょうか(焦るようなツイートをしていた記憶がある)