Produced by Fourier

mocopiの通信データパースライブラリを作ってみた

Hirayama Hirayama カレンダーアイコン 2023.04.21

はじめに

今年の 1 月末に mocopi が発売されてから、ネット上で様々な mocopi を使った記事や動画が投稿されています。

弊社でも発売開始直後に購入していたのですが、 しばらく放置 中々記事にすることができず、早数ヶ月経過してしまいました。ただ、せっかく購入したのに何もしないのはもったいないため、遅ればせながら mocopi を使って色々なことをしていきたいと思います。

今回は、まず mocopi から送信されてくるデータのパーサーを作り、今後の開発をスムーズにできるようにできるようなライブラリを作っていこうと思います。

実装について

実装例がないか探してみたところ、公式からパースするためのライブラリはなかったものの、以下の有志の方が作成したコードがありました。

GitHub - seagetch/mcp-receiver: Open source implementation of receiver plugin for mocopi motion tracking system. thumbnail

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 というライブラリを使用することで、何とか実装することができました。

Rustでバイナリを読み書きするのに必要なクレート3選 - aptpod Tech Blog thumbnail

Rustでバイナリを読み書きするのに必要なクレート3選 - aptpod Tech Blog

研究開発グループの大久保です。 当社の製品の中にはC/C++で書かれたものが存在し、その中には独自のバイナリフォーマットを取り扱うものが存在します。既存のコードとやり取りするようなRustのプロジェクトを起こすためには、その独自のバイナリフォーマットをRustで取り扱えるようにしなければなりません。しかしながら、Rustの標準ライブラリの機能だけでは、バイナリの読み書きは意外と面倒になります。そのため、今回はRustでバイナリを扱うのならぜひ知っておきたいクレートを3つご紹介します。

https://tech.aptpod.co.jp/entry/2020/10/09/090000

Hirayama

Hirayama slash forward icon Engineer

業務では主にPHPやTypeScriptを使用したバックエンドアプリケーションやデスクトップアプリケーションの開発をしています。趣味は登山。