エアガン測定

エアガンに関する色々を測定したりしなかったりしています http://www.eonet.ne.jp/~daisaku-tech/index.html

Tensorflowによる行列演算速度を、CPU/GPUで、Windows/Ubuntuで比較

Tensorflowによる行列演算速度を比較しました。CPUとGPUWindowsUbuntuでそれぞれ比較。で、同じPCでOSが異なるだけなのに、やたらWindowsの場合が遅い結果となりました。

 

まずはWindows10の場合。

f:id:daisaku_tech:20190603003302p:plain

Windows10:Tensorflow CPU vs GPU

次はUbuntu 18.04の場合。

f:id:daisaku_tech:20190603003351p:plain

Ubuntu18.04:Tensorflow CPU vs GPU

こうしてみると、Windows10の場合が、CPU/GPUともにやたら遅い結果です。原因不明。

 

プログラムは次のものをそのまま使用。

Introduction to TensorFlow — CPU vs GPU

https://medium.com/@erikhallstrm/hello-world-tensorflow-649b15aed18c

 

使用したPCのスペックは次の通り。

CPU: Core i7-8700K

GPU: RTX 2080 8GiB

マザーボード: Z370M Pro4

RAM: 32GiB

 

参考として、NVIDIA Jetson Nanoの結果です。縦軸の時間が3秒までとなっているのに注意。CPUが遅いため、上記と同じ1.5秒では収まらなかったため。

f:id:daisaku_tech:20190603004014p:plain

Ubuntu18.04:NVIDIA Jetson Nano: Tensorflow CPU vs GPU

 

Zybo/Petalinux 2018.3でUSBカメラを使う

無印ZyboにPetalinux 2018.3をインストールしてUSBカメラ(Webカメラ)を使用する。

  • 無印Zybo(Zybo Z7-10/20ではなく古いほうのZybo)
  • 開発用PC:Windows 10(Vivado/XSDKをインストール)
  • 開発用LinuxUbuntu 16.04(Petalinux開発環境をインストール)

次の記事の手順で開発環境をインストールする。

ZYBO (Zynq) 初心者ガイド (1) 開発環境の準備
https://qiita.com/take-iwiw/items/966f252f6ca954aff08b

ただし、Vivado/XSDK/Petalinuxのバージョンは2018.3を使用する。

次の記事の手順で、ZyboをEthernet使用可能な状態にする。ボードファイルのMDIO設定ミスを修正したPS部のみのブロックを生成する。

ZYBO (Zynq) 初心者ガイド (13) LAN(Ethernet 0)を使う (PetaLinux)
https://qiita.com/take-iwiw/items/ac489acaca1ab54d7ce8

ボードファイルは、"Zybo"(Zybo Z7-10/20ではない)を使用する。

開発用Linuxで次のようにコンフィグ、ビルドする。以下の例では、~/work/SimplePS/images/linux/ディレクトリにBOOT.BINとimages.ubが生成されるので、この2つのファイルをSDカードに書き込んでZyboを起動する。

cd ~/work/
petalinux-create --type project --template zynq --name SimplePS
cd SimplePS/
petalinux-config --get-hw-description=../project_1.sdk
→このコンフィグ画面では何も変更しない。
petalinux-config -c kernel
→UVCサポートなどを有効にする。下記の通り。
petalinux-config -c rootfs
→packagegroup-petalinux-x11などを有効にする。下記の通り。
vi project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dsti
→デバイスツリーを修正する。
petalinux-build
petalinux-package --boot --force --fsbl images/linux/zynq_fsbl.elf --fpga project-spec/hw-description/design_1_wrapper.bit --u-boot

最後に実行するpetalinux-packageコマンドによるBOOT.BIN生成は上記の通りで、Qiitaの記事(Petalinux 2017.4)とはdesign_1_wrapper.bitのディレクトリが異なる。

petalinux-build時に次の警告が出るが、無視しても大丈夫なようだ。

WARNING: petalinux-user-image-1.0-r0 do_rootfs: [log_check] petalinux-user-image: found 1 warning message in the logfile:
[log_check] warning: %post(sysvinit-inittab-2.88dsf-r10.plnx_zynq7) scriptlet failed, exit status 1

参考
AR# 71110
2018.x Zynq UltraScale+ MPSoC: Yocto or PetaLinux throws warnings when the build do_rootfs task completes
https://www.xilinx.com/support/answers/71110.html

petalinux-config -c kernel時のコンフィグ項目

Device Drivers > USB supportには最初からチェックが入っている。その項目内で、Support for Host-side USBなどいくつかの項目に最初からチェックが入っている。さらに次の項目にチェックを入れる。

Device Drivers > USB suport > USB Gadget Support >
[*] USB Webcam function
<*> USB Webcam Gadget

Device Drivers > Multimedia support  >
[*] Media USB Adapters > ←チェックを入れると、さらに下層に入れるようになる
<*> USB Video Class (UVC) (NEW)

petalinux-config -c rootfs時のコンフィグ項目

Filesystem Packages > misc > python3 >
[*] python3
Filesystem Packages > misc > v4l-utils >
[*] v4l-utils
Filesystem Packages > misc > xauth >
[*] xauth
Petalinux Package Groups > packagegroup-petalinux-opencv >
[*] packagegroup-petalinux-opencv
Petalinux Package Groups > packagegroup-petalinux-x11 >
[*] packagegroup-petalinux-x11

python3とopencvは、USBカメラ映像表示プログラムで使用するため。不要ならチェックなし。

バイスツリー(system-user.dtsi)の修正内容

初期状態では空の状態なので、次のように追記する。

/include/ "system-conf.dtsi"

/{
    usb_phy0: usb_phy@0 {
        compatible = "ulpi-phy";
        #phy-cells = <0>;
        reg = <0xe0002000 0x1000>;
        view-port = <0x0170>;
        drv-vbus;
    };
};

&usb0 {
    compatible = "xlnx,zynq-usb-2.20a", "chipidea,usb2";
    status = "okay";
    clocks = <0x1 0x1c>;
    dr_mode = "host";
    interrupt-parent = <0x4>;
    interrupts = <0x0 0x15 0x4>;
    reg = <0xe0002000 0x1000>;
    usb-phy = <&usb_phy0>;
};

起動、USBカメラ映像表示

起動時、Zyboのコンソールには次のようにX11のエラーが表示される。Zyboの出力画面を用意していないためだと思われる。開発用PC/LinuxのX serverを使用して(sshでログイン、X forward)USBカメラの映像を表示する場合は問題なし。

(EE)
Fatal server error:
(EE) no screens found(EE)
中略
(EE) Please also check the log file at "/var/log/Xorg.0.log" for additional information.
(EE)
(EE) Server terminated with error (1). Closing log file.
中略
xinit: unable to connect to X server: Connection refused
xinit: server error

LinuxなどのX serverありのPCから、X forwardありのsshでログイン後、次のようなプログラムを実行することで、USBカメラ(Webカメラ)の画面を表示できる。

import cv2

capture = cv2.VideoCapture(0)

while(True):
    ret, frame = capture.read()
    cv2.imshow('frame',frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

capture.release()
cv2.destroyAllWindows()

USBカメラの映像が表示されるが、1秒以上の遅延があり、Frame Per Secondも少ない。


参考Web
ZYBO (Zynq) 初心者ガイド (1) 開発環境の準備
https://qiita.com/take-iwiw/items/966f252f6ca954aff08b
ZYBO (Zynq) 初心者ガイド (13) LAN(Ethernet 0)を使う (PetaLinux)
https://qiita.com/take-iwiw/items/ac489acaca1ab54d7ce8
Ubuntu+ZynqでUSB-HOSTが機能しないときの解決方法
https://qiita.com/lp6m/items/45d90e9d2443c2198e96
AR# 71110
2018.x Zynq UltraScale+ MPSoC: Yocto or PetaLinux throws warnings when the build do_rootfs task completes
https://www.xilinx.com/support/answers/71110.html
Zybo+PetalinuxでUVCカメラを使う
http://d.hatena.ne.jp/seinzumtode/20171120/1511167136
Zynq Linux USB Device Driver
https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18842272/Zynq+Linux+USB+Device+Driver
OpenCV 接続したカメラから動画を取得しよう (Python)
https://weblabo.oscasierra.net/python/opencv-videocapture-camera.html

弾速計試作その2:エアガン機能拡張

銃に取り付けるタイプの弾速計試作その2を作成しました。初速だけでなく、次の4つのデータを表示します。

  • 発射弾数
  • 初速(m/s)
  • ターゲットまでの距離(m)
  • 銃口の方位(deg)


エアガン機能拡張器試作

 

初速を測定するための赤外線センサーは、ホントはサイレンサーに埋め込んできれいな見た目にしたかったのですが、とりあえずプラスチックのパイプに取り付けてあります。基板や部品の配置をきれいにしてケースに収めたかったのもありますが、試作ってことでむき出しのままです。

 

制御に使用しているマイコンはBlue Pill(STM32F103)で、2つ使用しています。ソフトウェアを手抜きしたので、一つは初速の測定専用で、もう一つで距離・方位の測定や液晶ディスプレイへの表示を行っています。

 

使用している銃は、WE SCAR-L(ガスブローバック)です。本体を上面のレールに取り付けているため、この状態ではサイトでねらえない状態です。透明なヘッドアップディスプレイにしたいところですが、無機ELとかはかなり高額なため手が出せず。

 

サイドレールに取り付けられるようにすればよかったですね。

Blue Pill/STM32duinoで電子コンパスHMC5883Lを動かす

Blue Pill+Arduino_STM32(Roger Clark氏作成版stm32duino環境)

Arduino_STM32(Roger Clark氏作成版)環境のBlue Pillでは、電子コンパスHMC5883Lが動作しません。

2019/03/17時点のmaster

https://github.com/rogerclarkmelbourne/Arduino_STM32

 

注:Arduino_STM32のWebサイトは http://www.stm32duino.com/ となっていますが、 https://github.com/stm32duino とは別物です。

 

このArduino_STM32環境で電子コンパスHMC5883L用ライブラリを使用し、スケッチ例のQMC5883_compassをビルドして実行すると、電子コンパスを動かしても値が変化しません。

2017/12/04コミット版

https://github.com/DFRobot/DFRobot_QMC5883

 

注:ライブラリ名はQMC5883ですが、HMC5883L/QMC5883両対応となっています。

 

このライブラリの、次の2行を削除すると動作します(HMC5883Lのみ)。

DFRobot_QMC5883/DFRobot_QMC5883.cpp:482 行目 DFRobot_QMC5883::readRegister16()

 Wire.beginTransmission(HMC5883L_ADDRESS); ←削除
 Wire.requestFrom(HMC5883L_ADDRESS, 2);
 while(!Wire.available()) {};
 #if ARDUINO >= 100
  uint8_t vha = Wire.read();
  uint8_t vla = Wire.read();
 #else
  uint8_t vha = Wire.receive();
  uint8_t vla = Wire.receive();
 #endif
 Wire.endTransmission(); ←削除

QMC5883では未確認です。

原因:Data Outputレジスタread後に不要なwriteがあるため

直接の原因は、HMC5883Lレジスタのoffset+03~+08のData OutputレジスタX/Y/Zの2バイトずつに対して、それぞれをI2Cでreadしたあと、そのreadした同じ値を2バイトwriteしてしまうことです。

 

理由は不明ですが、上記readRegister16()内でWire.write(reg)でreadするアドレスを指定した後、Wire.read()する際にWire.beginTransmission/endTransmisstionで囲んであるとreadした値をそのままwriteします。

f:id:daisaku_tech:20190318214727p:plain

BluePillの場合

Wire.requestFrom()/Wire.read()するだけならWire.beginTransmission/endTransmissionで囲む必要はないように思えます。

 

ただし、ArduinoUNOでは、上記の2行を削除しなくても正常に動作します。ArduinoUNOの場合は、Data Outputレジスタread後、I2Cのwriteでデータなし(I2CスレーブアドレスとR/Wビットのみ)の状態となり、おかしな値をwriteしないためです。正常に動作するといっても、このように不要なwrite(データなし)が行われます。

f:id:daisaku_tech:20190318214813p:plain

ArduinoUNOの場合

推測ですが、Blue Pillで動作しない原因は次の2つの組み合わせで発生しているように思えます。

  • DFRobot_QMC5883::readRegister16()内の不要なWirte.beginTransmission/endTransmission実行。
  • Arduino_STM32のWire(I2C)ライブラリの不具合。

 

BluePillでLIDAR-Lite v3

BluePillで、レーザー距離センサのLIDAR-Lite v3動作しました。

www.switch-science.com

BluePillはArduino互換環境で、LIDAR-Lite Arduino Libraryがそのままビルドでき、サンプルのGetDistanceI2cが動作しました。ライブラリにもサンプルスケッチにも、何も手を加えずそのまま。

github.com

ただし、BluePillは3.3V、LIDAR-Liteは5Vなので、レベル変換は必要。

メーカーは680μFのキャパシタを推奨していますが、SparkfunのHookup Guideに記載されているように、1000μFのものを使用しました。

f:id:daisaku_tech:20190204220927j:plain

BluePillとLIDAR-Lite_v3を接続

 

電子コンパス比較

電子コンパスのHMC5883LとQMC5883Lの精度を比較してみました。

起動後、8の字を描くようにグネグネさせた後、南方向に向けて水平にし、そのままにしておいた時の方位を取得しました。

HMC5883Lが安定して183.5度前後で推移しているのに対し、QMC5883Lは185~191度ぐらいとかなり揺れています。

f:id:daisaku_tech:20190114192439p:plain

HMC5883LとQMC5883の比較

使用したセンサーはそれぞれ次の通り。

・GY-271 QMC5883L 3軸磁気センサー 磁場センサー 電子 デジタル コンパス モジュール 地磁気センサー

www.amazon.co.jp

・3軸磁気電子コンパス&気圧センサーモジュールSEN315-652-16WI

eleshop.jp

Arduino UNOに接続し、ライブラリとして次のものを使用しました。

github.com

Arduino UNOとBlue PillのLCD描画速度

コントローラとしてILI9341が使用されているLCDの描画速度を比較しました。一つはArduino UNOで、もう一つはBlue Pill(STM32F103)です。

youtu.be

Adafruitライブラリに含まれるスケッチ例、graphictestを実行しています。Blue Pillの場合も同様です。

Blue Pillの方が高性能であるため、それがそのまま描画速度に反映されています。