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の計算の仕方がまだ不明瞭。
一旦、ここまで。もう少しちゃんと理解できたら、そのときにまた別記事を書きます。
ディスカッション
ピンバック & トラックバック一覧
[…] 先日、中途半端にサンプルソースを読んだのですが、それ以前にRAPIROの基本的な構造を押さえとこうと思います。ざくっと言うと、こんな感じになっています。 […]