Quantcast
Channel: CAVEDU教育團隊技術部落格
Viewing all 678 articles
Browse latest View live

MIT App Inventor 視覺辨識範例 –路牌辨識機器人

$
0
0
作者/攝影  曾吉弘
時間   2小時
成本
  •   Android手機 (>8000)
  •   樂高EV3機器人 (約12000)
難度   7 (難度10)
材料表
  • Android手機
  • 樂高EV3機器人

延續先前的水果分類器教學,今天來和機器人結合吧。一樣使用 MIT App Inventor 的 Personal Image Classifier 網站來訓練以下三種路牌。請實際印出來並放在之後機器人要執行的環境中來行走,這樣效果會比較好。最後把訓練好的 .model 檔上傳到您的 App Inventor 專案中。離線視覺辨識app 就完成囉!

訓練神經網路

請參考本文  https://blog.cavedu.com/2019/08/27/app-inventor-image-classifier

 

樂高機器人

組裝範例,基本上就是雙輪器人搭配一個可以放手機的地方就可以囉。其實按照這樣的架構,除了樂高機器人以外,其他任何支援藍牙或 W-Fi的機器人平台 (Arduino / 7697 / microbit) 都可以依樣畫葫蘆。但有了EV3元件 (CAVEDU寫的喔) 就不需要寫 EV3 端的程式,可以節省很多時間了!

App Inventor結合其他開發版的文章請參考:http://www.appinventor.tw/iot

 

App Inventor端

請先與EV3配對完成,這樣才能在app 的 listpicker 中找到它。

Designer頁面設定

請由MIT App Inventor 網站下載 personalImageClassifier擴充檔,或由此下載 .aia原始檔。再匯入您的 App Inventor 專案即可。請注意,PIC元件無法像 Sound元件一樣,無法透過程式指令在執行過程中修改所使用的 model (Sound元件可以隨時修改其 Source 來源檔案)

本專案元件說明如下,您之後可以根據個人需要來修改介面配置:

  • personalImageClassifier 元件(本文後簡稱PIC元件),別忘了匯入喔
  • 一個 Listpicker 來選取已配對的藍牙裝置 (EV3)
  • 一個 中斷藍牙連線的按鈕
  • 一個 WebViewer 用來即時預覽相機的畫面
  • 切換前後鏡頭的按鈕 (ButtonSwitch)
  • 顯示結果用的標籤 (Label_Result)
  • EV3Motor:控制馬達,請設定馬達為 BC
  • EV3Sound:使EV3主機發出聲音

Blocks

STEP1   PIC元件相關設定

當PIC元件準備完成之後,把在PIC網站上訓練好的模型的 ModelLabel 顯示在Label 上。可以先檢查有沒有匯入錯的辨識模型檔。

STEP2 

如果PIC元件發生錯誤的話,把 errorCode 顯示出來

STEP3  EV3的藍牙連線設定

按下 ListPicker,選擇已配對好的EV3,連線成功的話就會讓 Clock 的 timer 啟動來辨識物體。斷線的則一如往常簡單,呼叫 BluetoothClient 的 Disconnect 指令就好。

EP4  連續辨識影像

水果辨識器的做法是按下按鈕才辨識一次,但在此希望機器人能連續辨識來做出對應的粽剁,所以改用 Clock。在此設定 clock 的 Timerinterval 為100,請根據實際狀況來調整這個參數,太快太慢都要拿捏一下。

STEP4  取得辨識結果與信心指數並控制機器人

在PIC元件的 GotClassification事件中,所回傳的 result 是 (類別名稱, 信心指數) 的清單,例如 (apple, 0.763)。信心指數原為 0~1之間的小數,在此 x 100 轉換為百分比。

在此先檢查信心指數 (value) 是否大於60,並進一步根據辨識結果來執行對應的動作。EV3motor 的 RotateSyncIndefinetly 可設定 power (馬達轉速) 與 turnRatio (轉彎百分比)turnRatio  設為 0 代表前進不轉彎,> 0 則代表右轉,一路到 100 就會變成原地右轉,但轉彎的效果會根據您機器人的架構而定。 < 0 則代表左轉。 如果您發現 turnRatio > 0 機器人卻左轉的話,請把左右馬達的電線對調即可。

注意,在此使用了 local variable 區域變數 (class, value),如果您覺得不太習慣的話,改用全域變數也可以。

執行畫面

開啟程式會直接開啟相機鏡頭並顯示於app中的 WebViewer元件,隨後會看到 ModelLabel (模型可分辨的影像類別)。點選 Listpicker 來選取您的EV3 (利如下圖中的 00:16:53:49:28:47),連線成功之後機器人就會開始移動。沒看到路牌就會前進,如果看到路牌就會執行對應的左轉、右轉與停止等動作,一起來玩玩看吧!

 

相關連結:

 


【Raspberry Pi 4 x Qt Creator x 按鈕的吶喊 – 01】設計Raspberry Pi 4的人機互動介面

$
0
0

使用拖拉放三步驟完成Raspberry Pi 4的人機互動介面設計,讓你的作品不只是Prototype!

當你用Raspberry Pi做了一個概念很棒的Prototype,不論是自己玩賞用,還是要做成產品,都需要有對使用者友善且好看的人機互動介面。本文中將教大家如何在Raspberry Pi 4上安裝Qt Creator,並製作你的第一個人機互動介面。

本文大綱

  • 在Raspberry Pi4上安裝Qt Creator
  • 設定Qt Creator
  • 使用Qt Creator製作第一個人機互動介面
  • 延伸參考資料
作者/攝影   蔡雨錡
時間   3小時
難度   ★★★☆☆
材料表

在Raspberry Pi4上安裝Qt Creator

Step 1. 先打開terminal更新APT(Advanced Packaging Tools)軟體套件管理器,並重新啟動Raspberry Pi 4。

sudo apt-get update
sudo apt-get upgrade
sudo reboot

Step 2. 接著輸入以下指令安裝cmake、Qt5、Qt Creator

sudo apt-get install cmake
sudo apt-get install -y qt5-default qtcreator

Step 3. 安裝完後就可以在「Programming/軟體開發」裡看到安裝好的Qt系列

設定Qt Creator

Step 4. 點選表單中的Qt Creator後,會看到以下畫面:

Step 5. 設定編譯工具,點選主選單中的「Tools/工具」,選擇最下面「Options/選項」。

Step 6. 跳出以下畫面後,選擇左側的「Kits」

Step .7 點選「Desktop(default)/桌面(default)」後,要來設定GCC跟G++編譯器位置。

在「Compiler」後的「C」以及「C++」選擇列表中的第一個編譯器。

Step 8. 設定完如下圖,Device記得設定為Local PC,系統會自動去抓你剛剛安裝的cmake。

Step 9. 如果想要添加其他新編譯器以供選擇,可以到「Compilers」頁面點選「Add」添加新編譯器名稱及路徑,如下圖所示。想當年舊版Qt Creator都要自己先完成這步驟,才能去設定Kits。

Step 10. 完成上述步驟後,就可以點選右下角的「Apply」、「OK」即設定完成並離開設定畫面。

使用Qt Creator製作第一個人機互動介面

完成設定後,要來製作一個簡單的人機互動介面測試設定是不是成功讓程式能正常運作。本範例會帶大家設計一個會跟你互動的按鈕,讓使用者點選按鈕,按鈕上會顯示不一樣的文字內容。

Step 11. 首先,點選畫面左上方的「Welcome」,再點選「Projects」中的「New Project」。

Step 12. 選單中有不同種類的Qt應用程式可以選,我們要選擇第一個「Qt Widgets Application」來自行設定使用者介面。下方的「Qt Console Application」會沒有使用者介面可以設定,想要玩玩看「Quick」系列也可以之後嘗試看看。

Step 13. 選完專案的種類,就要幫專案取名以及選擇儲存專案的位置,本範例中名稱取為「Click_Me」,路徑為預設值。

Step 14. 由於這個專案是測試環境用,接下來的三個步驟都套用預設值,點選「Next」、「Next」、「Finish」。

到這個步驟的完整畫面如下圖。

Step 15. 左手邊的欄位中就是整個專案的架構以及檔案,基礎的架構會包含「Click_Me.pro」、「mainwindow.h」、「main.cpp」、「mainwindow.cpp」、「mainwindow.ui」。如果前面你的「Class name」沒有選用預設值,mainwindow這串文字會是你的「Class name」。

Step 16. 接下來試試看可不可以成功執行Qt Creator提供的預設程式。點選左手邊的「Projects」,取消勾選「General」底下的「Shadow build」。

Step 17. 點選主選單中的「Build」中的「Run qmake」,執行完畢後點選同一個選單中的「Build All」。

Step 18. 完成build之後,點選左下角的電腦圖示,選擇「Release」。接著點選下方的綠色箭頭執行。

畫面中跳出一個空蕩蕩的視窗就代表環境設置成功了!

上述的環境測試執行若失敗,可以試試看以下解法:

點選主選單中的「Help」最下方的「About Plugins」。

取消勾選Clang的任何plugins,再重新開啟Qt Creator就可以了!

Step 19. 確認環境設定沒問題後,就是最令人期待的設計介面環節!將剛剛產生的視窗關閉後,我們點選「Forms」中的「mainwindow.ui」進入以下畫面。分區細節如圖。

Step 20. 我們將從「元件區」中拖曳一個「Push Button」到「設計介面區」。如果找不到元件,可以在「元件區」的最上方「Filter」欄位輸入關鍵字查詢。拖曳後,調整元件大小及位置如下圖,並將文字改成「Click Me」。

Step 21. 對著按鈕點右鍵,選擇「Go to slot…」後,會出現「Select signal」的頁面,我們選擇「clicked()」並點選「OK」。

Step 22. 畫面會自動跳到「mainwindow.cpp」的頁面並幫你新增一個「on_pushButton_clicked」區塊。

Step 23. 請在此區塊的大括號之間加入以下程式。讓按鈕在被按的時候用文字吶喊,再被點選第二次時又再度恢復正常。你也可以改成你喜歡的文字內容。

Step 24. 寫完上述程式,就可以點選綠色箭頭執行「Run」,並看到以下畫面。

來體驗按鈕的吶喊吧!

對更多Qt Creator的撰寫程式細節有興趣,想體驗更多Qt Creator魅力的你,請持續關注Raspberry Pi 4 + Qt Creator的系列文章!

 

延伸參考資料

Qt Creator 官方論壇:https://forum.qt.io/

[邁向AI之前哨站] 收集LinkIt 7697數據至Google 表單

$
0
0

源起是因為依照某次而且隔天就要辦研習營的老師許願池,老師的需求是否可以將LinkIt7697感測器的數據上傳至Google表單。後來同事就傳給我花蓮曾希哲老師做成功的影片,解法是,利用IFTTT的平台來解,這樣就可以跳過惱人的Google sheet API,因為有一堆步驟要申請權杖和金鑰,而且API還會更新…,重點是IFTTT設定還不用寫程式!

所以IFTTT太強大了,真是感謝IFTTT,讚嘆IFTTT!

作者/攝影   許鈺莨
時間   一小時內
難度   ★★
材料表

IFTTT是甚麼呢?這是一種「網路自動連結」服務,如字面上意思,「如果(IF)  下雨(This) 則(Then)  通知我回家收衣服(That)」,簡單來說 “如果下雨這件事發生,就會收到通知要回去收衣服”的一種網路服務。在這個服務裡可以有上百個平台的可以串接,我最常用的是當有影片YOUTUBER上傳最新的影片時,我的Line就會接收到通知。

嗯,我喜歡看『木曜X超玩』,我剛好用這舉例,沒業配喔!

我將Youtube和Line串在一起,這作法稱為「菜單」或稱「配方(Recipe)」,有了上百種服務,你就可以自訂自己的配方喔。

回歸本專題,如果某個條件觸發後,感測器數值由LinkIt7697接上溫濕度模組上傳至IFTTT,中間就需要靠Webhook來做連接 。

現在就開始手把手教學,分為幾個步驟:

Step1. IFTTT 網站註冊

Step2. 申請Webhook

Step3. 和Google 表單連動

Step4. Webhook和Google 表單連動測試

Step5. 撰寫LinkIt 7697 程式

Step6. LinkIt 7697和溫溼度感測器接線

 

Step1. 到IFTTT註冊:

請到網址: https://ifttt.com/ 註冊,可以自行設定Email作為帳號,亦可以用Google或FB申請登入。

Step2. 申請Webhook:

如已經註冊完畢,則按頭像後再按「Create」。

選「This」服務。

寫入「Webhook」,則有Webhook的選項出現。

點選觸發方式,也只有一個選項可以選

接著要自己定義事件名稱,可以任意填寫,但是要記住,因為後面的步驟會用到此名稱,最後點選「Create triggrer」。

Step3. 和Google 表單連動:

如果Webhook設定好,會有圖示出現。接著點選「That」。

在搜尋欄寫入「googlesheet」,並點選其圖示。

再來會出現「Add row to spreadsheet」的選項,並點選。

接下來要填入Google 表單的一些參數。

第一欄位為google 表單的標題名稱,可以任意填寫,也可以和Event Name不同。第二欄位為上傳至Google 表單的數值欄位,LinkIt 7697會透過此欄位來更新數值,分別為時間戳記,也就是上傳數值至Google 表單的時間、事件名稱、數值1、數值2、數值3。

這欄位我是預設,不更動,最後點選「Create action」。

按下「Finish」,即兩個平台服務串接設定成功,再來做連動測試。

Step4. Webhook和Google 表單連動測試:

這個是接LinkIt 7697之前的測試,作法是開啟Webhook的網站上輸入Event Name和任意數值,測試成功時會在雲端裡自動建立名為IFTTT的資料夾,而該資料夾內有7697_to_googlesheet表單,所以要先開啟Webhook資訊網站(紅框處)。

開啟後,會看見有使用過Webhook的所有服務,再來在左上角有「Documentation」後按下。

接下來最重要的一點,就是測試!  依照下圖指示,第1點就是Webhook的金鑰,第2點填入Event Name,跟之前建立Webhook的trigger 名稱一致,之後程式內也會用到,第3點可任意寫入,如英文或數字,最後第4點按下測試。

按下測試後,會在「我的雲端硬碟」中看見「IFTTT」的資料夾,資料夾中會新增「7697_to_googlesheet」名稱的表單,就表示測試已經連動成功,最後一步就是寫LinkIt 7697的IFTTT程式。

Step 5. 撰寫LinkIt 7697 程式:

這邊的程式撰寫很簡單,為了保證程式觸發,所以寫只要溫度大於0,並每2秒上傳一次到IFTTT就好。

Step 6. LinkIt 7697和溫溼度感測器接線:

將溫溼度感測器DHT11接至擴充版D2腳位,接線圖出處: https://cavedu.gitbook.io/cavedu/rk001/module_ui/linkit7697_dht11

如果成功,會像下圖一樣。A欄位為時間戳記,B欄位為Event Name,這兩個欄位都是寫在Webhook網頁的預設值,C、D、E欄位為LinIt 7697 WIFI的IP位址和感測器數值。

 

相關文章:

LinkIt 7697套件包教學: https://cavedu.gitbook.io/cavedu/rk001

IFTTT 教學文章: https://blog.cavedu.com/?s=IFTTT

Jetson Nano 遠端桌面設定 (Windows, Mac OSX)

$
0
0

不想拿著螢幕、滑鼠、鍵盤跟著機器跑時,就需要遠端桌面的協助。這篇文章將教大家如何在Jetson Nano上安裝遠端桌面套件、並設定遠端桌面在開機時直接啟用。

使用嵌入式開發板時,常常會有檢視影像成果或是有操作瀏覽器頁面等需求,有時候手邊不一定有螢幕、滑鼠、鍵盤,相較於使用ssh這種無介面的遠端方式,視覺化的遠端桌面連線在這種情況下就是不錯的選擇。本文將介紹常見的兩種遠端桌面連線Jetson Nano的方式。

本文大綱

  • ssh 遠端連線
  • 在Jetson Nano上設定Vino遠端桌面
  • 在Jetson Nano上設定xrdp遠端桌面
作者/攝影   蔡雨錡
時間    1小時
難度   ★★☆☆☆
材料表
  • Jetson Nano x 1(商城連結)
  • SD card x 1
  • 電源供應器 x 1
  • 無線網卡 x 1

操作過程中,你可以選擇使用ssh遠端連線至Jetson Nano按步驟輸入指令,也可以將Jetson Nano接上螢幕、滑鼠、鍵盤來開啟terminal做設定。

 ssh 遠端連線

 Windows用戶:下載putty,選擇ssh連線方式,並輸入Jetson Nano的ip address

Mac用戶:在terminal輸入ssh 指令:ssh JetsonNano的帳號@JetsonNano的ip address

 在Jetson Nano上設定Vino遠端桌面

參考資料:https://wiki.archlinux.org/index.php/Vino

Vino是一種VNC(Virtual Network Computing) 伺服器,能協助你遠端連線至你的真實桌面。它是GNOME桌面環境的預設元件。以下步驟為安裝、設定、測試Vino server的教學。

Step 1. 安裝VINO – VNC Server

sudo apt update
sudo apt install vino

Step 2 . 使用gsettings來調整GNOME桌面設定,將Vino的prompt-enabled(啟用提示)以及require-encryption(需要加密)都設為false,讓VNC遠端連線不需要經過認證階段。

gsettings set org.gnome.Vino prompt-enabled false
gsettings set org.gnome.Vino require-encryption false

Step 3. 將你正在用的網路卡加入VINO服務

nmcli connection show

會顯示網路卡的UUID,把它填入下方的單引號’ ‘之間

dconf write /org/gnome/settings-daemon/plugins/sharing/vino-server/enabled-connections "['填入這裏']"
export DISPLAY=:0

Step 4. 下指令測試是否能使用

電腦端下載VNC Viewer作為遠端桌面的Client端
下載網址:https://www.realvnc.com/en/connect/download/viewer/

在terminal 輸入ifconfig取得jetson nano的ip address,下圖中ip address為192.168.12.218

/usr/lib/vino/vino-server

上述指令執行後,命令視窗(terminal)不要關閉,用VNC Viewer輸入剛取得的ip address:5900登入看看,若沒問題出現如下圖的畫面,則可執行下一步驟將該指令加入開機選項。

Step 5. 將指令加入開機選項,讓VNC server服務可以在Jetson Nano開機時啟動

搜尋startup application preferences,點選Add之後,新增項目細節如圖所示,重新開機即可遠端連線。

另一種方法:

cd ~/.config
mkdir autostart
sudo nano ~/.config/autostart/vino-server.desktop

輸入以下內容(如果不想要設定這麼多,最重要的是一定要有[Desktop Entry]、Type、Exec、Name、X-GNOME-Autostart-enabled、NoDisplay這幾行):

Step 6. 調整遠端時看到的解析度

sudo nano /etc/X11/xorg.conf

在最下面加上以下內容
1280  800為解析度設定,可以自行按喜好調整

在Jetson Nano上設定xrdp遠端桌面

Step 1. 安裝tightvncserver跟xrdp套件,重啟Jetson Nano

sudo apt-get install tightvncserver xrdp
sudo reboot

Step 2. 安裝xubuntu-desktop

sudo apt-get install xubuntu-desktop

Step 3. 將xfce4-session寫入.xsession中

echo xfce4-session >~/.xsession

Step 4. 重啟xrdp服務

sudo service xrdp restart

Step 5. 遠端連線

Windows 用戶可以搜尋遠端桌面,在電腦欄位輸入ip address,範例中ip address一樣為192.168.12.218。也可以在這一步的使用者名稱欄位輸入帳號密碼。接著點選[連線]->[是]。

看到以下畫面後,輸入Jetson Nano的帳號密碼就可以登入囉!

Mac用戶需要到App Store下載Microsoft Remote Desktop 10,下載開啟後看到的畫面如下圖右半邊。

點選[Add PC]後,看到以下畫面,在PC name欄位填入ip address。並於User account欄位點選[Add User Account]

看到以下畫面後,輸入Jetson Nano的使用者帳號密碼後點選[Add]->[Add]。

設定完後,PCs下面會出現下方圖示,點選圖示遠端Jetson Nano。

成功連線後就會看到以下畫面。

vino的優點是使用者友善。xrdp的優點是可以多人同時連線,而且速度比較快。按照教學實測後再決定哪種遠端桌面方式比較適合自己吧~

[翻譯] 重新定義電腦視覺:Intel RealSense 光學雷達攝影機

$
0
0

Intel RealSense 光學雷達攝影機 L515 是市面上最小且能效最好的高解析度光學雷達,特色在於超高精度的深度偵測,使其特別適合室內用途,包含醫療、零售、物流、機器人與量測等。Intel RealSense 光學雷達攝影機 L515 上市日期為 2019 / 12 /15 (資料來源:Intel Corporation)

本文感謝 Intel 公司授權後翻譯,請參考原文

譯者   曾吉弘

有什麼新東西:今天(12/19),Intel 推出了 Intel® RealSense™ 光學雷達攝影機 L515,市面上最小且能效最好的高解析度光學雷達,每秒可擷取數百萬點的深度點。以自家專利技術所設計 ,L515 提供了一個光學雷達與智慧裝置的全新整合方式,以3D的方式來感知這個世界。L515 針對各樣需要視覺能力的產品提供了超高效能與準到毫米的精確度。

 Intel RealSense 技術讓各種機器與裝置能以3D方式來感知周遭世界,可用於開發產品 that enrich people’s lives。有了 L515 深度攝影機,我們非常期待能把這項高解低度光學雷達功能帶入先前無法享受這項科技的市場。

–Sagi BenMoshe, corporate vice president, Intel RealSense Group

 為什麼它很重要:Intel RealSense 團隊設計了一款革命性的固態光學雷達來搭配自家的深度攝影機家族產品。Intel RealSense 光學雷達攝影機 L515 的超高深度偵測品質、低功耗,加上每秒可產生 2千3百萬的精確深度點,種種功能讓它非常適合各種情境的應用。

 物流產業就是 L515 的高解析度與全場景感知功能所瞄準的市場之一。希望導入庫存管理自動化的公司希望能受益於精確的容積量測,讓業主可隨時掌握最準確的庫存狀態。L515 的其它應用還包括 3D掃描、健康照護、零售、機器人等等。

 它如何運作:Light detection and ranging (光偵測與測距,lidar) 是一種遠距感測技術,使用雷射光與接收器來偵測與物體或目標之間的距離。Intel RealSense 光學雷達技術的領先在於採用了新一代的微機電系統來掃描場景。由於本方法可降低雷射脈衝功率,因而催生了 L515 這款市面上最小、能效最高的高解析度光學雷達。

 它有何不同:談到了精確度與深度邊緣偵測效果的話,L515 可說是獨樹一格,除了能在規格範圍(0.25 ~ 9公尺)中穩定進行高精確度偵測之外,它每秒還能產生超過2千3百萬個深度偵測點,解析度為 1024 x 768 時,可以達到 30 FPS。Intel RealSense 光學雷達攝影機 L515 內部就有一個負責處理動態模糊減震與降低光-深度轉換延遲的視覺處理器。L515 的功耗低於 3.5 w,使其很容易安裝於各種手持裝置,搭配電池(行動電源)的使用時間也很不錯。標榜開盒即用,L515 不需要任何校正程序,就能在整體產品壽命保持深度偵測的高精確度。

本裝置還配備了加速度感測器、陀螺儀感測器與 FHD RGB 彩色攝影機。與其他 Intel RealSense 系列產品相同,L515 也可享用相同的開放原始碼 Intel RealSense SDK 2.0

Intel RealSense 光學雷達攝影機 L515 售價 $349 美金且已可預購。更多資訊請參考 Intel RealSense 網站

 

更多內容:

 

MM相遇:micro:bit 結合 MIT App Inventor 視覺辨識機器人

$
0
0
作者/攝影  曾吉弘
時間   2小時
成本
  • Android手機 (>8000)
  • micro:bit 雙輪機器人 (本文以 dfrobot maqueen)
難度   7 (難度10)
材料表
  • Android手機
  • micro:bit 雙輪機器人

既然要寫,就都寫吧。日前寫了一篇如何結合 App Inventor 的 PIC 視覺辨識功能與樂高 EV3 機器人,其實都是來自最基礎的水果分類器教學。透過藍牙就可以結合各種機器人平台,當然程式碼根據實際狀況多少會有點不同,但基本架構都是差不多的!今天要說明如何讓 micro:bit 機器人根據App Inventor的辨識結果來執行對應的動作。基礎的 App Inventor 藍牙(BLE) 控制 microbit 文章請按我

本範例一樣使用 MIT App Inventor 的 Personal Image Classifier 網站來訓練以下三種路牌。請實際印出來並放在之後機器人要執行的環境中來行走,這樣效果會比較好。最後把訓練好的 .model 檔上傳到您的 App Inventor 專案中。離線視覺辨識app 就完成囉!

訓練神經網路

請參考本文  https://blog.cavedu.com/2019/08/27/app-inventor-image-classifier

microbit機器人

在此使用 DFROBOT maqueen 雙輪小車,但其他的雙輪機器人平台應該都是同樣的作法(請根據選用的平台找到正確的控制指令)。以下是示意圖,還在設計一個合適的手機支架,原來現在手機太大也是個煩惱啊…

App Inventor結合其他開發板的文章請參考:http://www.appinventor.tw/iot

App Inventor端

Lego EV3 Arduino Uno 搭配 HC05 不同,BLE 不需要先配對,直接連線即可。

Designer頁面設定

請由MIT App Inventor 網站下載 personalImageClassifier擴充檔,或由此下載 .aia原始檔。再匯入您的 App Inventor 專案即可。請注意,PIC元件無法像 Sound元件一樣,無法透過程式指令在執行過程中修改所使用的 model (Sound元件可以隨時修改其 Source 來源檔案)

本專案元件說明如下,您之後可以根據個人需要來修改介面配置:

  • personalImageClassifier 元件(本文後簡稱PIC元件),別忘了匯入喔
  • 一個 Listpicker 來選取 microbit (不需要先配對)
  • 一個 中斷藍牙連線的按鈕
  • 一個 WebViewer 用來即時預覽相機的畫面
  • 切換前後鏡頭的按鈕 (ButtonSwitch)
  • 顯示結果用的標籤 (Label_Result)
  • microbit_Uart 元件,用於發送訊號給 microbit,需搭配BluetoothLE 元件 (需另外匯入 .aix 檔)
  • BluetoothLE 元件,用於進行藍牙通訊 (需另外匯入 .aix 檔)

Blocks

STEP1   PIC元件相關設定

當PIC元件準備完成之後,把在PIC網站上訓練好的模型的 ModelLabel 顯示在Label 上。可以先檢查有沒有匯入錯的辨識模型檔。

STEP2 

如果PIC元件發生錯誤的話,把 errorCode 顯示出來

STEP3  BLE 藍牙連線/斷線設定

按下 ListPicker,選擇 micro:bit (從名稱可以看得出來是 microbit),連線成功的話就會讓 Clock 的 timer 啟動來辨識物體。斷線的則一如往常簡單,呼叫 Disconnect 指令就好。

STEP4  連續辨識影像

水果辨識器的做法是按下按鈕才辨識一次,但在此希望機器人能連續辨識來做出對應的粽剁,所以改用 Clock。在此設定 clock 的 Timerinterval 為100,請根據實際狀況來調整這個參數,太快太慢都要拿捏一下。

STEP4  取得辨識結果與信心指數並發送控制字元給 micro:bit

在PIC元件的 GotClassification事件中,所回傳的 result 是 (類別名稱, 信心指數) 的清單,例如 (apple, 0.763)。信心指數原為 0~1之間的小數,在此 x 100 轉換為百分比。

在此先檢查信心指數 (value) 是否大於60,並進一步根據辨識結果來執行對應的動作。在此都是透過 microbit_Uart 元件的 WriteRXCharacteristic (寫入RX字元) 指令送出一個字元與換行符號,例如 “R\n” 或 “F\n”,在此 \n 代表一段指令結果,micro:bit會讀取到 \n 為止。micro:bit 接到指令字元之後就會執行對應的動作。

阿吉老師說:相較於 LinkIt 7697 / Lego EV3 都有對應的 App Inventor 元件,這樣兩邊對應的做法比較瑣碎。

注意,在此使用了 local variable 區域變數 (class, value),如果您覺得不太習慣的話,改用全域變數也可以。

micro:bit端程式說明

STEP1   匯入 maqueen 函式庫

如果要控制 maqueen 小車的話,請在 makecode 網站建立一個新專案,並匯入 maqueen extension,匯入成功會看到 Maqueen IR 與 Maqueen 兩個新的指令集,如下圖

STEP2   開機時啟動藍牙服務

micro:bit 在啟動時會顯示”BLE”訊息提示使用者,並執行藍牙溫度服務與UART服務。在此宣告一個文字變數 RX_Data 來接收從手機發送過來的藍牙訊息。

並在藍牙成功連線與斷線的事件顯示對應訊息 (“C” / “D”)

在此多放一個 Bluetooth temperature sevice 只是放著,說明如果您想要在手機上看到 micro:bit 的溫度感測器值的話就要加這個指令 (延伸閱讀)

STEP3   宣告副函式讓程式更好讀

在 makecode 專案畫面點選 Advanced / Fuctions → Make a Fuction…,可以新增副函式來管理程式碼,由於機器人的動作是由馬達轉向與轉速所決定,因此用副函式來管理會好很多。

新增三個副函式,名稱為 left / right / forward,代表機器人左轉右轉與前進等動作。每個副函式都要新增 lSpeed 與 rSpeed 兩個參數,這樣每次呼叫副函式都可以調整馬達速度,程式的彈性就更高了。

STEP4   根據收到字元執行對應的動作

接下來就是等是否收到新的藍牙訊號,在此以換行符號 (newLine)作區別,並把讀取結果放在 RX_Data 變數中。最後比較變數內容並呼叫對應的副函式並傳入馬達轉宿即可,例如 call forward (200, 200),就是要馬達以 75%的電力轉動,讓機器人前進。請注意,maqueen 小車 motor 指令的馬達轉速範圍為 0- 255 且無法輸入負數,不然其實用同一個副函式搭配不同的馬達轉向轉速就可以讓機器人前進、轉彎與停止等等。

執行畫面

開啟程式會直接開啟相機鏡頭並顯示於app中的 WebViewer元件,隨後會看到 ModelLabel (模型可分辨的影像類別)。點選 Listpicker 來選取您的 micro:bit (如下圖中的 D9:D6: … 這個裝置),連線成功之後機器人就會開始移動。沒看到路牌就會前進,如果看到路牌就會執行對應的左轉、右轉與停止等動作,一起來玩玩看吧!

相關連結:

Intel RealSense D435 開箱與簡易測試

$
0
0
作者/攝影  曾吉弘

年 Intel RealSense 系列推出了不少裝置,希望能針對手持應用、機器人、倉儲等等提供更方便的解決方案。本文將介紹 D435景深攝影機 (機器人王國購買連結)。大小只有  90 x 25 x 25 (mm),可以透過usb 供電,非常適合手持應用與機器人等場域。

正面可以看到四個主要的模組,分別是右側成像器、IR 投影器、左側成像器與 RGB 模組

這張圖可以看得更清楚一點

以下影片是使用 D435 / T265 的機器人視覺應用

開箱開箱

現在實際開箱囉,盒子維持 Intel 一貫的 “飛向宇宙,浩瀚無垠“(自己說) 的風格。

軟體下載

請由 Intel 開發者頁面下載 Intel RealSense SDK  2.0,目前提供 Win10, Win7, Linux (Ubuntu 有安裝包) 與 Android 等平台。

支援的軟體平台相當豐富,網站上的 code sample 都是以 C/ C++ 為主,但在其 github 上就能找到其他語言的範例程式,本文後續將介紹一些 python 範例的操作畫面

SDK 安裝過程很簡單,按照預設設定安裝即可。

RealSense Viewer

安裝完畢後,開啟 RealSense Viewer 畫面如下,這時還未裝上 D435。請用盒裝中的 usb type C 線連接您的電腦與 D435,系統會自動抓到機器。

如果系統發現有可更新的韌體,Viewer 右上角就會詢問是否更新。點選 [Install] 就可以自動更新韌體,您也可以來這邊找最新的韌體。

右上角可以切換2D / 3D 模式,先來看 2D。點選畫面左側的 RGB Camera 選項就可以看到畫面囉,這不是我的新安州嗎?

切換為 stereo mode (2D),畫面右側的 Y 軸刻度代表距離(單位 m)

開始 2D streaming,點選 [info] 可以看到更多資訊

來看看3D streaming,在此可切換 Depth source 與 texture source (現為 depth)。

切換 texture source 為 color

Depth Quality Tool

     Depth quality tool 是另一個隨著 RealSense SDK 安裝好的工具,可以有更多細部的設定。在此只說明不同解析度、FPS 與  Region of interest 等設定。1280 x 720 可到 30FPS (ROI 40%),如果要更高的 FPS 的話,就要降低解析度才行,例如 640 x 360 @60, 90FPS。

Python範例

 請先根據原廠說明建立好您的 python3環境,我在 anaconda python3 環境中只要安裝好pyrealsense2 就可以執行(教學請按我),相當方便。

安裝 pyrealsense2 函式庫:

$ pip install pyrealsense2

以下直接執行原廠所提供的範例(github) ,也可以點選範例名稱來直接看內容

1. Tutorial 1 – 串流深度資訊,並在 console 中用 ASCII code 來顯示影像。意義不明的範例,可以看出有手掌的形狀嗎?)

2. NumPy and OpenCV – 使用 OpenCV and Numpy 來彩現深度影像與彩色影像。

3. Stream Alignment – 移除背景的範例,作法是將深度影像與彩色影像對齊並經過運算之後來移除背景。相關參數還是要調整一下才有最好的效果。

4. [點雲相關] OpenCV software renderer,可用滑鼠與鍵盤來操作。參數說明如下:

滑鼠:

按著滑鼠左鍵來旋轉畫面,按著右鍵平移畫面。滑鼠中央滾輪則是縮放。

鍵盤:

  • [p]     暫停
  • [r]     重置視角
  • [d]     切換十進位值
  • [z]     切換 point scaling
  • [c]     切換顏色來源
  • [s]     存檔 (./out.png)
  • [e]     匯出 ply 檔 (./out.ply)
  • [q\ESC] 離開

5. [點雲相關] PyGlet pointcloud renderer – 請先安裝 pip install pyglet
PyGlet 來檢視點雲,鍵盤滑鼠操作方式相同。

最後還用 ipynb 方式提供了兩個範例 Distance to ObjectDepth Filters

 

相關文章

製作Jetson Nano家庭影音文書機

$
0
0

想要一台影音文書機,又想要節省空間及省錢,使用Jetson Nano來製作全家都可以使用的影音文書機吧!

在樹莓派剛問世不久,就有許多教學教大家如何使用樹莓派建立影音文書機,但在使用上速度時常不盡人意,而且後續的維護資訊以及網路資源也比較少。而Jetson Nano使用的Ubuntu系統有更多使用者,硬體規格也較樹莓派高一些。因此本篇文章要跟大家介紹如何使用Jetson Nano製作家庭影音文書機,讓想節省時間、金錢及空間的Jetson Nano新手也可以輕易的組裝。

本文大綱

  • 製作一片有Ubuntu系統的SD卡及基礎設定
  • 音源設定
  • 設定系統語言以及鍵盤輸入法為中文(或是你想要的其他語言)
  • 製作外殼
作者/攝影   蔡雨錡
時間    1小時
難度   ★☆☆☆☆
材料表
  • Jetson Nano x 1(商城連結)
  • SD 卡 x 1
  • 電源供應器 x 1
  • 無線網卡 x 1(可以用網路線代替)
  • HDMI螢幕 x 1
  • 鍵盤 x 1
  • 滑鼠 x 1

製作一片有Ubuntu系統的SD卡及基礎設定

 還沒有製作過開機SD卡跟做基礎wifi設定的人可以參考 << NVIDIA Jetson Nano 實際使用難不難?從入手到安裝系統、開機與遠端連線 >> ,已經有可以開機的SD卡的人,可以把SD卡、HDMI線、鍵盤、滑鼠、無線網卡、電源線通通裝上或接上Jetson Nano,直接從下一步的音源設定開始。

音源設定

由於Jetson Nano沒有內建的音效卡,除了外接USB音效卡之外,可以連接HDMI螢幕,讓螢幕播放聲音。

連接螢幕之後,要設定聲音從HDMI螢幕播放。

點選右上角的齒輪圖案,選「系統設定值」(System Settings)

進入系統設定畫面後,點選「音效」(Sound)

左側選擇「HDMI/DisplayPort」,再點選右下角的測試音效,點選左右放聲音的測試,就可以聽到聲音從螢幕中出來囉!也可以在這個介面調整聲音的平衡跟輸出音量大小,或是其他的聲音效果。

設定系統語言以及鍵盤輸入法為中文(或是你想要的其他語言)

Step 1. 安裝 ibus-pinyin及ibus-chewing

開機之後,點擊介面右上角icon,搜尋「terminal」。

打開terminal後輸入以下指令,先升級apt套件清單跟既有套件升級。

sudo apt-get update
sudo apt-get upgrade -y

安裝 ibus-pinyin及ibus-chewing。

sudo apt-get install ibus-pinyin ibus-chewing

安裝完後重新啟動Jetson Nano,在terminal中輸入以下指令。

sudo reboot

Step 2. 設定系統語言

點選右上角的齒輪圖案,選「系統設定值」(System Settings)

進入系統設定畫面後,點選「語言支援」(Language Support)

可能會跳出視窗提醒你「安裝的語言支援尚未完備」,請點選「安裝」,並輸入密碼。

進入下圖畫面後,在「選單和視窗語言」(Menu and Window Language)中尋找有沒有「漢語(臺灣)」。若有,將其拖曳至選單最上方。

如果沒有,則點選「安裝或移除語言」(Install/Remove Language),跳出視窗後,找到並勾選「中文(正體字)」。再試著進行上一步驟。

接下來點選「套用至全系統」(Apply to the Whole System),完成後則可點選關閉,並重新啟動Jetson Nano。

Step 3. 設定輸入法及輸入法切換快捷鍵

重新開機後,點選「系統設定值」-「文字輸入」。

左側可以設定文字輸入使用來源,也就是可供切換的語言。右側可以設定輸入法切換用的快捷鍵,點選白色區域後,直接按下鍵盤上你想要的組合快捷鍵就可以更改。

點選左下角的「+」,在選單中選擇「漢語(Chewing)(iBus)」後,點選「加入」。

完成後在terminal輸入指令,重新啟動ibus。

ibus restart

再重新啟動Jetson Nano就可以輸入中文及看到系統介面中文化囉!

一台全家都可以使用的簡易影音文書機就完成啦!你可以用來上網、看youtube影片、編輯文件、ppt、excel等檔案,還可以撰寫程式。

製作外殼

如果有興趣進一步美化,可以製作或是購買Jetson Nano的外殼。

以下為常見的幾種製作外殼的方式:

  • 3D列印
  • 雷射切割
  • 使用紙盒包裝做美工

在製作的過程中,記得要考慮散熱以及哪些對外的連接埠是你會需要使用到的。

如果家裡有3D列印的話,私心推薦Thingiverse上的3D列印檔案,可以印出vesa壁掛外殼,讓你可以輕鬆將Jetson Nano掛在有vesa孔的螢幕後面~

當然也可以購買現成的殼,可以參考GeekWorm的Jetson Nano Case,外觀像是小電視機,也可以固定CSI Camera。

希望大家有愉快的Jetson Nano影音文書機體驗~


Jetson Nano 基礎教學 01 – Webcam

$
0
0

Jetson Nano 開發板可以開機後,下一步當然就是接Webcam來照相及錄影!

買了邊緣運算開發板後,開機的下一步通常都是連接鏡頭模組,讓這個裝置可以拍照或錄影。Jetson Nano除了可以使用像是Pi camera這種MIPI CSI-2的鏡頭之外,也可以使用手邊比較容易有的USB Webcam。

本篇要介紹如何在Jetson Nano上使用Webcam及OpenCV套件進行拍照、錄影、縮時攝影,還有做一些有趣的特效,使用的程式語言為Python。

還沒有成功開機的人可以參考製作開機SD卡及基礎設定教學: << NVIDIA Jetson Nano 實際使用難不難?從入手到安裝系統、開機與遠端連線 >>

將Jetson Nano開機後,開始來玩Webcam的各種功能吧!

本文大綱

  • 事前準備 – 安裝OepnCV
  • Let me take a selfie – 拍照
  • 理工文青風 – 縮時攝影
  • 尋找Green flash的天文迷 – 錄影存檔
  • 互動藝術裝置 – 影像串流搭配特效
作者/攝影   蔡雨錡
時間   2小時
難度   ★★☆☆☆
材料表
  • Jetson Nano x 1(商城連結)
  • SD 卡 x 1
  • 電源供應器 x 1
  • Webcam (Logitech C270) x 1
  • HDMI螢幕 x 1
  • 鍵盤 x 1
  • 滑鼠 x 1

事前準備 – 安裝OpenCV

點選Jetson Nano畫面的右上角圖示,搜尋「terminal」。點擊並開啟終端機(terminal)後輸入以下指令。

先更新apt套件清單並升級既有套件。

sudo apt-get update
sudo apt-get upgrade -y
sudo apt-get install build-essential

再安裝OpenCV

sudo apt-get install python3-opencv

測試OpenCV是否成功安裝,在terminal中輸入以下指令

python -c "import cv2; print(cv2.__version__)"

如果順利顯示OpenCV版本就代表安裝成功!

Let me take a selfie – 拍照

在terminal中下指令:

ls -ltrh /dev/video*

可以找到USB Webcam編號(本範例中為video0,代表編號為0),填入OpenCV的VideoCapture()指令中,就能順利使用Webcam囉!

 在terminal中執行,建立一個新的python檔案,本範例使用nano文字編輯器,你也可以使用你喜歡的任意程式編輯器,例如vim、jupyter lab等等。

nano LetMeTakeASelfie.py

輸入以下的程式:

# 匯入函式庫
import cv2
# 設定從哪顆鏡頭讀取影像,本範例中為video0
webcam = cv2.VideoCapture(0)
# 讀取影像
return_value, image = webcam.read()
# 儲存名為Me.png的照片
cv2.imwrite("Me.png", image)
# 刪除webcam,養成不佔用資源的好習慣
del(webcam)

按「Ctrl+O」、「Enter」存檔之後,按「Ctrl+X」退出。

在terminal中輸入以下指令

python3  LetMeTakeASelfie.py

將鏡頭對準自己並微笑,然後按下Enter鍵。

將將將將,你就有一張名為Me.png的自拍照啦!

你也可以拍其他喜愛的人物跟景色。開心拍照之餘,建議幫照片取名稱時可以加上日期/時間/用途/地點等重要資訊,能增加可讀性。

開啟新程式檔案、儲存檔案以及執行程式檔案這三步驟,在本篇後面都不會再重複描述,可以使用程式用途替程式命名。

理工文青風 – 縮時攝影

變化多端的天空,今天是什麼樣貌呢?用Jetson Nano搭配羅技C270來做縮時攝影吧!縮時攝影其實就是把固定時間間隔拍的照片全部串聯在一起做成影片。會使用for迴圈來控制拍照的張數、以及time套件來控制縮時攝影拍照的時間間隔。

在縮時攝影開始前,可以先用拍照程式確認照片的構圖、取景是不是自己想要的。

# 匯入函式庫
import os
import cv2
import time

# 設定照片儲存資料夾路徑
path = "pics"

# 如果照片路徑不存在,就建立這個資料夾
if not os.path.isdir(path):
    os.mkdir(path)

# 設定從哪顆鏡頭讀取影像,本範例中為video0
webcam = cv2.VideoCapture(0)

# 範例中為求測試執行,設定拍5張照片,每兩秒拍一張照片
# 也可以設定執行24小時(86400s) - 拍8640張照片,每十秒拍一張照片,以此類推
for i in range(5):
    # 使用try/except防呆
    try:
        # 使用日期以及時間替每張照片命名
        date=time.strftime("%Y-%m-%d_%H-%M-%S")
        
        # 從攝影機擷取影像
        return_value, image = webcam.read()
        
        # 儲存到特定資料夾中,避免放在同資料夾下造成雜亂
        cv2.imwrite("pics/"+date+".png", image)
        
        # 等待兩秒
        time.sleep(2)
    except:
        # 如果無法拍照則印出警告文字,可以自己設定內容
        print("Cannot take pictures!")
# 刪除webcam,養成不佔用資源的好習慣
del(webcam)

也可以修改時間總長度、拍的照片張數、拍照間隔時間。存了許多照片後,我們可以使用以下的程式碼將這些照片製作成影片。

# 匯入函式庫
import os
import cv2
 
# 用於儲存圖檔位置的清單
imagefile_list = []
img_array = []

# 設定照片儲存資料夾路徑
path = "pics"

# 搜集圖檔位置清單
for r,d,f in os.walk(path):
    for file in f:
        imagefile_list.append(os.path.join(r,file))

# 按圖檔名稱排列順序
sorted_imagefile_list=sorted(imagefile_list)

# 將圖檔按清單順序讀出並加到
for filename in sorted_imagefile_list:
    #讀圖
    img = cv2.imread(filename)
    height, width, layers = img.shape
    size = (width,height)
    img_array.append(img)
 
# 定義要輸出的影片名稱為TimeLapse.mp4,fps為10,長寬大小按照原圖片比例
out = cv2.VideoWriter("TimeLapse.mp4",cv2.VideoWriter_fourcc(*'DIVX'), 10, size)
 
# 寫入新影片
for i in range(len(img_array)):
    out.write(img_array[i])
out.release()

程式跑完了之後,縮時影片TimeLapse.mp4就完成啦!

尋找Green flash的天文迷 – 錄影存檔

有些美好的景色有如曇花一現,稍縱即逝。如果想要尋找夕陽西沉時,僅有在天氣晴朗、太陽接近地平線的那瞬間的Green flash。除了每天癡情的等待,也可以使用Jetson Nano錄影存檔,幫你記錄每一時刻,絕對不會錯過綠閃的那一剎那。與架設腳架及攝影機相比也有另一番浪漫,而且成本較低且不容易被偷。

錄影片的程式如下,按下Q鍵即可結束錄影,也可以改成用time.sleep(秒數)來控制影片長度:

# 匯入函式庫
import cv2

# 設定從哪顆鏡頭讀取影像,本範例中為video0
webcam = cv2.VideoCapture(0)

# 設定擷取影像的尺寸大小
webcam.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
webcam.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)

# 使用 XVID 編碼
fourcc = cv2.VideoWriter_fourcc(*'XVID')

# 建立 VideoWriter 物件,輸出影片至 Video.mp4
# FPS 值為 20.0,解析度為 640x480
out = cv2.VideoWriter("Video.mp4", fourcc, 20.0, (640, 480))

while(webcam.isOpened()):
    return_value, frame = webcam.read()
    if return_value == True:
        # 寫入影格
        out.write(frame)
        # 顯示影像
        cv2.imshow('frame',frame)
    else:
        break
    # 按下 q 鍵跳出迴圈結束錄影
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 釋放所有資源
webcam.release()
out.release()
cv2.destroyAllWindows()

接下來你只需要架設好Jetson Nano套組,就可以在你想要的時間錄下影片了!

 互動藝術裝置 – 影像串流搭配特效

 辦活動或是展覽時,有時會需要有跟來賓或是路過民眾有互動的大型裝置藝術單單使用Jetson Nano搭配攝影鏡頭及大螢幕,就可以做很多有趣的互動題目。

在搭配特效之前,要先讓Jetson Nano可以做到即時顯示影像串流。光是可以做到影像串流,就可以製作常見的魔鏡效果,讓異地的人可以透過面前的魔鏡看到另一片魔鏡中的他/她。

影像串流程式如下:

# 匯入函式庫
import numpy as np
import cv2

# 選擇攝影機video0
webcam = cv2.VideoCapture(0)

while(True):
    # 從攝影機擷取影像
    return_value, frame = webcam.read()

    ####特效放這裡####
    
    # 顯示影像
    cv2.imshow("frame", frame)

    # 按下 q 鍵跳出迴圈
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 釋放攝影機
webcam.release()

# 關閉所有 OpenCV 視窗
cv2.destroyAllWindows()

以下的不同特效程式碼取代 ####特效放這裡#### 後,會有不一樣的效果唷!

變色效果特效:

frame = cv2.cvtColor(frame,cv2.COLOR_BGR2RGB)

圖片模糊化:

frame  = cv2.blur(frame , (11, 11))

圖片銳利化:

kernel = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]], np.float32)
frame = cv2.filter2D(frame, -1, kernel=kernel)

可以搭配特效後,除了拍貼機、自動化妝、服裝搭配、場景切換等效果,還可以搭配人臉辨識、人體骨架辨識、距離深度辨識,製作各式各樣的遊戲。

對其他攝影鏡頭相關的教學有興趣想了解或是有不錯的作品想分享,歡迎在下面留言讓我們知道~

新北市MIT App Inventor學生徵件賽,該如何準備?

$
0
0

新北市108學年度MIT App Inventor師資培訓暨學生徵件賽

由新北市政府教育局所主辦,翰尼斯企業有限公司(註1)協辦的「新北市108學年度MIT App Inventor師資培訓暨學生徵件賽」,題目已經公告了,詳細資料請參閱比賽公告頁面(http://www.appinventor.tw/2019_ntpc_competition)。

首先,有師長朋友來信問 :「怎麼只限新北市而已?」我們的目標是,未來能辦得像貓咪盃這麼有規模,不過需要時間來醞釀,也需要很多人來支持。所以第一年最好支持的方法就是來參加!請分享相關訊息讓您在新北就讀的高中職或國中親友來參加吧!第一年的得獎機會最高,原因不用我多說吧?

本文將針對比賽辦法中的題目、 (四) 評選標準、(五) 專題企畫書項目以及常見問題來說明:

題目

  • 高中職組:智慧新北
  • 國中組:智慧校園行動應用

專題名稱需以各組題目為大方向來設計。其實App Inventor 的畫面元件就那幾十個,寫 app 也不是比誰的元件多。評審們普遍的想法是 「多觀察生活週遭來找出問題」以及 「好好想一個有意義的題目」,否則不容易脫穎而出。例如,同樣是「水平儀」這樣的app,只要用 orientation sensor 去控制 ImageSprite 的位置就可以達到。但為什麼 Google Play 上有些 app 下載次數超過 10萬甚至更多,有的則普普。先不考慮打廣告洗榜這件事,多看看多比較,下載來玩玩看就會對 「介面」、「操作順暢」等有感覺。

另一個建議就是「結合時事」,例如最近大家都關心的口罩,政府已經推出了[健保特約機構口罩剩餘數量明細清單] 即時查詢,檔案格式為 csv,相信大家已經想到可以做一個  app 來即時查詢您所在位置附近是否有口罩可以購買。如果再結合 Clock 元件來確認今天是星期幾,搭配使用者身分證字號最後一碼來確認今天是否可以購買(單數週135,偶數週246)

(四) 評選標準

  1. 原創性(30%):問題是否定義完整,並是否可由提出的 app 來解決(或部分解決)
  2. 技術性(30%):所用的元件與技術是否具備一定的技術難度。例如同樣是空氣汙染查詢的 app,如果有結合了藍牙去觸發 Arduino 等開發板做到空氣品質過差就亮紅燈,反之則綠燈等。這樣就技術性而言,當然比單純 app 呈現來得高。
  3. 完整性(30%):介面安排是否合理,操作流程是否順暢,會否當機。
  4. 其他加分項目(10%):某一個不錯的亮點,就會由此加分。

(五) 專題企畫書項目:

  1. 專題名稱:給作品一個響亮的名字吧!
  2. 學生及指導教師姓名及所屬學校名稱(可跨校)。
  3. 專題簡述:簡要說明這個專題的功能與特色。
  4. 執行畫面:請附上重要的app功能截圖,幫助評審更快理解你的用心。請參考 App Inventor 中文學習網上的範例
  5. 程式原始碼與執行檔:MIT App Inventor的原始碼格式為 .aia,打包後執行檔為 .apk。請附於報名信件附件或提供下載連結。評審會先用 .apk 測試,如果發現有哪邊會造成當機或 「怪怪的」才會去看 .aia 程式是怎麼寫的,這邊就會看實作的程度來評分。

另一個學生交件常見的問題就是:「會把所有的程式碼都貼上來」並佔用大量篇幅。對評審來說,我們只要看亮點就好,也就是您的專題最厲害的地方是怎麼做的。一些比較瑣碎的功能像是 “按下按鈕換頁” 或是 “更新 ListPicker 元素” 就簡單帶過就好囉。

  1. 專題影片連結(1分鐘):用影片說明本專題的功能與執行過程,請附上YouTube等影像串流網址或影片檔案下載網址,格式不限,但請確認可以播放。請注意 「可以播放」 是最基本的要求喔!影片只要清楚達意就可以,不需要很華麗的片頭或換場動畫,這通常是不會加分的。錄製操作過程時,可用螢幕錄影 app 的效果會更好。

常見問題

一、可否使用第三方開發的擴充檔?

僅開放 MIT App Inventor 所開發之擴充檔,例如 BluetoothLE、.PersonalImageClassifier 以及 MIT App Inventor IoT 網上站所列之擴充元件。MIT App Inventor 自 2016年之後開放使用Java所編寫之擴充檔,但為求公平起見,參賽元件只限MIT App Inventor 所開發之元件與擴充檔件,不開放使用第三方開發的擴充檔。不確定的話都可以寫 email (info@appinventor.tw,MIT App Inventor活動小組) 來詢問。

二、可否使用 iphone / iPad 來參賽?

MIT App Inventor 即將 (但尚未) 推出 iOS平台,故本次競賽皆使用 Android 裝置。

三、可否結合其他網路服務API?

可以,請於專題企畫書中說明與 App Inventor 之間的互動關係即可。例如如果結合MySQL資料庫的話,就要說明 app 與 資料庫之間的對接方式以及可做到的功能等等,如果有對應的執行畫面就更好啦。

四、可否結合其他硬體開發板?

可以,請於專題企畫書中說明與 App Inventor 之間的互動關係即可,例如透過藍牙、Wi-Fi 或其他等通訊模式。例如我今天使用了 Arduino Uno 並透過 HC05 藍牙模組 (參考資料) 來與 app 互動,希望能提到雙方收發資料的型態(位元? 字串? 整數? 浮點數?)、資料範圍(0~255? -128~127? 0~100? 0.0~1.0?)。其他像是 LinkIt 7697micro:bit Arduino 101 等開發板是採用藍牙 BLE,所用到的元件就與上述的 HC05 不同。Raspberry Pi 則是單板電腦,支援 BLE / Wi-Fi,所以溝通的方式又更多了。

五、我有哪些資源可以參考?

六、其他技術問題,請優先參考以上資源:或寄信詢問:info@appinventor.tw

註1:CAVEDU 教育團隊為協辦單位翰尼斯企業有限公司之教育部門

NVIDIA Jetson Nano 華碩保固查詢及相關資源

$
0
0

如您已購買華碩販售的NVIDIA Jetson Nano Developer Kit,可在盒子右上角看到貼紙呈現品名、製造日期、產品序號等產品相關資訊。

製造序號可記錄下來,以供查詢保固資訊。

盒子側邊貼紙也能夠看到Serial No.(產品序號)和Part No.(料號)。

請記得將右邊產品序號標籤的QR code貼紙(下圖紅框處)撕下來貼在產品上,請注意,如果您遺失這個標籤貼紙,等同於保固失效。

建議可貼在產品底部平面(下圖紅框處),較不易脫離,也可以自己找個安全的位置黏貼。

記錄產品序號後可至華碩官網查詢保固相關資訊。

連結:https://www.asus.com/tw/support/Warranty-Status-inquiry

請輸入產品序號並勾選「我同意提供我的產品序號供華碩查詢產品保固期間,並同意華碩隱私權保護政策。」,點擊查詢。

查詢結果可以知道產品的保固狀態以及保固的到期日,如下圖所示。

不過網站中也說明查詢出的保固狀態僅供參考,主要依據還是購買時的發票,請將發票妥善留存。如果您無法提供發票,產品的保固日期將會以產品啟用後的首次連網日期開始計算,若兩者都無,則產品保固期將以機身序號所對應的出廠日期開始計算。

如果您的Jetson Nano不幸損壞,可以使用華碩的線上客服或是聯繫客服信箱,也能查詢離你較近的維修中心或是線上預約維修服務

Jetson Nano安裝及使用RealSenseD435

$
0
0

能在Jetson Nano上使用RealSense獲取影像深度資訊可以將材料費壓到一萬元出頭,做各式各樣立體視覺的專題。

自駕車是一直以來十分熱門的議題,但在早期的自駕車研發中,都會用上動輒數十萬、甚至到百萬的Lidar。Google早期研發的自駕車,為了全方位的安全,在一台車上就裝了四顆Lidar。過去想要體驗或研發自駕車跟立體視覺,通常都要先花一筆不小的費用。而現在想要體驗立體視覺,並製作自駕車的門檻已經大幅降低。Intel開發的景深攝影機RealSense D435提供的即時影像深度資訊,讓使用者可以在萬元以內體驗立體視覺,而且RealSense體積小,可以輕易地用於各式各樣有趣的應用。

本篇文章要跟大家介紹如何在Jetson Nano上安裝RealSense套件,以及一些簡易的應用。讓對影像深度資訊有興趣,又有一片Jetson Nano的使用者可以輕鬆入門。內文將會著重在RealSense於Jetson Nano上的應用,建議對Jetson Nano或是Linux系統有一些基礎再往下閱讀。

本文大綱

  • 在Jetson Nano上安裝RealSense套件
  • 測試RealSense的官方範例
  • Jetson Nano搭配RealSenseD435溫度實測
作者/攝影   蔡雨錡
時間   3小時
難度   ★★☆☆☆
材料表

在Jetson Nano上安裝RealSense套件

安裝RealSense是參考JetsonHacks的教學完成的,這個網站上有很多NVIDIA Jetson系列的文章以及影片,Github也十分豐富,誠摯地推薦給正在研究NVIDIA Jetson系列硬體的開發者。

安裝過程中會有幾個需要輸入密碼的地方,所耗費時間總約半小時。

Step 1. 設定Swapfile以解決記憶體不足的問題

git clone https://github.com/jetsonhacksnano/installSwapfile
cd installSwapfile
 ./installSwapfile.sh

重新啟動一下

sudo reboot

Step 2. 安裝RealSense套件

安裝的一開始,會跳出警告要你檢查沒有任何RealSense接在Jetson Nano上,確認完畢後按任意鍵就可以繼續安裝了。

git clone https://github.com/jetsonhacksnano/installLibrealsense
cd installLibrealsense
./installLibrealsense.sh
./buildLibrealsense.sh

安裝一個缺失的套件

sudo apt-get install libcanberra-gtk-module libcanberra-gtk3-module

安裝完後再次重新啟動

sudo reboot

安裝完成了,接下來就是測試範例讓RealSense動起來!

測試RealSense

打開terminal輸入以下指令,會跳出RealSense的操作界面。

realsense-viewer

將RealSense接上Jetson Nano後可以看到右上角建議你更新RealSense的韌體。點選「Install」更新,這邊會花一些時間。更新完成後如下圖。

將左側面板上的「Stereo Module」、「RGB Camera」都設定為「on」,就可以看到以下畫面,除了RGB Camera 拍到的串流影像之外,還有深度計算影像結果,可以看到兩個畫面的邊界有點差異,那是因為深度影像是多顆鏡頭的綜合結果,彩色影像是RealSense上 RGB Camera直接拍攝到的影像。

2D的兩個模式都有許多可以調整的參數,可以點選標題左側的三角形展開參數列表做調整。

3D模式下可以旋轉,可以下載3D點雲的檔案。有興趣的人可以進一步將檔案製作成可以3D列印的版本。

測試RealSense的官方範例

主要RealSense D435會用到的範例如下,下方包含T265的範例程式是針對追縱攝影機T265,在此不多著墨。

1.Tutorial 1 – 一個用ASCII顯示圖形的畫面

a.使用程式:python-tutorial-1-depth.py
b.執行成果圖:用ASCII code顯示深度影像

2.NumPy and OpenCV  – 測試OpenCV跟NumPy是否能順利使用

a.使用程式:opencv_viewer_example.py
b.執行成果圖:基礎的輪廓圖

3.Stream Alignment – 簡易的去背程式

a.使用程式:align-depth2color.py
b.執行成果圖:去背即時影像

4.RS400 Advanced Mode – 用於控制D400攝像機不同選項的高級模式界面範例

使用程式:python-rs400-advanced-mode-example.py

5.Realsense Backend – 使用後端接口控制設備的範例

使用程式:pybackend_example_1_general.py

6.Read bag file有關如何讀取bag文件並使用著色器在噴射色圖中顯示記錄的深度流的範例

使用程式:read_bag_example.py

7.Box Dimensioner Multicam – 用於控制D400攝像機不同選項的高級模式界面範例

使用程式:box_dimensioner_multicam_demo.py

8.Realsense over Ethernet  – 透過乙太網路做影像串流的教學文件

Jetson Nano搭配RealSenseD435溫度實測

點選「Software/軟體」搜尋Psensor並安裝,可以協助你監控Jetson Nano的溫度。

可以發現沒有加上風扇執行RealSense相關程式的時候,Jetson Nano溫度會高達52度。

有加上風扇後,執行RealSense相關程式的時候,自動降溫可以將系統維持在40 度上下。

可以參考Jetson Nano散熱風扇的教學,在terminal輸入以下指令:

sudo sh -c 'echo 255 > /sys/devices/pwm-fan/target_pwm'

強制將風扇風速調整至100%,就可以在五分鐘內降溫到24度左右!

所以建議想要在Jetson Nano上玩RealSense的人都幫它裝一顆風扇,讓開發板在適當的溫度下運作,可以延長開發板的使用壽命。

對Jetson Nano搭配RealSense有興趣的使用者,請繼續追蹤後續文章,或是有什麼感興趣的相關主題都可以跟我們分享唷!

Jetson Nano搭配RealSenseD435-人臉辨識及距離偵測

$
0
0

在Jetson Nano上使用RealSense能獲取影像深度及色彩資訊,結合兩者可以製作許多有趣的專題。

在Jetson Nano上安裝並測試RealSense之後,可以開始撰寫自己專案要使用的程式了!本篇文章要跟大家介紹如何在Jetson Nano上應用RealSense套件,提供Python範例及教學,讓大家可以輕鬆改寫成自己專案所需要的內容。讓對影像深度資訊有興趣,又有一片Jetson Nano及RealSense的使用者可以輕鬆入門。內文將會著重在RealSense於Jetson Nano上的Python程式撰寫,建議對Jetson Nano、Python有一些基礎再往下閱讀。

本文大綱

  • 解析官方範例程式
  • 取得單點深度資訊
  • 人臉辨識並取得臉部距離
作者/攝影   蔡雨錡
時間   3小時
難度   ★★★☆☆
材料表

解析官方範例程式

本篇選擇官方範例程式中的opencv_viewer_example.py來解析及作延伸,因為這個程式中使用常見的OpenCV及NumPy套件,並且有處理與顯示彩色影像資訊及深度影像資訊。是可以快速入門且方便的程式碼。

先來看看原始碼的內容及解析。

第一段為匯入函式庫,包含PyRealSense2、NumPy、以及OpenCV。

import pyrealsense2 as rs
import numpy as np
import cv2

第二段中設定彩色影像串流以及深度影像串流,解析度接設定為640×480。注意在這邊可以發現兩個影像資料格式的不同:z16為16bit線性深度值,深度比例乘上該像素儲存的值可以得到以公尺為單位的測量深度值;bgr8很直觀為8bit的藍綠紅三顏色通道資訊,與OpenCV格式互通。對其他格式有興趣可以參考此文件

pipeline = rs.pipeline()
config = rs.config()
config.enable_stream(rs.stream.depth, 640, 480, rs.format.z16, 30)
config.enable_stream(rs.stream.color, 640, 480, rs.format.bgr8, 30)

接下來就是開始影像串流

pipeline.start(config)

主要段落當中,使用了try/finally。我們之前的文章,大多數都是介紹try/except。except為try區塊中有發生例外則執行的區塊,而finally則是無論try區塊有無發生例外,finally區塊一定會被執行。常常製作影像相關專題的使用者可能會有過以下類似的經驗,如果沒有正確關閉資源,就會導致程式結束後,鏡頭模組資源被佔用,而無法順利執行下一個要使用鏡頭模組資源的程式。所以finally區塊可以放入「無論如何都會關閉資源的程式碼」。在這個官方範例中,就是放入了關閉影像串流的程式。

try:
    while True:
        ……
finally:
    # 停止影像串流
    pipeline.stop()

在while True迴圈中的第一段落為,等待同一幀的彩色跟深度影像才繼續執行後續影像處理,兩者缺一不可。

        frames = pipeline.wait_for_frames()
        depth_frame = frames.get_depth_frame()
        color_frame = frames.get_color_frame()
        if not depth_frame or not color_frame:
            continue

迴圈中第二段落將兩種影像資訊都轉換成NumPy陣列。

        depth_image = np.asanyarray(depth_frame.get_data())
        color_image = np.asanyarray(color_frame.get_data())

迴圈中第三段將深度影像資訊上假彩色 (影像必須事先轉換成每像素8bit)。假彩色很有趣,可以套用OpenCV不同的假彩色設定。除了cv2.COLORMAP_JET這個最常見的設定之外,也可以試試 cv2.COLORMAP_SUMMER、cv2.COLORMAP_OCEAN等不一樣的假彩色設定。

        depth_colormap = cv2.applyColorMap(cv2.convertScaleAbs(depth_image, alpha=0.03), cv2.COLORMAP_JET)

第四段中,使用hstack將彩色影像及深度影像兩張影像水平方向結合在一起,你也可以改成用vstack將兩張圖垂直結合在一起。能結合在一起的前提是影像要結合的邊像素數目要對上。

        images = np.hstack((color_image, depth_colormap))

第五段為顯示影像。

        cv2.namedWindow('RealSense', cv2.WINDOW_AUTOSIZE)
        cv2.imshow('RealSense', images)

第六段為設定按 esc 鍵或是 q 鍵就關閉顯示影像的視窗

        key = cv2.waitKey(1)
 
        if key & 0xFF == ord('q') or key == 27:
            cv2.destroyAllWindows()
            break

完整程式碼如下:

## License: Apache 2.0. See LICENSE file in root directory.
## Copyright(c) 2015-2017 Intel Corporation. All Rights Reserved.

###############################################
##      Open CV and Numpy integration        ##
###############################################

import pyrealsense2 as rs
import numpy as np
import cv2

pipeline = rs.pipeline()
config = rs.config()
config.enable_stream(rs.stream.depth, 640, 480, rs.format.z16, 30)
config.enable_stream(rs.stream.color, 640, 480, rs.format.bgr8, 30)

pipeline.start(config)

try:
    while True:
        frames = pipeline.wait_for_frames()
        depth_frame = frames.get_depth_frame()
        color_frame = frames.get_color_frame()
        if not depth_frame or not color_frame:
            continue

        depth_image = np.asanyarray(depth_frame.get_data())
        color_image = np.asanyarray(color_frame.get_data())

        depth_colormap = cv2.applyColorMap(cv2.convertScaleAbs(depth_image, alpha=0.03), cv2.COLORMAP_JET)

        images = np.hstack((color_image, depth_colormap))

        cv2.namedWindow('RealSense', cv2.WINDOW_AUTOSIZE)
        cv2.imshow('RealSense', images)
        cv2.waitKey(1)

finally:
    pipeline.stop()

執行成果如下:

左邊為彩色影像資訊、右邊為深度影像資訊。

取得單點深度資訊

知道如何取得影像及如何影像串流之後,下一步就是練習取得像素單點的深度資訊。

我們要在上述官方範例中加入一小段程式碼來顯示取得的單點深度資訊。

使用下列程式碼可以取得影像中像素(x, y)的深度資訊:

depth_frame.get_distance(x, y)

為了方便示範,接下來的範例中會試圖取得影像正中央的像素,也就是點(320,240)的深度資訊。並將深度資訊做成字串。 深度值太長,所以使用np.round,取前幾個數值即可。

text_depth = "depth value of point (320,240) is "+str(np.round(depth_frame.get_distance(320, 240),4))+"meter(s)"

如果你不是很確定你取得的影像大小,可以使用下列的程式來進行確認。

print("shape of color image:{0}".format(color_image.shape))

接下來使用OpenCV的circle函式在彩色影像上用黃色標記我們要取值的點

color_image = cv2.circle(color_image,(320,240),1,(0,255,255),-1)

並在彩色影像上加上剛剛深度資訊的文字,範例中用紅色顯示。

color_image=cv2.putText(color_image, text_depth, (10,20),  cv2.FONT_HERSHEY_PLAIN, 1, (0,0,255), 1, cv2.LINE_AA)

完整程式碼如下:

import pyrealsense2 as rs
import numpy as np
import cv2

pipeline = rs.pipeline()
config = rs.config()
config.enable_stream(rs.stream.depth, 640, 480, rs.format.z16, 30)
config.enable_stream(rs.stream.color, 640, 480, rs.format.bgr8, 30)
 
pipeline.start(config)
 
try:
    while True:
        frames = pipeline.wait_for_frames()
        depth_frame = frames.get_depth_frame()
        color_frame = frames.get_color_frame()
        if not depth_frame or not color_frame:
            continue
 
        depth_image = np.asanyarray(depth_frame.get_data())
        color_image = np.asanyarray(color_frame.get_data())
 
        depth_colormap = cv2.applyColorMap(cv2.convertScaleAbs(depth_image, alpha=0.03), cv2.COLORMAP_WINTER)

#################加入這段程式#####################

        #print("shape of color image:{0}".format(color_image.shape))
        #print("shape of depth image:{0}".format(depth_colormap.shape))
        #print("depth value in m:{0}".format(depth_frame.get_distance(320, 240)))


        text_depth = "depth value of point (320,240) is "+str(np.round(depth_frame.get_distance(320, 240),4))+"meter(s)"
        color_image = cv2.circle(color_image,(320,240),1,(0,255,255),-1)
        color_image=cv2.putText(color_image, text_depth, (10,20),  cv2.FONT_HERSHEY_PLAIN, 1, (0,0,255), 1, cv2.LINE_AA)

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

        images = np.hstack((color_image, depth_colormap))
        
        cv2.namedWindow('RealSense', cv2.WINDOW_AUTOSIZE)
        cv2.imshow('RealSense', images)
 
 
        key = cv2.waitKey(1)
        if key & 0xFF == ord('q') or key == 27:
            cv2.destroyAllWindows()
            break
 
 
finally:
    pipeline.stop()

執行成果如下:

可以看到深度距離訊息在彩色畫面右上角,且正中間有黃色標記的點。這個範例程式可以做很多距離相關的延伸應用,像是放在百米衝刺終點線前,偵測哪個選手最快通過終點、安裝在空拍機上做田間或果園巡視、或是搭配大型螢幕做成展場與參觀者互動的遊戲裝置都很有趣。

人臉辨識並取得臉部距離

想要做人臉辨識的話,把上一範例中插入的程式碼改成以下內容,就可以偵測人臉,並在人臉的方框左上方顯示人臉距離囉!

加入的第一行為取得人臉資料集,根據教學經驗,雖然設定相對路徑比較簡潔優雅,但設定絕對路徑比相對路徑的成功率高,不需要確認目前資料夾位置,任意移動檔案時也不會出問題。有興趣的人可以玩看看haarcascades資料夾下的其他資料集。

face_cascade = cv2.CascadeClassifier('/home/jetbot/opencv/data/haarcascades/haarcascade_frontalface_default.xml')

下一步將影像灰階化後比較方便偵測

gray = cv2.cvtColor(color_image, cv2.COLOR_BGR2GRAY)

接著設定人臉偵測的參數

faces = face_cascade.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=5, minSize=(50,50))

每一張人臉都畫方框後標記深度距離。在這段範例程式中,我們設定偵測人臉方框正中央代表人臉與鏡頭的距離。顯示深度的字串位置如果直接設(x, y)會跟方框黏在一起,所以將y修改為y-5讓文字高於方框。有任何顏色、粗細、字型、字體等喜好都可以自行做調整。

for (x, y, w, h) in faces:
    cv2.rectangle(color_image, (x, y), (x+w, y+h), (255, 0, 0), 2)
    text_depth = "depth is "+str(np.round(depth_frame.get_distance(int(x+(1/2)*w), int(y+(1/2)*h)),3))+"m"            
    color_image = cv2.putText (color_image, text_depth,(x, y-5), cv2.FONT_HERSHEY_PLAIN,1,(0,0,255),1,cv2.LINE_AA) 

完整程式碼如下:

import pyrealsense2 as rs
import numpy as np
import cv2

pipeline = rs.pipeline()
config = rs.config()
config.enable_stream(rs.stream.depth, 640, 480, rs.format.z16, 30)
config.enable_stream(rs.stream.color, 640, 480, rs.format.bgr8, 30)

pipeline.start(config)
 
try:
    while True:
        frames = pipeline.wait_for_frames()
        depth_frame = frames.get_depth_frame()
        color_frame = frames.get_color_frame()
        if not depth_frame or not color_frame:
            continue
 
        depth_image = np.asanyarray(depth_frame.get_data())
        color_image = np.asanyarray(color_frame.get_data())

        depth_colormap = cv2.applyColorMap(cv2.convertScaleAbs(depth_image, alpha=0.03), cv2.COLORMAP_JET)

        ################加入這段程式##################
        face_cascade = cv2.CascadeClassifier('/home/jetbot/opencv/data/haarcascades/haarcascade_frontalface_default.xml')

        gray = cv2.cvtColor(color_image, cv2.COLOR_BGR2GRAY)

        faces = face_cascade.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=5, minSize=(50,50))

        for (x, y, w, h) in faces:
            cv2.rectangle(color_image, (x, y-5), (x+w, y+h), (255, 0, 0), 2)
            text_depth = "depth is "+str(np.round(depth_frame.get_distance(int(x+(1/2)*w), int(y+(1/2)*h)),3))+"m"
            color_image=cv2.putText(color_image,text_depth,(x,y-5),cv2.FONT_HERSHEY_PLAIN,1,(0,0,255),1,cv2.LINE_AA)
        ###############################################

        images = np.hstack((color_image, depth_colormap))
        
        cv2.namedWindow('RealSense', cv2.WINDOW_AUTOSIZE)
        cv2.imshow('RealSense', images)
 
 
        key = cv2.waitKey(1)
        
        if key & 0xFF == ord('q') or key == 27:
            cv2.destroyAllWindows()
            break
 
 
finally:
    pipeline.stop()

執行成果如下:

戴口罩也可以順利偵測得到人臉。並且可以偵測到該臉離鏡頭的距離。

一人版本:

多人版本:感謝同事們支援!

由於這篇的教學是入門教學,僅取人臉偵測方框的中間點深度值代表整臉,所以可能會出現下圖情況,左手邊的人臉深度值因為方框中間點值偵測為零,而有了不符合期待的顯示。想要進一步練習的人,可以試著將整個方框的所有像素深度值去極值後取平均,會有更精確的效果。或是去除背景及偵測失敗的像素後再取平均值也是好方法。

以上的範例是不是很有趣呢!還有很多RealSense搭配OpenCV的延伸應用等你發掘,有任何想深入研究的主題都可以跟我們分享,希望你能玩得開心~

我要參賽!!新北市MIT App Inventor學生徵件賽參賽準備四部曲

$
0
0

掌握徵件賽的要訣與加分技巧,得獎者有機會就是你喔!

新北市MIT App Inventor學生徵件賽|徵件中

為發展學生程式設計興趣與運算思維能力,並激發學生創造力及想像力,由新北市政府教育局與新北市政府青年事務委員會主辦的「新北市 MIT App Inventor 學生徵件賽」現正開跑徵件中!歡迎有興趣的新北市師生一同來報名。

徵件賽說明頁面|新北市MIT App Inventor學生徵件賽(收件至2020/2/28為止)

  • 得獎者組別最高額可獲得獎勵金新臺幣(以下同)1 萬元之等值商品禮券與新北市教育局核發獎狀
  • 另外新北市教育局預計於109年8月辦理美國麻省理工學院參訪活動(含 MIT App Inventor 相關課程),每人經費預計 20 萬元整。本活動得獎學生可獲本局酌補交通費 3 萬元之資格(限額 10 名,擇優補助),參訪活動另案辦理。

本文大綱

一、題目發想

二、功能製作、測試功能

三、使用者友善介面

四、報名參賽資料繳交

本文由小編帶領大家掌握參賽四步驟,MIT App Inventor學生徵件賽參賽準備其實一點也不難喔!

作者/攝影 怡婷、Lisa/Cavedu教育團隊

一、題目發想

想要參加比賽卻想破頭要做什麼主題,首先先來了解一下徵件賽的題目吧!

活動頁面題目公布如下:

  • 高中職組:智慧新北
  • 國中組:智慧校園行動應用

可以從「新北市民(或是學生們),可能需要的服務或需求?」開始進行發想,例如:

  1. 新北市民 -> [服務需求]想知道垃圾車什麼時候來? -> 垃圾車到站通知
  2. 新北市民 -> [服務需求]不想浪費時間等待醫院門診號碼 -> 醫院門診進度查詢
  3. 新北市民 -> [服務需求]附近停車場哪裡有停車格? -> 停車格剩餘數量查詢

這些都是常見且非常實用的題目,可以從「需求」與「解決問題」的角度來思考,設計的題目方向呢!

在整理題目時,非常推薦以繪製「心智地圖」的方式,整理、分類與釐清自己想做的題目,線上有許多繪製心智圖的平台,下列為小編這次使用的製作心智圖網站:Coggle

二、功能製作與測試功能

清楚知道自己想做的題目後,就能夠開始執行題目的製作囉!

以下為小編彙整的教學製作與功能,不論是時下話題度夯的「AI人工智慧主題」、「穩扎穩打的物聯網」還是「基礎人機介面核心功能」提供給大家參考與應用。

AI人工智慧

IOT物聯網(Arduino、LinkIt、micro:bit)

更多物聯網教學範例請參考網站

人機介面核心功能

更多基礎學習範例請參考網站

 

有了基礎的功能教學後,反應快的同學們可以來進階自己的題目,讓創作主題更有特色喔!可用運線上公開的大數據平台網頁喔!既然是新北市政府的徵件賽,當然要分享「新北市政府資料開放平台」以下為製作範例,提供參考:

應用新北市政府開放資料的實作範例,尋找市民所在區的垃圾清運車輛位置

可以使用「CodeBeautify網站」檢視整理好的json資料格式喔!

也可以參考下方「AppInventor抓取json檔案教學」文件來學習怎麼應用開放資料~

參考資源

三、設計使用者友善介面

擁有了好題目、好想法以及好程式後,再加上方便操作與具美感的使用者介面,讓你的作品更加分喔!掌握介面的設計三大要點:「簡潔明瞭」、「畫面平衡」以及「功能豐富」,以下教大家幾招App Inventor介面設計的基礎技巧:

  • 讓使用者可以輕易點選或看清楚 – 將元件平均分佈在介面上,大小適中
  • 平衡 – 善用Fill parent讓元件平均分佈於Layout之中
  • 豐富 – 在Media區上傳圖片供元件使用,讓介面不再單調

四、報名參賽資料繳交

完成了前面的步驟,恭喜你/妳!準備比賽的進度條已完成90%囉!最後10%請將參賽資料整理並寄出喔!請記得務必填寫完整的資料,同學們!缺一不可啊,以下整裡所需資料:

  • 專題名稱:給作品一個響亮的名字吧!
  • 學生及指導教師姓名及所屬學校名稱(可跨校)。
  • 專題簡述:簡要說明這個專題的功能與特色。
  • 執行畫面:請附上重要的app功能截圖,幫助評審更快理解你的用心。
  • 程式原始碼與執行檔:App Inventor的原始碼格式為 .aia,打包後執行檔為 .apk。
  • 專題影片連結(1分鐘):用影片說明本專題的功能與執行過程,請附上YouTube等影像串流網址或影片檔案下載網址,格式不限(請留意影片是否可以播放)。

閱讀更多請參考:新北市MIT App Inventor學生徵件賽,該如何準備?

相信各位,看完參賽四部曲後也能順利地完成您的作品喔!想知道更多App Inventor相關資訊,可以以下網站資源了解:

也非常期待同學們可以激盪出更多有創意的作品喔!記得留意徵件時間至2020/2/28為止喔!如有相關問題也歡迎Email至info@appinventor.tw,MIT App Inventor 活動小組收

CAVEDU與您一同迎接跨領域導向式學習:面臨科技浪潮該如何挑選合適的教學套件呢?

$
0
0

現今的程式設計不單單只是工程師的專屬技能,在沒有標準答案的程式教育中,提供多元有趣好玩的主題讓孩子們享受「玩程式」,經由不斷的挑戰、嘗試與實際實作,能夠更加深刻體會以及興趣培養,透過程式邏輯思考,培養孩子們應對邏輯與解決問題的能力,讓大家成為「創意思考家」。

2017年底,Google於首頁慶祝兒童程式50周年,那一年也正是iPhone誕生11周年。回想一下,不難發現我們周遭的世界發生了怎樣翻天覆地的變化,食衣住行育樂,樣樣都跟著科技的浪潮走。那麼,孩子的教育又如何?如果孩子們今天學的東西,明年就落伍,又如何在這股浪潮中教孩子呢?

作者/攝影 曾吉弘/Cavedu教育團隊

大家一起來寫程式!

美國麻省理工學院(後簡稱MIT)Seymour Papert 教授於1981年的著作《MindStorms》一書所提出的 (http://el.media.mit.edu/logo-foundation/what_is_logo/logo_and_learning.html)相關概念,可說是開啟圖形化程式教育之先河,後續可說是所有的圖形化程式介面,追本溯源都是來自這裡。目前全世界都掀起了一股「大家來寫程式」的風潮,目標是讓孩子們具備運算思維(Computational thinking),在這股浪潮下,也有另一種反思:「是否人人都需要寫程式?這樣同質化的過程會對孩子造成怎樣的影響?」
MIT電腦科學與人工智慧實驗室,也是App Inventor創辦人與App Inventor創辦人Hal Abelson教授表示:「如果大家都認同現在資訊科技一日千里,那為什麼還讓我們的孩子用30年前的方式在學習?」他所推廣的App Inventor讓小學生也能自行完成各種豐富有趣的智慧型手機應用程式,正是即知即行的運算行動(Computational Action)。不是十年後,不是一年後,孩子們今天就可運用所學來做到心中所想要達到的功能,多麼美好!(註1)
根據Scratch創辦人,也是MIT媒體實驗室終身幼兒園小組的Mitchel Resnick教授表示,幼兒時期可說是我們一生中最具創造力的時候,因此他致力於讓大家都能成為創意思考家(Creative Thinker)。故此,重點已不再是讓孩子們學會多少種程式語言,而是藉由適當的科技軟硬件,輔助孩子們能對這個快速變動的環境有更多的好奇心與觀察力(註2)。回想一下,Scratch、App Inventor、Lego EV3/Wedo與micro:bit MakeCode等圖形化程式在全世界都蔚為風潮,不難想像這的確是目前最受關注的話題。

筆者2017年與App Inventor創辦人Hal Abelson教授以及Scratch創辦人Mitchel Resnick教授合影。

使用BOSON電子教學套件

針對目前市面上滿坑滿谷的兒童程式教學,筆者所處的CAVEDU教育團隊正在編寫的STEAM教材反其道而行:把「寫程式」拿掉了!
在尋尋覓覓之下,找到了DFrobot的BOSON電子教學套件。讓孩子使用簡易的電子套件直接理解感測(輸入)與動作(輸出)之間的關係,並以電路的方式來完成有趣的專題。

例如:運用動作感測器的小夜燈,或是透過溶液導電性來決定LED亮度等趣味實驗。

孩子們馬上就能對「感測」所延伸出的「動作」有感,激起他們去尋找環境中的各種「同」與「不同」(註3)。還能搭配邏輯元件(且、或、非門等)來做出更多豐富的效果。

當然這樣在內容上自然是比,直接開始程式設計來得簡易許多,因此後續的延伸學習可搭配擴充板來連接常見的嵌入式開發板,例如:Arduino、LinkIt7697與micro:bit並運用各開發板所搭配的簡易圖形化開發環境來銜接進階程式設計課程。

由CAVEDU教育團隊開辦的[國際暑期兩日營]BOSON遇上LinkIt 7697程式大冒險,就是以BOSON搭配LinkIt 7697的專題式課程呢!

不論是想學卻無法入坑的初心者還是已入坑卻止步不前的學習者都是非常適合且推薦的學習套件呢!由筆者帶領的CAVEDU教育團隊也致力於邏輯與程式設計的相關課程執行與投入研發。

了解更多BOSON資源: 

註1:筆者受邀赴MIT擔任App Inventor訪問學者時相關成果:iot.appinventor.mit.edu
註2:筆者也參與了Scratch 3.0與Learning Creative Learning課程(https://learn.media.mit.edu/lcl/)的中文內容審閱
註3:本書預計分為「趣味互動」與「科學實驗」,運用BOSON電子模組來製作各種有趣的互動專題與科學實驗。


LinkIt 7697 Blockyduino 環境新增登月小車 mooncar相關指令

$
0
0
作者/攝影  曾吉弘
時間  30分鐘
難度

★☆☆☆

材料表
  • Linkit 7697 登月小車

由聯發科技實驗室所推出的 LinkIt 7697 近年來可說是入門物聯網開發板的優質方案之一,有圖形化介面 Blockyduino,有專屬的雲端介面 MCS。可以看到愈來愈多學校老師們採用它來進行各種教學。打一下廣告,MIT App Inventor 的小蜜蜂 就是用 LinkIt 7697 作為核心喔!點選連結進去看看相關教學吧。

本文將說明如何在 7697 Blocklyduino 圖形化環境下新增 登月小車(一款雙輪機器人平台)的控制指令。請根據以下步驟操作:

1.請下載7697 Blocklyduino 圖形化環境,解壓縮即可不必安裝。請注意後續在執行上請不要放在路徑過長的資料夾中或是路徑名稱有中文,否則可能會無法燒錄程式。例如我常用的就是 C:\BlocklyDuino3,如果 C: 需要管理員權限的話用 D: 也可以

2.下載 ICShop 登月小車的擴充指令集,請點選網頁右上角的 [Clone or download] → [Download ZIP]。

3.下載之後解壓縮,請把 2. 資料夾中的 arduino-1.8.5package.nw 兩資料夾整個複製到 1. 的 BlocklyDuino3 資料夾,記得要 覆蓋檔案

4.點選 Blocklyduino.exe 即可在左側欄為登月小車相關指令,指令相當豐富,一起來玩玩看吧~

本文封面照面引用自 ICshop github

https://github.com/iCShopMgr/LinkIt7697_Bit_for_BlocklyDuino

 

相關文章

華碩Tinker Edge-T在Donkey Car的應用—上篇(Tinker Edge-T操作介紹)

$
0
0

Google以TPU架構推出Coral Dev-Board的單板電腦與Coral USB Accelerator運算加速棒後,在支援Tensorflow-Lite的運算效能上獲得很好的表現。

(其相關的應用與安裝的詳細介紹文章,請參考以下Cavedu技術部落格的各種教學文,網址如下:https://blog.cavedu.com/?s=CORAL)。

華碩獲得Google授權生產支援Coral TPU運算的Tinker Edge-T單板電腦,Tinker Edge-T是一款參考Google Dev Board設計的單板電腦,基本上相關的硬體教學資訊都可以在https://coral.ai/docs/dev-board/get-started/參考到,Tinker Edge-T基本上和Google Coral Dev Board在各種作業系統的操作方式基本上是幾乎一樣的,教學網站上的範例基本上也幾乎都可以在Tinker Edge-T上操作。

作者/攝影 曾俊霖
時間 約4小時
難度

中等

材料表
  • Tinker Edge-T
  • Donkey Car遙控車車體(含電池與充電器)
  • 羅技C270 Webcam
  • 18650鋰離子充電電池3枚
  • 18650鋰離子充電電池3串可充電電池盒
  • AC110V轉DC 12V / 4A 電源供應器
  • Donkey Car固定車體架(雷切或3D列印製成)
  • DC電源插頭(5.5-2.5mm)
  • PCA9685 I2C 16通道PWM控制器

Tinker Edge-T的電路板 (左) 與Google Coral Dev Board (右) 的外型比較

從電路外型來看,基本上可以看出在散熱片下的便是Coral的TPU運算核心的位置,兩者都採用了HDMI的視訊輸出,也都具備有線網路RJ-45的接頭母座,兩者都採用了和Raspberry Pi相仿的外型與固定螺絲孔位。

Tinker Edge-T也都採用了和Raspberry Pi相仿的GPIO埠格式,因此在IO模組的選用上,便可以和大多數的Raspberry Pi擴充模組相通用,這對於後續的Donkey Car的硬體安裝,便能方便相互參考,並且採用相似的控制驅動方式,ASUS對於Edge-T的設計也頗為貼心,基本上不同屬性的GPIO接腳,便會採用不同的顏色底座進行區別,這樣可以防止誤接接腳的問題產生。

Tinker Edge-T和Coral Dev Board在電源供應的方式是有明顯的差異,Tinker Edge-T採用了DC電源接頭5.5-2.5mm的規格,並且必須供電12V,這和Dev-Board採用USB Type-C  5V供電是有差異的,這也會讓Donkey Car在設計電源的時候,必須針對這部分的供電進行重新設計。

本次設計Donkey Car的供應電源基本上是採用鋰離子充電電池18650串聯3枚產生約12V左右的電壓,使用的是可進行串聯充電的18650三串電池盒,透過這個電池盒對Tinker Edge-T供電。

Tinker Edge-T的電源啟動基本上是採用所謂的待機啟動的方式,啟動電源的開關基本上是採用無段按鈕開關進行設計即可,基本上只要把下圖黃色框起的位置的2Pins排針短路即可啟動Tinker Edge-T,請注意2Pins的排針是靠近電路內側的2Pins排針,記得不要接錯了,在按下啟動按鈕後,電路板上的LED便會亮起,透過電路板上的LED亮起的數量,便可以大略預估目前的電壓高低狀況。開機後風扇會轉,等到風扇停了,應該就會看到HDMI螢幕的畫面。

安裝Linux-Debian作業系統在Micro SD-Card記憶卡

Tinker Edge-T的作業系統基本上可以安裝在內建8GB的eMMC記憶體中,但這次我們將在Micro SD記憶卡上安裝作業系統,以利後續各種套件程式的安裝無容量限制之虞。

安裝作業系統到Micro SD-Card必須將Tinker Edge-T的指撥開關進行正確的設定,指撥開觀的位置基本上在電路板的背面,四個開關分別編號為1、2、3、4,若要設定為Micro SD-Card開機,則指撥開關的設定順序為ON、OFF、ON、ON。

開機選擇指撥開關設定
Boot mode Switch 1 Switch 2 Switch 3 Switch 4
Serial download Off On [Don’t care] [Don’t care]
eMMC On Off Off Off
SD card On Off On On

Donkey Car所使用的Micro SD-Card 作業系統

基本上Tinker Edge-T在Donkey Car專案採用的作業系統是Linux Debian,以下提供這次為Donkey Car專案所製作的映像檔超連結:http://gg.gg/tinker_edge_t_donkeycar

本次Donkey Car專案是以Win32DiskImager這套軟體進行燒錄,Micro SD-Card 容量請採用8GB以上,先在個人電腦上燒錄作業系統,再將Micro SD-Card移至Tinker Edge-T的記憶卡插槽中。

本次專案所製作的作業系統內含有OpenCV、Tensorflow、Donkey Car等相關控制套件程式,Donkey Car相關安裝參考網址如下:http://docs.donkeycar.com/

由於Donkey Car在操作的過程需要採用Wi-Fi的方式去進行遙控,因此必須在終端機下去設定相關Wi-Fi的參數環境,相關設定流程請參閱雲端硬碟超連結中的「Tinker_Edge-T自動連線多個WiFi網路.docx」檔案的內容即可。

Donkey Car的遠端連線則是以SSH的方式進行,相關的設定流程請參閱雲端硬碟超連結中的「Tinker_Edge-T之SSH連線設定.docx」,透過SSH便可以透過MobaXterm進行遠端連線控制,MobaXterm軟體的官網下載連結如下:https://mobaxterm.mobatek.net/

好了,「上篇」有關Edge-T的基本操作介紹就到這裡告一段落,筆者預計在「中篇」安排Donkey Car軟體與硬體的相關安裝與Donkey Cary在Tinker Edge-T控車流程,以及在「下篇」安排Donkey Car的人工智慧模型的訓練與推論應用,敬請各位讀者拭目以待囉!

MIT App Inventor 新增 dicationary 字典資料型態

$
0
0
作者/攝影  曾吉弘

 

MIT App Inventor 新增 dicationary 字典資料型態

MIT App Inventor 在2020年2月份的更新(nb181c / nb182)新增了字典(dictionary)資料型態,有這類需求的朋友歡迎參考它的指令說明,對於 xml 與 json 等資料格式也支援互轉。當然,dictionary 在用法上與 list 相當類似,例如取得指定欄位資料指令 (get value for key),與 list 的 look up in pairs 指令相當類似,這就看大家喜歡哪種方式囉。

直接登入 MIT App Inventor 之後就可以在 Blocks 頁面的 Built-in 內建指令中看到 Dictionaries 指令了,顏色區別上使用沉穩的深藍色(你在幹嘛)。

建立 dictionary 型態變數,需要指定 key 與 value。到時候就是要透過 key 來找 value。value 可用的型態包含 number、text、dictionaries、booleans 與 lists,結構相當有彈性,要做多少層都可以,只是太多層在爬取上會比較辛苦。請參考以下的 block:

等於這樣的內容:

{
  "name": "CAVEDU Education",
  "phone": "0223062900",
  "facebook page": "https://www.facebook.com/CAVEEducation/",
  "location": {
    "latitude": 25.030787,
    "longitude": 121.504242
  }
}

{
  "people": [{
    "first_name": "Tim",
    "last_name": "Beaver"
  },{
    "first_name": "John",
    "last_name": "Smith",
  },{
    "first_name": "Jane",
    "last_name": "Doe"
  }]
}

json editor online 這類的網站來看看:

以下是常用的 dictionaries 指令簡介:

查找 get value for key / get value at key path

使用 get value for key 指令在 cavedu 這個字典中查找 “name” 這個 key 所代表的 value,回傳結果為 “CAVEDU Education“。

也可以使用 get value at key path 做到相同的效果,它是上者的進階版。但不再透過指定 key 來取得 value,這個指令可接受由 有效 key 與通過資料結構路徑的數字所組成的清單。例如上述兩個指令的結果是一樣的,都是 “CAVEDU Education

取 location 看看(格式依然為 dictionary)

走過字典產生清單 list by walking key path 指令

list by walking key path 指令運作方式與 get value at key path 類似,差別在於前者回傳為數值所組成的清單,後者則回傳單一值。運作方式是從指定 starting at the given dictionary,並根據指定路徑來拜訪其下的樹狀結構。與 get value at key path 的另一項差別在於,它的 path 是由三個項目所組成:dictionary keys、清單索引值 與 walk all at level 指令。如果指定了 key 或 index 的話,路徑就是由樹狀結構的該點開始。如果使用 walk all at level 指令的話,就會依序納入該點之後的所有值(廣度優先),直到走完整個路徑為止。路徑上的所有元素都會依序被加入成一個 list。

例如以下指令就會把 cavedu 中所有內容顯示出來。

set value for key

加入新的 key – value 組,如果存在就覆寫,不存在就建立新的一組。例如以下指令就是在 cavedu 變數中加入 “city”: “台北” 這一組。

用這組指令來檢查一下,應該會回傳 “台北” 這個結果。

移除指定 key 的這個 key – value 組 

 

相關文章:

華碩Tinker Edge-T在Donkey Car的應用—中篇(Tinker Edge-T在Donkey Car的安裝與設定)

$
0
0

上篇主要的內容主要是著重在Asus的Edge-T基本環境的設定(文章連結,請點我),在基本環境建置完成之後,便可以進行相關Donkey Car套件的安裝。

Tinker Edge-T 基本上採用與樹莓派相同的GPIO配置,在安裝Donkey Car的流程上,亦大部分與官網上建議的樹莓派流程類似,因此下篇的介紹,主要是著眼在Donkey Car的安裝流程介紹與基本測試,請注意,若要進行這個階段的安裝與設定,請務必按照上篇所介紹的安裝內容進行安裝完成後,才能夠正常安裝Donkey Car的套件。

作者/攝影 曾俊霖
時間 約4小時
難度

★★★☆☆

材料表

一、PCA9685硬體介面安裝流程介紹

Donkey Car在驅動馬達的電路基本上是透過PCA9685這個PWM電路板進行控制,PCA9685是以I2C的方式與Tinker Edge-T的GPIO介面溝通,在這部分Tinker Edge-T 的系統設定在I2C和樹莓派有些差異,官網上的介紹是第2組I2C,而Tinker Edge-T則只能使用的第3組I2C,在安裝時請特別注意PCA9685的接腳都必須按照Edge -T 的GPIO接腳位置對應接好,5V與V+接到GPIO的5V,GND則只要接到GPIO的任何一組GND皆可;而伺服馬達與直流馬達的PWM控制線則分別接到PCA9685的「編號0」與「編號1」的PWM輸出接腳。

編號0的PWM接腳接直流馬達PWM控制

編號1的PWM接腳接伺服馬達舵機PWM控制

 

二、PCA9685的軟體設定

請按照以下流程,安裝PCA9685的軟體套件,請注意,PCA9685軟體套件基本上必須確實安裝完成。

sudo apt-get install git build-essential python-dev

sudo pip install adafruit-pca9685

 

安裝完成後,請透過以下指令檢查Edge-T是否找到PCA9685。

sudo i2cdetect -y l

三、在Edge-T系統安裝相依套件程式

請複製以下指令,進行相關相依套件程式的安裝,本次主要將要透過虛擬環境(virtualenv套件)進行所有過程的操作。

sudo apt-get install build-essential python3 python3-dev python3-pip python3-virtualenv python3-numpy python3-picamera python3-pandas python3-rpi.gpio i2c-tools avahi-utils joystick libopenjp2-7-dev libtiff5-dev gfortran libatlas-base-dev libopenblas-dev libhdf5-serial-dev git ntp

四、在Edge-T系統安裝OpenCV相依套件程式

OpenCV主要當成影像處理的介面程式,安裝過程如下:

sudo apt-get install libilmbase-dev libopenexr-dev libgstreamer1.0-dev libjasper-dev libwebp-dev libatlas-base-dev libavcodec-dev libavformat-dev libswscale-dev libqtgui4 libqt4-test

五、設定虛擬環境

本次專案使用的虛擬環境名稱為(env),進入虛擬環境的方式為source ~/.bashrc,而離開虛擬環境的指令為deactivate

python3 -m virtualenv -p python3 env --system-site-packages
echo "source env/bin/activate" >> ~/.bashrc
source ~/.bashrc

六、安裝Donkey Car主要控制程式

1.建立操作資料夾

mkdir projects
cd projects

2.至github取得donkeycar程式,並且安裝tensorflow套件。

git clone https://github.com/autorope/donkeycar
cd donkeycar
git checkout master
pip install -e .[mendel]
wget https://github.com/lhelontra/tensorflow-on-arm/releases/download/v1.14.0/tensorflow-1.14.0-cp35-none-linux_aarch64.whl
pip install tensorflow-1.14.0-cp35-none-linux_aarch64.whl

七、安裝OpenCV套件程式

sudo apt install python3-opencv
pip install opencv-python

八、建立Donkey Car屬性內容

donkey createcar --path ~/mycar
cd ~/mycar
sudo nano myconfig.py
找到並修改PCA9685_I2C_BUSNUM = 2 <<請注意!Busnum必須改成2號>>
找到elif cfg.CAMERA_TYPE == "CVCAM":
            from donkeycar.parts.cv import CvCam
            cam = CvCam(image_w=cfg.IMAGE_W, image_h=cfg.IMAGE_H, image_d=cfg.IMAGE_DEPTH, iCam=1)  <<請注意!iCam必須改為1>>

經過以上8個主要的流程動作,基本上Tinker Edge-T在Donkey Car專案的軟體環境就已經設定完成了,那我們將在「下篇 – Tinker Edge-T Donkey Car的神經網路自駕車訓練與測試」的章節介紹如何調整車輛的性能與如何進行神經網路訓練與測試。

若使用者不想處理這些繁瑣的設定流程,其實本篇文章也已經建立好相關的映像檔連結,這個映像檔就是依照上述的流程所設定製作而成,使用者可以直接下載並燒錄至SD卡當中,這個映像檔(EDGE_T_CAR_1024.img) 基本上在「上篇(Tinker Edge-T操作介紹)」就已經有提供了。

以下再列出這個下載連結供使用者參考:http://gg.gg/tinker_edge_t_donkeycar

 

相關文章:

App Inventor 上傳資料到 Google試算表 –作法1結合Google表單

$
0
0
作者/攝影  曾吉弘

 

本範例要說明如何讓 App Inventor 寫入資料到 Google 試算表中。先破題,做法是透過 Google 表單來寫入接受這個表單回覆的試算表。.aia 原始檔請由此下載:http://www.appinventor.tw/googlespreadsheet

如果要更完整的功能像是 SQL 語法的話,需要使用 script,之後有機會再寫一篇吧!

 

Google 表單與接受回覆的試算表

請從您的 Google 頁面(例如 Gmail),建立一個 Google 表單

新增五個欄位:班級 / 座號 / 姓名 / 體溫 / 休息時間,每個欄位的內容都選擇簡答。請先不要選必填,否則忘了填的話,會因為必填欄位無內容而使得表單無法送出。我們可以在App Inventor 中去檢查 TextBox 是否有內容即可。

表單建好應該長這樣子,有五個欄位

點一下回覆,按一下試算表的符號。接受回應也要打開喔!

這時會開啟另一個標籤來檢視這個試算表,可以看到剛剛新增的欄位(班級 / 座號 / 姓名 / 體溫 / 休息時間),請注意時間戳記會自動產生所以不需要建立。這裡已經有一些我測試用的數值,首次開啟的話,這個試算表會是空白的。

 

回到表單,按一下右上角的三個小點,選擇[取得預先填入的連結],會再開啟新的標籤,網址會長這樣:https://docs.google.com/forms/d/XXX/prefill,結尾與之前不一樣。

隨便填一些數字,因為我們要拆解它所產生的連結,之後 App Inventor 就可以把 TextBox 內容組合成正確的網址送出就好。

 

填好之後,按下表單最下面的取得連結,再按複製連結就會直接複製到您的剪貼簿,用 Ctrl + V 貼上來看看,會長這樣(XXX代表該表單的網址,在此省略,):

https://docs.google.com/forms/d/e/XXX/viewform?usp=pp_url&entry.2109761637=OOO&entry.183944744=@@&entry.17455618=***&entry.1288165757=$$$&entry.1936689391=###

之後只要點擊一次這個連結,就會送出一次預填資料的表單,可以直接檢查是否收到回覆。後續在 App Inventor 中就會透過 Web 元件去讀取這個網址 (Web.Get),但 viewform 要改為 formResponse

拆解如下:

  • 表單連結:https://docs.google.com/forms/d/e/XXX/viewform (XXX代表該表單的網址,在此省略)
  • 準備下參數:?usp=pp_url
  • 欄位與值,從上面的大連結可以看到一個欄位與值是由 entry***=值,這樣的格式組合起來的,中間再用 & 隔開即可。以班級欄位來說,就是這樣:
    • &entry.2109761637=ABC (在班級欄位中填入ABC,中文也可以但會轉成 %A6%BA 的編碼。
    • 接著有幾個欄位就有幾組

Designer

    新增一個 App Inventor 專案,版面大概長這樣,會用 Web 元件來取得 Google 表單連結以及 Notifier 元件來顯示是否有欄位未輸入。

Blocks

   主要的功能就是在按鈕的 click 事件中,透過 web.get 去取得表單網頁。其他都是一些檢查用的附加功能。請注意表單網址中的 viewform 要改為 formResponse

   如果有任何一個欄位為空的話,就會用 notifier 跳出錯誤畫面。為避免程式太瑣碎,這裡檢查五個 TextBox 改用自定義的副程序(checkEmptyInput)來處理。

   如果沒錯,更新 web 元件網址並執行一次 web.get。

 web.get 之後,如果 reponseCode = 200 代表成功寫入,就呼叫另一個自定義的副程序 (clearInput) 來清除 TextBox 內容。

checkEmptyInput 是屬於有回傳值的副程序,在此要檢查五個條件的聯集 (邏輯的 or ),只要任何一個欄位沒有內容,這個副程序就會回傳 true,讓 notifier 顯示錯誤畫面。

執行畫面

    經過一番設定,終於可以開始玩啦!請看一下操作畫面:

Viewing all 678 articles
Browse latest View live