MMA-Visionの解説 ハードウェア編

皆さんこんにちは.@konoe_akitoshiです.
だいぶ遅くなってしまいましたが、私が2023年の全国大会でロボットに搭載していた複数個のカメラの画像をリアルタイムで合成させてボールトラッキングをする技術について解説していこうと思います。
解説内容
この記事のタイトルの通り解説の最初の記事です。私はハードウェア担当ですのでハードウェア部分についての解説を行います。
ソフトウェア編の記事で弊チーム(MMA)の優秀なプログラマーくんがソフトウェアの解説を行ってくれるはずです。
それでは~
はじめに
このモジュール(以下MMA Visionとする)は2023年のルールから複数台のカメラの設置が許可されたことをきっかけに開発した新しい対応のVisionセンサです。
ハードウェア構成
Visionモジュールには高性能のRISC-VプロセッサーであるK210を搭載したSipeed M1n(M5 stack vはこのボードの互換にあたる)を使用しました。

このボードの特徴として非常に小さく組み込みに向いているということ、カメラピン(24Pin)がついていることが挙げられます。
一方でメモリが非常に少ないためプログラムに苦労したと聞いています。
部品名 | メーカー | 使用用途 | 個数 |
---|---|---|---|
maix nano (M1n) | Sipeed | カメラ | 5(4) |
RP2040 Stamp | Solder Party | 画像合成 | 1 |
OV5640-120 Degree | 不明(Aliexpress) | カメラレンズ | 5(4) |
M1nには120画角のレンズをつけて使いました。最初、OV2640という素子のカメラが付いてきます。
最近のM5ではOV7740を使っているようなのですが、画素数が劣るということで今回はOV5640を採用しました。
どうもOmni visionのセンサは数字が大きい方が良いとかではなく、特製の違いっぽいです。ちなみにOV7740の方が画素数が少ないのに夜間性能が良いらしい?(なんでやねん)

ボードの構成は以下の図のようになっています。

カメラとの通信、RPとmainボードの通信共にI2Cを使いました。ここは完全に失敗したポイントで、UARTすればよかったのですが、RPのポートの関係でI2Cにしました。(Software Serialを使う案もあったのですが、通信速度を考え却下になりました)
構成自体は単純ですが、画像処理をさせるということで、M1nの負荷が大きくなることを避けたいと思い、合成用にRP2040を載せました。
M1nからは生の座標データを送り出し、RP2040の方で歪み補正と合成を行うという感じです。
回路
M1nは回路関連のデータが少なく、あっても場所がわからないことが多かったので苦労しました。
結局わからない部分はsipeedにメールしまくりました。(←このメンタルたぶん大事)
基板にピンヘッダを用いてつけ外しのできる形で実装したいと考えていたので、フットプリントなどのありかをメールで聞きました。
このURLのリンクにあるデータとおそらく公開情報であろうPDFをもとに自分でフットプリントを起こし(気が向いたら公開します)基板を起こしました。
後ろ側には書き込み用のType-c(合成用のRP2040)を置き、ResetボタンとそれぞれのM1nを一括でReset、書き込みモードにできるようにスイッチが3つついています。

これはカメラモジュールの話ですが、Wio terminalが取り外し可能になっていて、立地的に少し遠いプログラマー君が電車の中でコーディングして練習場所についたら上に指すだけでロボットが動くようにしたのも工夫点です。
カメラの配置
写真のように5つのカメラを配置しました。前方のカメラはゴールの中心位置を検出する用途で配置しました(本番不使用)。

他の4つのカメラは合成用途。つまりボール検出用です。
4つのカメラはそれぞれ90度角で配置しました。それぞれのカメラの画角が120度なので両端15度が重複する部分、つまり合成に使う部分です。
カメラの配置でもう一つ重要なポイントは傾きです。
おおよその角度を推定するために色々計算しましたが、最終的に針金をレンズに付けて画面を見ながら調整しました。
実際に角度は下向きに35度でした。

結局のところ、全方位視覚センサをやめたことで、Light weightのような低重心のロボットが作れるかと思ったのですが、合成して全方位画像にするので、最適な配置位置はできるだけ「高い位置で中央」でした。
もちろん下方向を向いているカメラの視界を遮ってはいけないので、従来の球形のデザインは継承されました。

ただ、全方位視覚センサのように4つのカメラの視界を遮らなければ何を置いてもいいので設計の自由度は高まりました。
デザイン
あまりカメラがあることがわからないようなデザインにしたいなと思いました。
そして、当時カクカクしたデザインにはまっていたのでフレッチャロッサを参考にしました。

そして、前面にはロゴを載せたいと思ったので、最終的にこんな感じになりました。

デザインを重視したことでカッコよくなりました。これはモチベーションも上がりますし重要です。
一方で、予想以上の排熱が発生し熱暴走でM1nの調子が悪かったことを考えると意味のあるデザインにしなければならなかったと反省しました。
皆さんも実用的でカッコイイデザインを目指しましょう!
※特殊なプログラムゆえの熱暴走でした
おわり
次の記事でプログラマー君がどんな工夫をして高速化させたかを書いてくれると思うので、自分がテストした普通の状態も貼っておきます。

それではごきげんよう
※だいぶ公開が遅くなってしまい申し訳ございません。遅くなってしまったのに資料集めが十分ではないので、追記するかもです。許して…>>大学生