2010年9月18日 星期六

NXT-G v2.0使用心得

NXT-G是LEGO官方所出用以開發MINDSTORMS NXT程式的軟體,其特點就是容易上手,我覺得即使是熟悉程式設計的玩家,剛入手NXT時也應該先使用NXT-G,其原因為


1. NXT-G內每一種方塊,都可算是LEGO為NXT所定義的模組,方塊內的參數,類似於模組的功能設定,藉由使用每一種方塊,可以很快瞭解NXT的種種功能。

2. NXT-G容易設計的特性,很適合想法的初步實驗。

3. 網路上許多人分享其用NXT-G設計出來的程式,瞭解NXT-G,有助於理解這些新創意。

4. 沒用過NXT-G,怎麼算是LEGO玩家^^

不過使用一段時間後,我發現NXT-G也有一些缺點:

1. Loop方塊無法透過條件判斷強迫跳出(類似C的break)。有人會說可以透過變數,當條件成立時,設定該變數為某個值,當變數等於該值時離開Loop方塊。不過這還是有兩個問題
   a. C語言的break一旦呼叫即馬上離開迴圈,不會再執行後面的敘述,而上述方法無法達成馬上離開的功能。
   b. 這種離開方式讓邏輯變得複雜,容易與主要工作混雜,讓程式不易閱讀,也讓程式圖變得很長。

2. 一旦方塊變多,程式圖很長時,反應會變慢,導致不容易瀏覽程式。因此對於複雜程式,不容易找出問題所在。

3. NXT-G雖然有多個stream的觀念,但是stream有點類似thread,但又不太像,並不容易使用。

4. NXT-G也有副程式(或稱function)的概念(My Block),但是必須一開始就規劃好傳進去的參數,透過變數來傳遞參數。一旦參數改變,無法在block內修改,必須重新建立block。

5. My Block內的變數其實是總體變數(global variable),所以如果多個block內的變數名稱一樣(或是主程式內的變數名稱與block內的變數名稱一樣),就會產生不可預期的錯誤(然而這種錯誤並不容易找出原因)。

6. 要顯示變數內容,必須先透過轉換方塊轉成字串,再接到顯示方塊,如果要在前面或後面加上其他說明字串,還要再加上連接字串方塊。由於除錯時常必須將變數顯示在NXT的LCD上,容易造成整個程式變得很長,進而影響瀏覽。

7. NXT-G的Loop方塊如果以馬達旋轉圈數為條件時,即使在Loop前將馬達旋轉圈數重設,並不會影響到Loop方塊的判斷(我抓這個bug抓了好久)。

看來好似NXT-G有很多問題,但是我還是建議一開始拿到NXT時,還是先熟悉NXT-G這套軟體,畢竟使用它是件很愉快的事。


 

9 則留言:

  1. 你好:

    我已經發文介紹您的部落格。

    有關於NXT文章的部落格介紹:生活中的攝影

    http://tw.myblog.yahoo.com/touch_classroom/article?mid=5045

    另外想請教您關於第四點及第七點的詳細情況,謝謝!

    回覆刪除
  2. Re: 探奇自然科學教室 <3818358663479001106>
    謝謝邱老師的介紹。

    關於第四點與第七點,說明的不是很詳細,在這裡做個補充:

    4. My Block透過在程式內將一些block框起來,選擇My Block功能將框起來的block建立成一個獨立的block,如果這幾個blocks有data線連到外面的block,NXT-G會自動建立input或output,這樣就可以把參數傳進My Block內,可是如果要新增,修改傳進去的參數,則無法在My Block內修改,必須要依上述過程重新建立。

    7. Loop block可以選擇檢查!Rotation Sensor轉動圈數做為離開loop的判斷依據, NXT-G也提供獨立的Rotation sensor block可以清除馬達旋轉圈數,可是如果在loop前放壹個Rotation sensor block清除馬達旋轉圈數,並不會讓Loop block檢查!Rotation Sensor轉動圈數從頭記數,舉例說明,我希望馬達每轉360度離開loop,所以我在loop開始前將馬達轉數清為0,假設這個動作是放在另外一個loop內,第一次正確執行,第二次與以後的loop卻認為已經超過360度,所以馬上離開,也就是其判斷的馬達轉數一直累積,無法透過rotation sensor清除。

    我後來的解決方式是將loop改成logic判斷,在loop內用rotation sensor block取得馬達圈數,並設定比較圈數,然後將比較結果送給loop block。

    回覆刪除
  3. 謝謝詳細說明。

    關於第四點,只能利用原有的My Block程式修改,再建立另一個My Block,然後更新替代舊的My Block。

    關於第七點,我寫了一個程式進行測試:

    http://groups.google.com/group/touch_classroom/web/rotationtest.rbt?hl=zh-TW

    Rotation Sensor的Reset是有效的,如果可以的話,還請提供你的程式讓我進行測試。

    如果真的有這樣的BUG,那麼就可以拿來氣氣NI跟LEGO。^_^

    回覆刪除
  4. Re: 探奇自然科學教室 <1217651405243514151>
    邱老師,這個bug還蠻特殊的,我把程式盡量簡化後放上google doc,請您抓下來看看

    https://docs.google.com/leaf?id=0B4I8PSl8D5jbOWI0ODcyYmEtNWQ0OS00NmYzLWIxYmYtMTJjYTZhMmM3OWRm&sort=name&layout=list&num=50

    我的程式有三個回圈,最外層就是一直做,先將rotation sensor清除, 第二層透過rotation sensor檢查超過2050度離開並顯示旋轉度數,第三層則每次轉10度,檢查超過360度離開,理論上每一次都要顯示2050度,但是只有第一次正確顯示,以後都顯示幾度(就是透過rotation sensor檢查馬上超過2050,也就是清除沒發生作用)

    回覆刪除
  5. 你好:

    我無法從連結網址下載檔案,出現不存在的訊息。

    麻煩重新上傳,或是直接email給我,謝謝!

    回覆刪除
  6. Re: 探奇自然科學教室 <3962024842311332644>
    已經改成all public設定,也寄到老師的信箱,請老師收信。

    回覆刪除
  7. 可以下載了,謝謝!

    建議使用Rotation Sensor就正常了>

    還不清楚!Rotation Sensor的整數定義及確實用法

    不過這的確可以視為BUG

    回覆刪除
  8. Re: 探奇自然科學教室 <1839770640598305973>
    謝謝老師花時間檢視,後來我也是改用rotation sensor解決。

    所以loop block的!Rotation sensor能不用還是盡量不用,因為這種bug太難抓了。

    回覆刪除
  9. How to withdraw a $50 casino winnings - DRMCD
    How to withdraw a $50 casino winnings. In 경기도 출장마사지 some 전주 출장마사지 states, the maximum amount you 김해 출장안마 can claim is 사천 출장샵 $50. In some states, you can only use $10 for your bonus. To withdraw 삼척 출장마사지

    回覆刪除