kuroの覚え書き

96の個人的覚え書き

ラズパイでタイムラプスカメラの続き

さて、fswebcamで定期的に写真を撮っていくということで動作も軽く、問題なくどんどん画像が溜まっていくということは確認できた。
しかしやはりカメラとしてはファインダーがないのはちょっとつらい。写真撮ってビューワーで見てカメラ動かして・・・というのは操作性が悪すぎる。

ということでフレーミングを決めるためにguvcviewというGUIな写真・ムービー撮影ツールを試してみた。
Raspberry Pi 3 とウェブカメラ(ロジクール C270) - 今日も微速転進

それ自体撮影や映像の調節などができるアプリなわけだけど、どうもラズパイには荷が重いのか安定しない。
3度に1回は起動に失敗する感じだ。

そこでやはりmotionに戻ってきた。
これは動くものを感知して自動で撮影する監視カメラ的なツールなのだけれど、単純に映像をストリーミングすることもできる汎用性の高いアプリである。使用例もかなりたくさん紹介されているので、困ったときにもいろいろ参考にできる。
Raspberry Piでmotionを動かして、カメラの画像をストリーミング配信する方法 : 試行錯誤な日々

Motion の導入手順 ~ 指定した内容、パラメータの意味について

Raspberry Piセットアップ(motion編)Stretch版 | MacFeeling Blog

キモとしては画像、動画を保存しないように/etc/motion/motion.confに設定するということだろう。

で、せっかくなのでpython+flaskのwebアプリを作ってVNCsshなしで使えるようにしてやろうととりかかったのだが・・・

motionを起動しているとfswebcamが写真を撮る事ができないので、フレーミングが終わったら終了してしまいたいのだが、どうもmotionの起動、終了に癖があるようで意図したとおりに動いてくれない。

かなり悩んでたどり着いた解は
/etc/motion/motion.conf
daemon on

/etc/default/motion
start_motion_daemon=yes

/etc/init.d/motion
デフォルトのまま

起動
sudo service motion start

終了
sudo service motion stop

これをflaskに仕込む。

ただし、この設定ではシステム起動時にmotionも起動してしまう。今回はwebから制御したいので
sudo service motion stopを/etc/rc.localに追加して、一旦起動はするが、すぐに終了しておく。


flaskのアプリをserviceとして起動する設定は
/etc/sysconfig/kcam

FLASK_APP="./cam/views/home.py"
LC_CTYPE="en_US.UTF-8"
_EOF_

を用意し、
/etc/systemd/system/kcam.service

[Unit]
Description=python instance to serve kcam
After=network.target

[Service]
User=pi
Group=pi
EnvironmentFile=/etc/sysconfig/kcam
WorkingDirectory=/home/pi/kcam
ExecStart=/usr/local/bin/flask run --host=192.168.0.10

[Install]
WantedBy=multi-user.target

という感じのファイルを作成。
ユーザpiのホームディレクトリにアプリ本体をおいたとして
ExecStart=/usr/local/bin/flask run --host=192.168.0.10
の部分は自分の環境に合わせるように。

f:id:k-kuro:20190128190801p:plain

ラズパイでタイムラプスカメラ

研究絡みで植物のタイムラプスムービーをつくりたいという話があったので、それならWEBカメラとラズパイでちょちょいでしょ、ということになってやってみた。

まずは参考にしたサイトから
RaspberryPiとUSBWebカメラでタイムラプス | Foolean – 備忘録風雑記ブログ
ラズパイでタイムラプス撮影 - Qiita
このへん。

カメラは手持ちにあったUSBカメラを使用。
https://www.amazon.co.jp/gp/product/B008AO4KXG/ref=oh_aui_detailpage_o01_s00?ie=UTF8&psc=1
3年ほど前に買ったカメラ。

Raspberry Piは3+を使用。
OSはraspbian

使用ソフトは

$ sudo apt-get install fswebcam libav-tools -y

でインストール。

USBカメラを差したら

$ fswebcam -F 10 ./tmp.jpg

これで画像が撮れることを確認。
ちなみにfswebcamのオプションは

-r 1920x1080 解像度
-d 5 ディレイ(カメラに露出やフォーカスの調節を自動でさせるための時間を与える)
-F 10
--jpeg 85 (JPEGで85%画質で撮るとき)
--line-colour '#FF000000' --banner-colour '#FF000000'  タイムスタンプなどの文字色など

ほかにもあると思う。

今回は

#!/bin/bash
FILENAME=`date +%Y%m%d%H%M%S`
fswebcam -r 1280x720 --line-colour '#FF000000' --banner-colour '#FF000000' -F 1$

こんな感じのスクリプトを書いてcamera.shとした。

これをcronで定時実行もしくは間隔を決めて実行すれば画像がどんどん溜まっていく。

$ crontab -e
00 * * * * * /home/pi/camera.sh

こうすれば毎時0分に定時撮影となる。

*/10 * * * * /home/pi/camera.sh

こうしておけば10分間隔で撮れる。

ある程度画像が溜まったらパラパラ漫画の要領でムービーに仕立てる。
今回は

#!/bin/sh

find ./img/ -name '*.jpg' | sort -n | awk 'BEGIN{ a=0 }{ printf "mv \"%s\" ./img/%05d.jpg\n", $0,a++}' | bash
avconv -y -f image2 -r 10 -i ./img/%05d.jpg -aspect 16:9 -s '1280x720' ./img/output.mp4

こういうスクリプトを作ってみた。
名前が連番でないといかんらしいので、名前を変更し、それをoutput.mp4という名前のムービーにする。

特に困ったこともなくあっけなく完成。


しいていうなら、このままではフレーミングを決めるために何度もスクリプトを実行して撮ってみて、画像確認してまた撮って・・・と繰り返さなければならない点かな。

これはmotionもインストールしておいてストリーミングで画像を見れるようにしておくのが良いかもしれない。
k-kuro.hatenadiary.jp


RaspberryPiでWebカメラを使ってストリーミング動画を配信させてみた - 水菜巻のメモ的ななにか。
こっちのほうがお手軽かな。

最後にこのタイムラプスカメラシステムをいくつもクローンで作りたいので
SDカードの複製(for Mac) | Make.
SDカードのまるごとコピー

Pythonの環境を一旦リセットする

どうもややこしくていけないのだが、systemに入っているpython は2.6とかなりふるい目。なので自前でpython3を入れて使いたいわけだが
バージョンの使い分けにpyenvというものがある。更にはvirtualenvというものもある。
しかしよく考えると、バージョンを細かく使い分けるようなことはしていないので、単純にbrewで最新のpython3を入れてしまって、それだけ使うようにしても何ら困ることはないということに今更ながら気づく。

どうやらpyenvで入れたpython3.6.1とbrewで入れた3.7.1がうまく折り合いをつけてくれずにトラブっていたらしく、一旦全部クリアしてbrewだけにしたらすんなりとinternal server errorは解決した。

うん、pyenvやめよ。

あとはflaskのmanage.pyをきちんとcgi経由で動くようにしないとな。

value serverでレンタルサーバー

某大学内でサーバを建ててあれこれやっているが、外部からアクセスできるようには、なかなかさせてもらえないので、学外にサーバを建てることにした。
といっても、物理サーバを管理することもできないので、レンタルサーバお茶を濁す
とにかく料金が安く、sshでそこそこ自由度の高いvalue serverに白羽の矢を立て、早速お試し開始。

とにかくpython3が走らないとお話にならないのだが、一応いんすとーるされてはいるようだ。
でもpip3が使えなくてライブラリが入れられないので、pyenv-virtualenvを入れよう・・・なんかドツボにハマっていきそうな予感。

$ git clone https://github.com/yyuu/pyenv.git ~/.pyenv
Initialized empty Git repository in /virtual/hoge/.pyenv/.git/
remote: Enumerating objects: 63, done.
remote: Counting objects: 100% (63/63), done.
remote: Compressing objects: 100% (37/37), done.
remote: Total 16547 (delta 25), reused 46 (delta 20), pack-reused 16484
Receiving objects: 100% (16547/16547), 3.21 MiB | 2.81 MiB/s, done.
Resolving deltas: 100% (11217/11217), done.
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(pyenv init -)"' >> ~/.bashrc
$ source .bashrc
$ pyenv --version
pyenv 1.2.8-5-gec9fb54
$ pyenv install 3.6.1
Downloading Python-3.6.1.tar.xz...
-> https://www.python.org/ftp/python/3.6.1/Python-3.6.1.tar.xz
Installing Python-3.6.1...
Installed Python-3.6.1 to /virtual/hoge/.pyenv/versions/3.6.1

$ pyenv global 3.6.1
$ pyenv rehash
$ python
Python 3.6.1 (default, Nov 26 2018, 19:58:29) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-18)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>

ここまではまあなんとか。

続きを読む

redmineのインストールでつまづく

redmineをインストールしようとして
Redmineが依存するgemパッケージをインストールのため
# bundle install --without development test --path vendor/bundle
としようとすると、途中で
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.
というエラーが出て、最終的に

An error occurred while installing rmagick (2.16.0), and Bundler cannot continue.
Make sure that `gem install rmagick -v '2.16.0' --source 'https://rubygems.org/'` succeeds
before bundling.
というエラーで止まってしまう。
この原因はrmagick(2.16.0)がimagemagick (version7)に対応していないためで、imagemagickをversion6にダウンしなければならない模様。

rmagickのインストールにハマった - Qiita
ここで対処法が書かれているがMacのHomebrewでの話。
Linuxbrewだと
$ cd /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/Formula/
の部分を
$ cd /home/linuxbrew/.linuxbrew/Homebrew/Library/Taps/homebrew/homebrew-core/Formula/
と読み替えないとならない。

とまあ、うまくインストールできず今の所頓挫中・・・

NETGEAR GS716Tv3でVLAN その2 自作LANケーブルを疑え

とりあえずの設定ができて2つのVLANにclusterとLANを分離したのだが、なにやら挙動が安定しない。
LANから外のウェブにアクセスしようとするとどういうわけかpublicではなくinternalの方から接続しようとして
つながらなかったり、逆にネットにはつながるのに外からアクセスできなかったり。

もとのアンマネージスイッチと無線LAN 子機などをとっかえひっかえ入れ替えてみるも全然再現しないし。

途方に暮れかけたところで、ふとケーブルを自作カテ6からカテ5Eの既成品に戻してみたところ、何事もなかったようにつながるじゃないの。

NETGEAR GS716Tv3でVLAN

なかなか設定に苦労した。
最終的に一番参考になったサイトは
beginners-network.com

若干機種が違うのでメニュー項目が違っているのだが

まず
Switching>VLAN>Advanced>VLAN Configuration
で、分けたい分のポートのためのVLANを作る。2つに分けたいならとりあえず1個はDefaultをそのまま使っておくのが良さそう。
VLAN IDに4、VLAN Nameは適当にわかるような名前をつけて右下のADDボタンを押す。
次は
Switching>VLAN>Advanced>VLAN Membership
で、VLAN IDに4を選び、Unit1を開いて分けたいポートをUにする。Tは違う。
VLAN ID1も開いて、4で選んだポートのUを消す。
最後に
Switching>VLAN>Advanced>Port PVID Configuration
で、VLAN ID=4に変えたInterfaceにチェックを入れてConfigured PVIDを4に、VLAN Memberも4に書き換えてAPPLY

以上でとりあえずVLANを2つに分けてcluster側と、LAN側を分離することができた。