足郎1に足踏みさせる

歩行にはどうしても一時的にでも片足立ちになることが必要なので、足郎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

######## 以上 ###########