次の段階として、前への踏み出しをするようにして、二足歩行させてみた。
原理としては、二足歩行であるが、あまりに不恰好だ。膝がないために、足の折りたたみができないので、重心を片足に乗せて、重心のない方の足をしっかり釣り上げなければならず、負担が大きい(下記、サーボ角度図参照)。
二足歩行のために、足の裏に厚さ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 ######## 以上 ###########