社内のアイデアコンテストで優勝した話
この記事はマイクロマウス Advent Calendar 2022の21日目の記事です。
前回はqtfdl94qさんの「マイクロマウスのプログラム構造の紹介2(アプリケーションの基本骨格)」でした。自分も新作ハードを作る度にプログラムを一から書き直していますが、未だに納得のいく構造になっていません。この記事を参考に新しく書き直したくなりましたが全日本大会が終わるまでは我慢です。マイクロマウスは毎年ルールが変わらないのでハードもソフトもじっくり進化されられるのが魅力のひとつだと思います。
◆はじめに
本稿はとあるマウサーが異世界(社内のアイデアコンテスト)に転生(出場)して無双(優勝)した話です。マイクロマウスとは関係ないのでご注意下さい。
例年のアドベントカレンダーではマイクロマウス以外のネタもあったんですが、今年は真面目なマウスネタばかりなので、それ以外の記事を書くのは気が引けたのですが、他のネタもなかったので少しだけ自慢話に付き合って下さい。
◆アイデアコンテスト概要
もはや公然の秘密かもしれませんが一応社名は伏せて紹介させて頂きます。
弊社では隔年周期で会社公式のアイデアコンテストが開催されており、アイデアコンテスト以外にも、モノづくり体験やステージショー、魔○造の夜の作品展などが同時開催され、一般客も参加できる一大イベントとなっています。
今年のアイデアコンテストは、弊社グループの製品をハックしてソフトウェアによる新しい価値や面白さを、イベント当日に訪れた一般客の現地とネット投票数によって競うものに変わりました。
例年はマイクロマウスを展示するだけだったのですが、今年のアイデアコンテストはソフトウェア重視にルール変更され、自分たちでも楽しく開発できそうだったため、ドローンを開発している課のメンバー5人でコンテストに参加してみました。私は後述する地上ロボットのメカとエレキ、Unityアプリの開発を担当しました。
◆VRバトルドローン
まずは作ったものの動画を見て下さい。
今日はちゃんと動画も撮りました。 pic.twitter.com/8GxEmKhbVm
— コヒロ (@Savant013) November 27, 2022
地上を走るロボットの上に360度カメラ(Ricoh Theta Z1)が搭載されており、そのカメラ視点で操縦しながらデンマルくんという弊社のマスコットキャラクターを射撃しています。右モニタにはそのVRゴーグル(Meta Quest2)に写っている映像をそのまま流しています。
上の映像には対戦者が写ってませんが、左モニタには上部にあるドローン視点でデンマルくんを射撃する別のプレイヤーの映像を流しています。
デンマルくんの位置やプレイヤーが発射した弾などは、下のロボットが推定した位置情報をもとに双方のプレイヤーで同期させています。
◆ロボカート
私が仕事で開発しているドローンに360度カメラを載せただけで、本コンテストのルールである「弊社製品をハックすること」を満たしているなんて言うつもりは毛頭ありません。
実は地上ロボットの中にはドローンの制御をしているフライトコントローラ基板がそのまま搭載されており、ソフトウェアも4行変えただけでこの地上ロボットを制御しているそうです。基板の写真などの詳細はコンプライアンス上載せられません。
夢卵では、ドローンの制御基板をリユースした全方位移動ロボットを、上に搭載した360度カメラの映像をVRゴーグルで見ながら操縦して遊ぶゲームを作ってます。ロボットに乗り込んで操縦したいロマンを叶えるべく鋭意製作中です。 pic.twitter.com/rRXJnvccAK
— コヒロ (@Savant013) November 22, 2022
ベースの台車はNexus Robotのメカナムホイールロボットを使っていますが、前述の通り制御基板は弊社製フライトコントローラに換装され、モータにはDJIのRoboMaster M3508 P19、モータドライバは同じDJIのRoboMaster C620を搭載しており、バッテリーは私が信仰しているマキタの18Vバッテリーを利用しています。そのため元の台車は外装とメカナムホイールくらいしか残ってません。
ロボットの上部に搭載されたIntelのRealSense D455は、NvidiaのJetson Xavier NXと接続されており、ドローンでも使用しているSLAMを使って位置情報を推定するのに使っています。今回は走行するフィールドが限られているのでマッピングは事前に行い、位置の推定だけにSLAMを利用しているそうです。
◆システム構成
システム構成は以下の図のようになっています。
プレイヤーそれぞれにMeta Quest2をQuest Linkで繋いだPCがあり、その中でUnityアプリが動いています。これらのUnityアプリはNetcodeというライブラリを使ってマルチプレイヤー化しており、プレイヤー1(ドローン)側をホストとして立ち上げ、プレイヤー2(ロボカート)側をクライアントとして接続しています。
Unity自体を初めて触るというのもありますが、今回の開発で一番苦労したのはこの同期部分です。Unityにはマルチプレイヤーを実現するためのライブラリがなぜか複数あり、今回はデフォルトでインストールされているNetcodeを利用しましたが、なかなかに癖のあるライブラリで手懐けるのに大変骨が折れました。
地上ロボットとの通信にはROSを利用しています。UnityとROS連携は「Unityではじめる ROS・人工知能 ロボットプログラミング実践入門」という参考書とUnityとアールティが共同で開発した教材を参考に作りました。どちらも初心者の自分でもわかりやすく大変勉強になりました。
Ricoh Theta Z1には様々な開発ツールが提供されており、Unityに360度カメラの映像を入力するのにTheta Web APIを利用しています。ThetaにLANを繋いでJSONを投げるとシャッターやカメラの設定変更などができます。
このAPIの制約によりカメラの映像を1920x1080の8fpsでしか送信できなかったので、もし次があったらWebRTCを利用して最高画質で30fpsくらいの映像転送をしてみたいです。
◆イベント当日
マイクロマウスは大会当日にスイッチを入れる程度の体力が残っていれば良いですが、今回は1万人近い来場者があるイベントで、元気いっぱいな子供たちに体験してもらうアプリケーションです。日頃の限界開発に耐えるだけの体力、ドローンの飛行試験で鍛えた現場力、マイクロマウスの展示で培った接客力を活かして、ほとんどトラブルなく2日間を終え、めでたくグランプリを頂くことができました。
夢卵優勝しました!!これでTOEICサボった言い訳ができます。 pic.twitter.com/pgyQ9dbJpm
— コヒロ (@Savant013) November 27, 2022
◆おわりに
ここまでお付きあい頂きありがとうございます。
夏季休暇くらいからUnityとROSを勉強し始めて、勤勉な社会人に擬態しつつ、マイクロマウスの大会に参加して、TOEICを受験したり、アウトドアに出掛けたりしながら開発してましたが、死ぬほど大変な限界開発でした。おかげで優勝することができましたがもう2度とこんな開発はしたくないです。それと同じくらい楽しくもあったから続けられたというのもありますけどね。