一足歩行ロボット

先の記事で書いたこと(こちら)を証明するために、まず、1足ロボット アイコメ01でやって見た。ただ、左右に体を揺らせているだけである。前後のバランスの違いで、動画のように前に進んでいる。
この時の設定ファイル controler.init の内容を記録しておく。一足歩行と無関係なものもある。

################################
# 2017年5月1日作成
# controler.init
# controler 初期化ファイル
# 実行時にパスを設定できる
# ./controler -e -init /home/pi/controler.init
######################################
# で始まる行はコメント
# サーボ0の初期角度(度で指定)
initialangle:0:-2.0
# サーボ1の初期角度
initialangle:1:-6.0
# 以下の各種角度は、上記初期角度に対する相対角度である
# 実行時間(秒単位で指定)加速度チェックの時間でもある
duration:3
# 臨界加速度:関節が固定化される加速度
acceleration:0.1
# 関節固定化に際して、追加的な角度(傾いただけ、逆側は伸びる)
#diffAngle:-1
diffAngle:2
# 完全に弛緩させる角度
slackAngle:-6.0
# 倒す時の吊り上げ角度
fallAngle:2.0
# 最大リアクション回数
# 転倒に対するリアクションがこの回数に到達したら反応しなくなる
# 負の数字を入れると無限に反応する
# 0を入れると反応しない
maxReaction:0
# 最初に緩和する角度
initialSlakAngle:-8.0
# 逆振り子の実行回数
# pendIteration:10
# 不活性期間(ミリ秒)
# 一度転倒に反応すると、この期間は、反応しなくなる
inertiaPeriod:800

 
 

倒れこみとしての二足歩行

ロボットの現在の二足歩行が不自然なのは「倒れこみ」が基本になっていないからだ。
人は歩く動きは、ただ前に倒れ続けているだけなのだ。それは、人工衛星が地球に落下し続けているのと似ているかもしれない。倒れるときに、大きな力は必要がない。だから人も、歩くことに大きなエネルギーを使わない。前方に倒れかかると片足を前に出す、新しい足が低になって回転する。さらにその回転が前に倒れこむ。別の足を出す。ただそれの繰り返しである。
倒れる!おっとっと、足を前に出そう、である。
そのとき、ただ、体が左右に揺れる。これは、倒れない程度に揺れる必要がある。なぜなら、倒れこみの時、足を前に出す必要があるが、その足には重心がかかっていてはならないからである。
従って「倒れ込まない揺れと」「倒れ込んでしまう揺れ」の二つを繰り出して、人は歩いていく。
現在のロボットは、関節の角度を変えながら歩いていく。倒れこみはない。倒れこみなどすると、本当に倒れてしまう。

逆さ振り子としてのロボット

以下の記事についての詳細は論文参照
NAOは、ただ立っているとき、小さく体を揺らしている。これはALDEBALANの技術者が、より生きているように見せようとした工夫だろう。実際そう見える。ただこれが、NAO自身にとって必要なこととは思えない。問題は、なぜ体を揺らすことが生きているように見えるために必要なのかということだ。結局それは、人もまた、立っている時でも体を微妙に揺らせているからだ。人の場合は、体を揺らせることによって直立状態を維持できる、という必要においてそうなのだ。無意識に体の姿勢を制御している。
この揺らせることによって直立を維持するメカニズムの基本的なところは理論モデルとシミュレーションで示してきた。
理論モデルで示したように、直立構造の運動方程式は、単振り子の運動方程式とよく似ている。同じように見える。ただ、加速度の方向が逆向きになっていて、三角関数ではなく指数関数でそれが解けるようになっている。
下向きのたん振り子は、それ自体に、あるいは内生的に、復元力が働くのだが、逆さまの振り子であるロボットは(現在の多くのロボットは、NAOも含めて逆さ振り子とは言えない。新しい設計思想で作られるロボットのことを意味する)、それ自体は、転倒が基本なのだ。それに対する外生的な揺り戻しが生じることによって転倒を微妙に避けている。このような姿勢制御によって、直立が維持される。そのプロセスは、結局、揺れている状態と同じになるのだ。
この揺れは、この立っている状態に冗長性を生むというもう一つの、とても大事な側面を持っている。単なる剛体であれば、ちょっとした撹乱としての傾きで倒れてしまう。しかし、常に揺れながら状態を直して入れば、撹乱を吸収できるゆとりが出てくる。
スポーツでは、膝や腰や腕を柔軟に使うことが大切なこととして求められる。人間のさまざまなしなやかさは、関節の自由度の大きさによって確保されている。
そのようなロボットをイメージすることがとても大切だ。

ロボット転倒問題のシミュレーション解

前の記事で書いたロボットが倒れる、倒れない問題について、シミュレーション解を出すことができた。なお、計算に使ったJAVAの関数は、以下の論文の中に示しておいた。
詳細は論文参照
この図で、横軸は、横の棒の長さを1としたときの高さである。縦軸が、転倒を回避するために、臨界点で止まる(再び位置エネルギーが元の値に戻る)ために必要な関節を固定化する角度である。ラディアンから度に変換している。
計算結果の誤差は、ここで解とみなした値のときで、高さの比が1のときが最も小さく0.0000000082である。高さの比がここで調べた中で最も大きい20.0のときに0.0000011608である。いずれもゼロに極めて近く、ほぼ解であると考えて間違いないだろう。刻み方をもっと細かくすれば、さらに誤差を小さくできることが予想される。ただ、高さが高くなるほど誤差は僅かながら大きくなっている。その理由は、高さが高いと、微妙なバランスが求められると考えても良いだろう。
その結果の特徴は、まず、理由はまだ正直わからないのだが、常にαとβは等しくなる。
高さが1のとき、すなわち、横棒と縦棒が同じとき、角度は29.99697622度、ほぼ30度だ。何か理由がありそうな角度である。αも同じになることは先に述べておいた。綺麗に90度を三等分する角度になっている。ただ、この角度は大きい。つまり、頂点で手を離して、30度傾くまで、自由な関節の回転を放置しておいて良いのだ。その後固定化すると、ギリギリ転倒を回避できる。高さが低いからである。
小さなロボットが転倒しにくい理由はここにある。
また、比率で見た高さが高くなると、最初は急速に関節を固定化するまでの角度が小さくなっている。その後は、少しずつ低下する。すなわち、高さが高くなればなるほど、転倒しないために関節を固定化しなければならないタイミングは早くなるのである。僅かに傾いたら、即固定化ということになっていく。
それでも、高さが10のときに、β=2.870976923度、ほぼ3度の余裕がある。3度傾いたら、関節を固定化しなければならないのである。高いと、微妙な調整が必要になる。
これだけでも面白い結果だが、人に応用するともっと興味深い。例えば、私の身長は182cmである。一方、足のくるぶしの関節から足のつま先までの長さは18cmくらいである。高さの比は、10.1である。
上の計算で、10.1の限界度、βは、2.843990611度である。つまり、足前に出したりせずに、動かさずに立った状態を維持するためには、2.8度、前に傾いたら筋肉を緊張させなければならないのである。
確かに、体を前にわずかに倒そうとすると筋肉を硬直させるが、この角度が、2.8度だよとこのシミュレーション結果は示している。もちろん、人間の体は質量が分布しているので、理論モデルで示したような質量の一点集中とは違っている。
一つ首をかしげることは、常にαとβが、ぴったり等しくなることである。数学モデルから、解析的に言えそうなのだが今の所わからない。
残された課題は、(1)頂点から倒れ始めて、関節が固定され、最終的に転倒の臨界角度に至るまでの時間を示すことである。確かに、高さが高いほど、関節を固定しなければならなくなるまでの角度は急速に小さくなっていく。しかし、そこに至る時間はどうなるかわからない。それを解析に出せないかを考えることである。また、その時間には、B点の質量が影響を与える可能性が高い。メトロノームが重りを上に持っていけばいくほど、スピードが遅くなることも考慮される。(2)実際にシステムを組んでシミュレーションして確かめることである。シミュレーションするための材料はほぼ整っている。加速度センサーも、サーボも、RaspberryPiから制御できるようになっているからである。

ロボットの転倒及び転倒回避に関する基本問題

昨日、ロボットが「倒れる、倒れない、倒さない問題」と言うのを考えたと、その内容をここに書いた。答えは出ていなかった。
今日、ちょっと昼寝をして起きたら、答えを思いついたので、メモを書いた。間違いを見つけたら、教えていただきたい。
この問題とそのシミュレーション解については、こちらの記事に詳細を示しておいた。論文もダウンロードできる。

倒れる、倒れない、倒さないの問題

以下の問題については、そのシミュレーション会も含めてこちらの記事に詳細が書いてある。
ロボットが倒れる、倒れない、倒さないという問題について、解いてはいないが、問題だけをまず考えた。

手書きの図で申し訳ないが、見ていただきたい。今、CDという棒と、AEという棒が、A点で関節のようにつながっていると考えてください。図(1)。2次元で考えます。関節は、A点を支点に自由に動くこともできるし、固定化することもできると考える。A点の位置を変えることはできない。人間の足首の関節だと考えてもらって良い。
縦の棒の、Bの位置に、m( > 0)という正の重さの塊があります。簡単化のために、この塊以外は重さがない。棒も、剛体だけれど「重さがない」と考えてください。
今、縦棒が水平からの角度θのところで、関節Aを固定し、つまりCDの棒とAEの棒をそれ以上動かないように固定化したとして、このθをある限界を超えて、小さなところで固定すれば、これは右回転して倒れてしまうだろう。その限界のθは、計算しなくても、BがちょうどDの真上に来る時であることが想像つく。つまり、図(2)のような状況である。何しろ、棒には重さがないのだから。(B点がD点の真上よりも右側になれば倒れる)
逆に、BがDの真上より左側で、関節が固定されれば、復元力が働くだろうことも、計算するまでもない。つまり、右側には倒れない。
解けると思うが解いていない問題はここからだ。
今、縦棒が、D点の真上に来るまで、自由に動く関節Aの元で、動きながら到達し、急に関節を固定化させたら、あるいは固定化させたとしても、当然、それまでの運動量があるから、慣性の法則か何かわからないけれど、右回転でこのシステムは倒れてしまうだろう。
ちょっと言い換えれば、頂点から少し右側に外れたところで重りから手を離して自由にさせた状況で、D点で急ブレーキで固定しても、倒れるということである。
今、頂点の極近くで重りから手を離したら、D点で、固定化させても倒れたとする。一方、D点の真上で手を離して、そのままD点で固定したら、先の洞察と同じようにそれは微妙に倒れないだろう。
だとすると、固定化するのをD点の真上よりも、もう少し早く固定化させれば復元力が優って、右側に倒れ込まないところがあるのではないか、これが問題。なぜなら、D点の真上よりも早く固定化すると、固定化したために、D点を軸に回転する動きが発生し、それによって重りがそうでない場合よりも上に持ち上げられて、そのこと(位置エネルギーの増加)のためにエネルギーが使われて、運動が減速されて元に戻る力が買ってしまうのではないかということである。
図(4)にその状況を書いている。角度が元よりも大きめのθ''のところで固定化したために、Dを新たな回転軸としてδの角度が発生し、重りBが少し持ち上がりながら回転することになって、復元力が発生するのではないかということである。
問題は、復元力が発生する限界の固定化点はどこかということである。
基本、これが、人間のする、倒れないための復元努力に近いと思っている。
数学的にというか、物理学的に解いてみたい。高校の物理で溶けるだろうと思うのだが。

言葉が通じないときの人工知能

ほぼ、雑談に近いが、Google Cloud APIで、ストリーミングとして言語解析する時、APIに今から喋ることは英語だと伝えて(設定して)、日本語を話した。すると、APIは、必死でその日本語の音声を英語として解釈、解析しようとする。当然、英語にはできない。それでも、なんとかその発音に近い英語の文章を返してくる。まさにこれだ、これが実に人工知能なのだ。とても面白い。人間が、理解できない外国語に出会った時にやっていることを再現しているようだ。

エコーロボット(echo robot)の考察

人間的知能の最もプリミティブな形態は、音を言葉に変えることだと思う。たとえば、見知らぬ外国語は言葉ではなく単なる音でしかない。しかし、それが言葉に変わった時、すべての人間的知能の基礎ができる。言葉は、まさにロゴスなのだ。
この間、Googoleのcloud apiのストリーミングの音声解析をやってきたが、結局それは、知能なのだ。非常に単純で、簡単なことをやっているように思われるかもしれないが、そこにこそ人工知能の基礎がある。音を連続的に言葉に変えること、それは素晴らしいことだと思う。確かに、その言葉を意味化することはできていない。しかし、決定的に重要な一歩だと思う。
そこで、エコーロボットというのを考えてみる。いや、実際に作ってみようと思う。人が話しかけた言葉を、そのまま鸚鵡返しに、自分で繰り返すのだ。音声を単にロボットの発音に変換するのではない。一旦、「言葉」してから、ロボットの音声としてそれを発するのだ。赤ちゃんが、お母さんの言葉を真似しながら、言葉を覚えていくことに似ている。マネができれば、その意味を少し理解して返せば、ごく簡単な人間的応答ができてしまうはずだ。お笑いで言えば、いつかそれがボケにつながる。
エコーロボットは、人工知能型ロボットの最も初歩的なもので、プログラミングで言えば、"Hello World" に対応するものだ。
そのための技術としては、まず、ロボットの音声データをストリーミングで受け取る必要がある。これは、ALAudioDeviceでできることがわかった。それを、GoogleのCloud APIに送って、これまたストリーミングで言葉化する。返ってきた言葉を、ロボットに送り込んでALTextSpeechで発生させる。
プログラミングのツボはだいたいわかったので、数日中にはできると思う。
 
 

チャッペック作『ロボット』を読み終える

大学に来るとき、電車の中でチャッペック作『ロボット』の最後の部分を読んでいたために、駅を乗り過ごしてしまった。後楽園で降りるべきところを神保町まで行ってしまった。大学まで歩くと35分。昔は何度も歩いた。ついでだからとそこで降りて、古本屋街で店頭の古本のタイトルを斜め読みしながら、九段下まで行く。九段下から新宿線に乗るつもりが東西線に間違って乗った。また、戻って飯田橋で南北線に乗り、ようやく四谷までついた。その間に、ベンチに座ったりしているときに続きを読み、結局最後まで読んでしまった。
SF的な味わいはない。人間がロボットを生み出す。そのそロボットは、我々がイメージする機械的なロボットではなく、動物的、有機的組織を持つ、人造人間(アンドロイド)といったほうが良いものである。大量の生産されたロボットがて人間を滅亡に追い込む。それによって、ロボットも滅亡の危機に瀕するが、ロボットの中に新しいアダムとイブが生まれ、新しい種となっていく。SFよりももっと、薄気味悪さがそこに漂っている。
あまりに人に似過ぎたロボットが醸し出す薄気味悪さ。それは本質的な問題である。ヒューマノイドロボットは人間に近づこうとしているのか。それは許されない。ロボットはロボットらしい表現、コミュニケーションを持っていなければならない。あまり、この本に関係ないことなのだが。