アフィリエイト広告を利用しています

広告

この広告は30日以上更新がないブログに表示されております。
新規記事の投稿を行うことで、非表示にすることが可能です。
posted by fanblog

Jetson Nano - その15: Ubuntu起動時にターミナルで自動起動

○はじめに


システム起動後に毎回、RTSPサーバー、ドアカメラ、Homebridgeなどをマニュアルで実行するのが面倒なので、自動実行することにします。

Linuxで自動起動と言えば、init.dとかsystemdとかが有名ですが、今回最も簡単な方法を使います。

それは・・ Desktop Entry(ショートカット)を作って、autostartに入れるだけ。


○手順
1) メニュー => "startup applications" => "Add"ボタンを押して、適当にファイルを作成。

Screen Shot 2021-06-20 at 0.22.28.png

2) ~/.config/autostart/test.desktopというファイルが作成されるので、必要に応じて ファイル名、Exec、Nameを変更

[Desktop Entry]
Type=Application
Exec=test
Hidden=false
NoDisplay=false
X-GNOME-Autostart-enabled=true
Name[en_US]=test
Name=test
Comment[en_US]=
Comment=


3) Execを以下のように変更するとターミナルが開き、dateコマンドが実行された状態になります。
Exec=gnome-terminal -e "bash -c 'date;$SHELL'"


ここのサイト に詳細が記載されていますが、ターミナルを開きっぱなしにするには、$SHELLを付加するのがミソみたいです。

起動を遅らせたい場合時、sleepなどが手軽に使えるので、便利です。
私はこんな感じで活用しています。

Screen Shot 2021-06-20 at 0.41.40.png


参考までに。


Jetson Nano - その14: Google Photoに写真を自動アップロード

○はじめに
キャプチャした写真なんかを自動でGoogle Photoあたりに置きたいと思いまして・・。

GitHubを探してたら、 便利そうなレポジトリ があったので、使ってみることにしました。


○手順
1) Googleの認証関係のライブラリをインストール。

sudo pip3 install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib



2) GitHubからGoogle PhotoにアクセスできるPython Scriptをダウンロード。
 オリジナルのブランチは、 eshmu/gphotos-upload なのですが、いつものごとく色々手こずりました。

  • 毎回、Web経由でGoogleの認証を取らなければならない。
  • 8080のポート番号が、私の場合、他のプログラムが使っていて使えなかったので変更。


ここに記載されているサンプルコード をベースに、変更したものを ここ に置いておくので、良かったらどうぞ。


3) GoogleからGoogle PhotoのAPIの有効、OAuth 2.0 client IDの取得。
ここ に書いてある通りです。

a) OAuth 2.0 client IDの取得時は、 "デスクトップ (Desktop)"を指定。
b) 作成したら、jsonファイルでダウンロードして、client_id.jsonに必要な部分をコピペ。


4) コードの実行。
python3 upload.py --auth auth_file --album album_test test.jpg


Albumは省略可能ですが、 --Authは何でも良いので指定しておきましょう。
一回目は、必ずブラウザを開いて、パーミッションを聞かれます。
しかし二回目以降からは、--Authで指定したファイルにtoken, refresh tokenが保存されており、その情報を使われるので、聞かれることはないはずです。

問題がなければ、Google Photoに指定した写真がアップロードされていると思います。

ということで、このPythonスクリプトを定期的に呼べば、自動アップロードが可能というわけです。

参考までに。


追記: 2021.3.28
使用し続けると、一週間ぐらいで以下のようなエラーが発生し、TokenがExprieして止まることがわかりました。

google.auth.exceptions.RefreshError: ('invalid_grant: Token has been expired or revoked.'



理由は テスト版 + 外部ユーザ向けでは7日でトークンが切れるようにGoogle側で設定されているからです。

ここ に記載されていますし、海外のサイトで詳細に議論されているサイトを見つけました。

回避策としては、以下の二つですが自分用に使うのであれば 1)が現実かなと思いますが、有料です。。
1) Google Workspace利用者になって、内部ユーザに設定することで回避。
2) アプリを公開してしまう。






Jetson Nano - その13: Jetson Nanoをドアに取り付ける (Part 2)

○はじめに

前回、 Jetson Nano - その12: Jetson Nanoをドアに取り付ける (Part 1) でJetson Nano、カメラを取り付けるドアに取り付けました。

今回は、ドアの開閉センサーを付けたいと思います。
(センサーというほど大層なものではないのですが・・)


○ドアの開閉センサーの取り付け

Jetson Nano - その11: GPIOでドア開閉を検出する (準備) で用意した以下のスイッチを使用します。

IMG_5884.png


とはいえ・・・基板のままドアに付けるわけにもいかないので、困った時のフリスクの箱を使います。

IMG_5889.png


食べ物を粗末にしないようにフリスクを全部食べて空箱をゲットし、ホットボンドで以下のようにスイッチを箱の中に固定します。

IMG_5903.png


以下のように磁石と一緒にドアに設置。
ドアの開閉でGPIOがHigh/Lowになるように位置を決めます。

IMG_5905.png


見た目を気にして、白いビニールテープでケーブルを巻きます。

IMG_5908.png


○仕上げ

最後に壁に貼られているJetson Nanoを隠します。

適当に百均で購入したケースをこんな感じで貼り付けます。
なんかちょっと・・・見た目が残念ですが、試作品なので良しとします。

IMG_5909.png



ドア全体としてはこんな感じです。

IMG_5911.png




○実際に使ってみて気づいた点

以前、 Jetson Nano - その6: 顔認識 + Homebridge-camera-ffmpegでドアモニタもどきの機能にする で使用したプログラムを走らせます。

全体的に、普通にiPhoneからドアの外が見えますし、視界も良好です。

ただ、以下の点が気になり、今後、改善を行う必要があります。

1) カメラが広角レンズでないために、身長の低い子供は死角に入り認識できない。
2) Open CVの顔認識の検出が遅い・・というより、Open CVに画像データを取り込む処理に時間がかかってるように思う。(要調査)


参考までに。






Jetson Nano - その12: Jetson Nanoをドアに取り付ける (Part 1)

○はじめに
ドアカメラ実現のために、今回Jetson Nanoをドアに取り付けるようにします。

○手順

1) Jetson Nanoの取り付ける場所に土台の板を取り付け。
2) 電源をJetson Nanoまで引く。
3) ドアスコープの取り替え、Jetsonの取り付け、カメラの接続。
4) ドアセンサーの取り付け。

以上。

○土台の板を取り付け

今回、ドアのヒンジ(蝶番)の側の壁にJetson Nanoを取り付けることにします。

IMG_5868.jpg


こんな感じに100円均一で買ってきた板を取り付けます。

IMG_5890.png


きっと取り付け方は、色々あると思いますが・・・・

私は、以下の道具で下地にトグラーがさせるか確認し、



問題なければ、ドリルで穴を開けて以下のトグラーを挿し、100円均一で買ってきた板をビス留めしました。

WAKAI 中空壁用 トグラー TB 30本入り TG-TB

新品価格
¥950 から
(2021/3/2 23:00時点)





2) 電源をJetson Nanoの設置場所まで引く。

100円均一で購入した以下の配線カバーを、ノコギリで切り、

IMG_5892.png


以下のようなタッカーでバチバチ止めていきます。

SK11 モール固定用タッカー SMF-1

新品価格
¥1,588 から
(2021/3/2 23:09時点)




こんな感じになります。
IMG_5895.png


ちょうどドアの右側の下駄箱にブレーカがあるので、そこまでひっぱりました。

IMG_5896.png


3) ドアスコープの取り替え、Jetsonの取り付け、カメラの接続。

a) ドアスコープの取り替え

ドアスコープから取り付けますが、その前に既存のドアスコープを取り外します。

こんな感じで溝がついているので、コインなどで溝に合わせて反時計回りに回せばとれます。

IMG_5899.png


不思議な感じですが、ドアスコープを取ると、普通にドアに穴が空いています。

IMG_5900.png


あとは、 Jetson Nano - その10: ドアカメラの取り付け準備 で用意したドアスコープを取り付けます。

ドアの内側から見たらこんな感じ。

IMG_5901.png


外側からみたらこんな感じです。

IMG_5906.png



b) Jetsonの取り付け

こんな感じで強力両面テープで板に接着します。

IMG_5902-b.png


その前にカメラのフレキを以下のような長いケーブルに変更する必要があります。
私が購入した50cmの商品は既に売り切れになっておりますが、以下のものでも使用可能かと思います。





c) カメラの接続。
Jetson Nanoとカメラの接続をしたいのですが、流石にケーブル剥き出しは危険なので・・

以下のカバーを購入し、強力両面テープでドアにはりつけました。



こんな感じです。

IMG_5902 (1).png


ケーブルを接続して、カバーをするとこんな感じです。

IMG_5907.png



次回につづく。



Jetson Nano - その11: GPIOでドア開閉を検出する (準備)

○はじめに

どうせJetson Nanoをドア近くに設置する予定なので、ついでにGPIOを使ってドアの開閉を検出する仕組みを入れておきたいと思います。

順番としては、ハードの工作を行い、ソフトウェアではGPIOのコードをインストールします。


○準備

以下のドアの開閉を検出するスイッチを使います。
昔、DAISOに似た様のが販売されていたのすが、最近、全く見なくなりました。
実は今回、リードスイッチとマグネット以外使わないので、一から作っても良い気がします。

LEDライト マグネットスイッチ式 白色LED

新品価格
¥110 から
(2021/2/28 15:09時点)




そのほかに、ハンダゴテ、1kohmの抵抗とかジャンパーなの道具や小さい部品が必要になります。
今まで持ってない方は以下のようなワンセットになっているのを持っていると何かと便利かもしれません。







○手順(工作)
ちなみにこのスイッチの構造は、 ここに 回路図を含めて詳しく書かれています。

1) 購入したスイッチを分解します。

IMG_5873.png


IMG_5874.png



2) リードスイッチ以外の部品を全て半田を使って外します。

IMG_5878.png



3) 1kOhmの抵抗を追加して、以下の回路図になるようにします。
schma.png


もし、今のジャンパーをそのまま使うなら、以下の作業が必要かと思います。
  a) リードスイッチとGNDのショート。
  b) 1kohmを電源の前に付加する。

私はこんな感じになりました。
元々付いてた線が心許ないので、線を付け直しています。
(緑: 電源、オレンジ: GPIO、白: GND)

IMG_5884.png



実は・・・ 上記に行き着くまでに、色々トラブルがあり時間がかかりました。
簡単に言うと、Jetson Nanoチップとピンヘッダの間にレベルシフタがあり、その内部抵抗が作用して、Highに張り付いたり、Lowに張り付いたりと本当に苦労しました。テスタ接続時だけ問題なく動作したりと・・

1) フォーラムでも同じ問題に直面した人がおり、解決方法も ここ に書かれています。今回、その回路図をそのまま使いました。

2) 同じようにトラブルにあった方が、Jetson Nanoに使用されているレベルシフタについて こちら に書かれています。

3) フォーラムで同様にGPIOが動作しなくて、Jetson Nanoチップ側の内部抵抗の話が ここ に書かれています。今回は関係ないですが。。


○手順(SW - GPIO)
次にソフトウェア側の設定になります。

1) JetsonのGPIOのインストール。
ここ に書いてある通りにマニュアルでインストールしていきます。

グループの作成。
sudo groupadd -f -r gpio
sudo usermod -a -G gpio your_user_name


以下のコマンドでルールのダウンロードをコピー。
git clone https://github.com/NVIDIA/jetson-gpio.git
cd /jetson-gpio
sudo cp lib/python/Jetson/GPIO/99-gpio.rules /etc/udev/rules.d/


システムをリブート。


○動作確認

1) Jetson Nanoにスイッチを接続。
ここにあるピンマップ に従って以下のように接続。

  • 1PIN (3.3V) - 電源
  • 6PIN(GND) - GND
  • 7PIN (gpio216) - GPIO


2) sampleプログラム (simple_input.py)を修正。
sample/simple_input.pyを接続したピンの環境に合う様に修正。
Raspberry Piのピン番号ではわかりにくいので、Jetsonボードのピン番号に修正します。

a) import RPi.GPIO as GPIO => import Jetson.GPIO as GPIO
b) input_pin = 18 => input_pin = 7
c) GPIO.setmode(GPIO.BCM) => GPIO.setmode(GPIO.BOARD)

3) 実行
python3 simple_input.py



○デモ

マグネットを近づけると、こんな感じで反応しているのがわかります。

これをドアに取り付けて、カメラ入力の1フレーム毎にチェックする感じにしようかと思っています。

このサンプルコードは1秒ごとのGPIOの状態を確認する制御ですが、割り込みやイベントでの検出もできるようです。






Jetson Nano - その10: ドアカメラの取り付け準備

○はじめに

ドアカメラを取り付けることを考えた場合、以下の二つの方法があると思います。

1) ドアスコープにカメラを取り付け。
2) 以下のドアモニのようにドアの上に引っ掛ける。

パナソニック モニター付きドアカメラ VS-HC400-W

新品価格
¥23,760 から
(2021/2/18 22:23時点)





そして、 顔認識をさせる場合、顔を正面から撮影するためにドアスコープに取り付けるのが良いという結論に至ったわけです。

試しにドアの内側からRaspi Camera V2でドアスコープを覗くとこんな感じになりした。

IMG_5760.png


視界が狭すぎて、使い物になりません。

ここから導き出した答えは ドアスコープごと取り替える必要があるということです。

つまり、 カメラをドアスコープに組み込み、それをドアに取り付けます



○準備

今回、以下の物を用意して工作しています。
サイズが合わないなどのトラブルがあり、正しい答えが導き出せていません。
あくまでも参考として、また、行うにしても自己責任でお願いします。


1) 改造の土台となるドアスコープ

快適防犯超広角NEWドアスコープ180 シルバー 2064

新品価格
¥1,837 から
(2021/2/18 22:35時点)




2) Raspberry Pi V2 Camera



3) 細身のRaspi V2の延長ケーブル
私は US Amazon で購入しましたが、以下のように一応、日本でも売っています。




○手順
こちらの作業も全て自己責任でお願いします。

1) 入手したドアスコープのレンズをガツン叩き割って取り除きます。
 取り除くとこんな感じになります。

IMG_5794.png


2) Raspi Camera V2のコネクタを外します。
IMG_5841.png


3) 入手した延長ケーブルをドアスコープに通します。
 延長ケーブルには向きがあり、薄くそれぞれの両端に"Board"、”Camera"と書かれています。

IMG_5842.png


Camera側のコネクタをグルグルと丸めて、ドアスコープに通しカメラを取り付けます。

IMG_5845.png


4) Board側もカメラボードに取り付けます。

IMG_5847.png


5) 本体に取り付けて動作するか確認してください。

6) 問題なければ、厚紙でドアスコープ側のカバーを作ります。


○完成

ちょっとカメラが剥き出しになってしまいました。

IMG_5850.png


横からみるとレンズが少しはみ出ています。

IMG_5851.png


当初は、上手く埋め込んで透明アクリル板でカバーをしたかったのですが、どうしても入手したドアスコープとRaspi V2 Cameraのサイズが合わず、こんな感じになってしまいました。。残念です。。


参考までに。


Jetson Nano - その9: GstreamerでRTSPサーバーのビデオをキャプチャ

RTSPサーバーのビデオをキャプチャ

忘れないためのメモになります。

RTSPサーバーを以下のコマンドで起動していると思いますが・・・
./test-launch "nvarguscamerasrc ! video/x-raw(memory:NVMM), width=1280, height=720, framerate=30/1 ! omxh264enc ! queue ! rtph264pay name=pay0 pt=96"



それに対して、受け側は、以下のコマンドでH264で受信して そのままmp4のファイルに落とします。

gst-launch-1.0 rtspsrc location=rtsp://localhost:8554/test ! rtph264depay ! h264parse ! qtmux ! filesink location=test1.mp4 -e


ここで、CTL-Cでこの処理を止める場合、 "-e"オプションが重要とのこと。
ここのサイト に以下のように書いていました。

Add -e to your command line. In that case when you press ctrl-c the pipeline will not just stop but is being properly shut down by sending an EOS signal through the pipeline.

ファイルは生成できるのに再生できなくてハマりました。。



Pythonで実行
Pythonで同じような処理をしたいと思います。

rec_video.shというスクリプトファイルを以下の内容で作成。
( ここのサイト を参考にdateコマンドで日付時間をファイル名に付加しています。)
#!/bin/bash
gst-launch-1.0 rtspsrc location=rtsp://localhost:8554/test ! rtph264depay ! h264parse ! qtmux ! filesink location=video_`date "+%Y%m%d_%H%M_%S"`.mp4 -e


Pythonで以下を実行。
(シグナルの送信に関しては、 ここのサイト を参考。)
import subprocess
import signal
import os
p = subprocess.Popen('./rec_video.sh', shell=True, preexec_fn=os.setsid) <= Rec開始
os.killpg(os.getpgid(p.pid), signal.SIGINT) <= 終了


Jetson Nano - その8: USB WiFiドングルを使う

○今回やること

前回の「 その7: HDMI未接続時の画面設定 」でキーボード、マウス、HDMIが未接続でも普通に立ち上がり、VNC接続できました。

ただ、まだネットワークケーブルが繋がったままなので、USBのWiFIドングルを使って無線にします。

○準備するもの
私は以下の物を購入しました。
Linuxだとドライバが動作したりしてなかったりと面倒なのですが・・。




○手順
今回、いたってシンプルです。

1) USBにWiFiドングルを挿す。

一応、以下のコマンドでWiFiドングルが認識されていたり、アクセスポイントを拾っているか調べられます。
lsusb
nmcli dev wifi


2) VNCを接続して、GUIメニューで[System Settings]->[NetWork]->[Wirelless]でWiFiのアクセスポイントを設定。
以下のコマンドでネットワークの割当状況が見れます。
ifconfig wlan0


3) シャットダウンして、LANケーブルを抜く。

4) 電源ONでSSHが繋がるか確認。


実は・・・
今回使用している2021.1のイメージでは上記のようにあっけなく動作していますが、それ以前にリリースされたイメージでは、ドライバのインストールが必要でした。
ここのフォーラム にもその内容が記載されています。

参考までに。

○結果


こんな感じで電源ケーブル一方のスッキリした形になりました。

IMG_5834.png



Jetson Nano - その7: HDMI未接続時の画面設定

ここのサイト に記載されている通り、HDMIを接続しないと画面が小さくなります。

対処方法も同様に記載されているように

/etc/X11/xorg.confに以下のテキストを追加。

Section "Screen"
Identifier "Default Screen"
Monitor "Configured Monitor"
Device "Default Device"
SubSection "Display"
Depth 24
Virtual 1280 800
EndSubSection
EndSection


再起動しておわりです。
sudo reboot



Jetson Nano - その6: 顔認識 + Homebridge-camera-ffmpegでドアモニタもどきの機能にする

前準備ができたので、今回からは「 Jetson Nano - その2 」で行った 顔認識と、前回試した「 Jetson Nano - その5 」の Homebridge-camera-ffmpegを使った合わせ技をやっていきたいと思います。


○期待する機能

以下のような動作になればドアカメラとして良いかと思います。

1) doorcam.pyが顔認識したら、JPEGファイルを保存し、Homebridge-camera-ffmpegに通知。
2) Homebridge-camera-ffmpegがサムネイル付きでiPhone(iPad)に通知。
(サムネイル付きの通知は、かなり処理時間の制約で難しいと このあたり にかいてありました。)


○ストリームの流れ
ストリームの流れは以下のような構成にしています。
本来、RTSPサーバーなんて立ち上げる必要がないと思いますし、無駄にEncoder/Decoderを使用しています。

video_stream.png



○使用するプログラム
以下の三つを使用します。

1) rtspサーバー - Jetson Nano - その5 で使用
2) homebridge- Jetson Nano - その5 で使用
3) doorcam.py - Jetson Nano - その2 で使用。


○RTSPサーバー
以下のコマンドで起動して終了です。

./test-launch "nvarguscamerasrc ! video/x-raw(memory:NVMM), width=1280, height=720, framerate=30/1 ! omxh264enc ! queue ! rtph264pay name=pay0 pt=96"



○Homebridge
前回と使った config.json にして、以下のコマンドで起動させてください。

homebridge


今回重要なのは、config.jsonで以下の記述が必要になります。
1) stillImageSourceをdoorcam.pyが保存するJPEGファイル"picture_latest.jpg"に指定しています。
2) motion, switchesをtrueにしているのは外部から通知を受けるようにしています。

あと、iPhoneの設定が必要ですので、 このあたり を読んで設定してください。


○doorcam.py
前回と違って今回は入力ソースがRTSサーバーであったり、JPEGファイルを保存したり、homebridgeに通知したり、と色々やらなければならないので、その辺りの変更をする必要があります。

私のdoorcam.pyを ここ に置いておきますので、必要であれば使ってください。

変更箇所
大きな変更・追加内容は以下になります。"[KM"で検索すればわかるようにコメントしています。

1) os, requests, loggingのモジュールを追加しましたので、インストールしてください。
sudo pip3 install os
sudo pip3 install requests
sudo pip3 install logging


2) 入力ソースをrtspサーバーに変更。

3) 顔検出した時にhomebridgeに通知するように追加。
 また、3秒毎にJPEGファイル (picture_latest.jpg)を保存するように変更。
 前のpicture_latest.jpgは履歴としてバックアップするように日時ファイルにリネーム。

4) そうでない時も、2秒毎にpicture_latest.jpgに保存。ただしバックアップしない。

doorcam.pyの起動
以下のコマンドで立ち上げます。

python3 doorcam.py


○デモ

こんな感じで、顔検出をするとiPadにサムネイル付きで通知がきているのがわかるかと思います。





    >> 次へ
×

この広告は30日以上新しい記事の更新がないブログに表示されております。

Build a Mobile Site
スマートフォン版を閲覧 | PC版を閲覧
Share by: