2018年3月4日 星期日

Otto機器人動作之程式碼分析2(Otto Source Code Understanding Part II)

Otto機器人動作之程式碼分析(Otto Source Code Understanding Part I)一文中沒有看到前進、後退、向左轉、向右轉等動作,於是此文就要說明筆者的閱讀心得。
Otto程式中有很多的動作都是呼叫Oscillator.cpp 裡的 Oscillator::refresh()函式

_inc 是以 360除以迴圈次數算出來的。
迴圈次數是以動作總時間除以每次取樣時間。

不過筆者是用別的方式,如下的mBlock積木:


根據refresh()副程式使用sine正弦曲線來產生平順的動作
例如要將馬達角度從60轉到90度時,不是使用下面的動作,
【設定馬達角度60】
【等待x秒】
【設定馬達角度90】

而是使用下面方法
【設定馬達角度60】
重複底下步驟直到跑完一個sine週期就是 2 * PI (360 度)
1.【設定馬達角度60 + 增加(些許)角度】
2.【等待n毫秒】

根據fresh()副程式,筆者設計出上圖的動作(action)積木指令。

成果影片:


讀者可以試著改變動作積木指令中的 LF、RF、LL、RL四個參數的值,例如將
前進積木從原本的
動作 30, 30, 20, 20 , 1 改成 動作 45, 45, 30, 30, 1

看看會怎麼樣。


給讀者思考的問題:
  1. 為什麼前進的動作角度要設定為 30, 30, 20, 20?
  2. 為什麼向左轉的動作角度設定為 30, 10, 20, 20?
  3. 可以不要使用正玹(sine)函數來完成前進、後退、向左轉、向右轉,這四個動作嗎?