名前 | Aegis 2020 (2020年 RT出場機) |
マイコン | STM32F103 C8T6 with Arduino IDE |
モータ | Maxon DCX10L x2 |
エンコーダ | COPAL RE12D 100pls x2 |
IMU | TDK ICM42605 x1 |
モータドライバ | Toshiba TB6641FG |
バッテリー | BETA FPV 3S 300mAh (45C/75C) |
ファンユニット | 1103 ブラシレスDCモータ with BETAFPV ドライバ |
ラインセンサバー | 自作。 汎用フォトトランジスタ SCM-014TB x16 赤外線LED OSI3120641E x17 |
重量 | 150g |
●概要
2019年度機「乱気流1.9」の大幅改良版。乱気流1.9と同じに見えて、モータを一新したり、IMUやモータドライバを一新したり、制御プログラムがほぼ全部書き換えられていたりと、中身は別物。名前はなんとなくかっこいい響きの英単語を選んだ。
● ブロック図
小さいので拡大して見てください。
●特徴
① 16個のフォトトランジスタを搭載したラインセンサ
100mm×100mmを超えるとプリント基板の値段が爆上がりするので、センサバーはユニバーサル基板で作りつつ、AD変換部はプリント基板にすることで、コストと大きさを両立した。 LEDの電流制限抵抗と、フォトトランジスタのI-V変換抵抗の選定に苦労したが、330Ω,
1kΩの組み合わせで行けることが分かった。
フォトトランジスタを16個搭載することで、反応の一つ一つが、ラインによるものかマーカーによるものかを判別できるようになった。はんだ付けはとてつもなく苦労した。
②ところどころに潜む3Dプリントパーツ
3Dプリンター (Anycubic Mega S)を導入し、こまごましたパーツを制作した。本機体では、BLDCマウント &
タワーバーと、ラインセンサーマウントである。シェル抜きしてあり軽くする工夫がされている。ラインセンサーマウントは、わざとふにゃふにゃな強度にしており、暴走して壁激突した時にランセンサの代わりに壊れてもらうようにしている。なにせラインセンサを再製作するとか大変なので。
③Maxon DCX10L 3V版
よく使われている4.5V版に対して、同電圧でより高出力な3V版を使っている。ただ、電流爆食いするのと、モータドライバでの電圧降下がすごいので、本当に出力が出ているかは謎。素直に4.5V版にしといた方がよかった気がする。
通常フランジだと、取付にM5.5ピッチ0.5という意味不明なナットを要求され、入手困難。自分の場合、知人に頼んで作ってもらった。ねじ穴付きフランジに変えたほうがいい。次買う時があったらそっちのフランジにするだろう。
2021.05.21 ついにM5.5ナットの市販品を見つけました!!!!!!
https://www.imon.co.jp/webshop/index.php?main_page=product_info&products_id=152844
④ モータドライバ TB6641FG
マイクロマウスではまず使われない TB6641FG というモータドライバを使っている。前述のマクソンモータの電流に余裕で耐えれること
& 東芝製ということで、これを使うことにした。今のところ問題は発生していない。でかい、厚い、高い。ほかの人の使っているTB6614でいいと思う。
⑤ 最新型のIMU
TDKの最新型(?)
ICM42605を使った。結果、MPU9250に比べオフセット安定性が向上した(気がする)。生値を積分して角度を出すのに使っている。が、LGAパッケージなのではんだ付けが激ムズで、使いこなすのに1年かかった。
⑥ FRAM
みんな大好き不揮発性RAM。1byte単位で読み書きできるため、諸々のマップデータを保存している。自分の場合、マーカーマップ、ラインマップ、速度計画マップ、補正計画マップetcと、事前演算情報をこれでもかと保存している。使っているのは、富士通製MB85RS2MT。安心と信頼の日本製でマニュアルも日本語なので採用。2Mbitと大容量だが、こんなに必要かは疑問の声が尽きない。
⑦ シリアルフラッシュメモリ
制御データを保存している。32Mbitと大容量なので、惜しみなくデータを保存できる。搭載しているのはMicrochipのSST26VF032B。SDカードは、通信速度が遅いので使っていない。ちなみに、Bluetoothで無線通信してデータログするのもありだと思う。
⑧BLDCユニット
BETAFPVのBLDCドライブシステムをそのまま使っている。2019年度にすでに使いこなしていたため苦はなかった。BLDCドライバが手に入りにくいのが難点。今から使いたい人は、別のBLDCドライバを使うことを強く推奨する。バッテリー消費が激しい。ファン圧は3Sになってから計測していないが、バッテリー2Sで100g強あった。
⑨ 加減速走行プログラム
完全自作だが、オーソドックスな方法になっていると思われる。
・1周目:等速走行し、走行距離に対するジャイロセンサーのログをとる。その後、ジャイロ値に反比例するような関係で、距離に対する速度計画を生成しFRAMに保存しておく。
・2周目以降:走行距離に応じてこの速度計画をプレイバックするだけ
という感じ。速度計画にはマーカーを一切使っていない。走行距離は、左右エンコーダのカウント平均値で算出する。自分の場合、ジャイロセンサー情報から生成した速度計画に対し、加減速タイミングに追加補正をかけている。例えば、長い直線を走るときは測距誤差が大きくなるだろうから早めに減速しよう、など。
⑩ 距離補正プログラム
タイヤのすべりの違いから、1周目と2周目では累積走行距離に誤差が生じる。ゆえに、単純にジャイロマップをプレイバックするだけでは加減速タイミングがずれていく。
自分の場合、先人の知恵を利用した。具体的には、1周目にマーカー&走行距離をセットで計測し、マーカーマップを生成、2周目でマーカーを計測するたびに走行距離を補正している。現在の走行距離に最も近いマーカーを、二分探索でマーカーマップを検索し補正する(ここまでが先人の知恵)。なので極端な話、自分のロボットでは、マーカーはどこに貼ってもらってもいい。あればあるほど補正点が増えるが、無ければないで推定の正確性が増すので、現状ルールでちょうどいい感じ。
また、補正タイミングも、R10ターンを避けて補正をかけている。これは、1周目にてR10にてマーカーを読み落とすことがよくあるためである。要は、マーカーマップが不完全な場合でも間違った補正をしない工夫である。そもそも、R10ターンでマーカーを読み落とさないようなハードを作るべきだった。
⑪ 大量にぶら下がったSPIデバイス
ブロック図の通り、1個のSPIバスにこれでもかと言わんばかりにデバイスがぶら下がっている。当初はこんなにぶら下げるつもりはなかった。つっこんではいけない。
DMA機能を使っており、小さいCPU負荷でデータ転送している。内部では転送管理用スケジューラがプログラムされていて、IMUとADCはスキャン風に常時データ更新を、FRAMとFlashは必要な時に間欠的に動いている。素直にSPIを二つ使わなかった者の末路である。
⑫ マーカーセンサの距離フィルタ
2018年度、コースのライン右側にわずかな白い傷があり、多くのトレーサーがその傷をマーカー判定して止まってしまった。このような教訓から、自分のトレーサーではマーカーセンサの反応している距離を計測し、閾値以下の反応はすべてノイズとして処理している。ついでに十字路も判定している。2019年度の実装をきれいにした。
● 制御
ライントレースと直進速度の制御に分けている。巷でいう、直進と旋回で制御を分ける感じ。ライントレースはデッドエリア付きのPD制御、直進速度は二自由度のI-PD制御を4ms周期で実行している。遅すぎと思われるかもしれないが、ロータリーエンコーダの分解能の都合上このくらいがいいところ。
コツは、ライントレースの制御をとにかくハイゲインにすること。ラインセンサーの中央しか使わないくらいのイメージで。そうすると、カーブ途中のマーカーを、簡単な処理で全部フィルタできるようになる。
速度制御は、台形加減速に追従させたいなら、二自由度化は必達課題。フィードバックのほうは、I制御大き目で、PD制御部はおまけみたいな感じに仕上げた。D制御はぶっちゃけいらない。
困ったことに、スピードを上げていくとPWMが飽和することが多々発生する。とくにうねうねライン部。飽和するとライントレースの入力が不足してラインアウトしてしまう。なので、ライントレースの入力を優先し、PWMが飽和する場合は、直進速度の制御をカットしている。具体的には、飽和限界まで入力するけど、積分を停止している。ラインアウトさえしなければOK、的な精神。そのせいで、うねうねは全く速度が出せていない。
●2020年の成果
① Maxon DCX10L
マクソンモータの特性がなんとなく理解できた。誉21Sと違い、ピニオンギヤを圧入しても壊れないのが偉大。ただ、トルクが誉21Sに比べ小さいのが難点...。ちなみに2Sバッテリーだと、高速動作時にライントレース制御と直進速度の制御が両立しない
=
電圧が足りない。2S時代、なーんか加速中に急減速するなーとログを詳しく調べていたら、PWM要求値が100%を超えている、なーんてことも。3Sにして10g減らしつつ足りないトルクを何とかするか、2Sで大きなモータを使うかは永遠の課題。ちなみに3SにしてもPWM要求値は100%を超えた(笑)。
② 新型IMU
ICM42605を使いこなせたのはでかい。来年からはもう困ることはない。きちんとしたところから買えるので、中身の信用度も高い。
③ 新型ラインセンサ
高解像度ラインセンサを作れたので、次のステップ=オドメトリ補正に開発の軸を移せる。が、一体どうやればいいの?
④ プログラムのクラス化
せっかくのArduinoなので、C++のクラスをふんだんに使って各種機能をプログラムした。グローバル変数が散らからなくなったため、メンテナンス性が向上した。が、そもそもArduino
IDEを使わないでおけばメンテナンスうんぬん言わなくて良かった気がしないでもない。
●2021年にやりたいこと
① 開発環境の移行
そろそろArduino
IDEだと限界を迎えている。タブが20個以上ある。そりゃマップ解析とかSPIスケジューラとかぶちこんだらそうなる。ブレークポイント設けられないとか、ステップ実行できないのも痛い。プログラムデバッグは毎回泣きそうになる。
② 経路追従制御
実はアルゴリズムとコード実装はもうできている。が、オドメトリ補正を作れていないため封印している。ラインセンサを使ってオドメトリ補正をしないとどうしようもないか、そんなことできるのか?(いや、2019ではやっている人がいるし、その後も別の人の開発例があるからできないことはないはず)