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

Ping-Lun Liao
2 min readMar 4, 2018

--

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)函數來完成前進、後退、向左轉、向右轉,這四個動作嗎?

Originally published at yunlinsong.blogspot.com on March 4, 2018.

--

--

No responses yet