2021年5月29日土曜日

<備忘録>CTU:ムクドリ追払いマシーン

 えー、プロトタイプですが、監視カメラで動きを検知したらドローンを出動させることに成功したので、簡単にメモ書いておきます。


<本当にやりたいこと>
 家の電線にムクドリがとまったら、ドローンを出動させて即座に追い払いたい。

<動機>
 およそ1月〜3月の夕方18時頃、家の電線に大量のムクドリが飛来します(以下、写真)。立つ鳥跡を濁しまくりで、周辺には大量の糞が投下され困っております。昔、東電に鳥害対策をしてもらったが効果はイマイチなようです。

<考えたこと>
 鳥が電線にとまったことを検知したら、ドローンを出動させて即座に追い払うソリューションを考えてみました。名付けて”CTU(Counter Tori Unit:トリ対策ユニット)”。

<構成イメージ>
 ①ムクドリが電線にとまる
 ②カメラで動きを検知する
 ③ドローンに指令を送る
 ④ドローンが浮上しムクドリを威嚇する
 ⑤ムクドリが逃げる

<作り方>
0)デバイスを購入
 ・RaspberryPi 4 4GB  
4)監視カメラとドローンを連動させる
4−1)ドローン起動用のシェルスクリプトを作る(event_start.sh)
・event_start.shという名前のシェルを作る

pi@raspberrypi:~ $ nano event_start.sh 


・シェルの中身はこんな雰囲気

  GNU nano 3.2                                                         event_start.sh                                                                   


#!/bin/bash


#本シェルスクリプトの置いてあるディレクトリに移動(pythonがはくlogが適切に吐き出されるように。)

cd $(dirname $0)


#トークンを記述

token="xxxご自身のtokenを記載xxx"

#LINEにメッセージを送信

curl -X POST -H "Authorization: Bearer ${token}" -F "message = ラズパイからのメッセージstart" https://notify-api.line.me/api/notify


#ドローンを動かす。result.txtに直近実行のlogを吐けるようにしとく。

python /home/pi/Tello-Python/Single_Tello_Test/tello_test.py /home/pi/Tello-Python/Single_Tello_Test/flight_test2.txt 2>&1 | tee /home/pi/result.txt


#motionを一時停止。暴走しないように。後述。

curl http://localhost:8080/0/detection/pause



・control+O(保存)、control+X(終了)でシェルを抜けた後、シェルの実行権限をつける

pi@raspberrypi:~ $ chmod +x event_start.sh 


4−2)モーションのイベント終了時のシェルスクリプトを作る(event_end.sh)
・event_end.shという名前のシェルを作る

pi@raspberrypi:~ $ nano event_end.sh 


・シェルの中身はこんな雰囲気

  GNU nano 3.2                                                          event_end.sh                                                                    


#!/bin/bash

#トークンを記述

token="xxxご自身のtokenを記載xxx"

#LINEにメッセージを送信

curl -X POST -H "Authorization: Bearer ${token}" -F "message = ラズパイからのメッセージend" https://notify-api.line.me/api/notify



・control+O(保存)、control+X(終了)でシェルを抜けた後、シェルの実行権限をつける

pi@raspberrypi:~ $ chmod +x event_end.sh 

 
4−2)motion.confに作ったシェルスクリプト組み込む
・motionの設定ファイルを開く

pi@raspberrypi:~ $ sudo nano /etc/motion/motion.conf


・control+W(検索)で、on_event と検索し設定近くに飛ぶ
・on_event_startとon_event_endの部分にシェルスクリプトを組み込む(以下、黄色)

  GNU nano 3.2                                                    /etc/motion/motion.conf                                                               


# %v = event, %q = frame number, %t = camera id number,

# %D = changed pixels, %N = noise level,

# %i and %J = width and height of motion area,

# %K and %L = X and Y coordinates of motion center

# %C = value defined by text_event

# %f = filename with full path

# %n = number indicating filetype

# Both %f and %n are only defined for on_picture_save,

# on_movie_start and on_movie_end

# Quotation marks round string are allowed.

############################################################


# Do not sound beeps when detecting motion (default: on)

# Note: Motion never beeps when running in daemon mode.

quiet on


# Command to be executed when an event starts. (default: none)

# An event starts at first motion detected after a period of no motion defined by event_gap

#; on_event_start value

on_event_start /home/pi/event_start.sh


# Command to be executed when an event ends after a period of no motion

# (default: none). The period of no motion is defined by option event_gap.

#; on_event_end value

on_event_end /home/pi/event_end.sh


# Command to be executed when a picture (.ppm|.jpg) is saved (default: none)

# To give the filename as an argument to a command append it with %f

; on_picture_save value



4−3)シェルと同じ場所にlogフォルダを作っておく
・python実行後のログが格納されます。

pi@raspberrypi:~ $ mkdir log


5)ドローンの電源を入れて数秒待って、motionを実行する
  監視カメラが動きを検知したら、ドローンが動きはじめる

pi@raspberrypi:~ $ sudo motion


6)ドローン動作終了後、実行ログを確認(動作エラー時の確認用)
・直近のログは直下のresult.txtを確認

pi@raspberrypi:~ $ cat result.txt 


id: 0

command: command

response: ok

start time: 2021-05-29 13:08:52.257217

end_time: 2021-05-29 13:08:52.315474

duration: 0.058257


id: 1

command: takeoff

response: ok

start time: 2021-05-29 13:08:52.315591

end_time: 2021-05-29 13:08:57.701102

duration: 5.385511


id: 2

command: flip b

response: ok

start time: 2021-05-29 13:08:59.703400

end_time: 2021-05-29 13:09:03.325487

duration: 3.622087


id: 3

command: flip f

response: ok

start time: 2021-05-29 13:09:05.327844

end_time: 2021-05-29 13:09:08.921326

duration: 3.593482


id: 4

command: flip l

response: ok

start time: 2021-05-29 13:09:10.923559

end_time: 2021-05-29 13:09:14.479949

duration: 3.55639


id: 5

command: flip r

response: ok

start time: 2021-05-29 13:09:16.482158

end_time: 2021-05-29 13:09:20.089971

duration: 3.607813


id: 6

command: land

response: ok

start time: 2021-05-29 13:09:22.092242

end_time: 2021-05-29 13:09:25.904518

duration: 3.812276



・logフォルダ内のファイルで過去履歴も残っている

pi@raspberrypi:~/log $ ls

'2021-05-23 16:42:56.109620.txt'  '2021-05-23 18:13:02.157302.txt'

'2021-05-23 17:30:33.422215.txt'  '2021-05-23 18:13:52.863802.txt'

'2021-05-23 17:55:20.817894.txt'  '2021-05-23 18:14:50.656453.txt'

'2021-05-23 17:58:11.359075.txt'  '2021-05-29 13:07:00.454953.txt'

'2021-05-23 17:59:02.850064.txt'  '2021-05-29 13:08:52.256574.txt'

'2021-05-23 17:59:53.879250.txt'  '2021-05-30 12:15:42.879107.txt'

'2021-05-23 18:11:40.650572.txt'


<確認・工夫したこと>
・シェルを書く前にコマンドが単体で動くことを確認した。
 当たり前かも知れんが、event_start.shの中身は一気に書けるほど分かっているわけではなく、、コマンド単体で動くかは動作確認した。試行錯誤の連続です。

・ドローン起動のトリガーに、motionのon_event_startを使った。
 最初適当にon_picture_saveにシェルスクリプトを組み込んだところドローンが暴走した(汗)。LINEに写真を送るサンプルがここだったので。on_picture_saveはカメラで写真を保存するタイミングをトリガーとする設定らしい。動きがあると連続して複数枚の写真が連続で撮影され、次々にドローンに指令が入ったため暴走したと思われる。motionの公式ページを見てみると、on_event_startはイベント(動き)がスタートしたタイミングで1度トリガーとなる。一連の動きが終わればon_event_endでクローズ(一連の動き終了)となる。また動きがあればon_event_startが実行される。一旦これを採用してみる。

・ドローンが暴走しないようにドローン起動後にmotion一時中止を入れた。
 on_event_startもどのタイミングで再実行になるかは動き次第(いつon_event_endが実行されるかは動き次第)。ドローン飛行中に再実行されると暴走の危険性があるので、苦肉の策でシェルスクリプトにmotion自体の動きを一時中止するコマンドを入れておいた。
 ドローンが無事着陸した後も連続で動くようにするには、cronで数分後にmotion再開するとか、着陸後に再開コマンド叩くとかすれば良いと思われる(未実装)。

pi@raspberrypi:~ $ curl http://localhost:8080/0/detection/pause   #motion一時停止

pi@raspberrypi:~ $ curl http://localhost:8080/0/detection/start  #motion再開


<今後>
 実はフィールドテストは未実施。ラボで動作確認しただけ。まず3月の構想から約2ヶ月経ち、ターゲットのムクドリが飛来しなくなりました…。またターゲットが現れたとしても、カメラを屋外に設置して常時鳥の動きを観察したり、監視カメラの位置・角度やmotionの設定をチューニングをしたり、お庭でドローンを電柱の高さ約10m位まで上昇させてみたりと、やることは盛り沢山。安心・安全かつ完全自動運転までは、まだまだ道のりが長そうです。動物と自然との戦いはまだまだ続く。。。

<参考>

0 件のコメント:

コメントを投稿