報告したGPSロガーの更なる小型化(完全自己完結化)について一息付けたので、ここで再度取り
上げたいと思います。7月までのGPSロガーの開発状況を振り返ります。ハードはホストとのUSB
接続を前提とした非自己完結型でした。
タブレットPCと接続してデータ収集実験もしました。小型化が最大の課題でした。
タブレットPCをラズパイ3A+に替えてモバイルバッテリで動作確認しました。Node-RED
ベースなので、Windowsでもラズパイでもソフトウェアは共通でした。
更なる小型化(犬用リュックに収まる程度:自己完結に近づける)のためラズパイ基板
とマイコン基板の容積を小さくするよう工夫しました。が、USBケーブルが邪魔です。
ラズパイのGPIOに直接GPSやセンサを接続しマイコン(XIAO)不要かつUSBケーブルを
使わない完全自己完結型を目指しました。苦労しました。
課題は大きく2つありました。GPSシリアルを直接ラズパイGPIOに接続すること、結線は簡単です
がソフトウェアです。ライブラリを使えば動くというようなものではありませんでした。
もう一つは、pythonプログラムの自動起動です。ラズパイ4などは4とおりあるようですが、ラズ
パイZEROは3/4はNGでした。
マイコンとラズパイのUSB通信を無くしGPSと加速度センサを直接ラズパイのGPIOに繋げてより
軽量化するハードウェア構成に替えたこと、その場合GPSとラズパイのシリアル通信方法や加速度
センサの制御ライブラリを探しpythonでコード化すること、電源投入で上記pythonコードが自動
起動することが必要で、マイコンベースで開発してきたハード構成とNode-REDベースの便利な環
境で楽をしてきたつけが回ってきました。
まずラズパイのの開発環境ですが、ラズパイZEROはDRAMが0.5GBしかなくたらたらしていて
開発には向きません。ラズパイ400で開発しラズパイZEROに移植する方法を取りました。
まず、GPSですがGPIOのTX/RXを有効にするため設定変更をします。またGPSのコントロール
を「gpsd」というプログラムを起動時に動作させpythonコードからデータを収集できるようにし
ます。
また、ネイティブなGPSの出力(冗長な)を翻訳する「microGPS.py」をライブラリとして使用
します。*マイコン(XIAOやArduino)のライブラリでも「microGPS.h」を使用しました。
加速度センサ(MPU6050)は、GPIOとはI2C接続(SDA/SCL)ですがいつものようにまともな
pythonライブラリが無いため煩雑なコードになります。完全自己完結型GPS02のpythonコード
(GPS02.py)を以下に示します。
ログデータは、1秒間隔で自己完結のためapendモード(’a’)で共有フォルダ(share)に「GPS_
MPU6050/GPS00.csv」としてcsv形式で書き込むものと、更新モードで(’wt’)で書き込み
「TEMP.csv」して一行書き込みを繰り返します。これは、Node-REDを生かしておりWiFiがWEB
に接続された環境で、現在位置表示とダッシュボード表示をサポートするものです。親サーバーみ
たいなのを介してGPS00.csvを常時pullすることができればTEMP.csvは不要です*が,,,,,,,
*個々のGPSロガーがNode-REDのWEBサーバー機能とデータログをまるごと保存している仕様なの
で完全自己完結と呼ばせていただいています,,,,,,,,次にラズパイZEROでのpythonコードの自動起動
です。pythonコードの自動起動は4つの方法があるようです。開発環境のラズパイ400ではすべての
方法で自動起動を確認できましたが、ラズパイZEROはだめですね。唯一の方法は、autostartファ
イルを使う方法でした。
この方法は、そのまま使うとGUI画面設定の消えてしまいます。以下のようにautostartファイルに
追加書き込みを行えばGUI画面を表示できます。(DRAMの消費を抑える意味ではGUI画面は不要
ですが)
GPSロガーからの出力データを表示します。1秒間隔です。
リアルタイムサービスを行うNode-REDのブロックプログラムを示します。入力ノードは
「ReadCSV」です。先ほどのshare/TEMP.csvを流量制限して読み取り表示します。
地図情報はWiFiがインターネット環境に接続されていれば表示されます。
GPSロガーの通信環境についてレポートします。通信環境が無くても時刻を含むログデータを
保存するのですが、通信環境があるとリアルタイムの位置確認やセンサデータの表示がWEBを
介して可能になります。複数台あってもクラウドサーバーのようなセンターサーバーを介すこ
となく、個々のGPSロガー(WEBサーバー)に直接アクセスできます。
通信環境は、2.4GHzのWiFiです。今回は屋外用のアクセスポイントを用意しました。ドッグ
ランでは全域にWiFi環境があることを想定しています。APは中華製で愛用しているWAVLINK
です。アクセスポイントの設定はLANケーブル経由で、192.168.10.1で設定します。このIP
アドレスは変更できませんでした。
ラズパイZEROのIPアドレスは、192.168.10.201とか200番台を使用しました。
ラズパイ側のIPアドレスの設定は、ファイルを書き換える等必要はなくGUIで設定できるように
なったようです。wlan0もeth0も固定IPアドレスを設定します。/24はマスクを表しているようです。
アクセスポイントを介した通信確認のためセンサデータのダッシュボード(Node-RED)
を表示しました。 通信できています。
屋外での実験のため、IPアドレスを192.168.10.210と192.168.10.220に振った2台を準備しま
した。1台は群馬県、もう一台は横浜市の愛犬家にモニターしてもらいました。実際には、WiFi
を使うのは本体からデータを吸い出すときにだけ使用してもらいました。ケースサイズは、
10x5x3cmでUSBケーブルを外に取り出しモバイルバッテリと接続する方式にしました。
もう少し小型化したくラズパイゼロのサイズは7×3.5×2なので、8x4x3cm程度のケースを3Dプ
リンタで挑戦してみたいです。150cc→96cc
実験用システムを以下に示します。これとは別にデータ吸い出し専用簡易APも準備しました。
ログデータの吸出しには、データ共有サーバ(samba)をインストールしています。
実際に太郎君(柴犬)の散歩コースのログデータを示します。左がfoliumによる移動経路表示、右が
Googlemapによる付近の地図です。移動距離の推定値は2200mです。200x200mの四角い領域を散歩
しています。ドッグランは、200x100mですので同じような距離感です。
GPSデータから速度を移動距離を算出してみました。速度ににノイズが含まれているようなので
n=10で移動平均を行いました。速度を積分すると距離になります。平均速度は50m/分(時速3Km)
移動距離は2.2Kmでした。
GPSロガーデータを使った行動分類を検討しました。散歩中のデータなので、「歩いていた」
とか「走っていた」とか「立ち止まっていた」などのきっちりした教師データがないため、今
回は平均速度で分類することにしました。学習データはGPSの位置データを速度に変換したも
のと6軸加速度センサ値がメインです。6軸データのうちAx,Ay,Azはセンサの固定方向に依存す
る(特にAzの重力加速度の分配)ため3軸ベクトルをスカラに合成しました。
機械学習のためのデータを、オリジナルのGSP02のデータから変換しました。左側がオリジナル
データで右側が特徴値等の抽出データです。
Ax,Ay,Azをスカラにしない7パラメータとスカラにまとめた5パラメータのPairPlotを示します。
速度パラメータ以外は略正規分布です。強い共線性を持ったパラメータはないようです。
今回は教師データがないことから、仮の教師データを抽出することにしました。各パラメータの
経時変化を眺めながら、分類を試みました。
角速度はごちゃごちゃして良く判りませんが、Axyzの振幅の大きさと移動平均速度の大きさは
なんとなく同期しています。加速度は速度の微分ですから当然ですが….ということで、移動平均
速度(spmov)の大きさから、学習データを抽出することにしました。(本来は飼い主さんに頼
んで行動状況のメモから分類するべきですが….)移動平均速度で、Low,Middle,High,Topの4段階
の領域のデータを抽出しました。
機械学習用のファイルを作りました。全体のデータは2500個で学習データは約1/10の250個の
データです。速度分類(LMHT)を0,1,2,3の値にしています。
分類モデルとしては、RandomForestを使用しました。R2は略1でパラメータの感度解析結果
は、当然ですが、移動平均速度が支配的です。感度解析のため説明変数は8個としています。
上記モデルで、時系列全領域を予測した場合の分類結果を一番下のグラフに示しました。
合成加速度や移動平均速度を反映した分類になっています。
今回のデータは、小型老犬の散歩データなのですが、速度分布は2山になっていて、秒速100m
(時速6Km)で走っているか、秒速20m以下(時速1Km)でたらたらしているかでした。
小楽しますが推論モデルによる分類と速度分類は略一致していました。
最後にGPS02から吸い出したデータから行動分類までを表示するプログラムを作りました。
操作方法を次に示します。 ここで解決できなかったこととしてfoliumから出力されるマップ
画像(html)をpng形式に変換してGUI画面に張り付けたかったのですが、できませんでした。
方法があれば教えてください。
今回の結果から、GPSデータだけ(加速度センサデータなし)でもそこそこの情報が得られること
が判りました。GPSロガー開発レポートはここまでです。現在ケースの小型化(150cc→100cc以下)
を目指して3Dプリンタの活用を検討しています。