[Robotics Studio] 改良自走型機器車[III] -- Day7

  • 7530
  • 0
  • 2009-02-17

[Robotics Studio] 改良自走型機器車[III] -- Day7

恩, 昨天覺得機器車太慢, 今天來加快, 但是要如何加快呢, 一般我們開車時速度都是變化的, 在轉彎前就要減速啦, 所以我們不能再用 DriveDistance 這個功能, 因為這個功能在結束時都是緊急煞車, 所以即使你用 DriveDistance 把要行走的距離切分為不同的 Power , 依然會看到車子一直緊急煞車.

目前想到的辦法就是利用 SetDrivePower 或是 SetDriveSpeed 這樣的功能才行, 隨著要行走的距離減少而降低速度(或是馬力).

先做剛剛想到的辦法的其中一小塊, 比較簡單, 就是根據要行走距離以及已經行走的距離, 算出應該要給的速度, 這樣一來, 等一下就可以拿來應用, 而且要改速度只要改這裡, 一次就改好.

為了達到這個目的, 我們先拉一個 Activity , 取名叫 CalculateSpeed 來做.
將 CalculateSpeed 的輸出入設定如下:

image

裡面的程式用看的就明瞭:

image

接著, 我們來設計該如何讓車子走一段距離, 但一路上根據剛剛設定的 CalculateSpeed 來設定速度.
為了達到這個目的, 再弄一個 Acitivity 取名為 RunSmoothLength, 設定輸入只需要一個 Length, 基本上就要有三個狀態值, 應該就是目前的速度 (CurrentSpeed), 已經行走的距離 (StageRunned) , 以及我們設定應該行走的距離 (LengthSetting).
然後一開始流程就把 LengthSetting 設定為 Length, 再根據 Length 是否為 -1 來決定要不要通知結束, 大於 0 的我們就把 StageRunned 設為 0, 啟動 CalculateSpeed 去計算速度後再把值餵給 CurrentSpeed 以及 GenericDifferentialDrive 的 SetDriveSpeed.

最後, 我們設定一個 Timer , 使用 SetTimer, 值設為 100 (表示 0.1 秒後啟動 TimerComplete 通知) 交給 Timer 來驅動下一次 CalculateSpeed, 如下:

image

那我們應該如何收到 Timer 後續的行為呢?
當然是到 Start 這個 Action 裡面去做 Timer 通知, 將該 Timer 複製到 Start 以後,
接受 Timer 的 TimerComplete後, 先做一些判斷, 如果  LengthSetting 大於 0, 我們可以繼續下去,
不然就結束...千言萬語不如一張圖:

image

對啦, 就是這樣, 再把 RunL 作如下的修改:
image

而 RunL 的 Start 改為這樣:

image

終於就大功告成..

現在我們主要 Diagram 的程式如下:

image

當然一開始的值可以任意設定, 這樣你很快就會看到車子撞到停下來.

這回車子跑起來像樣多了...

這回因為簡化過多文字 (這樣大家也比較不會看的累), 如果大家對程式有疑問, 可以下載原始碼來看看:

Day7_Robot.zip