Python:csv,DataFrame,Matplotlibの操作例

データ処理のコード例です。
モジュール群をインポートします。

クラスとメソドです。
csvファイルを読み込んでDataFrameを作成。整理します。

クラスのインスタンスを作成して、メソドを実行する。

結果整理1

結果整理2

 

VR:Unity空間内をDayDreamコントローラーで歩く5(できました!)

今日は、キーボードからではなくて、デイドリームコントローラーからの入力を受け取るように改造していきます(´・ω・)

かなり前にSummonFunc()を作ったときにやったのを思い出しながらやってみます。

条件式:if (GvrControllerInput.ClickButtonDown) でコントローラーのボタンがクリックされたことを認識したときに、関数SummonFunc()を実行しています。

関数SummonFunc()は任意のオブジェクトを任意の座標と向きを定義してヒエラルキーに追加(Instantiate)する内容になっています。

変更しましょう:

Gvrのメソドを利用していきましょう。

GvrControllerInput.以下のメソド

  1. AppButtonDown     : アプリケーションボタンを押したとき
  2. HomeButtonDown : ホームボタンを押したとき
  3. ClickButtonDown   : タッチパッドボタンを押したとき
  4. TouchDown               : タッチパッドに触れたとき
  5. TouchPos                    : タッチパッドに触れている位置(Vector2)

if(GvrControllerInput.TouchDown)

  • tpX=0.5,tpY=0.5が中心で
  • 前進はtpY<0.3のときにしよう
  • 後退はtpY>0.7のときにしよう
  • 右を向くのはtpX>0.7のときにしよう
  • 左を向くのはtpX<0.3のときにしよう

もっといい方法があるかもしれないが、まずはこれでやってみよう。

スクリプト:PlayerMover2.cs

デイドリームコントローラーで動きました(´・ω・)

まだまだ、改良は必要ですが、とりあえず動くものはできました。

かれこれ、2日まるまるかかってしまいましたが、大きな前進です!

起動直後になぜか、カメラが動いてしまいます。

後日調整が必要です。

VR:Unity空間内をDayDreamコントローラーで歩く4(まずはキーボードから)

前回は結局 ロコモーションもスクリプトがおかしいですよーと警告が出てどうにもなりませんでした。しかも、ロコモーションアセットを全部消しても、ビルドができなくなるというわけわからん状態になったので、プロジェクトを捨てました。恐ろしいです。ここいらでちゃんとUnity勉強したほうがいいかもしれませんね。

基本に立ち返って、自分でカメラ操作のスクリプトを実装していこうと決意した次第であります。

今回の成果:大きな前進(*´﹃`*)

キーボードのWASDまたは矢印キーでプレイヤー視点を移動することに成功しました。

スクリプト:PlayerMover.cs

動いた、嬉しい。

VR:Unity空間内をDayDreamコントローラーで歩く3(Unity 2019.3.0a5はアカン)

原因が分かりました。

Unity 2019.3.0a5に対して、Unity v1.200.0用GVR SDKの組み合わせは上手くいかないようです。

代わりにUnity 2019.1.5f1を使用することで、Unity v1.200.0用GVR SDKをインポートしても問題なくビルドできます。

プレイヤーセッティングでAPIレベルを変更できない問題も特に発生しません。

いつも通りに戻りました。本当によかった。

改めまして 環境

  • OS                          : Windows 10 Home
  • Unity                    : Unity Hub  > Unity 2019.1.5f1
  • google VR SDK : Unity v1.200.0用GVR SDK
  • ヘッドセット : Mirage Solo

 

UnityでのDaydream(3DoF)コントローラのサポート

説明ページに従ってやっていきます。

Gvrプレハブをヒエラルキーに配置します。

Google VRプレハブのあるシーン

PlayerとMain Camera と GvrControllerPointerの座標設定

Playerの座標は目の高さy=1.4 原点付近に置いたオブジェクトが見える位置z=-3.0にします。

Main Cameraの座標はPayerの座標に一致させたいので、x,y,z =0,0,0 にします。

GvrControllerPointerの座標は左右の目の中心位置よりもy方向に-0.30 , z方向に-0.20とします。腕をくの字90°に曲げた状態を想定しています。

聞き手は右手に設定します。(Gvr Tracked Controller(script) でController Hand=right にする)

次にGvrControllerPinter直下のControllerVisualを設定していきます。

 

 

  いよいよ、念願の歩く設定に入ります。

ロコモーション

テレポーテーション:瞬間移動

トンネリング;1人称視点移動(中心のみ普通の映像で、周囲は暗くなるのでトンネリングというらしい。)

チェイスカメラ:3人称視点

では GitHubからダウンロード

DaydreamElements.unitypackage をダウンロードしてプロジェクトにインポートしましょう。

なんかでた・・・。

 

===再起動したら復活した。===

気を取り直して、やっていきましょう。

====でも 上手くいきません。眠いので以降は明日やります===

 

手動でトンネリングを設定したい場合は、次の手順を実行します。

TunnelingVignetteメインカメラの兄弟としてプレハブのインスタンスを追加します。
スクリプトのインスタンスをFirstPersonTunnelingLocomotionメインカメラの親に追加します。
ではFirstPersonTunnelingLocomotion、スクリプトを参照ドラッグ TunnelingVignetteビネットコントローラのプロパティにします。
プレイヤーを衝突でブロックしたい場合は、メインカメラの親にキャラクターコントローラーを追加します。

Add an instance of the TunnelingVignette prefab as a sibling of the Main Camera.
Add an instance of the script FirstPersonTunnelingLocomotion to the parent of the Main Camera.
In the FirstPersonTunnelingLocomotion script, drag a reference to TunnelingVignette into the Vignette Controller property.
Optionally, add a Character Controller to the parent of the Main Camera if you want the player to be blocked by collisions.

うーん(*´﹃`*) FirstPersonTunnelingLocomotionがコンパイルされていないとこどーとか出て、アタッチできませんぬー。

VR:Unity空間内をDayDreamコントローラーで歩く2(全然無理)

Unity空間内をDayDreamコントローラーで歩くどころではなくなりました。

このUnityバージョンの重大な不具合を見つけました。

環境

  • OS                          : Windows 10 Home
  • Unity                    : Unity Hub  > Unity 2019.3.0a5
  • google VR SDK : Unity v1.200.0用GVR SDK
  • ヘッドセット : Mirage Solo

ビルドできません!!

ビルドしようにも、プレイヤーセッティングが白紙になってしまい何も設定できなくなります。

その場合の解消法としては、一旦プラットフォームをアンドロイドからPCに変更してから、再びアンドロイドに戻すと復活しました。ちなみにRun DeviceはDefault deviceのままでOKです。わざわざLenovo VRにする必要はありませんでした。

引き続き、やっていますが、再ビルドできなくなりました。

プロジェクトを新規に立ち上げてセットアップしましたが、恐ろしい不具合が・・・

APIレベルの変更ができないのです。というか、項目がないのです。

ここでビルドすると、失敗しますが、プレイヤーズセッティングの項目が増えてAPIレベルの変更ができるようになります。

でもビルドは成功しません。意味不明の状態であります。さあ、次はどうしましょうかね。

======ビルド成功した手順=====

  1. 新規プロジェクトを作る
  2. ヒエラルキーにプレーンを作る
  3. シーンをセーブ
  4. プロジェクトをセーブ
  5. ビルドセッティングでまずアンドロイドへプラットホームを変更
  6. プレイヤーセッティングスでカンパニーネームをTiに
  7. XRセッティングスで バーチャルリアリティサポートテッドにチェック
  8. バーチャルリアリティSDKにDayDreamを追加
  9. アザーセッティングスのグラフィックスAPIからVulkanを削除(VRに対応していない旨の傾向が出る)
  10. アザーセッティングスのIdentificationのMinimum API Levelを24にしたいが、この時点ではgetting APIなんちゃらと、薄い字になっていて変更できない。
  11. びるどえんどらーん する。当然失敗するが、Minimum API Levelを19から24へ変更するよう警告がでる。
  12. これによって、Minimum API Levelを24に変更できるようになるので、やる。
  13. 再び、びるどえんどらーん。
  14. Mirage Soloをかぶると自動的にUnity画面が立上り、ゲームが開始される。
  15. 以後、このゲーム画面のまま、再度びるどえんどらーんをすると、自動的に強制停止されて、新しく更新されたゲーム画面に自動的に遷移する。

====== しかーし!!=====

世の中そんなに甘くはありません。

本題であります google VR アセットをインポートして、ビルドした瞬間。またでました。ディナーイのエラー もう google VRは使いたくないので、 Mirage Solo 捨てて、Oculus Quest に乗り換えます。

さようなら、Google

VR:Unity空間内をDayDreamコントローラーで歩く1(見る価値なし)

Unity空間内をDayDreamコントローラーで歩きたいとき ありますよね。

UnityでのDaydream(3DoF)コントローラのサポート

結果:無理でした。別途再チャレンジします。

環境

  • OS                          :Windows 10 Home
  • Unity                    :Unity Hub  > Unity 2019.3.0a5
  • google VR SDK : Unity v1.200.0用GVR SDK
  • ヘッドセット:Mirage Solo

Unityへgoogle VRをインポート

GoogleVRForUnity_1.200.0.unitypackage をダウンロードしてUnity内でAssetsフォルダ直下にインポートします。

Android搭載のUnity用Google VR SDKのクイックスタート

その中に、Hello6DoFControllers の説明があるので リンク先にいってみると404 お探しのページはありません・・・と出てきます。自力でやるしかありません。

ビルドエンドら~ん

画面下のProjectメニューにAssets>GoogleVR>Demos>Scenesが追加されているので、>VideoDemo を試してみましょう。この中に、DayDreamコントローラーで歩く方法が実装されているかもしれないという期待をこめて。

ではシーンにチェックを入れて、プラットフォームをアンドロイドにして、ここで問題発生。

プレイヤーセッティングが白紙・・・。設定できない。

まあ、そこは無視して、ヘッドセットとPCをUSBケーブルで繋いで、さあ ビルドエンドら~ん。※私はMirage Soloでやりますので、USBケーブルをPCとヘッドセットに接続してビルドアンドランしてみます。

上手くいきません。それもそのはず、プレイヤーセッティングをやってませんからね・・・。どうしよう。

今一度プレイヤーセッティングに行ってみると、何故か設定項目が復活していたので、Company Name を入れて(多分頭が大文字にしないとだめ)、Other SettingのGraphics APIsでVulkanを削除、Minimun API Level を24に,XR SettingsのVirtual REality Supportedにチェックをいれて、プラスボタンを押してDayDreamを選択。

いろいろ設定して、ビルドしてみます。

target architecture not specified という警告がでるので、target architectureでarm v7を選択(これしか選べない)

これで上手く行くと思いきや、コンソールにアラートが。

unitygvr.aar is dinied とか言われていますが。じゃあ無理じゃんということで、もうやめます。

ちなみに、シーンをDemosではなくて、起動時のシーンに戻しましたが、同じくディナ~い と言われましたので。もう無理です。完全にはじめからやります。

余談:

いつの間にか、USBケーブル直でできるようになりましたね!しかしなぜか2Dアプリとしてインストールされてしまいます・・・不具合はないですが、気持ち悪いです。

 

 

 

VR:Unity2019からUSB経由でMirage Soloへビルド

こんにちはKeita_Nakamori(´・ω・`)です。

今日は久々にMirage Soloをいじってみました。

というのも、2017を使っていたのですが、ウィルスバスターを入れてから、なぜかビルドできなくなってしまい、どうにも解決できなかったので暫く放置していました。

さて、今日こそ復活させようというわけです。

 

今どきはUnity Hubというものがあって、これをインストールすることによって、色んなバージョンのUnityを管理することができるようです。

せっかくですから最新のUnityバージョンをインストール使用と思います。

Unity2019.3.1.1f5のインストール

Unity Hub上からインストールしました。

このときAndroid SDK とか JDKとかNDKは同時にインストールできるようになりましたので、楽になった部分であります。

Mirage Solo用のセッティング

まず、適当に、床としてプレーンを、3Dオブジェクトとしてキューブを適当に置いておきます。

シーンの追加

build settingに入って、シーンの追加をしましょう。

プラットフォーム変更

build settingに入って、プラットフォームをアンドロイドに切り替えましょう。

Vulkanの除去

player setting >Other settingsのなかでグラフィック関係でしょうか。

Vulkan(ばるかん?)というものを使うようにセットされているのですが、これがビルド時に悪さするようで、マイナスボタンを押して除去しておきます。

会社名、プロジェクト名を入力する

頭文字は大文字で書いておきます。

XRにチェック

XRにチェックを入れて、DayDreamを追加します。

Mirage Soloへのインストール

Mirage SoloとUSBケーブルを繋ぎます。

USBが、どうとかこうとか書いていますが、つなげます。

触れなければ、つながりを維持します。

Buid and runをします。

するとapkファイルが作られます。

何事もなかったように終わるので、再度実行します。すると今度はapkファイルを作るとともにMirage Solo側で見ることができるようになるます。

これでインストールと実行をやってしまったわけですが、なぜか2Dソフト群の仲間入りをしてしまっています。この辺意味不明ですが、ちゃんと動きます。

 

以上、あとで絵とか追加しておきます。眠いので寝ます。

 

 

 

 

Python:マルチスレッド threading モジュール

どーもこんにちはKeita_Nakamori(´・ω・`)です。

最近はIoT関係で遊んでいるのですが、1つのラズパイで、複数のセンサーを扱うにはどうすればいいか考えていました。

普通のシングルスレッドで実行すると、PLCでいうところのスキャンタイムに依存することになります。

あるセンサーは高速でパルスをカウントしなければならない一方で、別のセンサーは、1秒周期でいいよとか、サンプリングタイムが全然違う場合はどうすればいいのか。

解決策として、マルチスレッドというものがあります。

それぞれのセンサーでサンプリングする関数を作って、それぞれを別々のスレッドとしてオブジェクト化して、メインスレッド内で実行するというやり方です。そうすると、それぞれのスレッドが互いに干渉することなく、あたかも2つのプログラムが同時に動いているような挙動を示します。

今回は、IOTというより、Pythonの基本なので、カテゴリーはPythonにしました。

では、やってみましょう。

まずは普通の関数を実行

まず最初に time_count()という関数を作って実行してみましょう。

1秒ごとに現在時間を出力しているだけのスクリプトです。

Pythonではthreadingモジュールから利用することができます。

結果:どうでしょう、これは普通ですよね。

次は、これをスレッド化して実行してみましょう。

最後の2行で、関数をスレッドとしてオブジェクト化し、スタートさせています。

動作は、全く一緒です。

そして、次はマルチスレッドを試してみましょう。

今度は2つのスレッドを同時に動かしてみます。

結果:さあどうでしょうか。

thread_001とthread_002をスタートして、最後に”here is script end”をするスクリプトです。

thread_001が始まった直後にthread_002もスタートしていますので、スクリプト通り、thread_001による時間カウントが5秒のところで”get up now!!”というthread_002の出力が確認できます。

さらに、スクリプトの最後の”here is script end1”はthread_002がスタートされた直後に終了しています。

メインスレッドが最後までいっても、thread_001、thread_002が終わっていなければ、プログラムは終わりません。このように、実は3つのスレッドが同時に走っているわけです。

最後に

関数をメソド化して使ってみましょう。

動作は一緒です。以上です。

IOT:速くて軽い MQTTプロトコル

こんにちは、Keita_Nakamori(´・ω・`)です。

みなさんIOTしていますか?

今日はIOTで流行っている通信プロトコルであるMQTTについてやっていこうと思います。

なぜMQTTか

OASISという規格団体において、軽い、公開、単純、簡単に使えるというコンセプトで設計されたプロトコルです。

従来のHTTPプロトコルは人と人がコンピューターを介してコミュニケーションを取ることが前提となっており、1つのコンテンツで多くの情報をやり取りしています。

しかし、IOTの場合は莫大な数のIOTデバイスと接続することになりますので、速くて軽いプロトコルである、”MQTTプロトコル”を使いこなしていく必要があります。

MQTTの特徴

すこし専門用語を出しますが、

MQTTはクライアント・サーバー間のpublish・subscribeメッセージをバイナリ(2進数)でやり取りするプロトコルです。

  • トランスポート層ではTCPをベースとます。
  • セキュリティはTLS/SSLを使用します。
  • MQTTは確実なデータ発信と重複を避けることができます。
  • 順序が決まっていてかつ可逆的な2進数情報をread/writeの両方向に対して適用されます。

MQTTの用語

peer:仲間という意味で、PCやIOTデバイスのようなサーバーではない端末のことです。MQTTクライアントとも言います。

Broker:サーバーのことです。Central MQTT BrokerとかLocal MQTT Brokerという使い方をします。

Publish:Brokerにデータを渡す。

Topic:Publishされたデータを格納する箱。encodingはutf-8。例えばAなら01000001という2進数8bitで表現されます。

Topic Level:トピックはツリー構造で格納されます。例えば

  • mytopic/machine_001/transmission_system_001/bearing_001/temperature

というように、トピックレベルセパレーターと呼ばれるスラッシュ記号で表現します。この各ディレクトリのことをトピックレベルと呼びます。

Subscribe:Broker内のTopicのデータを送ってもらうよう申し入れをします。

QoS:サービス品質 Quality of Serviceです。

レベルの低いものから

QoS_0

Publisherがメッセージを投げたらBrokerを通してSubscriberに渡す。そして、Publisherはメッセージを消す。

QoS_1

PublisherはメッセージをBrokerに投げる前に、Publisher自身がメッセージを保持する。PublisherがメッセージをBrokerに投げたら、Broker内で一旦保持してからSubscriberにわたす。渡ったらBrokerはメッセージを消して、続いてPublisherもメッセージを消す。少し複雑になりました。

QoS_2

PublisherはメッセージをBrokerに投げる前に、Publisher自身がメッセージを保持する。PublisherはメッセージをBrokerに投げたら、Broker内で一旦保持してからSubscriberにわたす。渡ったらBrokerはPUBRECをPublisherへ渡して、PUBRELが返ってきてから、Broker内のメッセージを消す。

渡ったらBrokerはメッセージを消して、PUBCOMPを渡す。

それによって、Publiserはメッセージを消す。とても長い手順を踏むことになります。

MQTTのヘッダーフォーマット

頭にヘッダー情報をつけます。ヘッダーは2バイトで構成されています。

  1. 4bitでコマンドメッセージタイプを指定します。
  2. 1bitでDUP(デュプリケート、複製)
  3. 2bitでQos Level(Quality of Service Level)
  4. 1bitでRERTAIN

これで1バイトです。

次の1バイト中最大4bitを使ってRemaining Lengthを表現します。

その次にペイロード(内容)を書いていくのですが、それはまたあとでやりましょう。