jetson nano 覚書

nvcc は /usr/local/cuda/bin/nvcc

~$ /usr/local/cuda/bin/nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2019 NVIDIA Corporation
Built on Wed_Oct_23_21:14:42_PDT_2019
Cuda compilation tools, release 10.2, V10.2.89

サンプルが /usr/local/bin/ 以下にいくつか

$ ls /usr/local/bin/
camera-capture          detectnet-console.py  images
camera-viewer           detectnet.py          my-detection.py
camera-viewer.py        f2py                  my-recognition.py
convert-caffe2-to-onnx  f2py3                 networks
convert-onnx-to-caffe2  f2py3.6               pasteurize
cuda-examples.py        futurize              segnet
cuda-from-cv.py         gl-display-test       segnet-camera
cuda-from-numpy.py      gl-display-test.py    segnet-camera.py
cuda-to-cv.py           imagenet              segnet-console
cuda-to-numpy.py        imagenet-camera       segnet-console.py
detectnet               imagenet-camera.py    segnet.py
detectnet-camera        imagenet-console      segnet_utils.py
detectnet-camera.py     imagenet-console.py   video-viewer
detectnet-console       imagenet.py           video-viewer.py

tensorflow は入っていないが、container でGPU対応のV1.5とV2.2がある。

TF2.2は sudo docker pull nvcr.io/nvidia/l4t-tensorflow:r32.4.3-tf2.2-py3
TF1.5は sudo docker pull nvcr.io/nvidia/l4t-ml:r32.4.3-py3 

タグ(r32.4.3-tf2.2-py3とか)は指定しないとpullできないことに注意。

他にも https://ngc.nvidia.com/catalog/all で色々公式イメージが公開されている。

SDカード32GBだと足りないな。。

mjpg_streamer でUVCカメラのピントを固定して利用

3Dプリンターのプリントを ラズベリーパイで制御させるため、OctoPrint を使ってます。

USB カメラを使ってストリーミング表示と保存をして、プリントの進捗確認や失敗時の原因確認に使っています。これの覚書。

ストリーミングはmjpg_streamer 利用。下記コマンドで実行。

mjpg_streamer -b -o "output_http.so -n" -i "input_uvc.so -f 1"

ただし、ピントがあわないのが悩みの種だった。プリントヘッドがあちこち動いてそのたびにAutofocusでピントが背景のほうにあってしまう。

mjpg_streamer の output_http.so ではサンプルでAutofocus無効にして手動focusが設定できる。サンプルは output_http.so のオプションとして -w でフォルダ指定して実行。

mjpg_streamer -i "input_uvc.so -f 1" -o "output_http.so -w /usr/local/share/mjpg-streamer/www/"
これ。streamで見ながら数字を変更すると、フォーカスが動くのが確認できる。

但し起動のたびにピント変更も面倒だし、セキュリティ上もサンプル出しておくのも微妙。

そもそもどうやっているのかとみていると、USBカメラの規格でUVCがあり、これは v4l2-ctl コマンドで制御できることが判明。

フォーカスを手動にして、手前に固定するコマンドをmjpg_streamer起動前に記載して解決。

#!/bin/sh
v4l2-ctl -d /dev/video0 -c focus_auto=0
v4l2-ctl -d /dev/video0 -c focus_absolute=29
mjpg_streamer -b -o "output_http.so -n" -i "input_uvc.so -f 1"

v4l2-ctl は mjpg_streamer インストール時に導入済みだが、単体はv4l-utils でインストールできる。

sudo apt-get install v4l-utils

USBカメラの対応コマンドは 下記で確認できる。

v4l2-ctl -d /dev/video0 --list-ctrls-menu

USBカメラの情報は下記。autofocus が無効になっているのが分かる。

v4l2-ctl -d /dev/video0 --all

Driver Info:
Driver name : uvcvideo
Card type : Microsoft LifeCam Studio(TM):
Bus info : usb-3f980000.usb-1.3.1
Driver version : 4.19.97
Capabilities : 0x84a00001
Video Capture
Metadata Capture
Streaming
Extended Pix Format
Device Capabilities
Device Caps : 0x04200001
Video Capture
Streaming
Extended Pix Format
Media Driver Info:
Driver name : uvcvideo
Model : Microsoft LifeCam Studio(TM):
Serial :
Bus info : usb-3f980000.usb-1.3.1
Media version : 4.19.97
Hardware revision: 0x00000113 (275)
Driver version : 4.19.97
Interface Info:
ID : 0x03000002
Type : V4L Video
Entity Info:
ID : 0x00000001 (1)
Name : Microsoft LifeCam Studio(TM):
Function : V4L2 I/O
Flags : default
Pad 0x01000007 : 0: Sink
Link 0x02000013: from remote pad 0x100000a of entity 'Extension 5': Data, Enabled, Immutable
Priority: 2
Video input : 0 (Camera 1: ok)
Format Video Capture:
Width/Height : 640/480
Pixel Format : 'MJPG' (Motion-JPEG)
Field : None
Bytes per Line : 0
Size Image : 614400
Colorspace : sRGB
Transfer Function : Default (maps to sRGB)
YCbCr/HSV Encoding: Default (maps to ITU-R 601)
Quantization : Default (maps to Full Range)
Flags :
Crop Capability Video Capture:
Bounds : Left 0, Top 0, Width 640, Height 480
Default : Left 0, Top 0, Width 640, Height 480
Pixel Aspect: 1/1
Selection: crop_default, Left 0, Top 0, Width 640, Height 480, Flags:
Selection: crop_bounds, Left 0, Top 0, Width 640, Height 480, Flags:
Streaming Parameters Video Capture:
Capabilities : timeperframe
Frames per second: 7.500 (15/2)
Read buffers : 0
brightness 0x00980900 (int) : min=30 max=255 step=1 default=133 value=82
contrast 0x00980901 (int) : min=0 max=10 step=1 default=5 value=5
saturation 0x00980902 (int) : min=0 max=200 step=1 default=103 value=103
white_balance_temperature_auto 0x0098090c (bool) : default=1 value=1
power_line_frequency 0x00980918 (menu) : min=0 max=2 default=2 value=1
white_balance_temperature 0x0098091a (int) : min=2500 max=10000 step=1 default=4500 value=4898 flags=inactive
sharpness 0x0098091b (int) : min=0 max=50 step=1 default=25 value=25
backlight_compensation 0x0098091c (int) : min=0 max=10 step=1 default=0 value=0
exposure_auto 0x009a0901 (menu) : min=0 max=3 default=3 value=3
exposure_absolute 0x009a0902 (int) : min=1 max=10000 step=1 default=156 value=156 flags=inactive
pan_absolute 0x009a0908 (int) : min=-529200 max=529200 step=3600 default=0 value=0
tilt_absolute 0x009a0909 (int) : min=-432000 max=432000 step=3600 default=0 value=0
focus_absolute 0x009a090a (int) : min=0 max=40 step=1 default=0 value=29
focus_auto 0x009a090c (bool) : default=1 value=0
zoom_absolute 0x009a090d (int) : min=0 max=317 step=1 default=0 value=0

ラズパイでUSBカメラ使う時は、セルフパワータイプのUSBハブ利用の事。

delta型 marlin 2.x ファームウェアコンパイル時の注意事項

備忘録。delta型の3dプリンターのボードを32bitに交換した際の注意点。

ボードの型番ベンダーの資料などから探して、 Configuration.h に記載。
今回は #define MOTHERBOARD BOARD_MKS_SGEN_L
プルーブ(ベットの自動レベリング用センサー)#define FIX_MOUNTED_PROBE のあとで
Z_MIN_PROBE_PIN に指定する。delta型ではメーカー設定をそのまま使えないことがある。Z_MIN_PIN が未指定だったり、Z_MAX_PINがZ_MIN_PROBE_PINに指定されたり。
今回は Marlin\src\pins\lpc1768\pins_MKS_SGEN_L.h にdefine Z_MIN_PROBE_PIN Z_MIN_PIN を追記。
M119 コマンドで結果確認。
TMC2208 UARTチェック#define X_DRIVER_TYPE  TMC2208 と設定。
物理的にTMC2208接続横のUARTピンを有効にする。
M122コマンドで結果確認。
delta設定delta の example configrationを利用するが、設定値は下記を注意。
FEEDRATE、ACCELERATION 、JERKはX,Y,Zとしてα柱、β柱、θ柱の設定を変更するため、Zの値に要注意。X,YとZを同じ値にしないと、θ柱のみ動きが微妙に変わる。
TMC2208利用時は Configuration_adv.h 中の
#define Z_HYBRID_THRESHOLD     をX,Yと同じにしておく必要あり。

3Dプリンタ チューニング覚書

HE3D K200(デルタ型 ヒートベッド 22cm円形 )のチューニング覚書。

実施内容 効果など
ヒートベッド固定良。
付属のものはヒートベッドが動いてダメ。Kossel Adjustable Bed Clamp by stefel77(http://www.thingiverse.com/thing:1732494)が便利。ただしガラス板分の高さが足りないのを無理くりつけている。
ヒートベッドにガラス板 大変良。
確実に平面になる。今回一番効果が高い。
自動レベリングは Delta Auto Calibration のみ良。
ガラス板+ ” Delta Auto Calibration”のみが一番調子よい模様。
ガラス板なしでもauto bed leveling は3pointのほうが調子が良い。
AUTO_BED_LEVELING_UBL (MESH leveling)×
アルミのヒートベッドでは逆におかしくなる。
多分自動レベリングの押す力でベッドがたわんでしまうため。(特に中央寄りのポイント)
ガラス板ならば Delta Auto Calibrationのみで充分。計算量も減るし。
AUTO_BED_LEVELING_3POINT×
上同様。 ガラス板ならば Delta Auto Calibrationのみで充分 。
アルミのみならばUBLよりは良い感じがしたが、正確には不明。 端のみで計測のためかと思うが、ガラス板買う方がよほど良い。
Extruder交換大変良。
吐出が安定しないので過去間違えて買った
BIQU Universal Extruder Kit (SALEで送料無料だった) に交換したら安定した。努力があほらしくなったほど良い。買うなら right を買うべき。 leftだと逆だった。marlin 設定で方向逆にした。
モータードライバ交換TMC2208に交換。大変静かで良い。
モードはメーカー推奨値に従って下記とした。
XYZは stealthChop まま、0.8V。Extruder用は spreadCycleに変更し電圧を0.9Vにしてファンもつけたが、多分0.8VままでOK(Extruder交換後戻していない)
marlin設定では TMC2208_STANDALONE でreverseを true に。下記 Configuration.h参照。
Marlinバージョンアップ
1.x → 2.0
多分1.xと変わらない。
設定ファイルは HE3Dのfacebookサイトからダウンロードしたものを修正。
DELTA_SEGMENTS_PER_SECOND 100 100-150が妥当か。数字を大きくするには32bit化(というか高クロック化)した方がよさそう。

300とかにすると円盤プリントでプロセッサがほぼハング状態になり、時々動きが止まったりしてプリント結果も悪い。
10だと形が変になる。
速度などチューニング
(ガラス板追加後)
プリントスピードは60mm/sec位までまあまあ良い。
accelは 3,000mm/s^2,jerkは 20mm/s^3。
移動速度はプリントスピードと同じにする。

初期レイヤーは 速度10-30mm/sec 、accelは 1,000 mm/s^2 , jerkは5-10mm/s^3。
スプールホルダ ホコリ除け+吸湿防止に。
ダイソーの 透明蓋付き収納ボックス を利用。穴開けてチューブ(3cm位)とワンタッチ接手をつけ、乾燥剤を入れた。
湿度は 概ね30%台で、防湿はOKかと。

Configration.hの主な修正箇所。

#define DELTA

#define DELTA_SEGMENTS_PER_SECOND 100

#define X_DRIVER_TYPE TMC2208_STANDALONE

#define Y_DRIVER_TYPE TMC2208_STANDALONE

#define Z_DRIVER_TYPE TMC2208_STANDALONE

#define E0_DRIVER_TYPE TMC2208_STANDALONE

#define E1_DRIVER_TYPE TMC2208_STANDALONE

#define INVERT_X_DIR true

#define INVERT_Y_DIR true

#define INVERT_Z_DIR true

#define INVERT_E0_DIR true //extruder changed

#define INVERT_E1_DIR false //original extruder

..

Configration.h

3Dプリンタ設定

設定値覚書

HE3D K200入手。Cura4.4 でgcode作成するとなぜか3D造形がいまいちのため、設定値をプリンタ印刷精度を比較中。

設定設定項目名
(def)
結果
加速度インフィル・ウォール・上面底面 加速度 500 mm/s^2 1000
速度インフィル・上面底面
外壁・内壁
50 mm/s
30mm/s
80
50
フローフロー
初期フロー
80%
60%
90%
70%
インフィル形 インフィルパターントライアングル直線×
基準defdef×

結果詳細

設定表面接着
加速度 500mm/s^2○つやなし △底面段差×?
速度 50mm/s○つやあり少し底面段差
フロー80%△わずかにざらつき ×不足によるwave
○底面段差なし
インフィル形 tri×でこぼこ
基準×でこぼこ×インフィル飛び出し
△糸引き?

共通設定を記載しておく

  • 印刷温度 190℃
  • ビルドプレート 50℃
  • レイヤー高さ 0.2mm
  • ライン幅 0.4mm
  • 壁の厚さ 0.8mm
  • 上部表面レイヤー 0(1にすべきか)
  • 上部/底面の厚さ 0.8mm
  • 上層/低層 パターン 直線 [0,90]
  • 外壁優先 Off
  • 隙間重点 全対象
  • 小さなギャップのフィルターアウト ON
  • 壁補正 ON
  • 表面交差量 5%
  • インフィル密度 30%
  • インフィル交差量 10%
  • 引き戻し 有効
  • 引き戻し距離 6.5mm
  • 引き戻し速度 60mm/s
  • 余分な押し戻し量の引き戻し 0.1mm^3
  • 最小抽出距離範囲 6.5mm
  • 移動速度 200mm/s
  • 初期レイヤー印刷速度 10mm/s
  • 初期レイヤー移動速度 30mm/s
  • スカート速度 20mm/s
  • 遅いレイヤー数 1
  • 印刷加速度制御を有効 1000mm/s^2
  • 初期レイヤー加速度 500mm/s^2
  • スカート加速度 500mm/s^2
  • サポート加速度 500mm/s^2
  • ジャーク制御を有効 Off (On,0mm/s~3 だと1mmのwaveが出た)
  • 冷却ファン 50%
  • 小型形態の最大長さ 10mm
  • Small Feature Speed 50%
  • 小型形体の初期レイヤー速度 30%

Raspberry Pi サーボ覚書

Raspberry Pi 3 で pigpio のサーボ制御を利用して不安定だったので色々調べた覚書。

今回のトラブルはGPIO4の故障で発生。原因は詳しくは不明。

<現象>

Servo PWM制御が不安定。サーボ側の故障も考えたが、arudinoでは問題なく動く。

GPIO4を利用してして pi.set_servo_pulsewidth(4,1500) とかやっていたが下記のように不安定。

  • gpio実行の失敗。 pi.set_servo_pulsewidth(4,1500) とかのコマンド10回に2-3回失敗する。piscope で見ると何も出力されていない。
  • 動作不定。繰り返し実行すると動いたりする。
  • PWMが2-3秒で停止。piscope で見ていると、コマンド実行後2-3秒でPWMの出力が止まる。しかしpi.get_servo_pulsewidth(4) では1500とか出力されていることになっている。
  • ノイズ。上記停止後はpi.set_mode(4,0) として止めないとノイズが入る。誤動作の元。
  • ポートOUT/INモードまで変わってしまう。gpio readall で見ると、PWM出力中は MODEがOUTだが、2-3秒でINに代わる。だいたいこのタイミングでPWMの出力がかわる。

<解決?>

GPIOを4をやめて26に変更したら安定した。GPIOは4以外では正常だった。

  • 失敗なし。 pi.set_servo_pulsewidth(26,1500) とかで2-30回中失敗なし。
  • 動作安定。繰り返しでも動作変わらず。
  • 無停止。コマンド実行後停止するまでずっと PWM出力。ちなみに50Hzで出力。
  • ノイズなし。
  • ポートモード変化なし。gpio readall でずっとOUT.
  • 空いているGPIOざっと確認したがGPIO4以外では同様のトラブルなし。

何かがGPIO4を利用しているようにも見えるが不明。OCTPY使っているだけなんだが。

M5StickV がPCから認識しない → 解決

M5StickV が一昨日到着したが、PCから認識できなかった。他の動作は正常。

現象:PCに接続しても、Windows 10 から USBデバイスとして認識に失敗する。「不明なUSBデバイス(デバイス記述子要求の失敗)」や「不明なデバイス」など。

USBデバイス認識失敗の例

かたっぱしからテストした結果、どうも USB供給の電圧が5V未満になると認識に失敗するようだ。

ダメになる例。一時的に5Vを下回る。
電圧がVが大きめ(+0.08V程度)に出るので実際は4.86V位。
通常は5V程度あっても認識中に5V以下になる。PC本体の電源が弱いのか。

 

ACアダプタ付きUSBハブで解決。 USBハブはエレコム U3H-A408SBK を利用しました。

さすがACアダプタ付きHUB、電圧値安定。
+0.07V程度表示ずれ。テスターも怪しいですが。

蛇足ながら、試したことは下記の組み合わせ。どれも結果良くならず。

  • USBケーブル交換、USBポート変更
  • PCリブート、PCシャットダウン
  • M5 StickV のAボタン押し続けて起動(boot.pyスクリプト起動しない)
  • 内蔵バッテリーを疑い充電を空にしたり、逆に満まで充電したり
  • Silicon Labs ドライバを手動インストールしたり(通常自動インストール)

さて、、まずは起動時の音を小さく設定。/flash/boot.py を確認。

player = audio.Audio(path = "/flash/ding.wav")
player.volume(100)

のvolume値を100から5に変更。これで夜中でも家族に怒られませんね。

簡易エディタ pye の使い方はこちらなど

maix bit とWROOM-02 でネットワーク接続など

WROOM-02(ESP8266)を接続してネットワーク接続できるようになった。

WROOM-02なので技適も問題なし。

配線は WROOM-02のTX to pin-6,RX to pin-7 ,ATモードでESP8266を動作させる。

あとは電源、Io0、IO2、EN、電源(3.3V/GND)などは通常のWROOM-02と同様。

ntp含めて、maixpy のサンプルをgithubに置いてます。

https://github.com/shiosalt/maixpy_sample

maixpy 覚書

maix bit camera

1)maixpy IDEと対応ファームウェア

maixpy IDE でファイル送付や画像表示はファームウェア 3.1以上が必要。

Add file transfer support for MaixPy IDE

yolov2 20classサンプル公開されているファームは3.0用なので注意。

os.uname() コマンド出力の version とかでファームを確認。

2)プロンプト(REPL)上で xx.py ファイルを実行する方法

with open("xx.py") as file:
    exec(file.read())
# Back Space + Enter

あるいは下記コマンドなら1行で同じことをする。

exec(open("xx.py").read())

3)カメラの撮影、LCDへの表示、SDへの保存サンプル

import sensor
import image
import lcd

#LCD初期設定
lcd.init()
lcd.direction(lcd.YX_LRUD) #デフォルトだとLCD上下逆のため設定。YX:横長 LR 左右順 UD上下順

#カメラ初期設定
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.set_hmirror(0) # デフォルトだとカメラがミラーに設定されているため
sensor.run(1)

i=0 #ファイル名用
while (True):
    img = sensor.snapshot()
    lcd.display(img)
    filename = "/sd/{0:0=8}.jpg".format(i) # 00000000.jpg から連番
    img.save(filename)
    i=i+1
    lcd.draw_string(10,20,filename)

4)簡易エディタ pye の使い方

pye("ファイル名")

矢印キー 移動
マウス 移動
deleteキー 実質バックスペース
BackSpaceキー 押さないこと! 文字置換 押してしまったら Enter 2回

Ctrl + l またはスペース 行選択(画面上黄色選択)
Ctrl + c 行コピー
Ctrl + v 行ペースト
Ctrl + s 保存。ファイル名が表示されるので Enter 。flash だと10-15秒保存に時間がかかる。ファイル名表示が消えれば保存完了。SDなら1秒未満で保存完了。
Ctrl + q 終了。
 保存していないときは 終了していいか聞いてくる。y/N 、デフォルト N
 保存せず終了の場合、 Delete(デフォルトのNを消す) y(Yes) Enter (確定) 

5)SDカードにより不安定

SDカードによっては、USBでシリアル接続しているとマウントされるが、USBで給電のみだとマウントされないものがある。SDにより不安定とのユーザ報告もちらほらみられる。

逆にSDカードのフォーマットは FATのみ対応を記載されているが、3.1ではFAT32でも問題なかった。古いファームでは不明。

maix bit camera
テスト中。 thingiverseから適当に3Dプリンタデータをダウンロードしたら寸法違った。

6) Maix BiT は2種類あり。マイクあり・なし

キットとしてカメラ+液晶セットだが、本体ボード上に秋月電機はマイクなし・SwitchScienceはマイクありの模様。入手は秋月電子版のためマイク未テスト。

M5StackVはまだ配送中。シンガポール。