はじめに
今年の 1 月末に mocopi が発売されてから、ネット上で様々な mocopi を使った記事や動画が投稿されています。
弊社でも発売開始直後に購入していたのですが、 しばらく放置 中々記事にすることができず、早数ヶ月経過してしまいました。ただ、せっかく購入したのに何もしないのはもったいないため、遅ればせながら mocopi を使って色々なことをしていきたいと思います。
今回は、まず mocopi から送信されてくるデータのパーサーを作り、今後の開発をスムーズにできるようにできるようなライブラリを作っていこうと思います。
実装について
実装例がないか探してみたところ、公式からパースするためのライブラリはなかったものの、以下の有志の方が作成したコードがありました。
GitHub - seagetch/mcp-receiver: Open source implementation of receiver plugin for mocopi motion tracking system.
Open source implementation of receiver plugin for mocopi motion tracking system. - seagetch/mcp-receiver
https://github.com/seagetch/mcp-receiver
この方の実装言語は Python でしたが、自分の予定では RaspberryPi や Arduino などのマイコンと連携していきたいと思っているので、 Rust で実装しました。
調査
いざ実装を始めて見たものの、そもそも UDP レシーバーを実装したことがなかったため、実際に mocopi の通信を読み取り、 Wireshark を使用してどのようなデータが受信できるか見てみるところから始めました。
mocopi からデータを受信する
まずは UDP 経由でデータを受信できるのか確かめます。
説明書どおりに mocopi を体に装着し、モーションキャプチャ画面まで表示します。
そして、PC の IP アドレスに向けて UDP を送信するように設定し、送信します。
上手くいくと、以下のように PC でデータを受信できます。
mocopiデータをパース
前節でデータを送信の確認ができたので、これと解析レポートを見ながら、このデータをプログラム上で受信し、データを利用しやすいようにパースする処理を書いていきます。
普段は Rust を書かないので、最初はかなり苦戦しましたが、以下のブログで紹介されていた nom というライブラリを使用することで、何とか実装することができました。
https://tech.aptpod.co.jp/entry/2020/10/09/090000
GitHub - rust-bakery/nom: Rust parser combinator framework
Rust parser combinator framework. Contribute to rust-bakery/nom development by creating an account on GitHub.
https://github.com/rust-bakery/nom
以下が実装したコードです。構造体の定義を見るとわかりますが、元データの構造から若干変えているところがあります。
実行すると、以下のようにコンソールに出力されます。
パッケージ化
せっかくなので、ここまで来たらパッケージ化まで進めようということで、Cargo パッケージとして公開しました。もしよかったら使ってみてください。
https://crates.io/crates/mocopi_parser
パッケージのソースコードは会社の GitHub にリポジトリにプッシュしたので、そこで確認できます。
GitHub - FOURIER-Inc/mocopi-parser: a parser library for streamed data from mocopi.
a parser library for streamed data from mocopi. Contribute to FOURIER-Inc/mocopi-parser development by creating an account on GitHub.
https://github.com/FOURIER-Inc/mocopi-parser
まとめ
今回は Rust で mocopi の受信データをパースするライブラリを作りました。
今のところこのライブラリを使ってやろうとしている案は、
-
mocopi でゲームをプレイする
-
mocopi でロボットを操作する
の二つを考えているので、アイデアが固まったらドンドン作っていこうと思います。
ちなみに、Arduino や RaspberryPi は C 言語での実装経験はあるものの、 Rust はコンパイルできると聞いたことがある程度の知識なので、もしかしたらこのライブラリは使えないかもしれないです。🤷♂️