足郎1は、膝ありロボット「足郎2」への試作品である。足郎2では、膝があるだけではなく、高さは1の倍になる。その大きさを、支えて、動かせるかが問題だ。
その点で、最も重要なのがサーボモータである。
現在使っているのが、KumanのMG996Rだ。現在までの評価は、合格である。価格も、1個600円しかしない。
確かに、原点を抑える安定感も不安があり、サーボ角度の刻みを4度以下だと時々、調整を諦めているふうがあるなど、粗いことは確かだが、支える力はしっかりしている。足郎2で、体躯が2倍になってもなんとかいけそうな気がしている。
また、足郎1は、関節を直接回しているのではなく、関節は自由で、筋肉のように骨格に引っ張り力を与えて動かしているので、この辺りのハードも問題だ。今、引っ張っているのは、0.9ミリのステンレス線だ。これだけの重さと力だと、伸びてしまうのではないかと思っていたが、今の所、そんな様子はない。壊れるのは、接合部分のスッポ抜けみたいなものである。
足郎2では、この線を二本で引くようにするか、もっと太い線を使うけれども、基本的な構造は変えない。
アルミ板の加工を自宅で行なっていたが、設計図を渡して業者にやってもらうか、アキバの共用施設でちまちま作るかのどちらかにして、自宅での作業はやらないようにしたい。クズの処理が大変なので。
RaspberryPi3には、特に問題はない。
日別: 2017年5月23日
足郎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 ######## 以上 ###########