[Robotics Studio] 開始玩機器人啦 -- Day2
有沒有說錯, 第二天就開始玩機器人啦?
因為 VPL 蠻簡單的, 所以我們第二天就可以看見機器人(嚴格說應該是車子吧?)啦...
從新的 VPL 專案開始, 為了要看見車子, 我們從 service 選一個 Generic Differential Drive 放到 Diagram 上,
(Generic Differential Drive 意思就是通用差速驅動, 關於差速的說明, 可以參考 Wiki 的 差速器 , 基本上就是同一軸的左右輪胎可以轉不同的速度的車子)
對 GenericDifferentialDrive 點選右鍵, 選 Set Configuration
會跳到 GenericDifferentialDrive 的設定畫面, 我們選 Use a manifest
所謂的 manifest, 在這裡指的是一整個拖拉庫的服務全部都包起來啦...
現在當然還沒能力創建一個 manifest, 就直接匯入現有的.
然後選這次的活動獎品(目前只有虛擬寶物), LEGO.NXT.Tribot.Simulation.manifest.xml
Okay, 現在你的設定應該是如下圖
現在你可以存檔, 開始執行看看會不會有機器車子跑出來了...
什麼? 你說你等了好久都沒看到, 又發現跳出 Browser 跟你講 ERROR ??
你該不會是用 Vista, 又跟我一樣把 Visual Programming Language Express Edtion 裝在那個 Program Files 目錄當中吧?? 如果是, 恭喜你, 請把 Visual Programming Language Expression Editon 改用系統管理員身分執行吧, 請在開始選單上面對 Visual Programming Language Expression Edtion 點選右鍵, 選"以系統管理員身分執行" , 這樣才不會有權限上的問題歐...
解決了權限, 再執行一次就應該可以看到如下畫面啦.
啊...這樣能幹嘛...
因為我們什麼也還沒開始寫啊, 所以現在就只能移動攝影機, 看看畫面這樣而已, 可以用上下左右跟滑鼠操作攝影機移動.
那我們趕快來寫點程式來玩它吧^ ^
為了能夠操控裏頭的那個虛擬寶物(機器車子), 我們先從 service 拖一個 Direction Dialog 到 Diagram 上, 這個 Direction Dialog 會在系統中產生一個有上下左右以及 Stop 的五鍵, 好讓我們可以操控虛擬畫面裡面的車子,
現在你的 Diagram 裡面應該有兩個 service 啦.
接著要介紹 Calculate 這個 Basic Activities, 這個 Calculate 活動呢, 除了可以做算式運算, 也可以負責拆解訊息, 在 VPL 裡面, 訊息可以透過 Join 活動組合起來, 也可以透過 Calculate 活動拆開, 你可以把訊息想成是某個 Class 的物件, 而 Calculate 就是負責調用該物件的屬性, Join 就像是把多個屬性合併成為一個新的 Class.
當然 Class 的說明是為了讓那些習慣寫 Code 的人來了解的, 事實上, VPL 內部的訊息就是訊息, 可以透過 Join 任意組合以及透過 Calculate 任意拆解或運算其中的子訊息.
寫了一堆, 還是不如直接操作比較容易了解.
把 Calculate 拉到 Diagram 當中之後, 我們把 DirectionDialog 的 Notification (右下方的紅圈) 拉到 Calculate , 表示把 DirectionDialog 的通知餵給 Calculate, 你會看到 Connections 對話框彈出來:
這個對話框問我們要把 DirectionDialog 的三種通知 (ButtonPress : 表示按鍵被按下了, ButtonRelease 表示按鍵被放開了, DialogStateChange 表示對話框的狀態改變了) 哪一種餵給 Calculate 呢, 我們選 ButtonPress.
然後 DirectionDialog 就跟 Calculate 連上了, 接著我們要選 Calculate 中間的輸入, 會有提示下拉, 我們選 Name, 表示要從 ButtonPress 訊息當中, 拆解出 Name 這個訊息 (被按下的按鈕名稱) , 這個被按下的按鈕名稱將會被輸出到 Calculate 的右端.
接著, 我們再從 Basic Activites 當中拉一個 Switch 活動,
這個 Switch 活動, 就像是 C++ 當中的 Switch, 代表根據多個不同的訊息, 我們要採取多個不同的輸出, Switch 左下方有一個 "+", 表示你可以新增加一個訊息分岔點, 我們一共要五個 (因為有五個按鈕) , 這五個按鈕的名稱分別為 "Stop", "Forwards", "Backwards", "Left", "Right" , 新增五個後通通給它填好,然後把剛剛 Calculate 的右邊訊息餵給 Switch, 現在應該如下圖:
接下來要弄 VPL 當中最辛苦的資料設定 (相較於寫 Code 設定資料而言), 請從 Basic Activities 當中拖拉 7 個 Data 活動, 型態都是 double , 值分別設定為 0, 0.8, -0.8, 0.6,-0.6, 0.6, -0.6 (你可以用複製貼上來加速動作), 然後一一設定連線, 我們把 "Stop" 連到 0, "Forwards" 連到 0.8, "Backwards" 連到 -0.8 , "Left" 連到 0.6,-0.6 兩個 Data, "Right" 則是連到另一組 0.6,-0.6 Data , 如下圖:
現在我們要開始 Join, Merge 這些資料輸出了, Join 剛剛介紹了, 是負責把多個訊息合併成為一個, Merge 也是, 但不同點在於, Join 是把多個訊息組合成為子訊息, 一起輸出, Merge 則是左邊進來右邊出去, 沒有任何改變.
請把 0, 0.8, -0.8 三個訊息 Merge, 把 0.6, -0.6 兩組訊息 join, 然後分別填上 left, right, 如下圖: (請注意, "Left" 那一組的 Data 輸出 剛好跟 "Right" 這一組的 Data 輸出, 採取不同的 left, right join 方式)
讓我們先解決上面的 Merge, 把它的輸出餵給一開始的 GenericDifferentialDrive , 你會看到對話框彈出來, 我們要把 Merge 的輸出對應到車子的油門 (SetDrivePower)
按下 OK, 你會看到另一個對話框, 分別指定左邊輪子的油門跟右邊輪子的油門, 我們通通設為 value.
這樣我們就完成了前進, 後退, 以及停止啦, 等不及的人可以先按 F5 (Run 選單下面的 Start) 玩玩看會不會前進後退.
緊接著趕快把 "Left", "Right" 設定好, 我們把這兩組 Join 好的資料通過 Merge , 再輸出給 GenericDifferentialDrive , 啊, 一個 GenericDifferentialDrive 不願意吃兩個輸入耶, 沒關係, VPL 當中, 物件可以有多個分身, 只要 Name 屬性相同, 就表示是相同的物件. (那些沒有 Name 屬性的物件, 都是基本物件, 一定不同). 所以你可以複製一個分身, 或者再拖拉一次, 系統會問你是否要新增還是使用原來的物件. (當然是使用原來的).
複製好 GenericDifferentialDrive 的分身後, 把 "Left", "Right" 兩組 Join 好的資料透過 Merge 再餵給它, 你又看到 Connections 的對話框了, 一樣選 SetDrivePower, 接著 Data Connections 對話框要設定如下:
最後, 你的程式就如下圖所示:
噹噹, 恭喜你完成可以操控機器車子的程式囉,
你可以試玩看看, 但是要常常 Stop 歐, 不然一定會像我一樣翻車的
我可不知道翻車要怎麼救...
明天我們再來改良吧^ ^