如何用 Raspberry Pi 抓到誰偷吃了你的香蕉

這是一個用 Raspberry Pi 架設監視系統的教學文。
禮拜二早上起床的時候,家人傳了一張圖片來:

Image_75433fe.jpg

放在桌上的香蕉居被咬了一個洞!這個洞的大小應該是老鼠,不過我們家從來都沒有老鼠,也找不到任何對外的洞,所以也是有可能是我晚上夢遊去咬了一口。在布置捕鼠陷阱前,有必要先確認一下。找到來源也比布置陷阱抓到老鼠還重要多了。

於是晚上下班回家之後,我馬上開始上網找監視設備。IP Camera 似乎是個不錯的選擇,也可以接上我的 NAS 做儲存和分析。另外因為手邊剛好有一個 Raspberry Pi 3,又剛好有一個相機模組,我一開始就有想到要用,但是前提是要先找到教學讓我可以很輕鬆的架起來。看標題就知道我最後選擇了什麼,先講結論,RPi 作為短期需求還不錯,不用怕買了 IP Camera 就只用這幾天,但是 encoding 效能很差,要順暢頂多只能用到 640 x 480。或是說可能需要特別調整才能有比較好的效能。而且其實 RPi + 相機模組比一般 IP Camera 貴了許多,所以如果要長期使用,還是 IP Camera 會比較好。

其實我原本是想架一個 IP Camera server,把 RPi 當成 IP Camera 來用,串流到 NAS 做儲存和分析,不過搜尋的方向好像不太對,只查到一個叫 Motion 的 open source project (後來發現串流其實要搜尋 RTSP / RTMP 等等的 protocol 名稱才會找到)。因為它文件寫得蠻爛的,我對這領域也不熟,所以我架完測試才發現它沒辦法串流到 NAS,只能直接寫檔和用網頁直播。好在它的 motion detection 還不錯,讓我省了事後分析的功,以速成的角度來看,Motion 應該是最好的方法。所以到這邊,整個方向就變成了用 RPi 包辦整個流程,不使用額外的 server。我幾乎完全參考這篇文章Motion 官方文件就完成了,如果你的應用情境跟我不一樣,也可以去參考一下。我這邊會更注重在一些參數的調整,以及最後做出通知系統。

先說一下我的環境:

  • Raspberry Pi 3 (台幣 1350 元左右購入)
  • Raspberry Pi Camera rev 1.3 (台幣 670 元左右購入)
  • Raspbian Stretch
  • Motion 4.1.1

相機設定

  1. 如果你沒有用過相機,要先啟動。用 sudo raspi-config 或是 GUI,很簡單,應該不用贅述
  2. /etc/modules 裡加入一行字: bcm2835-v4l2
  3. sudo shutdown -r now 或 GUI 重開機

Motion 安裝

如果想要裝跟我不同的版本或在不同環境裝,可以參考官方文件

  1. 開始前最好把所有 package 都更新到最新版
    sudo apt update
    sudo apt upgrade
    
  2. 下載安裝檔
    wget https://github.com/Motion-Project/motion/releases/download/release-4.1.1/pi_stretch_motion_4.1.1-1_armhf.deb
    
  3. 安裝
    sudo dpkg -i pi_stretch_motion_4.1.1-1_armhf.deb
    
  4. 如果在前一步看到有缺 dependency,可以用 sudo apt install -f 補齊

Motion 設定

Motion 的設定檔在 /etc/motion/motion.cof,我把我修改完後的完整設定檔放在這個 gist 裡了,以下我只講我改了什麼。如果有哪個設定看不懂也可以去看官方文件,只是他寫的真的蠻爛的。

  1. daemon on
  2. logfile /var/log/motion/motion.log

    要注意的是,我本來想用 /var/log/motion.log,但直接這樣弄會有權限問題。想改的話請自行研究。

  3. width 640 & height 480

    我一開始想說用 16:9,所以設成 640 x 360,後來才發現用 4:3 才能抓到完整的畫面。這個大小幾乎是能順暢跑的極限了,超過後就很難到達 30 fps。

  4. framerate 30

    我用的這個相機模組極限好像就 30,為了加速和節省空間節省功耗,我覺得 30 fps 是個不錯的數字。

  5. threshold 100

    這是 motion detection 的敏感度,改變量高於這個敏感度就被當成一個 motion,在我們的設定中就是開始錄影或是繼續錄影的指標。因為我是在室內,幾乎沒什麼擾動,所以 threshold 可以設低一點,我也從來沒發現過 false alarm,比我想像中還好。

  6. pre_capture 5 & post_capture 900 & event_gap 0

    這三個要一起講,他們控制了什麼時候要錄影。官方文件寫得超爛,我看了很久都不是很懂,只好直接做實驗。首先要有一個概念,除非做其他設定,否則一個 event 會存成一個檔案。而檔案不一定是連續的時間,有可能錄一錄發現沒 motion 就會停下來,之後發現又有 motion 又會繼續錄,直到 event 結束,這個檔案才會做收尾。motion 和 event 是不同的概念,一個 event 可以包含很多 motion。pre_capture 是觸發 event 前多少秒的影像要存下來,其實我覺得他好像沒有像我想像的那樣運作,總之我沒有深究。post_capture 是發現 motion 之後還要錄多少 frame,每次有新的 motion 就會重新開始計時。event_gap 是錄影停止後,多少秒內沒 motion 才算 event 結束,每次有新錄影就會重新開始計時。這邊有點複雜,舉個例子,預設是 post_capture 0 & event_gap 60,意思是,一旦畫面沒動靜,馬上就會停止錄影,但是 event 不算停止,所以檔案不會收尾。停止錄影後 60 秒內如果發現了新的 motion,那又會繼續開始錄影,黏在同一個檔案的後面。所以預設的設定下,同一個檔案時間會一直跳,每分每秒你都會看到畫面有東西在動。因為這樣很容易讓人產生時間的錯覺 (後面會有例子),而且無法從 log 推斷現在有沒有在錄影中 (為了後面的通知系統),所以我改成 post_capture 900 & event_gap 0。意思就是 motion 產生後的 900 frames (以前面設定的 30 fps 來說,900 frames 至少 30s) 都要錄下來,且一停止錄影,馬上算 event 結束。用白話文來說就是 event 開始到結束我會完整地錄下來,而且一個 motion 之後的 30s 內沒 motion 才算 event 結束。

  7. target_dir /var/log/motion

    不要像裡面被註解掉的預設值一樣用 /tmp,因為每次重開機會被清掉。

  8. stream_maxrate 100

    直播不設 frame rate 上限,怕流量太大可以降低。

  9. stream_localhost off

    這樣才能從外部連到 8081 port 看直播,只想在 local 看的話不用改成 off。

設定完成後,執行 sudo service motion restart。這樣系統就開始跑了!可以從 http://localhost:8081 看到直播畫面。從外部連的話就是把 localhost 改成你的 RPi 的 IP。

用 Slack 做通知系統

既然有 motion detection,有個通知系統也是很合理的。不然會忍不住一直盯著 log 看,也是蠻痛苦的。這種時候,工作中常用的招數就派得上用場了,幾分鐘就可以搞定了。

  1. Slack 開一個 workspace,我特別為了這件事開了一個家庭 Slack,然後逼我家人用 Slack XD
  2. 這裡開啟 incoming webhook integration,會拿到一個 webhook URL,把它記下來
  3. 寫一個 shell script (以下以 motion_slack.sh 為檔名),WEBHOOK_URL 填入你上面拿到的那個 URL,USERNAME 可以依據自己的喜好更改
  4. chmod +x motion_slack.sh 改成可執行檔

  5. 由於是速成,所以我直接用 tmux 來做背景執行,長期使用應該要包成 systemd 或是 supervisor 的 service 比較好。千萬不要 ssh 進去後就直接執行,否則斷線就會關了。不知道 tmux 請自行 google。

    sudo apt install tmux
    tmux
    
  6. ./motion_slack.sh

    執行這個就馬上開始了,一開始會先送一個 ‘motion alert start’ 的訊息,可以檢查看看有沒有正確收到。

攝影機架設

2018-03-01 08.17.07.jpg
因為沒有買專用架子,所以要想辦法把攝影機固定到正確的角度。我發現一個不錯的方法。找一個柱狀物體,例如水壺,杯子等等的。再找一個橡皮擦。因為我是要弄成斜向下的視角,首先把橡皮擦用橡皮筋綁在最上面。接著把排線綁在下面,讓攝影機板子剛好靠在橡皮擦上,這時候就只要上下調整橡皮擦的位置,就可以改變攝影機的角度了。

實測 (老鼠出沒請注意)

實測畫質還算清晰,老鼠大小的物體移動在 3 公尺以上的距離都還偵測得到。由於解析度很低,檔案也很小,1 分鐘的影片大約 2.5MB,32G MicroSD 可以錄超過 200 小時,更何況有 motion detection,大部分時間其實都沒在錄影。

第一天晚上,我把剩下的香蕉放在跟早上被咬的那根一樣的位置,架設監視器等待。早上起來家人又發現香蕉被咬了!馬上把我挖起來看錄影,一開啟第一個檔案馬上就看到了一隻大鼠😮 影片請到這裡看。可以發現出現了我前面講到的,預設
post_capture 0 & event_gap 60 導致的時間跳躍問題。

發現是老鼠之後,我們全家就開始動員起來架設陷阱,家人也開始很緊張的關注 Slack 訊息XD 身為一個 maker,陷阱當然要自己做。查了一陣子之後,發現了很厲害,又很好架設的陷阱:

於是我們也架了一個
2018-03-01 08.17.24.jpg

到現在為止該老鼠總共上去了木頭的頂端三次,但都沒有踩上鋁罐的部分。中間有個小插曲,我發現我們特別買來當誘餌的花生醬,它的紙蓋被老鼠從垃圾桶,拿到冰箱間的縫隙外帶去了…可見誘餌是有用的,有問題的是陷阱本身。
22-20180302015705.jpg

其實仔細想想,如果我們一開始就弄黏鼠板,他大概早就中計了…至於為什麼網路上號稱最強的陷阱,在我們這邊卻沒用,我有觀察出幾個差異:

  • 我們的老鼠太大隻了,可能比較不敢踩上去。
  • 燈太亮,老鼠看得很清楚。我因為這個原因去買了紅外線攝影設備,但我想,到貨的時候大概已經抓到了吧。
  • 比較適合野外大量捕捉。

我其實完全無意抓他,我更希望找到牠從哪裡進來的,所以這幾天也不是毫無收穫,我已經往來源推進兩次了。可疑的地點縮到很小的範圍了,也已經可以防止牠進入我家大部分區域了。只是最可疑的區域堆積了很多東西,一時之間沒辦法清理。只要牠再來一次,我幾乎就可以確定了。結果牠昨天居然沒來QQ

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

w

Connecting to %s

Create a free website or blog at WordPress.com.

Up ↑

%d bloggers like this: