M5StickC 3Dマウスを動かしてみる

目次

M5StickC 3Dマウス

M5StickCの6軸慣性センサMPU6886(加速度センサ3軸、ジャイロセンサ3軸)を利用して、3Dマウスを作成されている方がいらっしゃる。

動画でかなり精度よく3Dオブジェクトを操作、クリックできている。

www.youtube.com

 

ソースコード

M5StickCを水平に設置した際に、XY方向の加速度(重力)の大きさにより、マウスの移動方向を決定している。

初めはX方向、Y方向のジャイロセンサを利用していると思った、Y方向の回転によりマウスが上下するのは良いが、X方向の回転でマウスが動作しないため、違和感を感じてソースを見てみると、XY方向の重力の大きさでマウスを上下・左右に動かしていた。

ジャイロでも良いと思われる。

github.com

 

HID OVER GATT (BLE入力)がうまくできない場合

技術的には、HID OVER GATTという通信規格を使っています。

f:id:jijiken0417:20200922142001p:plain

 

GATT対応のBluetoothバイスがあるPCで「Bluetoothバイスを追加する」を押すと、

ESP32 BLE Keyboardという名称が見えるると、後は選択すれば接続が完了します。

f:id:jijiken0417:20200922142045p:plain

 

ただし、接続されていてもキー入力できない場合があります。

その場合、デバイスマネージャからBluetooth関連の全てのデバイスを削除するのが良いです。(PC再起動しなくとも基本的に接続できます)

PCに接続されたBluetoothバイスのドライバは自動で追加されます。

また、BLEデバイスもデバイスを追加した際に、ドライバが自動で追加されます。

Windows10の場合、外部からドライバを追加インストールする必要はありません。

(追加で入れると相互に影響する可能性があるので入れないほうが良いです。自分はこれで接続できずにはまった気がします。)

f:id:jijiken0417:20200922141547p:plain

 

所感

 Fantazy Earth ZeroというMMO対人ゲームのコントローラに利用したいと思っており、視点移動・スキル実行を行う際、マウス一つでは加速度かジャイロを用いた視点移動程度しかできず、8つのスキルをM5StickC側で区別して入力する手立てがない。

 やはり、マウス入力はBLEで行っており、コードはキーボード用、マウス用、ゲームパッド用の3つがある。

 視点移動・スキル実行を一つのM5StickCで行う場合、①マウスで視点移動/キーボードでスキル実行、もしくは②ゲームパッドで全てを行う必要がある。

 ②の場合、視点移動は3Dマウスのソースを活用させてもらえばよい。その場合、スキル実行はボタンを押しながらの加速度の変化に応じて特定の入力を行う。

 ①の場合、視点移動は3Dマウスのソースに加え、加速度の変化に応じて特定の入力を行う。

 まずは①からやってみよう。

 

 最終的に4パターン程度あるため、何が良いかは順次試す必要がある。

 ①+加速度のみ

 ①+ジャイロも利用

 ②+加速度のみ

 ②+ジャイロも利用

 

Pitch/Roll/Yawの取得

 3Dマウスは加速度を利用しているが、Pitch/Roll/Yawを直接取れないものかと思った。M5.IMU.getAhrsData()でPitch/Roll/Yawを直接取得できるようだが、Yaw方向にドリフト誤差ががあるようだ[1]

 [2]を参考に、M5StickCで取得した値をMadgwickフィルタで処理してみた所、赤Roll 青Pitch 緑Yawとなり、Yawの傾きが大きくドリフト誤差が生じている。

 

f:id:jijiken0417:20200921145613p:plain

 

[3]を参考にオフセットを入れてみるとかなり良くなった。

尚、地磁気センサは利用していません。

青線(roll)は0度-180度と180度の境目のためスパイクが立っているが、誤差は少ない。

f:id:jijiken0417:20200921162937p:plain

[1]M5StickC(MPU6886)+ENV Hatで6+3軸IMUの値を取得する - Qiita

[2]パソコン上のM5Stackの3Dモデルを、M5Stackの動きに合わせて動かす - AmbientでIoTをはじめよう

[3]M5StickC(MPU6886)+ENV Hatで姿勢推定する(Madgwickフィルタ編) - Qiita

FEZインターフェイスへの利用

BLE 3Dマウス

 ◎ Aimモードでの動作はある程度マウスと同じようにできる。微調もできる。6軸姿勢推定では積分誤差が大きくなってくるので、加速度だけを利用したほうが良いと思われる。9軸姿勢推定では問題ない?

 △ BLEマウスのソースコードがキー入力に対応していないため、任意スキルの実行ができない。BLEキーボードかBLEゲームパッドを同時に動かせられればよいが、現状できない。→口述するように二台でやってみている。

 △ WIndowsへの左クリック、右クリック、ホイールクリック、進むクリック、戻るクリックは100%効くが、FEZ上だと30%程度の確率でしか成功しない。BLEの送信頻度を変更しても変わらない。原因不明。そのため、クリックでスキル実行するには、クリック入力を連続して30回程度は行う必要があり、この場合成功確率は 10万回に3回失敗する程度。1-(1-0.3)^10=0.9999

 △ ホイール移動 move(0,0,1) or move(0,0,-1)は FEZでは連続実行できない。

   delayを5msまで入れてみたが効果がない

BLE ゲームパッド

 〇 Aimモードで視点移動ができるが、微調はマウスに劣る。

 〇 任意のキー入力もできる。

 △ 視点を滑らかに動かせない

BLE キーボード

 × 視点移動ができない。

 

 BLEゲームパッドで進めることにする。

 

BLE 3Dゲームパッド(左手) + BLE マウス(右手)

 〇:移動(左手)と視点(右手)を行える。

   マウスのスキル選択・実行が失敗することが多いため、スキル選択を20回選択→30ms待機→スキル実行を20回実行にした。これでレート30Hzまでなら問題ない。

 〇:微妙な視点移動ができる。

   移動は加速度。

   視点はジャイロの加速度により細かい制御、ジャイロ速度により早い移動をできるようにした。

  ×: ポケット3/4が使えない

BLE キーボード(左手) + BLE マウス(右手)

 〇:移動(左手)と視点(右手)を行える。

 サンプリングレート30Hzなら問題ないが、それ以上だとパケット衝突のためかBLE キーボードの入力が遅れているかもしれない?

 →スキル実行は遅れるため、2台同時は非常に難しい。2台動かすには、スキル実行や選択がなぜ100%成功しないのか、ライブラリを解読するなどして突き止める必要がある。

 ×:キーボードもマウスもスキル実行時、ある程度連続送信しないとスキル実行されない。

 〇:ポケット3/4が使える?

USB DDRマット + BLE マウス(右手 )

 〇:移動(足)と視点(右手)を行える。

  ×: ポケット3/4が使えない

 

所感・残務

 1.キー入力が遅れる場合のデバッグ用にサンプリングレートを変更できるようにする。

  →30Hz程度なら特に問題ない。

 2.キー入力の失敗

   ゲーム依存なのかスキル選択・実行は失敗することがある。連続実行により対応する。

 

 3.キー入力は加速度のみで判定しており、誤判定/未実行がかなり発生するため、変位で検出してみる。参考 [Arduino] IMUから速度と角度を求める - Qiita

  → 移動平均により平滑化した。

 4.視点変更を誤差のある6軸RPYで無く、加速度のみにしてみる。

  → ジャイロ速度の利用により、微妙な操作が可能。

 5.視点変更を9軸RPYにしてみる

 6.Boothに出店

企業仕事の価値観

価値観

 インターネットのおかげで仕事はどこでもできるようになった。

 オープンソースのおかげでソフトもハードも共有される世界となった。

 開発は会社に行かなくてもできるようになった。

 仕事は本当にどこでもできる。仕事と生活の垣根が無くなってくる。

 しかし、それでいいのだろうか。平日も休日も同じような事をする。

 そんな仕事感でいいのだろうか。

 

 会社でもプライベートでも、そこでしかできない仕事がある。

 制約があり資産がある会社、自己の最良で好きな事ができるプライベート。

 明確な境界が無くなりつつあるこの時代に、心の線を引きながらも、上手く調和し、時間とも資源も最大限使えるようにしたい。 

 そして、企業でしかできない事を探究したい。

 

GNURadioでTTGO-Beamの信号をgr-loraで受信する

LoRa Decodeブロックが複数あるため、それぞれ紹介する。

rpp0/gr-lora

TTGO-BeamからのLoRa信号をRTL-SDRで受信し、GNU Radioのgr-loraブロックにより復号することを試みる。今回は以下の条件で行った。

  • GNU Radio : 3.8
  • OS : Doker Arch Linux on Docker
  • Receiver: RTL-SDR
  • Transmitter : TTGO-Beam

環境構築・実行

gr-loraは、rpp0/gr-loraを利用し、READMEに記載のDocker Installationにより、gr-lora環境を構築した。

GitHub - rpp0/gr-lora: GNU Radio blocks for receiving LoRa modulated radio messages using SDR

 

Dockerコンテナへ接続後、Sampleの"lora_receive_realtime.grc”を実行。

git clone https://github.com/rpp0/gr-lora.git .
cd docker/
./docker_run_grlora.sh
gnuradio-companion lora_receive_realtime.py

FrequencyとSpreading Factorを適切に設定し、TTGO-BeamからRTL-SDRへ信号を入力した結果を載せる。今回はTarget 923.2MHz(Center923.0MHz)、SF9とした。

GNURadio コンソールにCSV形式で送信したデータが16進表示されている。2C(コンマ、Comma)が頻繁に現れている。Water FallはCenter周波数0MHzから上側に200kHz離れたTarget周波数でチャープ変調している。

f:id:jijiken0417:20200405152632p:plain

 

追記

GNURadio3.7で動かす場合は、3,7branchを利用するのが良い。

GNURadio3.7にてLimeSDRでも動作した。

gr-loraに同梱のMessage Socket Sinkに復号データを渡すと、UDPで指定portへ送信できる。

f:id:jijiken0417:20200405163906p:plain

 

BastilleResearch /gr-lora

GitHub - myriadrf/LoRa-SDR: An SDR LoRa implementation for R&D にソースコードがあるが、Mod/Demodブロックが何の信号を入出力するのかわからなかった。

 

後日 LoRa modem with LimeSDR – MyriadRF を見るとGNURadioよりもデータフローがビジュアル化されてわかりやすいPothos(ブロックはほぼ共通?)で使われているような事例があった。Mod/DemodeはSDR Sink/Soureceと直接接続すれば良いので、rpp0/gr-loraと使い方は同じでbit列をベースバンド信号に変換してくれるようだ。f:id:jijiken0417:20200405233156p:plain

GRConで発表されておられるMATT KNIGHTさんの名前があるため、元のソースはGRCとPhotosで共通なのだと思われる。

 

 

Zynq-SDRによる開発

Zynq-SDR

Zynq - GNU Radio によると、Zynq-SDR(Zedboard/zc702/zv706)はGNURadioを実行でき、GNURadio上でFPGA Accelearatedなブロックを実行できる。

以下は FIR Filter FPGAが組み込まれた例。FIR Filter FPGAはサンプルで提供される。

f:id:jijiken0417:20200331220456p:plain

但し、開発は2017で終了しているようだ。

This page was last modified on 13 March 2017, at 14:23.

 本資料は古いようなので、以下を参考にする。

Embedded Development with GNU Radio - GNU Radio

Hardware - GNU Radioによると、利用できるHardwareは先に記載したものと同じでZedboard/zc702/zv706等。RFフロントエンドとしては、4x4のAD-FMCOMMS5-EBZ 等が利用出来る。

Common development tasksの中でも、

 を理解する必要がある。

MATLABからHDL codeを生成して実行

Using Model-based Design for SDR - Part 1 | Analog Devices によると、MATLABからHDL codeを生成して実行することもできる。

AD-FMCOMMS5-EBZ User Guide [Analog Devices Wiki]

に開発事例が詳しい。

 

Analog Devices の IP コアを使う

場合は以下を参考にする良いかもしれない。

Analog Devices の IP コアを使う

 

Pythonによる高位設計

以下を参考にすると良いかもしれない。

https://swest.toppers.jp/SWEST17/data/s5c_proceeding.pdf

 

GNURadio Technic(更新中)

手動インストール

インストール先の変更

以下によると、通常のインストール先は/usr/local/lib/&pythoversions/dist-packagesだが、cmakeのオプション-DCMAKE_INSTALL_PREFIXによりインストール先を変更できる。

この場合は、../にインストールされる

$ mkdir build # We're currently in the module's top directory
$ cd build/
$ cmake ../ # Tell CMake that all its config files are one dir up
$ make # And start building (should work after the previous section)

When you run cmake, you usually run it in a separate directory (e.g. build/). This is the build tree. The path to the install tree is $prefix/lib/$pythonversion/dist-packages, where $prefix is whatever you specified to CMake during configuration (usually /usr/local/) with the -DCMAKE_INSTALL_PREFIX switch. 

$ cmake -DCMAKE_INSTALL_PREFIX= ../ # should be the configured 

 

 

 

Python環境変数の設定

但し、GNURadioのインストール先を指すprefixを変更した場合、以下エラーが表示される。

Cannot import gnuradio

f:id:jijiken0417:20200330193932p:plain

 

Python環境変数であるPYTHONPATHとLD_LIBRARY_PATHをShellから読めないために発生する。exportにより設定する必要がある。

$ export PYTHONPATH=~/grc3.8.0/gnuradio-3.8.0.0/lib/python3.6/dist-packages:~/grc3.8.0/gnuradio-3.8.0.0/lib/python3.6/site-packages:$PYTHONPATH
$ export LD_LIBRARY_PATH=/home/kenji/grc3.8.0/gnuradio-3.8.0.0/lib:$LD_LIBRARY_PATH

Shellに接続する毎に自動設定する場合は上記設定を~/.bash_aliases or ~/.bashrc or ~/.profileへ追記する。

gnuradio3.8.0手動インストール

最終的に、gnuradio-3.8.0.0の手動インストールは以下のように行うことで、gnuradioが正常起動した。

$ wget https://github.com/gnuradio/gnuradio/releases/download/v3.8.0.0/gnuradio-3.8.0.0.tar.gz

$ tar xvf gnuradio-3.8.0.0.tar.gz

$ cd gnuradio-3.8.0.0

$ mkdir ~/build
$ cd ~/build
$ cmake -DCMAKE_INSTALL_PREFIX= ../
$ make -j3 // If PC have 4  cores, 3 is recommended not to fleez.
$ make test
$ sudo make install

$ export PYTHONPATH=~/grc3.8.0/gnuradio-3.8.0.0/lib/python3.6/dist-packages:~/grc3.8.0/gnuradio-3.8.0.0/lib/python3.6/site-packages:$PYTHONPATH
$ export LD_LIBRARY_PATH=/home/kenji/grc3.8.0/gnuradio-3.8.0.0/lib:$LD_LIBRARY_PATH
$ cd ../bin
$ ./gnuradio-companion

 

参考

InstallingGR - GNU Radio

OutOfTreeModules - GNU Radio

ModuleNotFoundError - GNU Radio

OOTブロックのインストール

続いてOOTブロックをインストールする。

OOTブロックをインストールしようとしたが、 missing: Volk::volk エラーが発生。

 

$ cmake -DCMAKE_INSTALL_PREFIX=../../ ../

CMake Error at CMakeLists.txt:101 (find_package):
Found package configuration file:

/home/kenji/grc3.8.0/gnuradio-3.8.0.0/lib/cmake/gnuradio/GnuradioConfig.cmake

but it set Gnuradio_FOUND to FALSE so package "Gnuradio" is considered to
be NOT FOUND. Reason given by package:

The following imported targets are referenced, but are missing: Volk::volk

 

-- Configuring incomplete, errors occurred!

https://kazkojima.github.io/gr-neug.html

結論

Python環境変数に悩み、解決に多忙な時間を費やすのであれば、

手動インストール先をデフォルトの/usr/local/...に設定し、

各OOTブロックを手動インストールするのが良い。

最終的にgnuradio3.8.0、gr-lora、gr-limeは手動でインストールできた。

同一PCに複数のversionを入れる場合、python仮想環境のvirtualenv、またはdockerでコンテナを作るのが良い。

 

Dockerによるインストール

Dockerコマンドは以下を参照されたい。

Dockerコマンドメモ - Qiita

Input any text from GUI

File:Epy demo.png

File:Epy demo.png - GNU Radio

LimeSDR VNA(Memo)

Setup

sudo -s apt install python3-pip

sudo -s pip3 install Cython

sudo -s pip3 install setuptools

python3 setup.py install

sudo -s apt install libpython3.5

Execution

python3 measureVNA900M.py DUT20dB

 -> DUT file and short file will be generate.

python3 calculateVNA_900M.py DUT20dB

 -> DUT20dB.s1p are generate.

 

from s1p, calculate power(=20*log10(SRQT(i^2+q^2)) and phase(=atan(I/Q)).

However the data have bad duw to

- Directibity of coupler is not so good(=about 20dB)

- Lime has 180 degree phase jump

The VNA can measure only s11 log-mag( -20dB>)

 

freq[HJz] I[mv] Q[mv] Power[dB] Phase[degree]
890000000 -0.3207844778 0.1656117838 -8.849557909 -1.09421666
891000000 -0.320746235 0.1248143493 -9.26440117 -1.199689209
892000000 -0.33145192 0.09156823234 -9.272167867 -1.301255368
893000000 -0.3298455399 0.06659722632 -9.46025948 -1.371570401
894000000 -0.323988073 0.04586521932 -9.703245322 -1.430166261
895000000 -0.3176111542 0.01769844856 -9.948620591 -1.515130259
896000000 -0.3137158057 0.02579331231 -10.04001283 -1.488762122
897000000 -0.3123975193 0.02814374638 -10.07074286 -1.48094934
898000000 -0.3198297211 0.03133417552 -9.86013707 -1.473136559
899000000 -0.319007123 0.04898002654 -9.822799017 -1.418447089
900000000 -0.341734431 0.06622322869 -9.16612285 -1.379383182
901000000 -0.3412811236 0.07168561031 -9.150248832 -1.363757619
902000000 -0.3647781632 0.08259255915 -8.54229973 -1.348132056
903000000 -0.3651387116 0.09934108934 -8.440723564 -1.305161759
904000000 -0.3674497304 0.1015131313 -8.376619988 -1.301255368
905000000 -0.34211872 0.1002489499 -8.958712934 -1.28575188
906000000 -0.3425551609 0.1062162584 -8.906714661 -1.270126317
907000000 -0.3201771305 0.1076086631 -9.427409269 -1.246565898
908000000 -0.3150940205 0.1183821603 -9.457755423 -1.211408381
909000000 -0.3118271442 0.1116265427 -9.598066235 -1.227033944
910000000 -0.325873772 0.08185771054 -9.473275999 -1.324693712

Although Lime has phase 180 jump, calculateVNA.py fix the error????

https://github.com/myriadrf/pyLMS7002Soapy

 

Installing GNURadio3.8

以下を参考にUbuntu18.04へGNURadio 3.8のインストールを試みたが、何度も失敗した。

GitHub - gnuradio/pybombs: PyBOMBS (Python Build Overlay Managed Bundle System) is the GNU Radio install management system for resolving dependencies and pulling in out-of-tree projects.

 

数週間後に Gnuradio 3.8 on Ubuntu 18.04 · GitHub 殿のサイトを参考にするとインストールに成功した。但し、途中cmake3.13以上を求められるため、既存の3.10を削除し、ソースから3.15.2をbuildしインストールするとpython2系のGNURadio 3.8をインストールできた。

 

GRC3.8はPython2,3両者で動作するが、後方互換性もある可能性があるためpython2を入れた。