RAPIRO(ラピロ)の歩行を補正する

th_rapiro_walk_1th_rapiro_walk_2th_rapiro_walk_6

ウチのラピロは前からちょっとずつ左にずれながら歩いているなあとは思っていたのですが、左腕にArduinoシールドをつけたことにより、目をつぶるわけにはいかないぐらい左に曲がるようになってしまいました。

ラピロの動作の制御については、公式に配布してくださっているArduinoソースをほぼそのまま使っているのですが、これに記載されているパラメータを、ウチのラピロ向けに修正してやることにします。

「(接地圧が逃げるんなら)合わせりゃいいんだろ!」

と、某スーパーコーディネイターの方も言っておられることですし。

 

さて、まずはどれぐらい曲がっているかの確認。ラピロに赤外線リモコン銃Arduinoセンサシールドを装備させて。

th_rapiro_walk_1

よーいドン。

th_rapiro_walk_2

デスクの上の超短距離で、これぐらい回ってしまいます。うーん、うまい具合にデスクから落ちるのを回避しているとも言えるけれど、今はそれは望んでいないのです。

次に、ラピロの装備を外して再チャレンジ。

th_rapiro_walk_3

ちょっとマシになりましたが、これでも結構曲がります。

 

ということで、まずはこの状態から調整していきます。調整にあたっては、こちらの最下部にまとめられているサーボモータの順番と可動範囲が役に立ちます。

オリジナルソースの「前進」に該当する部分は、こんな感じです。

  { 90, 90,  0, 90, 90,180, 90, 90, 80,110, 80,120,  0,  0,  0,  5}, // 左足前
  { 90, 90,  0, 90, 90,180, 90, 90, 70, 90, 70, 90,  0,  0,255,  5}, // 左足つき
  { 90, 90,  0, 90, 90,180, 90, 90, 70, 70, 70, 80,  0,  0,255,  5}, // 右足上げ
  { 90, 90,  0, 90, 90,180, 90, 90,100, 60,100, 70,  0,  0,  0,  5}, // 右足前
  { 90, 90,  0, 90, 90,180, 90, 90,110, 90,110, 90,  0,  0,255,  5}, // 右足つき
  { 90, 90,  0, 90, 90,180, 90, 90,110,100,110,110,  0,  0,255,  5}, // 左足上げ
  { 90, 90,  0, 90, 90,180, 90, 90, 90, 90, 90, 90,  0,  0,  0,  0}, // (正面)実行しない
  { 90, 90,  0, 90, 90,180, 90, 90, 90, 90, 90, 90,  0,  0,  0,  0}  // (正面)実行しない

 それぞれがどのポーズに対応しているかは上のコメントに書いていますが、自分で調整しながら調べる場合にはラピロのポーズコマンドを使うと便利です。例えば一番上のポーズがどんなものを調べるには、Arduinoのシリアルコンソールから以下のように入力します。

#PS00A090S01A090S02A000S03A090S04A090S05A180S06A090S07A090S08A080S09A110S10A080S11A120T005

#Pでポーズコマンド開始を表し、以下順に、サーボをSxxで指定して、角度をAxxxで表現しています。サーボS00からS11まで、ソースの並び順に角度の値を入れていってやればOKですが、角度は3ケタで入力しないといけないことだけ注意が必要です。2ケタで入力すると、ラピロが反応してくれません。

また、ラストの”0,0,0,5″は、順にラピロの目の色(R, G, B)と、動作に要する時間を表しています。よって、この部分はそのまま書くとR000G000B000T005になるのですが、ポーズのチェックにラピロの目の色は関係ないので、上記のコマンドではRGBの入力を省略しています。Tについては省略不可です。T005で0.5秒になります。T000にすると、そのポーズは無視されます。

さて、ウチのラピロの動作を見た感じ、右足の進みに対して左足の進みが悪いようだったので、右足の進みを弱めて左足に合わせます。こんな感じ。

  { 90, 90,  0, 90, 90,180, 90, 90, 80,110, 80,120,  0,  0,  0,  5}, // 左足前(変更なし)
  { 90, 90,  0, 90, 90,180, 90, 90, 70, 90, 70, 90,  0,  0,255,  5}, // 左足つき(変更なし)
  { 90, 90,  0, 90, 90,180, 90, 90, 70, 70, 70, 80,  0,  0,255,  5}, // 右足上げ(変更なし)
  { 90, 90,  0, 90, 90,180, 90, 90,100, 60, 92, 70,  0,  0,  0,  5}, // 右足前(左足水平軸回転を抑える)
  { 90, 90,  0, 90, 90,180, 90, 90,110, 90,102, 90,  0,  0,255,  5}, // 右足つき(左足水平軸回転を抑える)
  { 90, 90,  0, 90, 90,180, 90, 90,110,100,110,110,  0,  0,255,  5}, // 左足上げ(変更なし)
  { 90, 90,  0, 90, 90,180, 90, 90, 90, 90, 90, 90,  0,  0,  0,  0}, // (正面)実行しない(変更なし)
  { 90, 90,  0, 90, 90,180, 90, 90, 90, 90, 90, 90,  0,  0,  0,  0}  // (正面)実行しない(変更なし)

これで歩かせてみると、

th_rapiro_walk_4

毎度毎度完璧に真っ直ぐ歩いてくれるワケではありませんが、それでもだいぶ改善されました。

では、この補正状態で、赤外線リモコン銃とArduinoセンサシールドを装備させてみます。よーいドン。

th_rapiro_walk_5

おおう。

大きく曲がります。シールドなし時と同じように足首(?)の回転で補正することを何度か試みてみましたが、一向に良くなってくれません。

「右手の赤外線リモコン銃が歩くときに引っかかってるのかなー」と思って、試しに右腕を大きく開くようにしてみると、

th_rapiro_walk_6

まっすぐ歩くようになりました!

というか、最初は腕を開き過ぎて逆方向に曲がってしまうぐらいだったので、最終的にデフォルトよりちょっとだけ腕を開くように修正しました。まさか歩いているときの腕の開きがこんなにも歩行バランスに影響するとは。。。ロボットのバランス制御ってものすごいセンシティブなんだなあというのを実感しました。

これが最終的な補正結果です。

  { 90, 90,  0, 75, 90,180, 90, 90, 80,110, 80,120,  0,  0,  0,  5}, // 左足前(右腕を少し大きく開く)
  { 90, 90,  0, 75, 90,180, 90, 90, 70, 90, 70, 90,  0,  0,255,  5}, // 左足つき(右腕を少し大きく開く)
  { 90, 90,  0, 75, 90,180, 90, 90, 70, 70, 70, 80,  0,  0,255,  5}, // 右足上げ(右腕を少し大きく開く)
  { 90, 90,  0, 75, 90,180, 90, 90,100, 60, 92, 80,  0,  0,  0,  5}, // 右足前(右腕を少し大きく開く、左足水平軸回転と縦軸回転を抑える)
  { 90, 90,  0, 75, 90,180, 90, 90,110, 90,102, 90,  0,  0,255,  5}, // 右足つき(右腕を少し大きく開く、左足水平軸回転を抑える)
  { 90, 90,  0, 75, 90,180, 90, 90,110,100,110,110,  0,  0,255,  5}, // 左足上げ(右腕を少し大きく開く)
  { 90, 90,  0, 75, 90,180, 90, 90, 90, 90, 90, 90,  0,  0,  0,  0}, // (正面)実行しない(右腕を少し大きく開く)
  { 90, 90,  0, 75, 90,180, 90, 90, 90, 90, 90, 90,  0,  0,  0,  0}  // (正面)実行しない(右腕を少し大きく開く)

この補正結果が、自分以外のラピロにもそのまま当てはまるとは思いませんが、とりあえず歩行を補正するときには腕の開き方を変えてみると結構変わりますよ、ということだけ記録しておこうと思います。

次回は中断していたXBeeのお話の続きです。