2015年9月29日火曜日

motion : カメラを複数つないでみる

のんびりと環境設定をしていたところ、やらかしてしまい時間が無くなってしまい急いでつなげてみました。

motion自体の扱いはOpenWRTで触っているのでなんとなくは解ってはいるのですが、カメラを複数台つなげるのはあまりないので変なところではまってしまいました。

正直なところ、Raspberry Piに標準のOSであるRaspbianではなく、OpenWRTという選択肢があるということを知ってかなり選択に迷ってしまいました。もっと言ってしまえばほかのディストリビューションもあったりしますし。興味本位で気になるのはWindows10ですが、ソフトやドライバを書く時間も気力もおそらくないので選択肢からは外れています。
もう一つRaspberry Piを買って遊ぼうとも目論んでいたのですが、現段階でそこは我慢して、目先の道具としてのRaspberryPiの設定を行ってからと我慢しました。

実際に触ってみると良くも悪くもPCです。できなさそうなことも物理的にはなさそうなところがほぼ完成されたハードということでしょうか。
素直にゲームハードのプラットフォームとして使ってもかなりのことができそうですし。
そんなことやったらRaspberry財団から「教育に使ってください」とか言われそうですが(笑)

RaspberryもAndroidやiOS、Windowsみたくストアアプリもあったりと教育向けとはいうもののかなり洗練された形になっていて驚きました。そもそも標準でマインクラフトのPiエディションとか入ってるのも驚きました。(記憶をたどると確かマインクラフトをRaspberryに提供するよとか聞いた覚えがありました。ただ、私の環境では表示画面がウィンドウからどうやってもずれていたり、そのおかげでマウスの操作がかなり厳しかったり、クラフトモードしか見つからないしで動かしただけですが。)

かなり脱線しましたが、本題です。

時間が無くなってしまったので、選択肢が限られてしまいました。
  • 1台だけつないで満足する。
  • 不安ながらも2台つなげてリモートで悩む。
ですので、できれば2台つなげて動作することまではやっておきたかったので少し足掻いてみました。

Raspbianでsudo apt-get install motionでインストールすると、デフォルトでUSBカメラを刺して適当なコマンドラインからsudo motion -nとやればひとまず動作します。
実際にweb-camの様に使うためには
/etc/motion/motion.conf 内の
webcam_localhost on
となっている行を
webcam_localhost off
に変更してあげる必要がありますが、これを行った後sudo motion -nとやれば外部からポート8081にアクセスするだけで何らかの画像は表示されるようになります。
とっても便利。Raspberry Piのカメラの場合は、「input 8」と入力がUSBになっているのでこれを0か1に設定してあげる必要がある感じがします。買ってないのでわかりませんが。

あまり使ったことはありませんがweb上からでもある程度のカメラのコントロールが可能なのでそれを使うとするならば、
control_localhost on
となっている行を
control_localhost off
にしてあげれば同様にポート8080で使えるようになります。
試したところstartxでGUI上からローカルからアクセスしているのになぜかはじかれてしまったので、問題がなければここは解放しておいたほうが使い勝手はいいのかな?

デフォルトの状態で問題となるのは勝手に画像ファイルがぽこぽこ/tmp/motion/内に作られてゆくのであまりカメラの前で動き回っていると容量をかなり食いつぶすのできちんと設定できるまでは適当なコマンドラインで起動させてあげたほうがいいかもです。

設定を変えてデーモンモードで起動させるとすぐに罠が待っています。
ほとんどの単独プロセスで動作するアプリはプロセスの番号を特定のファイルに出力し動作するのですが、適当なコマンドラインからsudo motionしただけでは/var/run/motion/motion/pidファイルが作れないのでエラーとなって落ちます。
たぶんディレクトリを作ってあげればうまくいく気もしますが、正当法がわからないのでとりあえず
process_id_file /tmp/motion.pid
に変更して逃げました。

init.dなのかな?でプロセス番号がわからないと困るはずなのでちゃんと設定しないといけないとは思います。

さて単独のカメラであればほぼこれだけで後は細かい設定を行ってゆけばよいわけですが、複数カメラの場合はさらにファイルの末尾にあるthreadの部分のコメントを必要な数コメントアウトさせる必要がありますが、ここでも罠が。
thread1.conf ~ thread4.confは/etc/motion/に展開されているので、私は素直に
thread /etc/motion/thread1.conf
thread /etc/motion/thread2.conf
と追記しました。

今回はまだ2台だけなので、2つだけ記述して起動させると、さらに罠が(笑)thread1.confなどの出力ディレクトリ指定が/usr/local/apache2/htdocs/cam1となっているのですが、こんなディレクトリはありません。
とりあえず元のtarget_dirをコメントアウトして
target_dir /tmp/motion/cam1
と追記。
あと、撮影後今のところスクリプトは動かさないのでon_picture_saveとon_movie_endのスクリプトもコメントアウトしておきました。
必要な/etc/motion/thread1.confと/etc/motion/thread2.confの設定が完了したので再度動かしてみると、とりあえずCAMERA 1の画像は表示されるのですが、CAMERA 2の画像がうまく表示されません。
デーモンではなく、sudo motion motion -nで動かすとインタラプトなんとかかんとかというエラーが表示され続けています。

カメラを1台にしてUSBを刺しなおしてもどちらのカメラも正しく動作するので、原因がどこにあるのか見当がつかずここで半分あきらめながら.confを見ていました。
あまり時間もないのでこの状態であきらめて確実な1台だけ接続した状態にするか、動作が不安定になりそうでも2台とも接続した状態にするのかで悩みつつ、そういえばinputでデフォルトでUSBになっていたけど、複数の場合は入力の設定ができないとこまるよなぁと思い、thread2.confを見てみるとありましたinput 1となっていました(笑)
早速input 8に直して起動すると、問題なく2つのカメラが見えるようになりました。

解ってしまえばたいしたことはないのですが、エラーメッセージで検索をかけてもそれらしいものが見当たらずどこが原因なのか全くわからず途方にくれましたが、何とかなりました。

ちなみに過去にOpenWRTのmotionで一つのカメラはそのままでは接続できず、別のものを買い足して使っているのですが、現時点でのraspdianのmotionで何の問題もなく動きました。もしかするともう一台はカメラの角度を少し動かせるのでそれも動かせるかも?

現時点ではOpenWRTではなくraspdianで環境を作ってみようと思ってはいるのですが、容量が無駄に消費されるものの、パッケージがそれなりに新しく、たぶんソースを持って来ればデバイス上でコンパイルまでできると思うので意外な便利さはあるかもしれませんね。

蛇足として気になる点が、Raspberry Pi 2のUSBポートの番号が見た目とは違うかも?と気になりました。
CAM1とCAM2の順番が意図している順番とは逆になっていることから気になっています。

Raspberry Pi 2はUSBコネクタが4つ出ているのですが、一体どのような順番なのだろう?

root@raspberrypi:/var/run# lsusb
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp.
Bus 001 Device 004: ID 046d:0994 Logitech, Inc. QuickCam Orbit/Sphere AF
Bus 001 Device 005: ID 046d:089d Logitech, Inc. QuickCam E2500 series
root@raspberrypi:/var/run# lsusb -t
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=dwc_otg/1p, 480M
    |__ Port 1: Dev 2, If 0, Class=hub, Driver=hub/5p, 480M
        |__ Port 1: Dev 3, If 0, Class=vend., Driver=smsc95xx, 480M
        |__ Port 2: Dev 4, If 0, Class='bInterfaceClass 0x0e not yet handled', Driver=uvcvideo, 480M
        |__ Port 2: Dev 4, If 1, Class='bInterfaceClass 0x0e not yet handled', Driver=uvcvideo, 480M
        |__ Port 2: Dev 4, If 2, Class=audio, Driver=snd-usb-audio, 480M
        |__ Port 2: Dev 4, If 3, Class=audio, Driver=snd-usb-audio, 480M
        |__ Port 4: Dev 5, If 0, Class=vend., Driver=gspca_zc3xx, 12M
        |__ Port 4: Dev 5, If 1, Class=audio, Driver=snd-usb-audio, 12M
        |__ Port 4: Dev 5, If 2, Class=audio, Driver=snd-usb-audio, 12M
表示してみたもののよくわからない(笑)
やはりここは一度抜き差しして確認しないとダメかな。
で、ここで初めて気づいたのですが、どちらもマイクが仕込んであるという事実に。 

0 件のコメント:

コメントを投稿