2016年1月18日月曜日

Kinect + Raspberry Pi 2 で監視カメラを作る(8)

運用の自動化

前回からだいぶ間が開いてしまったが、再起動のたびに手動でプログラムを起動するのはアホらしいので、Kinect プログラムを自動で起動するようにしていく。

自動起動の設定

まずは、camtest を適当にそれっぽいディレクトリにコピーしてついでにファイル名も kinect に変えておく。

> sudo install camtest /usr/local/sbin/kinect

で、/etc/init.d の下に起動/終了用スクリプトを作成
------------------------------
#! /bin/sh
### BEGIN INIT INFO
# Provides:             kinect
# Required-Start:       $remote_fs $syslog
# Required-Stop:        $remote_fs $syslog
# Default-Start:        2 3 4 5
# Default-Stop:        
# Short-Description:    Kinect remote webcam system
### END INIT INFO
set -e
test -x /usr/local/sbin/kinect || exit 0
. /lib/lsb/init-functions
case "$1" in
  start)
        log_daemon_msg "Starting Kinect webcam system" "kinect" || true
        if start-stop-daemon --background --start --quiet --oknodo --pidfile /var/run/kinect.pid --make-pidfile --exec /usr/local/sbin/kinect; then
            log_end_msg 0 || true
        else
            log_end_msg 1 || true
        fi
        ;;
  stop)
        log_daemon_msg "Stopping Kinect webcam system" "kinect" || true
        if start-stop-daemon --stop --quiet --oknodo --pidfile /var/run/kinect.pid; then
            log_end_msg 0 || true
        else
            log_end_msg 1 || true
        fi
        ;;
  *)
        log_action_msg "Usage: /etc/init.d/kinect {start|stop}" || true
        exit 1
esac
exit 0
------------------------------
sshd のスクリプトをベースに見よう見まねで改造しただけ。
本当は restart や status も作ったが、スペースの都合で割愛した。

出来上がったら、
> /etc/init.d/kinect start

などして動くのを確認したら
> sudo init q

でスクリプトのリストを更新(Ubuntu だと要らなかったのだが、よくわからん)

最後に
> update-rc.d kinect defaults

で、自動起動に登録。

ラズパイを一度再起動して自動で立ち上がるか確認しておく。

自動終了

Kinect の深度センサーは赤外線レーザーを使っている。
人体に影響があるとは思えないが、一晩中我が子に照射し続けるのも気が引けるため、深夜になったら自動で切れるようにする。

入手したラズパイはタイムゾーンが違っていたので、まずはそれを合わせておく。
> cp /etc/localtime /etc/localtime.org #念のためバックアップ
> cp  /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

色々と試行錯誤したのだが、Kinect の深度センサーの照射を止めるには USB から切り離す方法でしか止められなかった。
ちと乱暴だが、以下のコマンドで大本のポートから止めることで深度センサーの照射を止めることが出来るようだった。
> echo -n '1-1' > /sys/bus/usb/drivers/usb/unbind
(止まっているかどうかは、肉眼で深度センサーからうっすら出ている赤い光をみて確認した)

しかしながら、これをやると無線 LAN まで止まってしまうので、子供を寝かせる時間になったら自動で再起動するようにしたい。

というわけで、cron を使って以下のように自動で Kinect センサーの停止とラズパイの再起動を行うように設定した。

> sudo crontab -u root -e
※エディタが起動するので以下の行を追加
0 23 * * * /etc/init.d/kinect stop
5 23 * * * echo -n '1-1' > /sys/bus/usb/drivers/usb/unbind
0 18 * * * /sbin/reboot

これで、毎晩 23 時に Kinect プログラムが終了。その 5 分後にセンサーを停止し、翌日の 18 時になったら自動で再起動するようになる。