歩行にはどうしても一時的にでも片足立ちになることが必要なので、足郎1にもそれをさせてみた。サーボ制御言語の応用の意味もあった。
まだ、安定していないが、微調整をしていきたい。左右の動きに関する8個のサーボの角度マップは以下のようである。前後の8個は動かしていない。左右の動きの一部強い非対称性は、重心が微妙に右側にあることと、サーボの引き方のグダグダ感によるものだと思う。(この角度に向かって現在の角度から、ステップを刻みながら近づいていくように、次のスクリプト言語でプログラムされている)
以下に、上記のサーボの制御言語で書かれたスクリプトを記しておく。動画はこのスクリプトで動かしたものである。見れば、言語の文法はおよそわかっていただけると思う。最初は定義が羅列されていて、最後の方に実行コマンドが入っている
############################## # 2017年5月18日 Toyoaki WASHIDA # 2017年5月20日 ver.2 # 足郎1号の制御のためのプログラム # 「足踏み」 # ファイル名: ashiro1-1.ibot # '#'で始まる行はコメントになる ############################## # 角度の定義、定義の名前、 # 定義の場合は、内容を { } 内に書き込む # デリミタは基本、空白 # %で始まる定義やコマンドの順序は関係ない # ただし、 { }内記述の順番は意味を持つ(順番の通り実行される) # パラメーターは、サーボ角度の値(足の角度ではない) # (注)現状で、上のサーボとしたのサーボで方向が逆になっている # スピード、delayの値で使うことが可能 # パラメーター使用時には'$'の接頭文字が必要 # 角度パラメーター %param angle0 0 %param angle1 8 %param angle2 14 %param angle3 16 %param angle4 6 %param -angle1 -8 %param -angle2 -14 %param -angle3 -16 %param -angle4 -6 # スピードパラメーター # ステップが刻まれる回数なので # 正の整数、数字が大きくなるほど遅い # 1ステップの最後に10msの待機を入れている %param fast 10 %param slow 10 # 直立状態 %defangles zerophaseSide { #左の項のサーボ名はシステム予約語 LeftUpperLeft:$angle0 LeftUpperRight:$angle0 LeftLowerRight:$angle0 LeftLowerLeft:$angle0 RightUpperRight:$angle0 RightUpperLeft:$angle0 RightLowerRight:$angle0 RightLowerLeft:$angle0 } # 右への傾きの第1段階、菱形に潰れる %defangles rightphase1 { RightUpperRight:$angle2 RightUpperLeft:$-angle2 RightLowerRight:$angle2 RightLowerLeft:$-angle2 LeftUpperLeft:$-angle2 LeftUpperRight:$angle2 LeftLowerLeft:$-angle2 LeftLowerRight:$angle2 } # 右への傾きの第2段階、 # 右足に重心を十分移動し、左足をできる限りあげる %defangles rightphase2 { RightUpperRight:$-angle4 RightUpperLeft:$angle4 RightLowerRight:$angle3 RightLowerLeft:$-angle3 LeftUpperLeft:$angle3 LeftUpperRight:$-angle3 LeftLowerLeft:$angle1 LeftLowerRight:$-angle1 } # 左への傾きの第1段階、菱形に潰れる(使わなかった、以下の改訂版を使った) %defangles leftphase1 { LeftUpperLeft:$angle2 LeftUpperRight:$-angle2 LeftLowerLeft:$angle2 LeftLowerRight:$-angle2 RightUpperRight:$-angle2 RightUpperLeft:$angle2 RightLowerRight:$-angle2 RightLowerLeft:$angle2 } # (改訂S:右足をあまり開かない)左への傾きの第1段階、菱形に潰れる # angle2 は本来14 %param angle2S 4 %param -angle2S -4 %defangles leftphase1S { LeftUpperLeft:$angle2 LeftUpperRight:$-angle2 LeftLowerLeft:$angle2 LeftLowerRight:$-angle2 # ここを変形 RightUpperRight:$-angle2S RightUpperLeft:$angle2S # ここまで RightLowerRight:$-angle2 RightLowerLeft:$angle2 } # 左への傾きの第2段階、これは使わずに、次の改訂版を使った # 左足に重心を十分移動し、右足をできる限りあげる %defangles leftphase2 { LeftUpperLeft:$-angle4 LeftUpperRight:$angle4 LeftLowerLeft:$angle3 LeftLowerRight:$-angle3 RightUpperRight:$angle3 RightUpperLeft:$-angle3 RightLowerRight:$angle1 RightLowerLeft:$-angle1 } # (改訂S:)左への傾きの第2段階、 # 左足に重心を十分移動し、右足をできる限りあげる # LeftLowerLeftをもっと引く # この定義に関係するだけのパラメータを書いておく %param angle3S 32 %param -angle3S -32 %param angle4S 0 %param -angle4S 0 %param angle3T 10 %param -angle3T -10 %defangles leftphase2S { LeftUpperLeft:$-angle4S LeftUpperRight:$angle4S # ここを変化させた LeftLowerLeft:$angle3S LeftLowerRight:$-angle3S # ここまで RightUpperRight:$angle3T RightUpperLeft:$-angle3T RightLowerRight:$angle1 RightLowerLeft:$-angle1 } # 前後の動き、使っていない %defangles foreflac { LeftUpperFront:$angle LeftUpperBack:$angle LeftLowerFront:$angle LeftLowerBack:$angle RightUpperFront:$angle RightUpperBack:$angle RightLowerFront:$angle RightLowerBack:$angle } # 前後の動き、使っていない %defangles backflac { RightUpperFront:$angle RightUpperBack:$angle RightLowerFront:$angle RightLowerBack:$angle LeftUpperFront:$angle LeftUpperBack:$angle LeftLowerFront:$angle LeftLowerBack:$angle } # 実行の定義 # 使えるコマンドは今の所 # setAngle, speed, delay, stand, relax # メインルーチンの定義 %defexecs walk1 { # この実行定義はループさせないで # exec は、再帰的呼び出しを可能にするか # 無限ループを避けなければならない # 次のものは繰り返させる # カンマの前後に空白を入れないこと exec:walk2,3 # 実行が終了したら # 立たせる stand:all } # サブルーチンの定義 %defexecs walk2 { # 指定されたスピードは再指定がない限り有効 # 右に揺れ始める speed:$fast setAngle:zerophaseSide setAngle:rightphase1 # 足を上げる speed:$slow setAngle:rightphase2 setAngle:rightphase1 # 左に揺れ始める speed:$fast setAngle:zerophaseSide setAngle:leftphase1S # 足を上げる speed:$slow setAngle:leftphase2S setAngle:leftphase1 # 100ミリ秒待機 # delay:100 } # 実行させる # exec 実行コマンド # walk1 定義されている実行内容名 # メインルーチンは1回だけ実行する %exec walk1 1 ######## 以上 ###########