圖片來自 機甲人形師 |
這一篇說明 OTTO like 機器人 (以下簡稱 OTTO) 的 ROSA 程式碼一些細節以及開發極樂淨土舞過程的想法。
開始動工是拿 RWG 6x2 Spider 的 ROSA 程式碼改寫,蜘蛛的程式一跑,OTTO 馬上跌倒鼻青臉腫,就只好一樣一樣調整,ROSA 程式碼看不懂沒關係,只要你會設定調整,就可以一一解決相關問題。ROSA V15 程式中,玩家基本上搞懂 OTTO_Define.h 與 OTTO_Motion.h 兩個檔案,就可以編出你自己 OTTO 特殊舞蹈動作。
先看 OTTO_Define.h,因應不同的狀況可以調整它們:
//1. 選擇那一類 Arduino 板
#define Nano // UNO // mBot // motoduino // Mega //
//2. 選擇 OTTO 幾隻腳,那一種組裝法?
#define OTTOx4 // OTTOx6 //
//3. 選擇 BT 高低速通訊
#define BT_57600 // BT_9600 //
//4. 選擇那一類紅外線遙控
#define IR_KEYES // IR_MBOT // IR_AUDIO // IR_CARMP3 //
//5. 紅外線遙控可否處理 #13## 之類指令
#define ENABLE_IR_COMMAND
//6. 選擇 debug 訊息傳送至何處
enum{USB = 1, BT, IR};
#define DEBUG_INTERFACE USB // BT //
//#define DEBUG_IR // 檢查紅外線遙控器原始碼
//#define DEBUG_IRKEY // 檢查紅外線遙控執行程序碼(內碼)
//#define DEBUG_IRWORD // 檢查紅外線文字碼
//#define DEBUG_ACTION // 檢查動作執行程序
//#define DEBUG_SERVO // 顯示 SERVO 狀態
//#define DEBUG_MUSIC
#define DEBUG_COMMAND // 檢查指令狀態
//#define DEBUG_NOW // 檢查系統時間
ROSA V15 程式,只先加入一些重要指令功能,另外 SG90 對應 Arduino 的 pin 腳,可以從 SERVO_PIN[] 修改,
const byte SERVO_PIN[] PROGMEM =
// 0, 左腿上肢,左腿下肢,右腿上肢,右腿下肢,XXXX,XXXX
#ifdef Mega
{ 0, 17, 16, 15, 14, 4, 5};
#else
{ 0, 4, 5, 6, 7, 9, 10 };
#endif
再看 OTTO_Motion.h,在動作編輯時,發現 OTTO 的左右姿勢不對稱,有些姿勢會因重心不對而跌倒,所以就以下列特殊字定義特定角度,並用量角器實際觀測,這樣可以確保左右姿勢對稱,那如何控制角度呢?ROSA 預留 _SERVO 指令,可以經由 USB 或 Bluetooth 傳送控制,例如 _SERVO LR3, 30,idl, hon,代表左腿上肢右轉 30° (但是要設定 62°,參考下表),左腿下肢設定 30° ,右腿上肢維持不變 (idl 是 idle 的縮寫),右腿下肢持續通電強力定角 (hon 是 hold on 的縮寫)。修改下表就可以將每個馬達角度精準定位,由此可知玩具級的 SG90 每個馬達變異度很大。
// Servo 的角度定義 -------------------------------------
// 右腿上肢
#define RR6 30 // 注意 LR4 才不會卡到
#define RR4 40
#define RR3 65
#define RMD 100
#define RL3 135
#define RL4 150
#define RL6 166
#define RL9 180
// 左腿上肢
#define LR9 0
#define LR6 28
#define LR4 48
#define LR3 62
#define LMD 90
#define LL3 125
#define LL4 140
#define LL6 155 // 注意 RL4 才不會卡到
// 右腿下肢
#define RU9 0
#define RU6 20
#define RU4 35
#define RU3 47
#define RU2 59
#define RSD 81
#define RD3 110
#define RD4 126
#define RD6 141
#define RD9 180
// 左腿下肢
#define LU9 0
#define LU6 30
#define LU4 46
#define LU3 63
#define LU2 73
#define LSD 95
#define LD3 123
#define LD4 138
#define LD6 155
#define LD9 180
#define hon 251 // hold on
#define hof 250 // hold off
#define idl 255 // Servo idle
調好上表角度,就可以利用它們填寫動作,下面是右轉的例子,
const byte RUN_R[] PROGMEM = { // turn right
// 0, 1, 2, 3, 4, 5, 6,
_SERVO, hon, hon, hon, hon, hof, hof, //0
_LOOP, 2, idl, idl, idl, idl, idl, //1
_SERVO, LMD, LD3, RR4, RU2, idl, idl, //2
_SERVO, LMD, LSD, RL4, RU2, idl, idl, //3
_SERVO, LMD, LSD, RMD, RSD, idl, idl, //4
_NEXT, 4, idl, idl, idl, idl, idl, //
_SERVO, hof, hof, hof, hof, hof, hof, //
_STOP,
};
在編輯動作時,伺服馬達 1 ~ 4 角度設得如何?很難從文字代碼理解,因此 ROSA V15 開始,可以直接 COPY 指令貼到 Arduino IDE 序列埠監控視窗,把指令傳入給 OTTO,機器人就會動作到該角度停格,這樣很方便實際觀測機器人每一步動作,而且可以微調,我就沒有使用任何動作編輯器,因為在電腦上以軟體模擬動作調整可能跟實際動作有落差,但是指令控制則動作完全一致。上面右轉的例子,第 2,3,4 列會重複兩次。
在還沒編舞之前,仿生機器人應該先編輯基本動作:前進、後退、左轉、右轉、停止,你可以當作是練兵,因為基本動作弄不出來,舞當然也不用編了,另外在弄動作的時候,你也可以藉此機會搞清楚角度與姿勢之間的關聯,就這樣把基本功練起來。
再來談論極樂淨土編舞的經驗,這首曲子長度 217 秒,我是以第四號程序(遙控器四號按鍵)來數拍子,慢慢調整 _TEMPO 時間,直到設定到 _TEMPO, 23 ,才抓準節奏時間。網路查一下簡譜,曲子共 116 小節,每小節有四拍,因此才確認每 0.46 秒一拍,0.23 秒半拍,跟我實測結果一致。
const byte RUN_4[] PROGMEM = {
// 0, 1, 2, 3, 4, 5, 6,
_TEMPO, 23, idl, idl, idl, idl, idl, // 23 x 10 ms
_FAST2, LMD, LSD, RMD, RD3, idl, idl, //
_FAST2, LMD, LSD, RMD, RSD, idl, idl, //
_GOTO, 1,
};
找出曲子的基礎節奏後,最後就是一直看影片,分辨快舞、慢舞的區段,記錄每段舞的起止時間,以及音樂與舞蹈的特徵,再來是發揮創造力編出能配合節奏的舞蹈動作。
如果你對這最新 ROSA V15 版 OTTO like 程式有興趣,請填寫資料,就會提供連結下載,謝謝。
https://docs.google.com/forms/d/e/1FAIpQLSf6u-oOYDRFFxFYKY2ESDevcPeoK78WEx9l2s16gOoIIdMt-A/viewform
const byte RUN_R[] PROGMEM = { // turn right
// 0, 1, 2, 3, 4, 5, 6,
_SERVO, hon, hon, hon, hon, hof, hof, //0
_LOOP, 2, idl, idl, idl, idl, idl, //1
_SERVO, LMD, LD3, RR4, RU2, idl, idl, //2
_SERVO, LMD, LSD, RL4, RU2, idl, idl, //3
_SERVO, LMD, LSD, RMD, RSD, idl, idl, //4
_NEXT, 4, idl, idl, idl, idl, idl, //
_SERVO, hof, hof, hof, hof, hof, hof, //
_STOP,
};
在編輯動作時,伺服馬達 1 ~ 4 角度設得如何?很難從文字代碼理解,因此 ROSA V15 開始,可以直接 COPY 指令貼到 Arduino IDE 序列埠監控視窗,把指令傳入給 OTTO,機器人就會動作到該角度停格,這樣很方便實際觀測機器人每一步動作,而且可以微調,我就沒有使用任何動作編輯器,因為在電腦上以軟體模擬動作調整可能跟實際動作有落差,但是指令控制則動作完全一致。上面右轉的例子,第 2,3,4 列會重複兩次。
在還沒編舞之前,仿生機器人應該先編輯基本動作:前進、後退、左轉、右轉、停止,你可以當作是練兵,因為基本動作弄不出來,舞當然也不用編了,另外在弄動作的時候,你也可以藉此機會搞清楚角度與姿勢之間的關聯,就這樣把基本功練起來。
再來談論極樂淨土編舞的經驗,這首曲子長度 217 秒,我是以第四號程序(遙控器四號按鍵)來數拍子,慢慢調整 _TEMPO 時間,直到設定到 _TEMPO, 23 ,才抓準節奏時間。網路查一下簡譜,曲子共 116 小節,每小節有四拍,因此才確認每 0.46 秒一拍,0.23 秒半拍,跟我實測結果一致。
const byte RUN_4[] PROGMEM = {
// 0, 1, 2, 3, 4, 5, 6,
_TEMPO, 23, idl, idl, idl, idl, idl, // 23 x 10 ms
_FAST2, LMD, LSD, RMD, RD3, idl, idl, //
_FAST2, LMD, LSD, RMD, RSD, idl, idl, //
_GOTO, 1,
};
找出曲子的基礎節奏後,最後就是一直看影片,分辨快舞、慢舞的區段,記錄每段舞的起止時間,以及音樂與舞蹈的特徵,再來是發揮創造力編出能配合節奏的舞蹈動作。
如果你對這最新 ROSA V15 版 OTTO like 程式有興趣,請填寫資料,就會提供連結下載,謝謝。
https://docs.google.com/forms/d/e/1FAIpQLSf6u-oOYDRFFxFYKY2ESDevcPeoK78WEx9l2s16gOoIIdMt-A/viewform
沒有留言:
張貼留言