COSMの改訂

足郎2を動かす前に、足郎制御言語cosmとそのインタープリターを改訂する。実際に動かし始めるとそれに集中したいからだ。

(1)サーボグループの角度定義に配列を設定できる。
ロボットのある一連のサーボを現在の状態から別の状態に変化させるのは、%defangles で、その角度群を定義するのだが、同じグループを連続で滑らかに変化させる場合に、いちいちそれを定義し直していくのは面倒なので、角度名の後に連続で定義し、配列に入れる。

(2)全ての定義の中で、空白を無視するようにする

今までは、定義の中では、空白は使えなかったが不便なので。

例えば、結局以下のように定義できる。

%defangles right_invpen[3] {
#右に傾ける動きをする      [0]     [1]       [2]
    RightUpperRight:  -$righ,  $righ2,   $righ3;
    RightUpperLeft:   +$right, $righ2_1, $righ3;
    LeftUpperRight:   -$left,  $left2,   $left3;
    LeftUpperLeft:     $left,  $left2,   $left3_1;
    LeftKneeFront:    -$bent,  $bent2_1, $bent3;
    LeftKneeBack:      $bent,  $bent2_2, $bent3;
    RightLowerRight:   $right, $righ2,   $righ3;
    RightLowerLeft:   -$right, $righ2,   $righ3_1;
    LeftLowerRight:    $left,  $left2_2, $left3;
    LeftLowerLeft:    -$left,  $left2,   $left3_2;
}

垂直直立の確認

朝から、足郎2の垂直直立の調整をやっている。

これまで、三角定規なのでやっていたが、足郎2は背が高いので、オモリをぶら下げた紐で確認するのがいい。紐に電池をぶら下げて垂直を見ている。前後左右に確認しなければならない。その度に、サーボからのリードの長さを変える。

単に一つのリードの長さで、一つの垂直が決まるのではない。そこに足郎2の複雑さがある。膝の関節は単純だが、他は色々関連している。上板で左右の足がつながっているので、一つの垂直がある意味全体のリード線の影響を受けていると言っても良い。

ただ、そういう、相互依存性が、これだけの体をか弱いサーボで動かすことができる理由でもある。一つのサーボに重さや動きが集中していると、支えきれなくなる。

動作上の組み立ては終わった

動作に関わる部品の組み込みが終わった。
足の裏につけるゴムの、ネジ穴部分のくりぬきに今回は、彫刻刀を使ったら、割と綺麗に仕上がった。

垂直に立てるのが苦労するところ。
ただ、今回は、フレームが業者に作ってもらい、精密なので、重りをつけて鉛直に垂らした糸で、ほぼ正確に垂直を捉えて、リード線の調整をした。

あとはネジを完全に固定して、プログラムで動かすだけだ。

ただ、ここにきて、NAOの方の業務ができたので、動かすのはしばらくお預けになる可能性がある。

RaspberryPIで二つ目のI2CチャンネルをPCA-9685用に動かす

足郎2では、左右の足を別のスレッドで動かし、かつそれぞれ別のI2Cチャンネルを使うことにしている。

RaspberryPIで二つ目のI2Cチャンネルを動かすことについては、
http://robo.genv.sophia.ac.jp/wp_robot/?p=1645
にだいぶ書いておいた。

ただ、これをサーボドライバPCA-9685用に動かすためには、一つ面倒な作業がある。それは、I2Cのデフォルトである1チャンネルは、すでにRaspberryPIのボード内でプルアップされているのであるが、この第二チャンネルは、プルアップされていないので、外部プロアップをしなければならないのである。

ただ、秋月電子のボードには、プルアップ用の抵抗がすでに取り付けられていて、このJ1とJ2を、直結すればSDAとSCLの二つのピンがプルアップされる。

直結する方法に戸惑ったが、ハンダで無理やりすれば良いのだと了解して、そうしている。今の所不都合はない。

二足歩行の意味

なぜロボットに二足歩行をさせるのか?

単純に考えれば、人が二足歩行しているからそれを真似させるということだ。見る側も、ロボットが四足歩行をしているよりも、二足歩行をしている方が、自分に対する親近感、共感を覚えやすいから、惹きつけられる。それを期待しているわけだ。

単なる移動であれば、四足歩行でも、多足歩行でも良いような気がする。

しかし、逆振り子型の二足歩行にこだわっていると、二足歩行には別の意味があるように思える。移動には、二足歩行の方が、他の多足歩行よりも簡便であり、省エネルギーなのではないかということだ。

モアイの移動を、逆振り子でやっている動画を先にお見せした。逆振り子は、あの深刻な重量のモアイ像をいとも簡単に移動させてしまう。

人間の歩行も、極めて省エネではないか。3足歩行はイメージがわかないが、四足歩行は、確かに安定している。チータは、確かに四足歩行で、100キロを超えるスピードを出す。それはすごい。しかし、二足歩行と四足歩行を同じ速さで、同じ重さで、測ったら、距離あたりのエネルギーは二足歩行の方が小さいのではないか?

そう思って検索したら、そういう研究論文がすでに発表されていることがわかった。
http://www.afpbb.com/articles/-/2255112?pid=1790817
二足歩行の必要エネルギーは四足歩行の四分の一というわけだ。
それが二足歩行への進化の要因だという考えには、批判もあるようだが、二足歩行が省エネルギーという事実が重要なのである。

やはりそうなのだ。予想は正しかった。つまり、ロボットの二足歩行へのこだわりは、省エネルギー型移動への模索という意味を持っている。

足郎2は今作っているところだが、足郎1でわかったのは、体を揺らして、ほんのわずかの前進操作をするだけで、歩み出すということだった。

足郎2が完成すれば、あの大きくて長い足が、いとも簡単に歩き出す様子をお見せできるはずだ。

NAOもそうだがホンダのASIMOも、その二足歩行は、人の動きを真似るためのただのパフォーマンスに見えて仕方がない。効率的移動という目的意識性を感じないのだ。

私は、このサイトに、逆振り子の理論から、足郎0(1本足ロボット)、足郎1と逆振り子型移動の理論とモデルを示してきた。この方向を、さらに徹底して追求していきたい。

足の配線完了

サーボドライバーボードのPCA-9685は片足それぞれについている。足郎1のように、上板上のコンピュータ側におくと配線が混雑してダメだからだ。ドライバーボードは16個のサーボモータを制御できるが、片足は10個しかついていない。この二つのボードは、RaspberryPIのI2Cの二つのポートを使う予定だ。RaspberryPIには、デフォルトでは1個のI2Cしか動かせないが、もともと2つついているのでその二つを動かす。

したがって、RaspberryPIそのものは、一つしか必要ないのだが、会話や知的な機能を担うために二台乗せてある。

当面は一つしか動かさない。

電池ボックスを股間に設置するのだが、いったんRaspberryPI を外さないとつけれない。

そのあと、サーボと関節をつなぐワイヤーをセットすれば、動作に関する部分は終える。

サーボモータをつける

今日は、この夏一番の暑さだった。

そんな中、サーボモータを全部つけた。
うわ板の真ん中でぶら下げているのだが、左右のバランスは完璧に取れている。当たり前だが。

何だか、恐竜のベロキラプトルのような格好なのだ。ジュラシックパークに出てきた(笑)

明日は、動きの部分だけは仕上げたい。

サーボモーターの設置

足郎2のサーボモーターは20個必要だ。

ニュートラルの調整をしなければならない。それから足郎2に貼り付ける。
昨日から、サーボから関節に力を伝える腱を40本も作成した。これが実に大変だった。
それに、サーボモータと腱をつなぐ、何というのか、金具、これも規格を合わせて作成するのが大変だった。

部品が届いた

業者に製作を依頼していた足郎2の部品が届いた。

足郎1は、すべて自分アルミを切ったり穴を開けたりして部品を作ったが、それと比べるとほぼ完璧にできている。足郎1の時は、開けた穴が合わなかったり、グダグダだった。何とかごまかして、形を整える状況だったが、今回は、穴の位置も綺麗に整合性が取れている。

足郎2の骨格だけ組み上げてみると次のようになった。
いかにも足らしい。奥の方に、足郎1も見えているが、比べるとわかるようにたかさがほぼ倍になっている。

これから、サーボモーター周りの部品を作成しなければならない。こればっかりは業者に依頼できない。微妙な部品だから。

ローカル座標のグローバル座標への転換戦略

表題のことがテーマである。
ずっと悩んでいる(笑)
(1)まず、片足に重心がほぼ乗っているかどうかの場合を分ける。
(2)乗っていない場合。乗っていなくても、相対的に重心がかかっている足は確定できる。その相対的支持足には四つのポイントがある。
z軸の値が小さなものが少なくとも二つはあるはずだ。

ロボットの体型が決まっていれば、その点を基準に他の足や脚の座標が全て決められるはずだ。

(※ここで注意しておくと、以後、足のくるぶしから先の部分を足(英語でfoot)といい、その他の英語でlegと言われる部分は脚ということにする)

その中で、z座標が負になるような点があったら、初めの2点の角度を変えて、それらの点がゼロになるように角度を変えなければならない。

逆に逆足が中空に上がってしまった場合は、そこを大地にくっつけるように回転させる必要がある。

(3)重心がその脚だけに乗っている場合は、その脚全体が大地についていることを前提に体型を載せる必要がある。そして、もし、逆足が大地から上がっている場合は、それをそのままにしておいて良い。重心がほとんど乗っていないわけだから。

シミュレータ、膝の動き

シミュレーターで、先のAshiro1のCosmファイルに膝を曲げる動きだけを加えたものを食わせて見た。

明らかに不自然だ。実際のロボットだったら変なことになっただろう。

シミュレーターがもっと自然な動きになるように工夫する必要がある。次の図を見てもらいたい。
後ろになった足がかかとを曲げ高くすることによって膝が周り、体全体が前のめりになり、一体の状態まで来ると後ろ足が上がり、前足のみで立つようになる。

重心が支えている足の一定近くに来るまでは、後ろ足をあげられないようにすれば良い。

それまでは、T点とS点で支えるような形にするのである。

さらに、近傍の中に入って、反対側の足がつり上がっている状態においては、その足の足首の角度が体全体の傾きを規定する、とすれば良い。

また、この近傍の大きさは、体に働いている慣性力の影響を受ける。体が強く動いている時には、この近傍は大きくなるだろう。逆に、体がゆっくりとしか動いていないときは、相対的にこん近傍は小さくなる。

シミュレータの改良

重心を支えている足の位置を固定するようにした。先のものは、ロボットの原点を動かないようにしたので、形はサーボによる決まるものだが、不自然だった。

ただし、側面図では、前方へ歩いて行ってしまうし、正面図では、スクリプトが微妙に(こちら側に向いて)左側に開きが大きくしてあるものだから左側に動いて行ってしまう(笑)

足郎2のシミュレーターの第1段階、ほぼ出来上がる

この間、計算に次ぐ計算をやってきた、足郎2のシミュレーターだが、スクリプトからサーボを動かして、ロボットの形を作るところまでは、ほぼ出来上がった。このシミュレータに、COSMで書いたスクリプトを読み込ませて、動きを確認する程度には、実行させることができる。実際のロボットの動きにどれだけ近くなるかは、ロボットの方を組み上げてみないとわからないが、そちらは、業者に部品を作ってもらっているところなので、まず、シミュレータの動きを確認するしかない。

計算式が複雑なので、プログラムのバグを取るのに苦労した。

ただし、まだ、重心と着地した足の関係など、グローバルな座標で描いてはいない。ロボットの形をシミュレーションしているだけである。この動きを、重心との関係で、グローバルな座標に変換して表示するのはこれからの作業である。

このシミュレーターに足郎1を動かしたときのCOSMスクリプトを読み込ませて、動かしてみた結果が以下の動画である。

左が側面から見たもので、右側が正面から見たものであり、右足が緑色で、左足が青である。

足郎1には、膝がなかったので膝が動くスクリプトではないが、膝を動かすスクリプトも次に書いてみる。以下に、上記の動画の元になったスクリプトを記載しておく。

#######################################
# ashiro1-13.cosm
# 逆振り子二足歩行
# 2017年7月26日 作成
#######################################

%defspeed normal {
    interval:3
    steps:20
}

%defspeed fast {
    interval:3
    steps:10
}

#####################################
# かなり基本的なパラメータ
# いじるパラメータはここに置いておく
#####################################

# ただの逆振り子だと、40にすると倒れる
%param invpen_angle_right 35
%param invpen_angle_left 40
# 逆足を少し開いて、縮み加減にしないと倒れる
%param open_inv_right 15
%param open_inv_left 15
# 足を前に(わずかに)振り出す
%param step_forward 7

######################################
# 単純逆振り子
######################################

%defangles right_invpen {
#右に傾ける動きをする
    RightUpperRight:-$invpen_angle_right+$open_inv_right
    RightUpperLeft:+$invpen_angle_right-$open_inv_right
    LeftUpperRight:-$invpen_angle_left
    LeftUpperLeft:$invpen_angle_left
# 上の動きに合わせて、足も角度をつけて
    RightLowerRight:$invpen_angle_right
    RightLowerLeft:-$invpen_angle_right
    LeftLowerRight:$invpen_angle_left
    LeftLowerLeft:-$invpen_angle_left
}

%defangles left_invpen {
#左に傾ける動きをする
    RightUpperRight:$invpen_angle_right
    RightUpperLeft:-$invpen_angle_right
    LeftUpperRight:$invpen_angle_left-$open_inv_left
    LeftUpperLeft:-$invpen_angle_left+$open_inv_left
#
    RightLowerRight:-$invpen_angle_right
    RightLowerLeft:$invpen_angle_right
    LeftLowerRight:-$invpen_angle_left
    LeftLowerLeft:$invpen_angle_left
}

######################################
# 前へ
######################################

%defangles left_forward {
#左足を前に出す
    RightUpperFront:-$step_forward
    RightUpperBack:$step_forward
    LeftUpperFront:$step_forward
    LeftUpperBack:-$step_forward
}

%defangles right_forward {
#右足を前に出す
    RightUpperFront:$step_forward
    RightUpperBack:-$step_forward
    LeftUpperFront:-$step_forward
    LeftUpperBack:$step_forward
}

######################################
# 実行手続きの定義
# 即実行コマンドから最初に呼び出されるという意味で
# メインルーチン
# 初期歩行
######################################

%defexec walk {
    #stand:all
    exec:walk_sub,10
}

######################################
# サブルーチンの定義:通常歩行
######################################

%defexec walk_sub{
    speed:normal
    setAngle:right_invpen
    speed:fast
    setAngle:left_forward
    speed:normal
    setAngle:left_invpen
    speed:fast
    setAngle:right_forward
}

################################# 
# 唯一の即実行プログラム:他は全て定義
# 全てはここから始まる
################################# 

%exec walk 1

#################################

ロボット座標面への射影の長さの計算

先の記事の中に、足の長さのロボット座標面への射影の長さが計算できて、実際の足の長さと角度からそれを求めることができると指摘した。

その実際の計算を以下に示す。ただ、描くのが面倒になったので、ノートの写メを掲載しておくにとどめる。
<1、2ページ>

<3、4ページ>

ロボット座標の再構成(修正)

いざプログラムに書こうと思ったら、先の記事に書いた正面図が、ひざ関節が左右に曲がるというものになっているのに気づいた。足郎2は、ひざは前後にしか曲がらない(人間と同様)ので、修正した。

正面図は、変な格好だが、図は角度の正の向きを確認し、関節位置の座標を確定するためのものだから問題ない。

《正面図》
A点とB点の関係

y_{a}=y_{b}+l_{1}sin(\frac{\pi}{2}-\theta_{3})\\z_{a}=z_{b}-l_{1}cos(\frac{\pi}{2}-\theta_{3})


B点とC点の関係

y_{b}=y_{c}+l_{2}sin(\frac{\pi}{2}-\theta_{3})\\z_{b}=z_{c}-l_{2}cos(\frac{\pi}{2}-\theta_{3})


C点と原点の関係

y_{c}=y_{0}-\frac{l_{3}}{2}\\z_{c}=z_{0}


D点と原点の関係

y_{d}=y_{0}+\frac{l_{3}}{2}\\z_{d}=z_{0}


D点とE点の関係

y_{e}=y_{d}+l_{4}sin(\frac{\pi}{2}-\theta_{4})\\z_{e}=z_{d}-l_{4}cos(\frac{\pi}{2}-\theta_{4})


E点とF点の関係

y_{f}=y_{e}+l_{5}sin(\frac{\pi}{2}-\theta_{4})\\z_{f}=z_{e}-l_{5}cos(\frac{\pi}{2}-\theta_{4})

《側面図》
A点とB点の関係

x_{a}=x_{b}-m_{1}sin(\phi_{2}+\phi_{3}-\frac{\pi}{2})\\z_{a}=z_{b}-m_{1}cos(\phi_{2}+\phi_{3}-\frac{\pi}{2})


B点とC点の関係

x_{b}=x_{c}+m_{2}sin(\frac{\pi}{2}-\phi_{3})\\z_{b}=z_{c}-m_{2}cos(\frac{\pi}{2}-\phi_{3})


C点とD点と原点の関係

x_{c}=x_{d}=x_{0}\\z_{c}=z_{d}=z_{0}


D点とE点の関係

x_{e}=x_{d}-m_{4}sin(\frac{\pi}{2}-\phi_{4})\\z_{e}=z_{d}-m_{4}cos(\frac{\pi}{2}-\phi_{4})


E点とF点の関係

x_{f}=x_{e}-m_{5}sin(\frac{\pi}{2}-\phi_{4}+\phi_{5})\\z_{f}=z_{e}-m_{5}cos(\frac{\pi}{2}-\phi_{4}+\phi_{5})