RAPIROのサンプルソースコードを読む

これからRAPIROを色々いじっていこうと思ったら、とにもかくにもRAPIROの動きを制御しているArduinoのソースを理解しないといけません。ソースコードはこちらで公開されています…が、うーん、要所要所、よくわかりません。サーボモータとかもこれまでいじったことがないから、基本的なお作法も全然わかりません。

でもわからないはわからないなりに何とかしないと進まないので、ソースコードを眺めながら、とにもかくにもメモしていきます。理解が間違っている箇所も大いにあるかと思いますが、ご了承ください。

  • プリセットの各動き(#M1〜#M9)は、すべて8個のフレームパターンで構成される。各フレームは、16個のuint8_t型の値(motion)で定義されている。フレームパターンの数はMAXFNで変更可能。
  • 各フレームを定義するmotionの値は、先頭から順に以下のとおり。設定可能な値の範囲は、自分の組み立て環境における目安。bufferTimeの役割がまだ不明瞭。bufferTime×100[ms]がその動作フレームを完了させるまでに許容する時間?
    • 頭部 水平回転角度(Head yaw)(左)180 <- – -> 0(右)
    • 腰  水平回転角度(Waist yaw)(左)180 <- – -> 0(右)
    • 右肩 上下角度(R Shoulder yaw)(下)0 <- – -> 180(上)
    • 右肩 開き角度(R Shoulder pitch)(閉)90 <- – -> 180(開)
    • 右手 開閉角度(R Hand grip)(閉)50 <- – -> 110(開)
    • 左肩 上下角度(L Shoulder yaw)(下)180 <- – -> 0(上)
    • 左肩 開き角度(L Shoulder pitch)(閉)90 <- – > 0(開)
    • 左手 開閉角度(L Hand grip)(閉)130 <- – -> 70(開)
    • 右足 水平回転角度(R Foot yaw)(左)0 <- – -> 180(右)
    • 右足 足首のひねり角度(R Foot pitch)(内)0 <- – -> 180(外)
    • 左足 水平回転角度(L Foot yaw)(左)0 <- – -> 180(右)
    • 左足 足首のひねり角度(R Foot pitch)(内)180 <- – -> 0(外)
    • 眼の赤色成分(R)0 <- – -> 255
    • 眼の緑色成分(G)0 <- – -> 255
    • 眼の青色成分(B) 0 <- – -> 255
    • bufferTime
  • サーボに与える数値と実際に各部分の位置の対応は理解したが、いちいち頭の中で変換するのも面倒なので、できれば一枚絵を作りたいところ。←こちらで作成済み。値の範囲も、こちらの方がもう少し正確。
  • uint8_t型(=unsigned char, 1 byte)で定義されている変数は、
    • motion[動きの定義の最大数][動きのフレームの最大数][16]
    • eyes[3]
    • bufferAngle[サーボの最大数]
    • tempAngle[サーボの最大数]
    • bufferBright[3]
    • tempBright[3]
    • bufferTime
  • int型(2byte、こちらを参照)で定義されている変数は、
    • trim[サーボの最大数] … サーボの調整用
    • nowAngle[サーボの最大数]
    • targetAngle[サーボの最大数]
    • deltaAngle[サーボの最大数]
    • nowBrright[3]
    • targetBright[3]
    • deltaBright[3]
    • remainingTime
  • servo変数のwriteの引数の範囲は、0〜180(単位:度)。こちらを参照。
  • 要所要所でシフト演算(7ビットシフト)が入る理由がよくわからない。uint8_t型(1byte)の値をint型(2byte)の変数に格納するときに左シフトを実行し、int型の値をwriteするときに右シフトを実行している。正しい計算結果を得るために必要?このあたりを参照してみたものの、まだ理由をはっきり理解できていない。
  • 基本のloop()は、【Serial入力のチェック(コマンド受付)】と【動作状態のチェック】を繰り返している。
  • 【Serial入力のチェック(コマンド受付)】の内容を見てみると、”#M”以外に、”#P”, “#Q”, “#C”も受け付ける模様。それぞれのコマンドの内容は未確認。
  • 【動作状態のチェック】では、現在の経過時間がendTimeを越えていなければ、remainingTime, nowAngle, nowBrightを更新し、サーボとLEDに値を書き込む。現在の経過時間がendTimeを越えていれば、次の動作フレームを設定する(nextFrame)。
  • endTimeは、nextFrame -> nextPose内で、現在の経過時間+bufferTime×100[ms]で設定される。
  • nextPose内でのdeltaAngleの計算の仕方がまだ不明瞭。

一旦、ここまで。もう少しちゃんと理解できたら、そのときにまた別記事を書きます。