こんにちは、SWチームの Junya です。
LOVOT は様々な技術要素が組み合わさって作り上げられていますが、 LOVOT がどのように開発されているか、 なかなかイメージしにくいのではないかと思います。
その中でも特にイメージのしにくい、LOVOTの基盤部分の開発について、 Lovot Framework チーム (以下LFチーム)の皆さんにインタビューしました。
今回は3部構成の第2回、中編です。前回の記事は、こちらをご覧ください。
ハードウェアの話
司会
LFチームで扱っているハードウェア周りの話も聞かせてください。
マイコンのファームウェアとの連携
bucchi
ハードウェアに近い部分としては、LFチームではメインコンピュータに直接繋がっているデバイス向けのドライバ・サービスと、マイコンとの通信部分を扱ってます。
司会
LOVOTにはとてもたくさんのマイコンが載っていますが、どうやって通信しているのでしょうか?
bucchi
マイコンとはSPI、UARTやUSBなどのインタフェースで繋がっています。
ato
初代・LOVOT 2.0 の構成ですが、ファームウェアチームのブログにこのあたりのことが書いてありましたね。
司会
メインコンピュータとファームウェアの間の連携はどのようになっているのでしょうか?
bucchi
Memmory Map Sync (以下mm-sync)というサービスが各マイコンごとにあり、ファームウェア側のデータを数百 Hz 程度の周期でメインコンピュータの共有メモリに同期しています。
データの中身としては、センサー値の読み取りやサーボへの指示値など、Read/Write 合わせて数百項目あります。
司会
共有メモリにデータを集約することで、各アプリケーションはファームウェアとの通信を気にすることなく、任意のタイミングでセンサ値にアクセスできるのですね。
bucchi
はい。ただ、各アプリケーションは、直接共有メモリにアクセスしているわけではなく、代わりに Nerve System (「神経回路」由来。以下ns)が提供する gRPC を利用しています。
ns は共有メモリへの入出力を仲介するだけでなく、上位レイヤーからの指示値を逆運動学を用いてサーボへの指示値へ変換したり、可動域のガード制御をするなど、データ変換処理も一部担当しています。
他にも、安全制御のためサーボへの指示がなくなるとトルクを抜くような仕組みも入っています。
マイコン以外のデバイス
司会
マイコンとの通信以外だとどういったものがありますか?
bucchi
LOVOT 3.0 のケースでは、メインコンピュータである Jetson Orin NX に直接接続されている、3Dレーダー、NFC、IMU、WiFi、SSD、Bluetooth などが LF チームの担当になります。
他にも、カメラも Jetson に接続されていますが、カメラ関係はスマラボチーム(主に画像認識を担当するチーム)が担当しています。
h1sakawa
ファン制御、バッテリー制御もやっています。
bucchi
そうですね。バッテリーは、ファームウェアチームと半々くらいの感じですね。
直接バッテリー制御ICをコントロールするのはファームウェアチームで担当していて、LFチームではFCC更新(バッテリー容量を正しく推定するための仕組み)などの上位の部分を担当しています。
司会
マイクやスピーカーに関してはどうでしょうか? Jetson に直接繋がっているのですか?
bucchi
確かにそうですね。マイクとスピーカーも Jetson に直接繋がっています。
これらもLFチームの担当ですね。
司会
Device Tree も修正していましたよね? Device Tree もハードウェアに関係しますか?
bucchi
はい。Linux kernel のデバイス設定として、設定を変更したり使わないデバイスを無効化したりするのに使っています。
Jetson Orin では上記の使い方以外に、Bootloader でも Deivce Tree が使われていて、 各ピンのマルチプレクス設定やGPIOの初期状態なども Device Tree で設定できるようになっています。
これらの設定を LOVOT のボードに合わせ込むことも行っています。
起動高速化とディスプレイ制御
司会
起動の高速化みたいなこともやっていましたよね。どうやって速くするのでしょうか。
h1sakawa
そうですね、起動の高速化も実施しました。
簡単に言えば、起動時の制御をシュリンクをしています。 Jetson には LOVOT に必要のないハードウェア制御が数多く入っているので、 いるものといらないものを精査して、差し引いています。
単純に抜いて問題なければよいのですが、一つ一つのハードウェア制御には 他のハードウェアやソフトウェアとの間に依存関係があり、何かを抜くと、きちんと起動しなくなることがあります。
そこで、ハードウェアの仕様やボード設計、ソフトウェアの構造などを総合的にみて、残す、残さないを判断しました。
司会
起動時の目のところについても教えてください。
h1sakawa
起動時の目(ディスプレイ)は FPGA で表示させています。 ディスプレイに表示するスプラッシュ画像(LOVOTの起動時に表示するロゴ画像)とそれを映像信号に変換する回路を作成し、 FPGA に組み込みました。
LOVOT 3.0 では、これまでの LOVOT 1.0 / LOVOT 2.0 と比べると FPGA の性能を抑えたものを採用したため、 ディスプレイに出力する映像信号のタイミングが結構シビアでした。
ディスプレイに表示するための十分な信号スピードを確保するために、 FPGA のパラメータをチューニングして、きちんとディスプレイに表示されるような工夫をしました。
司会
FPGAとJetsonの関係はどうなっているんですか?
h1sakawa
FPGA は Jetson とは別のハードウェアで、 Jetson から映像信号を出力し、 それを FPGA で読み取って、 2つのディスプレイに表示しています。 この2つに分ける処理も FPGA で行ってます。
ato
デュアルディスプレイの仕組みで2つのディスプレイへ出力するのではなくて、FPGAで1枚の画像を2つのディスプレイに分けているんですよね。
h1sakawa
はい。もとは1枚のディスプレイ画像を、右半分、左半分っていう形で2つに分配しています。
司会
電源を入れた直後は、Jetson はまだ動いていないと思うのですが、どのようにして目の画像を表示しているのでしょうか?
h1sakawa
LOVOT に電源が入ると、 Jetson よりも先に FPGA に電源が入ります。
FPGA に電源が入ると、 FPGA の中のスプラッシュ画面を表示する回路がスタートして、目にスプラッシュ画像を表示します。 Jetson からの映像信号が届くまでの間、 FPGA はスプラッシュ画像を表示しつづけ、 Jetson から瞳やまぶたの映像信号が届くと Jetson の映像に切り替わるようにしています。
このあたりは、エレチームと連携しながらやりましたね。
中編のハードウェアの話はここまで。いかがでしたでしょうか?
LFチームでは、組み込みLinuxだけでなく、サーバの構成管理やサービス(デーモン)の開発経験、 Goを使ったバックエンド開発などのスキルを持っている方を探しています。
一緒に LOVOT を作りませんか?
recruit.jobcan.jp recruit.jobcan.jp
次回はとうとう最終回、お楽しみに。