sinatraでhashデータをJSONとして返す方法
方法
require 'json' return #{hash}.to_json
例
require 'sinatra' require 'json' get '/top' do hash = { "key1" => 1, "key2" => 2, "key3" => 3, } return hash.to_json end
raspberryPi3とWindowsPCでシリアル通信する方法
環境
RaspberryPi3
WindowsPC
USB-serial変換ケーブル
FTDI USB・シリアル変換ケーブル(3.3V): 半導体 秋月電子通商 電子部品 ネット通販
接続
raspberryPi側
調べると色々出てきますが、変換ケーブルのGND, TXD, RXDをRaspberryPiのGPIOに差し込みます
ここで注意が必要なのが、送信と受信を対にするために以下のように接続します
PC側
PC側は普通にUSBに差すだけです。
差したあとにデバイスマネージャーで認識されているか確認しましょう
設定
raspberryPi側
調べていくと、raspberryPiのシリアル通信ポートは既に他の用途で使われているようで、これを使えるようにする方法がRaspberryPiのモデルやRaspbianのversionによって様々で、ちょっと苦戦しました。
最終的に私がうまくいった方法は・・・
1. raspi-configでserial通信を有効化する
2. /boot/config.txtへ追記
$ sudo vi /boot/config.txt enable_uart=1 # 末尾へ追記する
3. getty無効化
sudo systemctl stop serial-getty@ttyS0.service
sudo systemctl disable serial-getty@ttyS0.service
4. 再起動する
通信(確認)
PC側 ⇒ raspberryPi
今回はターミナルとしてteratermを利用しました
接続方法を選択する際にTCP/IPではなくシリアルを選択します
raspberryPiのボーレートは115200なので、「設定 > シリアルポート」から、ボーレートの変更を行います
変更後にエンターキーを一度押すとログイン画面が表示されます。
raspberryPi ⇒ PC側
色々方法はあるようですが、今回はscreenを利用して確認をします
screen /dev/ttyS0 115200
これでscreen経由で入力した情報がシリアル側へ表示されればOKです
おまけ
/boot/cmdline.txtの編集
このままだとシリアル通信側に全てコンソール情報が常に表示されてしまうので、cmdline.txtファイルを編集することでそれを防ぐことができます
$ sudo vi /boot/cmdline.txt dwc_otg.lpm_enable=0 console=tty1 console=serial0,115200 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait # console=serial0, 115200を削除します
mjpg-streamerでraspberryPiのカメラからストリーミングをする方法
以下のサイトを参考にさせて頂いてraspberryPiのカメラでストリーミングを行えるようにしました
neuralassemblyのメモ: Raspberry Pi用カメラモジュールおよび赤外線カメラPi NoIRの映像をandroidで表示してみた
1. カメラの接続
まずは何はともあれカメラを接続します。
場所は基盤に「CAMERA」と書いてあるのですぐわかると思います。
2. cameraの有効化
カメラは接続しただけでは有効化されていないので、raspi-configから有効化します
sudo raspi-config
以下のような設定用の画面が出てくるので、6の[Enable Camera]を選択します
カメラを有効化するかどうか聞かれるのでYesを選択します
無事有効化できたら確認の画面が出た後に、再起動するか聞かれるので一応再起動しておきましょう
3. mjpg-streamerのinstall
streamingソフトのmjpg-streamerをinstallします
### download $ cd ~ $ git clone https://github.com/jacksonliam/mjpg-streamer.git mjpg-streamer ### install $ cd mjpg-streamer/mjpg-streamer-experimental $ sudo apt-get install libjpeg8-dev cmake $ make $ cd ../../ $ sudo mv mjpg-streamer/mjpg-streamer-experimental /opt/mjpg-streamer ### 起動 $ LD_LIBRARY_PATH=/opt/mjpg-streamer/ /opt/mjpg-streamer/mjpg_streamer -i "input_raspicam.so" -o "output_http.so -p 9000 -w /opt/mjpg-streamer/www"
以上でストリーミングがはじまります。
http://${IP}:9000にアクセスすると以下のようにmjpg-streamerのroot pageが表示されます
左にあるタブを選択することで、Staticでその画像、Streamでストリーミング映像が表示されます
4. オプションの設定
input_raspicam.soにオプションを指定することで色々と条件を変更することができます
### for input_raspicam.so option -fps # FPS -q # set JPEG quality 0-100, default 85 -x # width of frame capture, default 640 -y # height of frame capture, default 480 -br # Set image brightness (0 to 100) -ex # Set exposure mode (see raspistill notes) -mm # Set metering mode (see raspistill note)
reference
RaspberryPi3 初期設定
RaspberryPi3にraspbianをinstallして初期設定を行う方法です
1. SDカードをいれて、ケーブル等をつなぐ
SDカードにraspbianのimageをいれて、SDスロットにさし、電源ケーブルに繋ぎます
この時点でraspberryPiの装備は
- raspberry Pi3
- SDカード(raspbian image)
- LANケーブル
- USBキーボード
- USBマウス
- HDMIケーブル(to ディスプレイ)
2. 電源を入れる
電源をいれるのは簡単で、基盤の「PWR IN」というところにmicroUSBの電源ケーブルをさせば電源が入ります
あとは自動でinstallや設定が行われて、以下のようなraspbianのGUIが表示されます
3. ネットワークの確認
GUIからコンソールを開いてネットワークを確認します
割り振られたIPの確認
pi@raspberrypi:~$ ifconfig eth0 Link encap:Ethernet HWaddr b8:27:eb:c2:b2:c8 inet addr:192.168.11.22 Bcast:192.168.11.255 Mask:255.255.255.0 inet6 addr: aa80::bb65:cc31:dd5:20/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:13522 errors:0 dropped:8 overruns:0 frame:0 TX packets:3058 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:16528566 (15.7 MiB) TX bytes:274511 (268.0 KiB) lo Link encap:Local Loopback . . . wlan0 Link encap:Ethernet HWaddr a8:b7:cb:d7:e7:fd . . .
上記のeth0のipアドレスを利用することで、同じネットワーク内のPCからraspberryPiへアクセスすることができます
(上記では192.168.11.22)
アクセスできない場合はeth0の設定を見てみる
pi@raspberrypi:~$ cat /etc/network/interfaces # interfaces(5) file used by ifup(8) and ifdown(8) # Please note that this file is written to be used with dhcpcd # For static IP, consult /etc/dhcpcd.conf and 'man dhcpcd.conf' # Include files from /etc/network/interfaces.d: source-directory /etc/network/interfaces.d auto lo iface lo inet loopback iface eth0 inet manual ### staticとかになってないか確認 allow-hotplug wlan0 iface wlan0 inet manual wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf allow-hotplug wlan1 iface wlan1 inet manual wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
AVPro Videoで映像の再生ができなくなった時の調査したことまとめ
何もしてないのにこわれた!!()
ということでOculus Rift向けの動画アプリをUnityで作っていたのですが、急に動かなくなりました。
具体的には音声は聞こえるものの、映像は白一色で何も見えません。
Unityのシミュレータだけではなく、以前ビルドしたアプリも同様に見えなくなっていました。
環境
Unity: 5.3.6p1
Oculus Utilities: v1.7.0
asset: AVPro Video(Windows)
decoder: LAV Filters
movie format: H.264(mp4)
resolution: 4K
調査
わかってしまってからだから言える事ですが、大分遠回りしています
1から作り直してみた
create projectから作成しなおしてみた
- シミュレータでは動くようになったが、今度はRiftではずっとloading中で確認すらできなくなった
- 再起動するとRiftから確認が出来るようになったが、前と同じく白一色で映像は表示されず
しかし一点気になったのはAVProVideo(Windows)がまさに今日11/1にupdateしている点
AVProVideo側に問題があるのか・・・?
AVProVideo側からアプローチしてみた
hardware decoringのチェックを外してみた
動いた!けど当然高解像度の動画を再生するとガックガクになった
AVProVideoの無料試用版を使ってみた
動いた!けど当然WaterMarkが出現した
- この無料試用版はAsset Storeではなく、HPから直接unitypackageファイルをダウンロードしてきて、それをcustom importで取り込む形
- ちゃんと見てないけどたぶんこれはversion upに対応していちいちupdateはされていないんじゃなかろうか?
過去のavpro videoが動くということは、最新のavpro videoのUnityやutiliesに対する依存性に変更があったのかも・・・?
Unityのversionをあげてみた
現在の安定版最新のv5.4.2で試してみた
5.3系最新パッチのv5.3.6p8で試してみた
Utilityのversionをあげてみた
1.7.0から最新の1.8.0にあげてみた
decorderを変更してみた
LAV Filter
default
Oculus appをdowngradeしてみた(かった)
色々見ていると、Oculus Appの最新version(1.9.0)が2016/10/19にリリースされておいることに気づいた
現在更新の設定がデフォルト(自動update)になっていたため既に1.9.0になっていた
以前確認して、完全に動いているのを確認したのは2週間前くらい・・・怪しい・・・
とりあえずは1.8.0にダウングレード
- しようとしたけど方法がわからない
- PC SDKがそれにあてはまると思っていたのだがどうも違うっぽい。
- Oculus AppはSetupツール上でダウンロードするんだけど、それだと最新版がダウンロードされてしまう。
- 古いversionのsetupツールも提供されていない
- どっかのconfigファイルとかで指定できるんだろうか・・・
そういやOculus appだけじゃなくてWindows Updateも走ってたな・・・
再度AVProVideoの設定をいじってみる
前回Hardware Decordingのチェックを外したら動くことまでは確認したが、今回はdecorderの選択をDirectShowに変更してみた
動いた・・・
ちなみに以前の設定はこちら
- 前はこの設定で動いていたのだが、設定としては今回の設定の方が正しい気がする
(なんで黄色くなったの?ねぇなんで?)
これで解決と思いきや
1からアプリを動画アプリを作成してcodecもdirectshowにした
辛い・・・
とりあえず以前のアプリは動くようになったので一旦置いておこう・・・
検証十分じゃないし・・・
今日新versionでたばっかだし・・・
今は動いてるし・・・
まとめると・・・
推測ですが、
- AVProVideo(無印)からAVProVideo(Windows)に変えた際にForceDirectShowのチェック項目がなかったので、Windows環境専用のこのassetではデフォルトでDirectShowが使用されていると思っていた
- だけど実際はデフォルトではmediafoundationを利用していた。以前はこのAPI(decorder)でも偶然再生できたため、違いに気付かなかった
- しかしWindows updateでcodecに変更が入り、AVPro経由ではmedia foundationで再生できなくなった
- ここで設定を確認しなおすとDirectShowを利用する場合は明示的にVideoAPIの項目を変更しないといけないことに気づく
- 変更したところAVPro Video(無印)のときと同じ再生フローになり、正常に再生されるようになった
HMDスペックまとめ(Oculus Rift CV1/GearVR/HTC Vive/PSVR)
GPGPU用語集てきなもの
備忘録
CNN
- Convolutional Neural Network(畳み込みニューラルネットワーク)
- AlexNetのような畳み込み層とプーリング層を含む多層ニューラルネットワークのこと
OpenCV
- Computer Visionのためのライブラリ
- 画像の入出力や一部を切り抜く際などに利用されている
LevelDB
- KVS
- DB内部でよくアクセスされるデータを段階的に分けることでアクセス効率がよくなる
- Caffeでは学習データおよび評価データをそれぞれ一つのDBにまとめてから、それを利用してモデルの学習を行う
LMDB
- KVS
- LevelDBでは内部のデータにアクセスする際にロックがかかる仕様になっているため、複数のCaffeプロセスが単一のDBにアクセスすることが出来ない
- この問題を解決するために単一のDBへの同時アクセスできるLMDBが導入された
HDF5
- 大量の数値データをほぞんすることに適したファイルフォーマットとそれを操作する機能を提供するライブラリ
Blob
- Binary Large OBject
PCI Express
- I/Oシリアルインターフェイス
MPI
- Message Passing Interface
- 分散メモリ間のメッセージ通信APIの規格
- 実装でメジャーなものとしてOpen MPI とmpichがある
GPUDirect
RDMA
RDMAとは
Remote Direct Memory Access
DMA(Direct Memory Access)はCPUが介在することなくホストメモリへアクセスを行うデバイスの機能
RDMA(Remote DMA)はCPUが関与することなくネットワーク越しにリモート計算機上のメモリへアクセスする機能
RDMAをサポートするネットワークプロトコル
RDMAを使うには?
LInuxの主要なDistributionでRDMAをサポートしている