3Dプリンター「BS01+」にAstroBox v0.9 を導入 ~中編:Webカメラ~

0 件のコメント
前回で基本的なことは完了したけど、今回のテーマは、
  • Webカメラ でプリント監視
  • BS01+への取付パーツをつくって設置
想定と違って、かなり紆余曲折が。。

Webカメラの選定

v0.9でAstroBoxがRasberry Piの標準カメラの対応をストップしてしまったので、UVC(USB Video Class) なWebカメラを買うことにした。
最終候補は2つ。logicoolのC270、iBuffaloのBSWHD06M。

画質の評判はC270が圧倒的によさそうだったが、BSWHD06M と比較すると
  • フォーカス固定で焦点距離40cm~ (設置場所を考えるとかなり近いキョリでの撮影になる。調整方法はあるが、面倒。BSWHD06M は手動フォーカス)
  • サイズが BSWHD06M よりやや大きい
  • クリップの接合部の修正がしづらそう(というかどうなってるのか不明。BSWHD06M は単純なネジ)
という課題があって、結局 BSWHD06M を購入した。

接続テスト

写真(静止画)表示の確認

USB接続しただけで、UVC(USB Video Class) なので普通に認識可。
ローカルアクセスでもクラウドアクセス でも写真(静止画)は映像確認ができた(上下逆だけど。。)。

カメラ情報の確認

なお、カメラ情報(どういうパラメータに対応できるのかなど)はv4l2-ctlコマンドで確認できる。
ホワイトバランスは自動調整が有効。コントラストや明るさ調整ができるっぽいてのが何となくわかる。ただデフォ値が総じてmin-maxを超えてる変な状態。
# v4l2-ctl -d /dev/video0 --all
Driver Info (not using libv4l2):
        Driver name   : uvcvideo
        Card type     : BUFFALO BSWHD06M USB Camera

        Bus info      : usb-3f980000.usb-1.3
        Driver version: 4.4.11
        Capabilities  : 0x84200001
                Video Capture
                Streaming
                Extended Pix Format
                Device Capabilities
        Device Caps   : 0x04200001
                Video Capture
                Streaming
                Extended Pix Format
Priority: 2
Video input : 0 (Camera 1: ok)
Format Video Capture:
        Width/Height  : 640/480
        Pixel Format  : 'YUYV'
        Field         : None
        Bytes per Line: 1280
        Size Image    : 614400
        Colorspace    : SRGB
        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
Selection: crop_bounds, Left 0, Top 0, Width 640, Height 480
Streaming Parameters Video Capture:
        Capabilities     : timeperframe
        Frames per second: 15.000 (15/1)
        Read buffers     : 0
                     brightness (int)    : min=-255 max=255 step=1 default=-8193 value=-4
                       contrast (int)    : min=0 max=30 step=1 default=57343 value=15
                     saturation (int)    : min=0 max=127 step=1 default=57343 value=32
                            hue (int)    : min=-16000 max=16000 step=1 default=-8193 value=0
 white_balance_temperature_auto (bool)   : default=1 value=1
                          gamma (int)    : min=20 max=250 step=1 default=57343 value=84
           power_line_frequency (menu)   : min=0 max=2 default=1 value=1
      white_balance_temperature (int)    : min=2500 max=7000 step=1 default=57343 value=5000 flags=inactive
                      sharpness (int)    : min=0 max=64 step=1 default=57343 value=0
         backlight_compensation (int)    : min=0 max=2 step=1 default=57343 value=1
なお、対応する解像度とフレームレートの確認は下記でできる。
BSWHD06M は 720pの撮影は可能だが、8fpsに制限されることがわかる。640x480 なら30fpsまでいける。
# v4l2-ctl -d /dev/video0 --list-formats-ext
ioctl: VIDIOC_ENUM_FMT
        Index       : 0
        Type        : Video Capture
        Pixel Format: 'YUYV'
        Name        : YUYV 4:2:2
                Size: Discrete 1280x720
                        Interval: Discrete 0.125s (8.000 fps)
                Size: Discrete 800x600
                        Interval: Discrete 0.067s (15.000 fps)
                        Interval: Discrete 0.125s (8.000 fps)
                Size: Discrete 640x480
                        Interval: Discrete 0.033s (30.000 fps)
                        Interval: Discrete 0.050s (20.000 fps)
                        Interval: Discrete 0.067s (15.000 fps)
・・・略・・・

ストリーミング表示の確認

AstroBox v0.8系ではn分に一回(或いは1層ごとに1回)撮影する という設定しかできなかったが、v0.9からはストリーミングに対応
なお、ストリーミングについては、WebRTC(Web Real-Time Communication) を使ってて、ちょっと注意が必要。
特にコーデックが対応ブラウザを選ぶので、非対応の組み合わせだとこんなエラーが出る。
現状だとFireFoxしか、デフォルト設定のH.264には対応できてなくて、V8に変更したほうがよさげ。
H.264とV8の切り替えや、解像度設定などは、 AstroBox にローカルアクセスしたときの Setting -> CAMERA: Image/Video の Video Streaming EncodingCamera:Video でできる。
参考: 試した結果
Surface(Win10)だと、、
ブラウザH.264V8
Chrome×
FireFox
Opera×
Edge×
XperiaZ4(android M)だと、、
ブラウザH.264V8
Chrome×
FireFox
Opera×
iPhone(iOS9.3.2) だと、、
ブラウザH.264V8
Safari×
Chrome×
FireFox×
△はエラーは出ないが、ずっと待機中で映像がでなかった。
つまりiPhoneじゃ全くダメだった。。

USB Webカメラの取付

Webカメラの取付

テーブルにカメラを固定すれば、プリント中だけでなく、プリント前後でテーブルが下がった状態でも撮影できるので、そうしたかったけど、
超小型な BS01+ は筐体内に余裕がないので、筐体内に収まる位置にカメラを固定すると印刷中のガントリーに接触してしまう。
テーブルから張り出すように設置することも検討したが、前面のMDFボードがカメラの視界を遮ってしまいそう。

まぁ、カメラ位置が動くとケーブルの取り回しが面倒な気がするし、今回は前面部分に固定することにした。一応、カメラのパン/チルトはできるようにパーツは作っている。


BSWHD06M のクリップ部分のネジを外し、元のクリップの代わりに、3Dプリンタで造形した自作のBS01+用のハンガーをつけなおして取り付け。


パーツ画像説明/Thingiverseへのリンク
WebCam(BSWHD06M)ハンガーβ(自作 )

Webカメラの反転設定

上からWebカメラを吊るす方式にしたが、今回の取付方法だと映像の上下が逆。。
ただ、AstroBox は OctoPrint のフォーク。
OctoPrintの設定 を参考に下記設定を /etc/astrobox/config.yaml に追記してみた。
webcam:
  flipV: true

astrobox を再起動して反映。
# systemctl restart astrobox

が、画像反転できず。。

調査

けど、AstroBox はオープンソースなので、あきらめずにソースを眺めてみたら、カメラ回りは OctoPrint や AstroBox v0.8 とは違う実装になってた。

OctoPrint v1.2.13 は 写真が Python Picamera で、ストリーミングは ffmpeg かな?
で、画像の回転は単にCSS処理で負荷を無くしてる。
OctoPrint v1.2.13 の octoprint/settings.py 内のデフォルト設定値を参照すると下記。このあたりのパラメータを config.yaml で使えばよい。
ただ、よくみたら、反転はできるし、90度回転はできるが、OctoPrint でも、config.yaml の設定だけでは 180度回転はできなさそう。
        "webcam": {
                "stream": None,
                "snapshot": None,
                "ffmpeg": None,
                "ffmpegThreads": 1,
                "bitrate": "5000k",
                "watermark": True,
                "flipH": False,
                "flipV": False,
                "rotate90" : False,
                "timelapse": {
                        "type": "off",
                        "options": {},
                        "postRoll": 0,
                        "fps": 25
                },
                "cleanTmpAfterDays": 7
        },
なお、AstroBox v0.8 は写真が Python Picameraで、ストリーミングはなし。
octoprint/settings.py は下記。
OctoPrint と同様に上下左右の画像反転は可能。但し、回転用の設定項目はなく、rotate90 を指定しても、その処理がないので無駄。
        "webcam": {
                "stream": None,
                "snapshot": None,
                "ffmpeg": None,
                "bitrate": "5000k",
                "watermark": True,
                "flipH": False,
                "flipV": False,
                "timelapse": {
                        "type": "off",
                        "options": {},
                        "postRoll": 0
                }
        },
一方、AstroBox v0.9 は、写真、ビデオとも gstreamer 1.0 が標準で使われてた。RasPi camera非対応になったのもこの変更が主要因ぽい。
なお、サブで mjpg-streamer も使える。
AstroBox v0.9 の octoprint/settings.py は下記。項目名自体が webcam から camera に変わってる。
こちらも回転は実装されてない。
        "camera": {
                "manager": "gstreamer",
                "encoding": "h264",
                "size": "640x480",
                "framerate": "15/1",
                "format": "x-raw",
                "pixelformat": "YUYV"
        },

対応方法として

上記を踏まえて、ソースを追っかけたり検証してみたりしたが、、、
  • CSS処理だと、ローカルアクセスはそれでいけるけど、クラウドアクセスには適用されない。
    ローカルアクセスだけで我慢する手もあるけど、、却下
  • src/astroprint/camera/v4l2/gstreamer.py のソースを改変して、gstreamer のパイプラインに、videoflip method=rotate-180 を入れればできそうだが、エンコード/デコード処理になるので重そう。却下
  • mjpg-streamer に切り替えたら、USB Webカメラでは無理だけど、RasPi Camera なら mjpeg.py を修正すればいけそう
  • v0.8系に戻せば 反転はいける。が、180度回転はできないし、今回は v0.9 にこだわることにする。却下
  • 物理的に反転 → 当然いける。採用。。
ということで、いろいろ調べたけど、結局、物理的にカメラを回転させて対応をすることにした。  ソースコード修正でギリ対応できそうだけど、AstroBoxのバージョンアップの際にファイルが上書きされて、毎回ソース修正が必要になりそうなので。。
ま、結構苦労したけど、OctoPrint、 Python言語、V4L2回りのツールなど、全然知らんかったことが色々わかったのは収穫。

USB Webカメラの取付(改)

てことで、パーツを作り直して取り付け直し。当然ながら無事上下が正しくなった。

パーツ画像説明/Thingiverseへのリンク
WebCam(BSWHD06M)用ハンガーv1.0(自作 )

次回はプリント中に自動で点灯するLED照明をつけるのをやってみる。

mjpeg-streamer への切り替えメモ
今回の検証で、試したのでメモ。

mjpg-streamer を入手してコンパイルし、/ 直下に配置。
 apt-get install libjpeg-dev imagemagick subversion cmake
 mkdir /tmp/mjpg
 cd /tmp/mjpg
 svn co https://github.com/jacksonliam/mjpg-streamer.git mjpg-streamer
 cd mjpg/trunk/mjpg-streamer-experimental/
 make
 mkdir /mjpg-streamer
 cp -a mjpg-streamer input*.so output*.so /mjpg-streamer
使ったのはRaspiCam 対応の jacksonliam の mjpg-streamer フォーク
本家は http://svn.code.sf.net/p/mjpg-streamer/code/mjpg-streamer
/etc/astrobox/config.yaml 修正
camera:
  manager: mjpeg

今後の改造候補メモ
mjpg-streamer(RasPi Camera対応版)や、gstreamer に gst-rpicamsrc プラグインを入れれば、もともと想定してたRasPi Camera も使えると思われる。
現状のカメラアングルが微妙なので、Multi Camera Adapterを入れて、カメラ切り替えとかしてみるのもありかも。



0 件のコメント :

コメントを投稿

ご来訪者様の判別のため、
匿名希望の方もコメントの記入者欄に「名前/URL」 を選択し、
テキトーなペンネームを入れてくださいm(_ _)m
※ URLは不要。書いていただいてもOK。