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ハブ利用の事。

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使っているだけなんだが。

pip で “THESE PACKAGES DO NOT MATCH THE HASHES FROM THE REQUIREMENTS FILE.”とかの対応

備忘録。

pip で raspiのtensorflow インストールに失敗する。HASHが違うとエラー。

pi@raspberrypi:~ $ sudo pip --no-cache-dir install --upgrade tensorflow==1.9.0
Collecting tensorflow==1.9.0
  Downloading https://www.piwheels.org/simple/tensorflow/tensorflow-1.9.0-cp27-none-linux_armv6l.whl (62.8MB)
    25% |?????????                       | 16.0MB 324kB/s eta 0:02:25
THESE PACKAGES DO NOT MATCH THE HASHES FROM THE REQUIREMENTS FILE. If you have updated the package versions, please update the hashes. Otherwise, examine the package contents carefully; someone may have tampered with them.
    tensorflow==1.9.0 from https://www.piwheels.org/simple/tensorflow/tensorflow-1.9.0-cp27-none-linux_armv6l.whl#sha256=ca364521a1c4dc6cc2c19798bbd65d51f2c599d67cd5626f0301d05f6d8adc1b:
        Expected sha256 ca364521a1c4dc6cc2c19798bbd65d51f2c599d67cd5626f0301d05f6d8adc1b
             Got        c04d65eb504b6c6d0033210001b84f7a0e6fe88319c7ffc43b5ff6e0fa05a883

fromから wgetでダウンロードしてみたら、通信エラー。”TLS packet with unexpected length was received” サーバ過負荷か通信経路障害か。自動リトライ7回目でダウンロードできた。

“pip で “THESE PACKAGES DO NOT MATCH THE HASHES FROM THE REQUIREMENTS FILE.”とかの対応” の続きを読む