2017年9月19日 星期二

ROSA 系統開發 39 ─ OTTO like 的程式碼釋出

圖片來自 機甲人形師

這一篇說明 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 有引用兩個外部程式庫,因此 mBot.zip 和 SoftwareSerial.zip 請與 OTTO.ino 放在同一目錄。

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

沒有留言:

張貼留言