cvl-robot's diary

研究ノート メモメモ https://github.com/dotchang/

JINS MEME LoggerのデータをWebSocketServerを立てて取得してみる

新型JINS MEMEが安くておしゃれになっていたので、買ってみました。


ということを、事前に見かけていたので簡単にできるかと思ってやってみたら、本当に簡単にリアルタイムでデータが拾えたので、そのご報告です。

準備

1.新型JINS MEMEを買います。

フレーム形状は4種類、色は2種類、レンズはいろいろから選べます。

2.スマホを用意して、JINS MEME Loggerアプリ(¥120 iphone版、Androidは知らず)を購入します。
‎「JINS MEME Logger」をApp Storeで
JINS MEME Logger - Apps on Google Play

3.スマホとWebSocketServerを立てるPCがつながるローカルのWIFIルータを立てて、それぞれ繋ぎます。

4.WebSocketServerを立てるPCのIPアドレスを調べます。Windowsならcmd.exeを立ち上げてipconfigなど。IPアドレスはメモしておきます。また、データを送るのに使うポートがファイアウォールなどでふさがっていないか確認しておきます。

5.スマホアプリJINS MEME Loggerを起動して、JINS MEMEを接続します。接続後、アプリ中の「ロガー」や「グラフ」上でデータが取れているかどうかを確認して、うまくつながっていたら「設定」を開きます。
「設定」から「WebSocketクライアント」を「追加する」して、適当な「設定名」、「ip address」、「port」、「data type」を埋めたり選択します。
例.
設定名: MEME01
ip address: 192.168.10.17 (WebSocketServerのPCのIPアドレス)
port: 5001 (適度な範囲で適当に)
data_type: currentData (など。ロガーに詳細が出ているので、ほしいものを選ぶ。)

6.PCにPythonを入れて、websocket-serverのライブラリもpipで入れて、コマンドプロンプトからサーバーを実行。

7.スマホアプリの「設定」→「WebSocketクライアント」から登録してある設定を有効にする。うまくつながれば✓のマークが出てデータ送信が始まる。失敗すると×が出て止まる。

サーバー実行

#!/usr/bin/env python3
# reference: https://xp-cloud.jp/blog/2020/09/15/7564/
# pip install git+https://github.com/Pithikos/python-websocket-server

from websocket_server import WebsocketServer
import time
import json
import pprint

def start():
    # Connection event
    def new_client(client, server):
        print('New client {}:{} has joined.'.format(client['address'][0], client['address'][1]))
 
    # Disconnection event
    def client_left(client, server):
        print('Client {}:{} has left.'.format(client['address'][0], client['address'][1]))
 
    # Message receive event
    def message_received(client, server, message):
        # print(message)
        d = json.loads(message)
        # pprint.pprint(d, width=40)
	# currentData
        accX = d.get('accX')
        accY = d.get('accY')
        accZ = d.get('accZ')
        blinkSpeed = d.get('blinkSpeed')
        blinkStrength = d.get('blinkStrength')
        eyeMoveDown = d.get('eyeMoveDown')
        eyeMoveLeft = d.get('eyeMoveLeft')
        eyeMoveRight = d.get('eyeMoveRight')
        eyeMoveUp = d.get('eyeMoveUp')
        fitError = d.get('fitError')
        noiseStatus = d.get('noiseStatus')
        pitch = d.get('pitch')
        powerLeft = d.get('powerLeft')
        roll = d.get('roll')
        sequenceNumber = d.get('sequenceNumber')
        walking = d.get('walking')
        yaw = d.get('yaw')
        
        # debug
        print('accX:', accX, 'accY:', accY, 'accZ:', accZ)
        print('blinkSpeed:', blinkSpeed, 'blinkStrength:', blinkStrength)
        print('eyeMoveDown:', eyeMoveDown, 'eyeMoveLeft:', eyeMoveLeft, 'eyeMoveRight:', eyeMoveRight, 'eyeMoveLeft:', eyeMoveLeft, 'eyeMoveUp', eyeMoveUp)
        print('fitError:', fitError, 'noiseStatus:', noiseStatus)
        print('pitch:', pitch, 'roll:', roll, 'yaw:', yaw) 
        print('powerLeft:', powerLeft, 'sequenceNumber:', sequenceNumber, 'walking:', walking)

    # 5001番ポートでサーバーを立ち上げる
    server = WebsocketServer(port=5001, host='192.168.10.17')
    # イベントで使うメソッドの設定
    server.set_fn_new_client(new_client)
    server.set_fn_client_left(client_left)
    server.set_fn_message_received(message_received)
    # 実行
    server.run_forever()
 
if __name__ == "__main__":
    start()

実行すると、こんな感じ。

f:id:cvl-robot:20211015183450p:plain
JINS MEME LOGGERのWebSocketServerでデータ受信の実行結果

開発されたい方向け。このコードが良くまとまっていて使いやすそうです。