Matlab/Simulinkでシミュレータ環境を作るコツ

はじめに

この記事はMicro Mouse Advent Calendar 2020の1日目の記事になります。

このAdventCalendar(ADC)について

今年はCovid-19により、例年ですと、ちょうど全日本が実施される頃合いですが、今年は特別対応、オンラインでの開催になりました。

12/4に公式HPより「詳細告知・課題公開」の予定です。マイクロマウス2020 – All Japan Micromouse Contest 2020

さて、学生団体のように活動が規制されていない社会人たちはきっと、進化を続けていることでしょう!!!ということで、例年に漏れず、このADCを作りました。

というのは建前で、だいたいこれが理由です。

らっちくん。枠なら余裕があるよ。

本題

マイクロマウス大会のスポンサー「mathworks社」が大会出場者向けに無償提供しているソフトウェア「Matlab/Simulink」でシミュレーションを作る際のコツや使える関数などを紹介します。

Cのヘッダファイルからバスに読み込む(Simulink.importExternalCTypes)

Simulinkでバス(構造体のようなもの)を使用する際、自作バスを定義するのが面倒です。
そこで紹介するが、Simulink.importExternalCTypesです。この関数はC/C++のヘッダファイルに記載した構造体をバスとして読み込み、Simulinkで使用することができます。

以下のコードをシミュレーション前にinitファイルとして1度実行し、バス構成をワークスペースに登録しておきます。

Simulink.importExternalCTypes('../include/bus.h'); 

コード生成後は生成されたファイルと、上記のbus.hをC/C++ワークスペースにコピーしてビルドすればOKです。(インターフェースに構造体を使用したい場合など、この方法が個人的ベストプラクティスです)

enumを読み込むと、~~.mというファイルが自動生成されますが、enumの中身を変更した際は一度mファイル側を削除しないと、エラーが出たりしますが、overwriteのオプションを使用すればエラーを無視し、上書きします。

mファイルのパス情報を取得(mfilename、fileparts)

simulinkでビルドした際や、コード生成をした際は、matlabの現在のディレクトリに対し、ファイルを生成する仕様があります。(これどうにかしてほしい)

自動ビルドなどを行う際、mファイルなどに記載したコードを実行しようにも、mファイルの配置先からみた相対ファイル情報を得た方が、git管理をするときなど便利です。

mfilenameでは現在実行中のmファイルのパスを、以下のように、引数に'fullpath'と入れることで、取得できます。

script_file_full_path = mfilename('fullpath')

これだと、ファイル名まで取得できてしまうので、filepartsを使用します。 filepartsでは、引数に指定したファイルのパス、名前、拡張子を取得できます。

[filepath, name, ext] = fileparts(script_file_full_path );

コード生成コマンド(slbuild)

slbuildは引数に指定したSimulinkファイルをコンフィギュレーションファイルに沿ってビルド(コード生成)します。
ただし、先述のように、現在のディレクトリに対して、ファイルを生成します。(gitユーザには至極迷惑)
そのため、先に紹介したmfilenameやfilepartsを使用し、テンポラリーで作成したbuildフォルダに移動してから実行しましょう。.gitignoreでbuild/を追記しておけば、ビルドファイルによるgitのワークスペースの汚染は防げます。

初期値とunit_delayしたデータを切り替える

1ステップ目の初期状態と、シミュレーション結果を切り替えたい。そんな場合に、clockブロックを使用しています。
clock>0ならシミュレーション結果の座標を使用しています。

csv読み込み

私のマウスでは走行ログをCSV形式でprintfしてダンプしてます。
以前まではexcelでグラフを描画していましたが、simulinkFrom Spradsheetを使用すると便利です。
1列目にtime_indexとして時系列情報を書き込む(行番号でOK)必要があるのですが、それ以外は特に制約なく利用できます。

f:id:nao1288stusj:20201130212640p:plain

「適用」を推すとブロックから各出力が表示されますので、あとはscopeなどで描画して確認します。 f:id:nao1288stusj:20201130212834p:plain

まとめ

Matlab/SimulinkでMBDをやるんだ!」といっても、それ以前にソフト作りのしやすくするために、スクリプトを整えなくては宝の持ち腐れです。(そういう系の共有がMatlab/Simulinkは商用ユーザばかりでなさすぎる気がする)

やってることが、shell芸につながるアレコレだったり、自動化系じゃないかって?(本職でjenkinsおじさんしているので仕方ない)

おわりに

明日の担当は「ジャッジー君」です。(あ。twitterフォローしてない。これではトスができない。)

STM32+Clionで開発(在宅勤務の話も)

在宅引きこもりでマウスの意欲をロストして、3ヶ月間一切何もしなかった。 ここまで何もしない期間ができたのは、マウスを初めて以来初である。

今日は久々にモチベがあったので、ブログまで書ききった

技術的なネタの前に、在宅7ヶ月目が終わりに近づいて、在宅勤務も感想をちょっとだけ。

  • 通勤は害悪。1日2h近く移動に使っても、1円も認められないのは損でしかない。2時間睡眠を増やせばパフォーマンスは上がる。(平均5h未満が8hになることのバフ効果はヤバイ)
  • 在宅でコミュニケーションの問題が起きているのは言い訳。直接会えてても問題があったか、欠如していたかのどちらか。(私見
  • 通勤定期バグ(在宅で電車乗ってないのに、定期代が支払われるバグ)の修正が遅い。
  • 仕事中の何気ない雑談は少なくなったが、ネット会議の枠を使ってやれば十分足りる。
  • 場所に縛られない働き方によって、オフィスの価値が変わり、住む場所の選び方も変わった。仕事の選び方も変わるのだろうか?

さて、本題だ。 naophis.hatenablog.com

この記事の続きのつもり。

構成

  • Ubuntu 20.03
  • clion 2020.2
  • stm32h743(nucleo743zi) 
  • openocd(自力ビルド!!!!)

CubeMXの設定

Project Manager

  • Project・・・toolchainでSTM32CubeIDEを選択
  • Code Generator・・・Generate peripheral initialization as a pair of '.c/.h' files per peripheralにチェックを入れることを推奨。

HAL or LL?

LLを選択。HALは遅い。
HALを使うと格闘ゲームプレイヤーなら違和感が出るレベルで遅い。
ただし、基本動作の確認にHALを使うことは、ネットにサンプルコードがたくさんあることから推奨。テストコードはOK、本番コードはNGな印象。

printf

main.cに以下の関数を挿入しておく。

// LLでUSART3を使用。
void USART_TransmitByte(uint8_t ch){
    LL_USART_TransmitData8(USART3,ch);
    while(LL_USART_IsActiveFlag_TXE(USART3)==0);
}
void __io_putchar(uint8_t ch){
    USART_TransmitByte(ch);
}

OpenOCD

sudo apt install openocdで入るopenocdではnucleo-h7系がない。
githubの最新のcfgファイルを抜き出して入れても、参照先の解決ができない。

面倒くさいから自力でビルドする!!

以下を参考に前提になるパッケージを入れて、ビルドするだけ!!(他力本願)
hackaday.io

Clionで使えるようにする

clionの設定でOpenOCD SupportOpenOCD Homeにインストール先(openocdコマンドがあるディレクトリ)を選択する。

Clionのデバッグ構成

board/st_nucleo_h743zi.cfgを指定。後は▶で書き込むだけ。

やり残したこと

C++でやりたい。自動生成されるmain.cmain.cppに変更するだけでGPIOやTIMは動きはするが、printfが動かない。(LL_USART_TransmitData8を使って1文字ずつの送信はできるのに。printfはできない。タスケテ)

eagleでRS-274X形式のガーバーデータを出す方法

基板発注する際、毎回忘れてしまうため備忘録として残す。

使用するもの

発注先と出力形式

  • JETPCB・・・ここ数年、基板はここに発注してる。残念な思いをしたことがない。
  • RS-274X形式・・・eagleで出力したものをzip化し、発注画面でアップロードすればよい。

出力方法

  1. eagleのトップメニューから、使用するCAMプロセッサーをダブルクリック
  2. File>Open>Boardから出力したい基板の.brdファイルを選択。
  3. Process Jobを実行

    このままだとドリルファイルがないため、以下を続けて実行。

  4. eagleのトップメニューから、excellon.cam
  5. File>Open>Boardから出力したい基板の.brdファイルを選択。
  6. Process Jobを実行

以下の拡張子が付いたファイルが生成されればOK。

*.cmp
*.drd
*.dri
*.gpi
*.out
*.plc
*.sol
*.stc
*.sts

念のため、ガーバービューワーなどで、意図した出力がされているか確認しましょう。

CAMプロセッサーをカスタムして長穴を作りたい

悪い人は思うのです。余計なことをしたい(少し弄りたい)と。
今回、メッキ付きの長孔を作成したかったため、46. Millingを使い、長穴を作成。参考

ガーバデータに、46. Millingを出力に含めるため、CAMプロセッサーを改造。

gerb274[2L].camOutlineにて、すでにある20. Dimensionに加え、46. Millingを追加してからProcess Jobを実行する。

これで行けるはず。(まだ物が届かない)

Clion+CubeMXでSTM32マイコンの開発環境紹介(CMake)

当記事は後で書き直します。画像の用意が面倒。

開発環境の紹介

  • Clion 2019.3
  • CubeMX(デフォルトでClionに内包)
  • CMake

なぜこの構成

  • ビルド環境をOS依存にさせたくない。(プラットフォーム対応しているIDEなどを使う)
  • マイコンのドライバソフトに力を入れない。(CubeMXによる、HAL or LL出力)
  • Gitを経由して複数のOS、環境にて再度開発環境を再構築したい。

最新のClionではCubeMX、OpenOCDが標準に組み込まれており、Windows, Mac, その他Linux環境での構築が可能である。

exlipseベースの他のIDEでは、C++の環境を標準で作成してくれない上、 いちいちオプションを見たりと、C++プロジェクトにするのに手間がかかる。そこでCMakeを率先して使いたい。

他に組み込みたいこと

内部にMatlabなどのシミュレーション環境も内包させ、Matlab/Simulink coderを使用し、シミュレーション、コード生成といった流れを作りたい。

C++GUIアプリを作ろうとすると、環境依存が大きいので、やめることにした。(Win環境しかできないとか、まるで求めてない。)

今年のアップデート点

このブログはMice Advent Calendar 201914日目の記事です。

強調に意味などありません。14日目の記事です。良いですね?

さて。タイトルの通り、今年試したネタ(ボツネタ含む)を紹介していこう

ExiaAlter(黒)

APEC大会向けに定格無視していた部分をすべて直したつもりの機体。

使用したICが悪かったせいか、不安定の極み。シーズン後半ではExiaAlter(白)を使う羽目に。

ExiaAlter(白) 修正版

昨年の有償機体

  • エンコーダからの出力(5V)を直にマイコン(3.3V定格ピン)に流していたが、分圧していれるように修正。
  • 足回りはアクリルからMJFに変更し、強度を向上
  • 吸引ファンはダクトを渦巻きポンプを意識し作ることで、圧損を軽減、低騒音と効率上昇を実現

Exia-Jr.

新作ハーフの予定だったもの。ExiaAlterのフォルムをそのまま小さくした機体。強そうな印象がないためお蔵入り。

  • ギアの噛み合いが何故か悪かった
  • 重い
  • RX71Mを思ったより余裕で載せられたので、つまらなくなった。

これまでも、お蔵入りの機体>リリースされた機体 なので、仕方がない。

一回限りの根気で作れるものなんてたかが知れてます。1度良いものを作れるわけないのは仕事でも同様。(これを知らず、すぐに心折れる人を何人も見てきた)

調整システム

全データアップデート機能を実装。これでパラメータが合計1300個だったことを知る。 使ってないデータはいくらかあるのだが。これは酷い。

バッテリー

いつものHyperionを3個直列。半年程度で膨れ始めるからいい加減やめたい

ソースコード

テストプログラムを修正しただけ、実はここ3年ほどほとんどアルゴリズムの開発を行ってない。 パラメータチューニングだけで済ませている。来年は大型アップデートするので、作り直しかな

次回作の構想

この記事はMicro Mouse Advent Calendar 2019の7日目の記事です。

なお、2019/12/06 23:47から書き始めています。RTAです。

まずは

2019年全日本大会お疲れ様でした。

昨年優勝したものの、あっさり3位に陥落しました。 これで、勝ち逃げと言われず、ハーフに行けるというものです。

次回作の構想

ハードウェア周り

今回のマイクロマウスにて、W特別賞の彼が利用しているマイコン「ESP32」をメインにした構成にしようと構想中

電波法の改正があったので、無線回りも工夫したいですね。

ソフトウェア周り

従来のヘンテコC言語による実装をほぼすべて廃棄したい。

せっかくある高級MATLABを使ったモデルベース開発を主軸にしていこうかなと

起動生成について

今までの軟化子を使ったターンを廃止。 基準軌道をベースに追従軌道と数msec後先まで計算するモデル予測制御を採用したい。

最後に3つほど

上記どれもが完成するまで大会に出ませんとかそういうのは多分しません。 所詮構想です。完成して動いたら勝ちです。出れないのが最悪の敗北です。

それと、大会結果はあの場にいれば知ってるので、もっと未来の話とか、裏話とか聞きたいな!!!

明日はアライさんの「社会人マウサーを続けるコツ?みたいなもの」です。 注文した品は来ないが、今シーズン台風を呼び寄せ続けた方がきっとためになる話をしてくれます!!

APEC2019に行ってきた話

3行まとめ

  • APEC大敗
  • ネット環境はt-mobileのSIMで充分。
  • ぼっちディズニー

何位だったの?と聞かれますが、4位以下はノーカンです。

旅行日程

移動について

  • 旅行代理店ではなく、全部JALでカスタム。(Webサイト重い)
  • NRT-LAXで往復ともにJAL(エコノミー)を利用。
    • 隣の席の人とAPEC会場で再会。
    • 10時間程度(復路は11時間程度)
    • 全て通路側を選択。(トイレ難民回避)
  • 空港からの移動はシャトルバスを予約
  • 復路はUberを利用しようと思ったが、他のAPEC出場者がシャトルバスを手配してくれていて、便乗。

荷物について

  • 工具は全部預入れ
  • 機体は手荷物(バッテリーは預入NGです。)
    • アルミフレーム多めの機体でOKだったので、板マウスならOKなのでしょう。

現地のネットワークについて

  • ホテル、APEC会場ともにWIFI完備。
  • Amazonで海外SIMを用意しておいた。
    • Amazon CAPTCHA
    • 事前にアクティベーションが必要
    • 速度は十分すぎる。
    • 電話もできる。
    • iPhoneの場合、ピンを挿してSIMの入れ替えをしますが、そのピンも同梱。(ピンは尖ってないため、機内持ち込みできました)
  • イモトのWifiも持って行ったが出番がなかった(保険でレンタル)

食事について

  • 24h開いてるスーパーとコンビニなどがあったため、特に困らない。
  • 近くのスタバやピザ屋など便利。
    • スタバのドリンクメニューは日本と共通です。
    • 「抹茶フラペチーノ」通じます。

ディズニー

  • 到着直後にぼっちディズニーを敢行。(特にSAN値に変動はない)
  • アドベンチャーとランドと日本で言うランドとシーのように別々の施設がある。
  • 入るまでに時間を掛けたくなければ、通りのチケット店で購入を推奨。
    • ホテルで割引チケットがあったり、割引クーポンをくれたりするので要確認。
  • 園内はアメリカ補正を入れてしまうと、思ったよりも狭い印象。
    • 待機列とかのスペースは日本に比べ圧倒的に広い

お土産

  • イミグレーション後のエリアで買い物をと思ってたが、日本のほうがモノは良かった。(ように見える。見せている。)
    • 日本のほうが商品の見せ方が良い。(陳列方法や照明の工夫など)
    • 男性向けのお土産は少なめ。
  • お酒を買おうにも税関引っかかるサイズが多い。720ml*3まで免税だが、720ml以上のヤツが多くて、これ1本でNGなの??とかわかりずらかった。

英語について

  • 訛りがないおかげか聞きやすい
  • 適当英語で意思疎通できた

最後に

  • アメリカ2回目だけど、水回り(特にトイレ、風呂)に関しては日本はスゴイ!!