足郎1、歩行の改善

これまでの足郎1の歩行は、途中で大きな回転が入ったり不格好だったが、それを改善するために、これまで二足歩行の1サイクルを8フェーズに区切ってプログラムしていたのを6フェーズにして、途中で両足を下ろしたまま揃えるのをやめた。

動画に、歩行の改善が現れていると思う。
今回、超スローにしているが、少しずつ早い動きをつけていきたい。

サーボモータ制御のプログラミング言語名を、Cosmとさらに短くした。
Cosmなしに、ロボットのサーボ制御は、ほぼ不可能な状況だ。今回の動画の動きを作っているスクリプトをいかに示しておく。

##############################
# 2017年5月18日 Toyoaki WASHIDA
# 2017年5月20日 ver.2.2
# 2017年5月21日 ver.2.3
# 2017年5月23日 ver.2.4 ibot拡張子
# 2017年5月23日 ver.2.5
# サーボ制御言語 Cosm ver.1
# 足郎1号の制御のためのプログラム
# 「二足歩行」
# 左右の揺れとともに前への踏み出しが入っている
# ファイル名: ashiro1-5.cosm
##############################

# 角度パラメーター
%param init 0 # 左右に開いている初期状態の角度
%param openfront 50 # 足を前後に開く場合の基準角度
%param shiftbalance 30 # 片足に重心を移動するために傾けるメイン角度
%param support 14 # 開いた時に残った足の角度
%param liftup 6 # 重心が乗った足が、もう一方の足を釣り上げる角度
%param restflat 8 # 釣り上げられた足の角度(水平くらいがいい)
%param rhomb 22  # 菱形に重点移動角度
%param tiptoe 5 # 出した足のつま先

# スピード定義
%defspeed midium {
    interval:3
    steps:40
}
%defspeed slow {
    interval:5
    steps:30
}

# 右へ菱形に潰れる
%defangles rightrhomb {
    RightUpperRight:$rhomb
    RightUpperLeft:-$rhomb
    RightLowerRight:$rhomb
    RightLowerLeft:-$rhomb
    LeftUpperLeft:-$rhomb
    LeftUpperRight:$rhomb
    LeftLowerLeft:-$rhomb
    LeftLowerRight:$rhomb
}

%defangles leftrhomb {
    LeftUpperLeft:$rhomb
    LeftUpperRight:-$rhomb
    LeftLowerLeft:$rhomb
    LeftLowerRight:-$rhomb
    RightUpperRight:-$rhomb
    RightUpperLeft:$rhomb
    RightLowerRight:-$rhomb
    RightLowerLeft:$rhomb
}

# (状態)フェーズ0 直立
# (動作)フェーズ1の状態を作る
%defangles phase0 {
    RightUpperRight:-$liftup
    RightUpperLeft:$liftup
    RightLowerRight:$shiftbalance # 目一杯縮める
    RightLowerLeft:-$shiftbalance
    LeftUpperLeft:$shiftbalance-20 # 少し伸びている
    LeftUpperRight:-($shiftbalance-20)
    LeftLowerLeft:$restflat
    LeftLowerRight:-$restflat
    # 前後は不要か(初期の直立のままでいいから)
}

# フェーズ1
# (状態)右足に重点、左足が右足付近でつり上がっている
# (動作)左足を前側と左側にも開く 左に開くとは初期状態に戻すこと
%defangles phase1 {
    RightUpperRight:$init
    RightUpperLeft:$init
    RightLowerRight:$init
    RightLowerLeft:$init
    LeftUpperLeft:$init
    LeftUpperRight:$init
    LeftLowerLeft:$init
    LeftLowerRight:$init
    # 左足は目一杯開くが、右足は重心があるので、相当残す
    LeftUpperFront:-$openfront
    LeftUpperBack:$openfront
    # 左足のつま先を下げすぎないように-5する
    LeftLowerFront:-$tiptoe
    LeftLowerBack:$tiptoe
    RightUpperFront:$support
    RightUpperBack:-$support
    # ここに+5がないと、重心が後ろ過ぎて、後ろに倒れてしまう
    RightLowerFront:$support+5
    RightLowerBack:-($support+5)
}

# フェーズ2
# (状態)足が左右と前後に開かれている状態、左足が前に出ている
# (動作)股を閉じながら、左足に重心を移動する 右足を釣り上げる
%defangles phase2 {
    LeftUpperLeft:-$liftup
    LeftUpperRight:$liftup
    LeftLowerLeft:$shiftbalance # 目一杯縮める
    LeftLowerRight:-$shiftbalance
    RightUpperRight:$shiftbalance-20 # 少し伸びている
    RightUpperLeft:-($shiftbalance-20)
    RightLowerRight:$restflat
    RightLowerLeft:-$restflat
    # 前後はここで真っ直ぐに戻す
    LeftUpperFront:$init
    LeftUpperBack:$init
    LeftLowerFront:$init
    LeftLowerBack:$init
    RightUpperFront:$init
    RightUpperBack:$init
    RightLowerFront:$init
    RightLowerBack:$init
}

# フェーズ3
# (状態)左足に重心があり、右足がつり上がっている
# (動作)右足を右側に開きながら、前に踏み出す
%defangles phase3 {
    # 左右は揺れを直立に戻す、ことが開くことになるはず
    RightUpperRight:$init
    RightUpperLeft:$init
    RightLowerRight:$init
    RightLowerLeft:$init
    LeftUpperLeft:$init
    LeftUpperRight:$init
    LeftLowerLeft:$init
    LeftLowerRight:$init
    # 右足を前につりだす
    RightUpperFront:-$openfront
    RightUpperBack:$openfront
    # 左足のつま先を下げすぎないように-5する
    RightLowerFront:-$tiptoe
    RightLowerBack:$tiptoe
    LeftUpperFront:$support
    LeftUpperBack:-$support
    LeftLowerFront:$support+5
    LeftLowerBack:-($support+5)
}

# フェーズ4
# (状態)右足が前に出た状態で、足が開いている
# (動作)左足を右足に近づけながら、重心移動、左足を釣り上げる
%defangles phase4 {
    RightUpperRight:-$liftup
    RightUpperLeft:$liftup
    RightLowerRight:$shiftbalance # 目一杯縮める
    RightLowerLeft:-$shiftbalance
    LeftUpperLeft:$shiftbalance-20 # 少し伸びている
    LeftUpperRight:-($shiftbalance-20)
    LeftLowerLeft:$restflat
    LeftLowerRight:-$restflat
    # 前後はここで真っ直ぐに戻す
    LeftUpperFront:$init
    LeftUpperBack:$init
    LeftLowerFront:$init
    LeftLowerBack:$init
    RightUpperFront:$init
    RightUpperBack:$init
    RightLowerFront:$init
    RightLowerBack:$init
}

# 実行の定義
# メインルーチンの定義
%defexec walk1 {
    # まず、立たせる
    stand:all
    # 1000ms待機
    delay:1000
    # 右に揺れ始める
    speed:slow
    setAngle:rightrhomb
    setAngle:phase0
    # 歩行のサブルーチンに移動する
    exec:walk2,3
    # 実行が終了したら
    # 緩和状態で立つ
    delay:1000
    relax:all
}

# サブルーチンの定義
%defexec walk2 {
    # 指定されたスピードは再指定がない限り有効
    speed:midium

    # 右足に重心を置いた状態から、左足を前に出す
    setAngle:phase1
    # 左に重点を置いて、右足を釣り上げる
    setAngle:leftrhomb
    setAngle:phase2
    # 右足を前後に開く
    setAngle:phase3
    # 右足に重点を写し、左足を釣り上げる
    setAngle:rightrhomb
    setAngle:phase4

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

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

%exec walk1 1

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