足郎1を二足歩行させてみる

次の段階として、前への踏み出しをするようにして、二足歩行させてみた。

原理としては、二足歩行であるが、あまりに不恰好だ。膝がないために、足の折りたたみができないので、重心を片足に乗せて、重心のない方の足をしっかり釣り上げなければならず、負担が大きい(下記、サーボ角度図参照)。

二足歩行のために、足の裏に厚さ3ミリの天然ゴムを貼ったことを記しておこう。不要な回転を止めるためだが、役に立った。ただ、それでも回転は完全に止めきれていないが。これも、膝がないことが影響しているか。

サーボ16個フルに動かしているので、スピード感がなくなってきている。しかし、まだ、スピードを出す余裕はある。

サーボ角度図の最新版は次のようなものである。

動かすためのプログラムを以下に示しておく。プログラミングで、speedの設定を、stepsとintervalで定義するように文法を改訂している。次の文法改訂では、パラメータの演算、式の評価を入れて、さらに、センサーの制御も入れて、プログラミング言語らしくしたい。(Cosm: Controler Of ServoMOtor)

##############################
# 2017年5月18日 Toyoaki WASHIDA
# 2017年5月20日 ver.2.2
# 足郎1号の制御のためのプログラム
# 「二足歩行」
# 左右の揺れとともに前への踏み出しが入っている
# ファイル名: ashiro1-1.ibot
# '#'で始まる行はコメントになる
##############################

# 角度の定義、定義の名前、
# 定義の場合は、内容を {  } 内に書き込む
# デリミタは基本、空白
# %で始まる定義やコマンドの順序は関係ない
# ただし、 { }内記述の順番は意味を持つ(順番の通り実行される)

# パラメーターは、サーボ角度の値(足の角度ではない)
# (注)現状で、上のサーボと下のサーボで方向が逆になっている
# スピード、delayの値で使うことが可能
# パラメーター使用時には'$'の接頭文字が必要
# 角度パラメーター
%param angle0 0
%param angle1 8
%param angle2 14
#%param angle3 16
%param angle3 22
%param angle4 6
%param -angle1 -8
%param -angle2 -14
#%param -angle3 -16
%param -angle3 -22
%param -angle4 -6
# 前へ踏み出す
%param angle5 20
%param -angle5 -20
# 前に出した足のつま先がつっかからないようにする
%param -angle5S -5
# 踏み出しを半分戻す
%param angle6 10
%param -angle6 -10

# スピード定義
# intervalは角度設定の合間に置くms
# stepsは、目的角度まで幾つ区切って進むか
# speedは両者とも定義されていなければエラーになる
# デフォルトはmidium
%defspeed fast {
    interval:2
    steps:10
}
%defspeed midium {
    interval:6
    steps:10
}
%defspeed slow {
    interval:9
    steps:10
}

# サーボ角度の定義集
# 直立状態
%defangles zerophaseSide {
    # 左の項のサーボ名はシステム予約語
    #
    # 左右の動きに関わるサーボ
    LeftUpperLeft:$angle0
    LeftUpperRight:$angle0
    LeftLowerRight:$angle0
    LeftLowerLeft:$angle0
    RightUpperRight:$angle0
    RightUpperLeft:$angle0
    RightLowerRight:$angle0
    RightLowerLeft:$angle0
    #
    # 前後の動きに関わるサーボ
    LeftUpperFront:$angle0
    LeftUpperBack:$angle0
    LeftLowerFront:$angle0
    LeftLowerBack:$angle0
    RightUpperFront:$angle0
    RightUpperBack:$angle0
    RightLowerFront:$angle0
    RightLowerBack:$angle0
}

# 最初の一歩の前段階
# 右への傾きの第1段階、菱形に潰れる
%defangles rightphase1-pre {
    RightUpperRight:$angle2
    RightUpperLeft:$-angle2
    RightLowerRight:$angle2
    RightLowerLeft:$-angle2
    LeftUpperLeft:$-angle2
    LeftUpperRight:$angle2
    LeftLowerLeft:$-angle2
    LeftLowerRight:$angle2
    # 前後の動きに関わるサーボ
    # 不要と思われる
}

# 歩行中の
# 右への傾きの第1段階、菱形に潰れる
%defangles rightphase1 {
    RightUpperRight:$angle2
    RightUpperLeft:$-angle2
    RightLowerRight:$angle2
    RightLowerLeft:$-angle2
    LeftUpperLeft:$-angle2
    LeftUpperRight:$angle2
    LeftLowerLeft:$-angle2
    LeftLowerRight:$angle2
    # 前後は半分くらい戻す
    LeftUpperFront:$angle6
    LeftUpperBack:$-angle6
    LeftLowerFront:$angle6
    LeftLowerBack:$-angle6
    RightUpperFront:$-angle6
    RightUpperBack:$angle6
    RightLowerFront:$-angle6
    RightLowerBack:$angle6
}

# 右への傾きの第2段階、
# 右足に重心を十分移動し、左足をできる限りあげる
%param angle3U 10
%param -angle3U -10
%defangles rightphase2 {
    RightUpperRight:$-angle4
    RightUpperLeft:$angle4
    RightLowerRight:$angle3
    RightLowerLeft:$-angle3
    LeftUpperLeft:$angle3U
    LeftUpperRight:$-angle3U
    LeftLowerLeft:$angle1
    LeftLowerRight:$-angle1
    # 前後はここで真っ直ぐに戻す
    LeftUpperFront:$angle0
    LeftUpperBack:$angle0
    LeftLowerFront:$angle0
    LeftLowerBack:$angle0
    RightUpperFront:$angle0
    RightUpperBack:$angle0
    RightLowerFront:$angle0
    RightLowerBack:$angle0
}

# 右への傾きの第3段階、
# 左足を前に踏み出す
%defangles rightphase3 {
    # 左右は揺れを直立に戻す
    LeftUpperLeft:$angle0
    LeftUpperRight:$angle0
    LeftLowerRight:$angle0
    LeftLowerLeft:$angle0
    RightUpperRight:$angle0
    RightUpperLeft:$angle0
    RightLowerRight:$angle0
    RightLowerLeft:$angle0
    # (left)前に踏み出す 後ろ足(right)の送り
    LeftUpperFront:$-angle5
    LeftUpperBack:$angle5
    LeftLowerFront:$-angle5S
    LeftLowerBack:$angle5
    RightUpperFront:$angle5
    RightUpperBack:$-angle5
    RightLowerFront:$angle5
    RightLowerBack:$-angle5
}

# (改訂S:右足をあまり開かない)左への傾きの第1段階、菱形に潰れる
# angle2 は本来14
# パラメータはどこにおいても良いので
%param angle2S 4
%param -angle2S -4
%defangles leftphase1 {
    LeftUpperLeft:$angle2
    LeftUpperRight:$-angle2
    LeftLowerLeft:$angle2
    LeftLowerRight:$-angle2
    # ここを変形
    RightUpperRight:$-angle2S
    RightUpperLeft:$angle2S
    # ここまで
    RightLowerRight:$-angle2
    RightLowerLeft:$angle2
    # 前後は半分くらい戻す
    LeftUpperFront:$-angle6
    LeftUpperBack:$angle6
    LeftLowerFront:$-angle6
    LeftLowerBack:$angle6
    RightUpperFront:$angle6
    RightUpperBack:$-angle6
    RightLowerFront:$angle6
    RightLowerBack:$-angle6
}

# (改訂S:)左への傾きの第2段階、
# 左足に重心を十分移動し、右足をできる限りあげる
# LeftLowerLeftをもっと引く
%param angle3S 32
%param -angle3S -32
%param angle4S 0
%param -angle4S 0
%param angle3T 10
%param -angle3T -10
%defangles leftphase2 {
    LeftUpperLeft:$-angle4S
    LeftUpperRight:$angle4S
    # ここを変化させた
    LeftLowerLeft:$angle3S
    LeftLowerRight:$-angle3S
    # ここまで
    RightUpperRight:$angle3T
    RightUpperLeft:$-angle3T
    RightLowerRight:$angle1
    RightLowerLeft:$-angle1
    # 前後はここで真っ直ぐに戻す
    LeftUpperFront:$angle0
    LeftUpperBack:$angle0
    LeftLowerFront:$angle0
    LeftLowerBack:$angle0
    RightUpperFront:$angle0
    RightUpperBack:$angle0
    RightLowerFront:$angle0
    RightLowerBack:$angle0
}

# 左への傾きの第3段階、
# 右足を前に踏み出す
%defangles leftphase3 {
    # 左右は揺れを直立に戻す
    LeftUpperLeft:$angle0
    LeftUpperRight:$angle0
    LeftLowerRight:$angle0
    LeftLowerLeft:$angle0
    RightUpperRight:$angle0
    RightUpperLeft:$angle0
    RightLowerRight:$angle0
    RightLowerLeft:$angle0
    # (right)前に踏み出す 後ろ足(left)の送り
    LeftUpperFront:$angle5
    LeftUpperBack:$-angle5
    LeftLowerFront:$angle5
    LeftLowerBack:$-angle5
    RightUpperFront:$-angle5
    RightUpperBack:$angle5
    RightLowerFront:$-angle5S
    RightLowerBack:$angle5
}
# 実行の定義
# 使えるコマンドは今の所
# setAngle, speed, delay, stand, relax
# メインルーチンの定義
%defexec walk1 {
    # この実行定義はループさせないで
    # exec は、再帰的呼び出しを可能にするか
    # 無限ループを避けなければならない
    # 次のものは繰り返させる
    # カンマの前後に空白を入れないこと
    #
    # まず、立たせる
    stand:all
    # 1000ms待機
    delay:1000
    # 最初の歩き出しは、前後を開いていないため、
    # メインルーチンに入れておく
    # 右に揺れ始める
    speed:midium
    setAngle:rightphase1-pre
    # 歩行のサブルーチンに移動する
    exec:walk2,3
    # 実行が終了したら
    # 立たせる
    stand:all
}

# サブルーチンの定義
%defexec walk2 {
    # 指定されたスピードは再指定がない限り有効
    # 足を上げる
    speed:midium
    setAngle:rightphase2
    setAngle:rightphase3
    # 左に揺れ始める
    speed:midium
    setAngle:zerophaseSide
    setAngle:leftphase1
    # 足を上げる
    speed:midium
    setAngle:leftphase2
    setAngle:leftphase3
    # 右に揺れ始める
    speed:midium
    setAngle:zerophaseSide
    setAngle:rightphase1

    # 100ミリ秒待機
    # delay:100
}

# 実行させる
# exec 実行コマンド
# walk1 定義されている実行内容名
# 1回だけ実行する

%exec walk1 1

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