3Dプリンター「BS01+」にAstroBox v0.9 を導入 ~中編:Webカメラ~
前回で基本的なことは完了したけど、今回のテーマは、- Webカメラ でプリント監視
- BS01+への取付パーツをつくって設置
Webカメラの選定
v0.9でAstroBoxがRasberry Piの標準カメラの対応をストップしてしまったので、UVC(USB Video Class) なWebカメラを買うことにした。最終候補は2つ。logicoolのC270、iBuffaloのBSWHD06M。
画質の評判はC270が圧倒的によさそうだったが、BSWHD06M と比較すると
- フォーカス固定で焦点距離40cm~ (設置場所を考えるとかなり近いキョリでの撮影になる。調整方法はあるが、面倒。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) を使ってて、ちょっと注意が必要。
参考 :
WebRTC トラノマキ
特にコーデックが対応ブラウザを選ぶので、非対応の組み合わせだとこんなエラーが出る。現状だとFireFoxしか、デフォルト設定のH.264には対応できてなくて、V8に変更したほうがよさげ。
H.264とV8の切り替えや、解像度設定などは、 AstroBox にローカルアクセスしたときの Setting -> CAMERA: Image/Video の Video Streaming EncodingCamera:Video でできる。
参考: 試した結果
Surface(Win10)だと、、
XperiaZ4(android M)だと、、
iPhone(iOS9.3.2) だと、、
△はエラーは出ないが、ずっと待機中で映像がでなかった。
つまりiPhoneじゃ全くダメだった。。
Surface(Win10)だと、、
ブラウザ | H.264 | V8 |
---|---|---|
Chrome | × | ○ |
FireFox | ○ | ○ |
Opera | × | ○ |
Edge | × | △ |
ブラウザ | H.264 | V8 |
---|---|---|
Chrome | × | ○ |
FireFox | ○ | ○ |
Opera | × | ○ |
ブラウザ | H.264 | V8 |
---|---|---|
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 にこだわることにする。却下。
- 物理的に反転 → 当然いける。採用。。
ま、結構苦労したけど、OctoPrint、 Python言語、V4L2回りのツールなど、全然知らんかったことが色々わかったのは収穫。
USB Webカメラの取付(改)
てことで、パーツを作り直して取り付け直し。当然ながら無事上下が正しくなった。パーツ画像 | 説明/Thingiverseへのリンク |
---|---|
WebCam(BSWHD06M)用ハンガーv1.0(自作 ) |
次回はプリント中に自動で点灯するLED照明をつけるのをやってみる。
mjpeg-streamer への切り替えメモ
今回の検証で、試したのでメモ。
mjpg-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 修正本家は http://svn.code.sf.net/p/mjpg-streamer/code/mjpg-streamer
camera: manager: mjpeg
今後の改造候補メモ
mjpg-streamer(RasPi Camera対応版)や、gstreamer に gst-rpicamsrc プラグインを入れれば、もともと想定してたRasPi Camera も使えると思われる。
現状のカメラアングルが微妙なので、Multi Camera Adapterを入れて、カメラ切り替えとかしてみるのもありかも。
mjpg-streamer(RasPi Camera対応版)や、gstreamer に gst-rpicamsrc プラグインを入れれば、もともと想定してたRasPi Camera も使えると思われる。
現状のカメラアングルが微妙なので、Multi Camera Adapterを入れて、カメラ切り替えとかしてみるのもありかも。
関連記事
3Dプリンター「BS01+」にAstroBox v0.9 を導入 ~前編:基本~
3Dプリンター「BS01+」にAstroBox v0.9 を導入 ~中編:Webカメラ~
3Dプリンター「BS01+」にAstroBox v0.9 を導入 ~後編:LED自動照明~
3Dプリンター「BS01+」にAstroBox v0.9 を導入 ~前編:基本~
3Dプリンター「BS01+」にAstroBox v0.9 を導入 ~中編:Webカメラ~
3Dプリンター「BS01+」にAstroBox v0.9 を導入 ~後編:LED自動照明~
登録:
コメントの投稿
(
Atom
)
0 件のコメント :
コメントを投稿
ご来訪者様の判別のため、
匿名希望の方もコメントの記入者欄に「名前/URL」 を選択し、
テキトーなペンネームを入れてくださいm(_ _)m
※ URLは不要。書いていただいてもOK。