2015年12月14日月曜日

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

ブラウザから Kinect を操作する(前編)

前回で libfreenect を利用した Kinect の操作方法は大体わかったので、今度はWebカメラらしくブラウザから仰角や表示モードを操作できるようにする。

やり方は色々あるが今回は古典的だが一番簡単そうなネームドパイプ(FIFO)を使って cgi から camtest にコマンドを送る。

概念的にはこんな感じになる。

  camtest ← FIFO ← CGI ← ブラウザ

双方向の情報伝達も出来なくはないが、ちゃんとやろうとすると非常に面倒なので今回は一方通行にする。

まずは、camtest.c に以下の行を追加してFIFOの生成とオープンを行う。
マルチスレッドにするならブロックモードでも良いが、それはそれでめんどいありがたいことにイベントループ方式で Kinect から画像データを取得してくれているので、それに乗っかって今回はノンブロックモードを利用してシングルスレッドで運用する。

#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
...
char fifoname[] = "/tmp/kinect";
...

int main(int argc, char** argv)
{
        ...
        int fifo;
        if(mkfifo(fifoname, 0666) == 0) { // FIFOの作成
                chmod(fifoname, 0777);
        } // すでにFIFOがある場合は失敗するだけなので気にしない
        if((fifo = open(fifoname, O_RDONLY | O_NONBLOCK)) < 0) { // オープン
                printf("Failed to open fifo\n");
                return 1;
        }

ルート権限で実行すると mkfifo で0777を指定しても umask の影響で一般ユーザーの書き込み権限がなくなってしまうので、わざわざ作った後に chmod で権限を変更している。
この辺もう少し賢く出来ないもんか・・・

んでもってあとはイベントループの中でFIFOからコマンドをリードしてそれに応じて仰角とカメラモードを変更するようにすればよい。

        enum video_mode { KINECT_RGB, KINECT_IR, KINECT_DEPTH };

        // とりあえず最初はRGBモードでカメラだけ起動しておく
        current_mode = KINECT_RGB;        
        ret = freenect_set_video_mode(fn_dev, freenect_find_video_mode(FREENECT_RESOLUTION_MEDIUM, FREENECT_VIDEO_RGB));
        ret = freenect_start_video(fn_dev);

        // 起動時の仰角を取得
        freenect_update_tilt_state(fn_dev);
        p_raw_tilt_state = freenect_get_tilt_state(fn_dev);
        current_tilt = freenect_get_tilt_degs(p_raw_tilt_state);
        next_tilt = current_tilt;

        while (running && freenect_process_events(fn_ctx) >= 0)
        {
                char cmd;
                enum video_mode next_mode = current_mode;
                ...
                while(read(fifo, &cmd, sizeof(cmd)) == sizeof(cmd)) {
                        switch(cmd) {
                        case 'p':
                                next_tilt += 1.0;
                                if(next_tilt > 30.0)
                                        next_tilt = 30.0;
                                break;
                        ...
                        case 'D':
                                next_mode = KINECT_DEPTH;
                                break;
                        }
                }
                if(current_tilt != next_tilt) {
                        freenect_update_tilt_state(fn_dev);
                        p_raw_tilt_state = freenect_get_tilt_state(fn_dev);
                        tilt_status = freenect_get_tilt_status(p_raw_tilt_state);
                        if(tilt_status != TILT_STATUS_MOVING) {
                                freenect_set_tilt_degs(fn_dev, next_tilt);
                                current_tilt = next_tilt;
                        }      
                }
                if(current_mode != next_mode) {
                        set_mode(fn_dev, next_mode);
                }
        }

コマンドは複数文字にすると送信オーバーフロー時のバッファの処理や終端コードなど色々考える必要が出てくるので、単純化のため今回は全て1文字で p が仰角+1度、P が+5度、m が-1度、M が-5度、R がRGBモード、I が赤外線モード、D が深度モードとした。

set_mode 関数では以下のようにビデオモードの切り替えを行う。
貧乏性なので律儀に使わないモードを止めているが、どれだけ性能に影響するかは不明。

void set_mode(freenect_device* fn_dev, enum video_mode next_mode) {
        switch(current_mode) {
        case KINECT_RGB:
        case KINECT_IR:
                freenect_stop_video(fn_dev);
                break;
        case KINECT_DEPTH:
                freenect_stop_depth(fn_dev);
                break;
        }
        switch(next_mode) {
        case KINECT_IR:
                freenect_set_video_mode(fn_dev, freenect_find_video_mode(FREENECT_RESOLUTION_MEDIUM, FREENECT_VIDEO_IR_10BIT));
                freenect_start_video(fn_dev);
                current_mode = KINECT_IR;
                break;
        case KINECT_DEPTH:
                freenect_start_depth(fn_dev);
                current_mode = KINECT_DEPTH;
                break;
        case KINECT_RGB:
                freenect_set_video_mode(fn_dev, freenect_find_video_mode(FREENECT_RESOLUTION_MEDIUM, FREENECT_VIDEO_RGB));
                freenect_start_video(fn_dev);
                current_mode = KINECT_RGB;
                break;
        }
}

無事に出来たところで動作確認を行う。
camtest を実行すると、"/tmp/kinect”というファイルが生成されるので、試しにリダイレクトなどでコマンドを書き込んで動作確認を行う。

# echo p > /tmp/kinect

camtest の方はこれで出来たので、あとは CGI と html を作成する。

2015年12月5日土曜日

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

Depth と IR 画像の取得

Depth は depth_cb の data 引数から取得できる。
ただし、データは 11bit 形式なので、8bit のグレイスケールに変換する必要がある。
最初は律儀に RGB 各色に同じ値を入れていたが、JPEG のオプションを調べたら 1byte のグレイスケールでも出力できるようだった。

    JSAMPLE jpg_line[640];
    ・・・
    jpg_cinfo.input_components = 1;
    jpg_cinfo.in_color_space = JCS_GRAYSCALE;
    ・・・
    for(i = 0; i < 480; i++) {
        int j;
        for(j = 0; j < 640; j++) {
                unsigned short tmp;
                tmp = ((unsigned short)buf[i * 640 * 2 + j * 2 + 1] << 8)
                          + ((unsigned short)buf[i * 640 * 2 + j * 2] & 0xff);
                jpg_line[j] = (tmp >> 3) & 0xff;
        }
        jpg_row[0] = jpg_line;
        jpeg_write_scanlines(&jpg_cinfo, jpg_row, 1);
    }

IR の方は、最初に freenect_set_video_mode で FREENECT_VIDEO_RGB の代わりに FREENECT_VIDEO_IR_8BIT を指定する必要がある。
10BIT精度にも出来るが、どうせグレイスケールに変換するのでここでは 8bit で十分。こうすれば切り出したバッファをそのまま JPEG のライブラリに食わせられる。
このあたりからあまりまとまった解説が見当たらくなってきたので、わからなかったらlibfreenect のヘッダのコメントを見て解決している。

    freenect_set_video_mode(fn_dev,  freenect_find_video_mode(FREENECT_RESOLUTION_MEDIUM, FREENECT_VIDEO_IR_8BIT));
    ・・・
   
    ・・・
    for(i = 0; i < 480; i++) {
        jpg_row[0] = (JSAMPROW)&buf[i * 640];
        jpeg_write_scanlines(&jpg_cinfo, jpg_row, 1);
    }

動作中の RGB と IR の切り替え方法については、正式なドキュメントは見当たらなかったが、とりあえず以下のように一旦止めてから、モードを変更して再度スタートしたら無事に動いたので、とりあえずはこのやり方で行くことにした。

    freenect_stop_video(fn_dev);
    freenect_set_video_mode(fn_dev, freenect_find_video_mode(FREENECT_RESOLUTION_MEDIUM, FREENECT_VIDEO_IR_8BIT));
    freenect_start_video(fn_dev);

もしかしたら止めなくても良いのかもしれないが、なんとなく気分的にやってしまう。

Tilt(傾き) の操作

Tilt の操作は freenect_set_tilt_degs を呼べば良いはずなのだが、ベースとした camtest.c にこれを組み込んでもさっぱり反応してくれない。
コードを読み返したら一カ所怪しいところがあったので、ヘッダのコメントをみたら案の定これが悪さをしていた。というわけで、以下の一行をコメントアウト。

    //freenect_select_subdevices(fn_ctx, FREENECT_DEVICE_CAMERA);

これは、アプリで使用するキネクトのデバイスを指定するオプション。キネクトは、カメラ、モーター、LEDの3つのデバイスから構成されており、この関数を利用することで個別に指定して開くことが出来る。
例えば、アプリ A でカメラを操作し、アプリ B でチルトの制御を行うときなどはこれを使うと便利だが、今回はアプリを分けるつもりは無い。指定なしの場合は全部のデバイスをオープンするそうなので、コメントアウトしてしまうのが手っ取り早い。

傾きの角度は浮動小数点で自由に指定できるが、サンプルを見た限りだと ±30度 の範囲がデバイスとしての限界っぽい。(API 側で制限かけていないのは、将来的に新型 Kinect が出たときに動作範囲が変わることを想定してるんだろうな)
角度の指定は動いているときでも出来るようだが、気分的に以下のように止まっていることを確認してから行うようにする。

    freenect_raw_tilt_state* p_raw_tilt_state;
    freenect_tilt_status_code tilt_status;
    double tilt_deg = 10.0;

    freenect_update_tilt_state(fn_dev);
    p_raw_tilt_state = freenect_get_tilt_state(fn_dev);
    tilt_status = freenect_get_tilt_status(p_raw_tilt_state);
    if(tilt_status != TILT_STATUS_MOVING) {
        freenect_set_tilt_degs(fn_dev, tilt_deg);
    }

なお、±30度を超える角度を指定した場合は状態は TILT_STATUS_LIMIT になる。なのであえて TILT_STATUS_STOPPED ではなく !TILT_STATUS_MOVING で動作中かどうかを判定している。

これで必要な機能の使い方は一通りわかったので、後はこれをどうやってブラウザから制御するかってことになる。

2015年12月1日火曜日

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

Kinect のカメラ画像を Jpeg ファイルに出力してブラウザで見る

freenect の example には camtest.c が入っている。
ソースを読んだ感じでは、RGB/Depth カメラのデータを繰り返し取得しているようなのだが、そのままではメッセージを出力するだけで画像が取得できないのでこれを改造して画像を出力するようにする。

カメラのデータは video_cb という関数の第二引数であるdata に格納されていると思われるが、どのようなフォーマットで格納されているかいまいちドキュメントが見当たらなかった。仕方なしに先頭数バイトを HEX でダンプして心の目で見た感じだとどうやらRGBの生データぽかったので、これを上手いこと整形して JPEG のライブラリに食わせれば画像ファイルに変換できると考えた。

まずは Jpeg ライブラリのインストール
> sudo apt-get install libjpeg-dev

で、video_cb の中身を以下のように変更

#include <jpeglib.h>

char filename[] = "/var/www/html/kinect/output.jpg";

void video_cb(freenect_device* dev, void* data, uint32_t timestamp)
{
        JSAMPROW jpg_row[1];
        struct jpeg_compress_struct jpg_cinfo;
        struct jpeg_error_mgr jerr;
        FILE *fp;
        int i;
        char* buf = data;

        jpg_cinfo.err = jpeg_std_error(&jerr);
        jpeg_create_compress(&jpg_cinfo);
        fp = fopen(filename, "wb");
        jpeg_stdio_dest(&jpg_cinfo, fp);
        jpg_cinfo.image_width = 640;
        jpg_cinfo.image_height  = 480;
        jpg_cinfo.input_components = 3;
        jpg_cinfo.in_color_space = JCS_RGB;
        jpeg_set_defaults(&jpg_cinfo);
        jpeg_set_quality(&jpg_cinfo, 75, TRUE);
        jpeg_start_compress(&jpg_cinfo, TRUE);
        for(i = 0; i < 480; i++) {
                jpg_row[0] = (JSAMPROW)&buf[i * 640 * 3];
                jpeg_write_scanlines(&jpg_cinfo, jpg_row, 1);
        }
        jpeg_finish_compress(&jpg_cinfo);
        jpeg_destroy_compress(&jpg_cinfo);
        fclose(fp);
}

コンパイルは -lfreenect に加えて -ljpeg を追加してコンパイルする。
無事にコンパイルできたら、/var/www/html/kinect ディレクトリを作成してから実行すればここに Kinect カメラで撮影した画像が保存される。
実のところ Jpeg のライブラリを使うのは初めてだったが、思ってた以上にすんなり出来た。なので、細かいパラメータはどっかで拾ったサンプルそのまま。

画像を見るにはPCのブラウザで "http://ラズパイのIP/Kinect/output.jpg" と入れれば撮影した画像が閲覧できる。
ブラウザのリロードボタンをひたすら連打すればアニメーションぽいのも見れるはずである・・・が、
ここで問題が発生した。
一つはそのままだと画像がキャッシュされてしまい更新されない。
これは以下の.httaccesを作成して対処した。

<Files ~ "\.jpg$">
Header set Cache-Control "no-cache"
Header set Pragma "no-cache"
</Files>

もう一つは読み込むタイミングによってはライブラリが書き込んでる途中のデータが読み込まれてしまい、画像の一部が切れてしまうことがあった。

苦肉の策として、一旦テンポラリに吐き出した後で、mv コマンドで移動するようにした。
互換性がだいぶ犠牲になるが、どうせラズパイ専用なので気にしない。

char filename[] = "tmp.jpg";
char postcmd[] = "mv tmp.jpg /var/www/html/kinect/output.jpg";

void video_cb(freenect_device* dev, void* data, uint32_t timestamp)
{
        JSAMPROW jpg_row[1];

   ・・・

        fclose(fp);
        system(postcmd);
}

蛇足だが、Linux/Unix 系のファイルシステムでは読み込み途中のファイルが mv コマンドで変更されても、読み込んでファイルがクローズされるまでは読み込み側ではもとのファイルを参照し続けるので、このように mv で上書きしてしまってもブラウザで表示されるデータが混ざったり崩れたりする心配は無い。
FATやNTFSの場合は知らんが。

手動でリロードするのも何なので、JavaScriptで自動でリロードするようにしてあげれば、Kinectのカメラで撮った画像をぱらぱら漫画風の動画として見ることが出来る。

/var/www/html/kinect/index.html

<html>
<head>
<script language="javascript"><!--
function autoreload() {
    location.reload();
}
//--></script>
</head>
<body onload="setInterval('autoreload()',100)">
<img src="output.jpg">
</body>

このままでも良いのだが、リロードの時のちらつきが気になる。
見栄えの問題なので後回しにしようと思ったが、canvas を使えば意外と簡単に解決できそうなのでやってみた。

<html>
<head>
<script language="javascript"><!--
function loadimage() {
        var canvas = document.getElementById("cv");
        if( ! canvas || ! canvas.getContext ) { return false; }
        var ctx = canvas.getContext('2d');
        var img = new Image();
        img.src = "output.jpg?" + new Date().getTime();
        img.onload = function() {
                ctx.drawImage(img, 0, 0);
                setTimeout(loadimage, 100);
        }
}
//--></script>
</head>
<body onload="loadimage()">
<canvas id="cv" width="640" height="480"></canvas>
</body>

同じページでのリロードの場合は画像のキャッシュを無効にしても意味が無いようなので、結局ファイル名の後に"?"と日時を追加してブラウザに違うファイルとして認識させるようにする必要がある。

実態はパラパラ漫画なのだが、この程度でもLAN 環境なら動画と遜色ない感じで表示できる。
setTimeout はもっと短くても良いかもしれない。

とりあえずはこれでスタート地点と同じ RGB の動画(っぽいの)を表示するところまではたどり着いた。
せっかく頑張って libfreenect を導入したのだから、IR/Depth 画像の表示やチルト操作もできるように今後拡張していく。

2015年11月28日土曜日

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

外からラズパイにログインするための準備

前回でライブラリとベースとするソースは決めたのでこれからはごりごりコードを書いていきたいのだが、いかんせん家にいると子守と Fallout4 を並列にこなさなければならないのでその合間にコードを書くのはなかなかヘビーだ。

そこで少しでも作業が進むように外からスマフォなりタブレットなりで SSH でログインしてコーディングやその他の作業が出来る環境を整える。

何はともあれ、ラズパイを外部に公開するので、まずはそれなりにセキュリティを強化していく。

  • デフォルトユーザーのパスワード変更
    > passwd
  • 外部ログイン用グループ(developper)の作成
    > sudo groupadd developper
  • 外部ログイン用ユーザー(ruser)の作成
    > sudo useradd -c "remote user" -g developper -m -N ruser
  • 作成したユーザーにパスワードを設定
    > sudo passwd ruser
  • デフォルトユーザーの外部ネットワークからのログインを禁止
    /etc/security/access.conf に以下の行を追加
        - : pi : ALL EXCEPT 192.168.1.
これでWANからは先ほど作成したruserでしかログインできなくなる。
ルートの権限がほしい場合は、ruserでログインした後で、
> su - pi
でユーザーを切り替えるので両方のパスワードを知らないとroot権限を取得できないことになる。

さらに、
  • pi を先ほど作成したdevelopperグループに追加
    > sudo gpasswd -a pi developer
        ("usermod -G" は罠なので使ってはいけない)
  • 共有ディレクトリの作成
    > sudo mkdir /home/developer
    > sudo chown pi /home/developer
    > sudo chgrp developper /home/developper
  • 共有ディレクトリにSGIDを設定して異なるユーザーがファイルを作成しても同じグループになるようにする。
    > sudo chmod 2770 /home/developer/
  • デフォルトでグループに書き込み権限を与える
    /etc/profile に以下の行を追加
      umask 002
これで、外からは ruser, 家では pi でログインしても同じように作業が出来る。

そとからラズパイにログイン

グローバルIPをもらえる環境なら DDNS なりなんなり使えば良いが、我が家のマンションネットではそれが難しそうなのでホスティングサービスを利用して踏み台となる公開サーバーを用意して、そこに逆方向トンネルを掘って繋げる作戦で行く。

AmazonECにアカウント作成

この手のサービスは幾つかあるが、やっぱり無料で使えるAmazonECを選択した。
  • Ubuntuの仮想マシンを作成
  • 現在のサブネットからポート22(SSH)にアクセスできるようにセキュリティルールを追加
  • ssh でログイン
    Ubuntuの場合、初期ユーザー名はUbuntu
    Rloginの場合はSSH Identify Keyに仮想マシン作成時に生成したキーファイルを指定
  • ログインできたら早速 /etc/ssh/sshd_confに以下の一行を追加してトンネルを可能にする
    GatewayPorts yes
  • 次にラズパイにキーファイルをコピーしてアクセス権を変更
    > chmod 400 KeyFile.pem
  • キーファイルを使ってトンネルを掘る
    > ssh -i KeyFile.pem -f -N -R :10022:localhost:22 user@hostname
    ここでは仮想マシンの10022ポートをラズパイの22(ssh)ポートに転送する
  • EC2 ManagementConsoleに戻って先ほどの10022ポートをグローバルに通すようにセキュリティルールを変更
  • ポートに10022を指定して仮想マシンにsshをかけると手元のラズパイにログインできる。
設定が確認できたらautosshを利用して起動時に自動で接続させる
> sudo apt-get install autossh

一旦ルートになってSSHで仮想マシンにログイン
> sudu su -
> ssh -i /home/pi/KeyFile.pem user@hostname
※一見無意味な儀式だが、ルートのknown_hostsに登録するために必要となる

/etc/rc.localに以下の行を追加
sleep 10
/usr/bin/autossh -i /home/pi/KeyFile.pem -f -N -R :10022:localhost:22 user@hostname
※起動直後はネットワークの接続が完了していないことがあるので、とりあえず10秒スリープさせる

以降はラズパイを起動すると自動で仮想マシンにトンネルを作成してくれるので、そこからアクセスできるようになる。

スマフォ用のSSHクライアントは色々あるのでご自由に
どちらにしてもスマフォからがっつりコーディングするのは厳しいが、修正や簡単な動作確認用のコードの追加ならなんとか

2015年11月25日水曜日

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

OpenKinect (libfreenect) のインストール

お手軽に使えそうなラズパイ用のアプリを探してみたのだが、さっぱり見つからないので腹を据えて自分でプログラムすることにした。

ラズパイでも使える Kinect 用のAPIとして libfreenect があるので、まずはこれを導入する。
ただし、サンプルプログラムのビルドに難があるようなので(参考)サンプルプログラムをビルドしないように cmake のオプションを指定する必要がある。

> sudo apt-get install libusb-dev
> sudo apt-get install freeglut3-dev ※example をビルドしないなら要らないかも
> git clone https://github.com/OpenKinect/libfreenect
> cd libfreenect
> mkdir build
> cd build
> cmake -L .. -DBUILD_REDIST_PACKAGE=OFF -DBUILD_EXAMPLES=OFF
> make
> sudo make install

※ 参考ページだと CMakeLists.txt を編集しているが、cmake のオプションで指定した方が手っ取り早い。今回は再配布の予定も無いのでついでにそのオプションも追加した。

これでKinect 用のライブラリとドライバがインストールされるので、Kinect を差し直すか、ラズパイを再起動すれば新しいドライバが認識される(はず)。

動作確認その1

動作確認のために先ほどの参考ページにサンプルソースが貼ってあったので、コピペして Make した。
途中、sleep が見つからないと怒られたのでソースに"#include <unistd.h>"を追加したら通った。

ためしに実行してみる。
> sudo env LD_LIBRARRY_PATH=/usr/local/lib ./tiltdemo

libfreenect のビルドとインストールが上手くいっていればこれで Kinect センサーがウィーンと良いながら上下に動いてくれるはず。

毎回環境変数を設定するのも面倒なので/usr/local/lib をパスに追加しておく。
> sudo su - root
> echo /usr/local/lib > /etc/ld.so.conf.d/usr-local.conf
> ldconfig
> exit

動作確認その2

libfreenect の example を眺めてみると幾つか動かせそうなものがあったので先ほど作成したサンプルの Makefile を参考にコンパイルしてみた。

> gcc -o camtest -I/usr/local/include/libfreenect camtest.c -lfreenect
> gcc -o tiltdemo -I/usr/local/include/libfreenect tiltdemo.c -lfreenect -lfreenect_sync

両方とも sudo を付けて動かすと無事に動いてくれた。

なお、'#include "libfreenect.h"' を '#include <libfreenect/libfreenect.h>' に変えると -I... を付けなくてもコンパイルできるようになる。

camtest が Kinect の RGB カメラと Depth センサーのデータを繰り返し読み込むデモのようなので、これをベースに自前のアプリを作っていこうと思う。

2015年11月19日木曜日

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

XBOX360のキネクトが余っていたので、ラズパイと組み合わせて寝ている我が子を見守るための監視カメラを作れないかやってみた。

OSのインストール

ラズパイを触るのは初めてなので、まずはOSをインストールするところから。
  • 公式ページに行って素直にNOOBSをダウンロード
  • Zipファイルを展開
  • 手持ちのMicroSDカードにコピー
    ※公式ページにはフォーマットツールをダウンロードしろとあったが、エクスプローラーから普通にFAT32でフォーマットしたら普通に使えた
  • Raspbianをインストール
かなりお手軽にインストールできた。
いまどきはISO焼き込んだりextでフォーマットしたりしなくて良いのね。

WiFi設定

あまり深く考えずに、ラズパイを購入したときにAmazonでおすすめされたBuffaroのWLI-UC-GNMを一緒に購入
相性が悪ければ最悪ドライバのビルドとか必要かなと思ったが、挿すだけで何もしなくても認識してくれた。ありがとうAmazonさん。
  • WPAの設定
    > sudo su -
    > cp /etc/wpa_supplicant/wpa_supplicant.conf /etc/wpa_supplicant/wpa_supplicant.conf.orig
    > wpa_passphrase SSID PASS_PHRASE >> /etc/wpa_supplicant/wpa_supplicant.conf
    > ifdown wlan0
    > ifup wlan0
    > exit
  • 無線ルーターで固定アドレスに設定
  • Windows用のSSHクライアントとしてRLoginを落としてPCから接続
これで電源だけ繋げば後はリモートで作業できる。

RDP設定

基本はSSHで作業するつもりだが、画像確認などで画面飛ばせた方が便利かと思って一応RDPも設定しておく。

> sudo apt-get install xrdp

PC(Windows)側からはリモートデスクトップで繋げればOK

Kinectを繋ぐ

やるまえに色々調べていたが、結局USBに挿したら何もしなくても認識してくれた。
/dev/video0 が出来ているのを確認。

camoramaで表示

念のため、リモートで配信する前にリモートデスクトップで繋いでローカルできちんと見えるか確認。
> sudo apt-get install camorama
> camorama -d /dev/video0

ストリーミング

  • motionをインストール
      > sudo apt-get install motion
  • /etc/motion/motion.confを編集
      daemon off → on
  • /etc/default/motionを編集
      start_motion_daemon=no → yes
  • 自動起動設定
      update-rc.d motion defaults
で、再起動してPCのブラウザで先ほど設定したIPアドレス:8080にアクセスするとコマ送り状態だがキネクトカメラの画像が見える。
ただ、Chromeからは見えたが、Edgeではファイルの無限ダウンロードになってしまい正常に見えなかった。

一応これでお手軽に最低限監視カメラとしての機能は実現できたが、現状では
  • チルトが出来ない
  • ノーマルカメラでは暗い部屋ではほとんど見えない
と、Kinectの機能を全く生かせていないので、この辺をもうちょっとなんとかしていきたい。

2015年10月15日木曜日

赤城を作る

ハセガワの1/700赤城フルハルモデルをディティールアップパーツと一緒に購入。

武蔵の時のように作りながら記事を書く時間と根性がなかったので完成形だけ。






高い金出してエッチングパーツを買ったけど、結局飛行甲板裏のところまで作り込む根性はなかったので飛行甲板はキット標準の方を利用。
もともとのキットの出来が良いのでエッチングパーツがなくても十分見栄えしそうだけど、やっぱり手すりがあるだけでも近寄って見たときの印象は良い。

やっぱり戦艦に比べて構造がかなり複雑なので、作るのは難しい。
特に後甲板部分は時間と金が腐るほどあるならもう一度やり直したい気分。