日 | 月 | 火 | 水 | 木 | 金 | 土 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 |
« 2014年9月 | トップページ | 2014年11月 »
管理人のページ:
いままでの測距センサGP2Y0A21YK同様、アナログで距離を読むのはとても簡単です。1ピンと5ピンに電源電圧(2.7〜5.5V)、3ピンをGND、距離に応じた電圧は2ピンに出ます。距離と電圧の関係はこのようになっています。
距離対電圧が直線になっているので、普通の測距センサと比べて電圧から距離の計算は少し楽になります。また、線の途切れている部分、すなわち測定範囲外では0.1〜0.5V程の電圧が出ます。電圧がその範囲ならデータ無効と判断します。測定時間は最大40msとなっています。タイマー割り込みなどで40msごとにデータを読み出せば良い訳です。以前のセンサは50msくらいでしたから、ちょびっと高速になりました。
このセンサの消費電流は「平均」26mAとなってますが、GP2Y0A21YKのようにパルス状に比較的大きな電流が流れるようになっています。ただ、GP2Y0A21YKのパルス電流はこの投稿にあるように200mA以上ですが、新型は約100mA、データシートには150mA以上取れる電源を使用することとあります。小さな電源の場合は、電源ピン付近に10uF程度のコンデンサを入れた方が安心のようです。
テストのため、カッターマット上にセンサとテスタを乗せ、このままズルズルと室内を引きずり回して、センサの反応を見ました。電源には単三電池2本を使いました。箱の脇に見えているのが、センサ本体、地上高30mmくらいにセットしました。
赤外線のパワーが小さいせいか、家具の角や、家具と家具との隙間などは、だいぶ近づかないと反応しないようです。30cmくらいまで近づいて、ようやく反応がでると言った感じです。また、昼間太陽光がガラス越しに差し込んでいる明るい室内では、平らな壁でも50cmでは反応しないということもありました。太陽光の赤外線成分がジャマをしているようです。それから、マンガ雑誌の表紙のように、平面でも派手な印刷がしてあるものは、場所により距離がばらつくようです。これは以前のセンサでもありましたが、もっと神経質な感じです。測定用の赤外スポットが小さいせいかも知れません。
それを別にすれば、以前のセンサ同様に使えます。ロボットの障害物感知センサとしては、30cmくらいまでが実用範囲かなと思います。小型のロボットなら十分です。
花岡ちゃんのウィークエンド
今年の冬に購入したこのセット、はや10ヶ月くらいも放っておいたので、ubuntuをインストールしてテストすることにしました。本の通りにやれば簡単‥のはずでしたが「旬を逃した」ため、書いてある通りではダメでした。結構苦労したので、同じ境遇の方のために投稿することにしました。
まず、本では12.04LTSを入れるようになっていますが、本に書いてある方法だと、今ではこれは入らないようです。そこでutopic(14.10)を入れることにしました。どうしても12.04というなら別の方法があります。これで作ったmicroSDでも動作を確認しました。
作業は本の通り、ubuntuを入れたノートパソコンで行いました。必要なライブラリは本の通り、sudo apt-get install wget dosfstools u-boot-tools で最初にインストールしておきます。git-coreは最初から入っているようです。
・homeにworkディレクトリを作り、端末でそこに移動しておく
・git clone git://github.com/RobertCNelson/netinstall.git でインストールスクリプト取得、work/netinstallに格納される。(本の通り)
・microSDを入れる(本と違ってアンマウントはしない)
・本では、git checkoutして古いインストールスクリプトを使うようにあるが、これを使うとうまくいかないのでこれはやらない。参照しているサーバから古いファイルがマメに削除されているためらしい。もちろんスクリプトの修正もしない。
・work/netinstallに移動して、sudo LANG=C ./mk_mmc.sh --mmc /dev/sdb --dtb am335x-bone-serial --distro utopic でmicroSDに書き込む。LANG=Cはおまじない。
あとは本の通りに、microSDをBeagleBoneに差し込んで起動すれば良いです。残りのインストールが起動します。ただし、基板上のS2ボタンを押しながら電源を入れないと、microSDから起動しないようです。また、本にはUSB-Etherアダプターを使用するようにありますが、本体のEtherコネクターでネットインストール出来ました。14.10のためだと思います。アプリケーションはBasic ubuntu serverとOpenSSH serverのみインストールしました。これで十分です。
まだ、いろいろ試した訳ではありませんが、BeagleBoneで制御系を試してみたい人には、とても良い本だと思います。お勧めです。
次はwifi化して消費電力をはかります。→こちら
管理人のページ:
今日は以前から気になっていた、シャープの測距センサ、GP2Y0E03(いつも思うんですが、名前が覚えにくい部品ですね)を試してみます。モノはこれです。兄貴分のGP2Y0A21YKと比べるとこんなにちいさい。これなら取り付け場所に悩むことも少なくなりそうです。
次に動作電圧範囲が広くなりました。2.7~5.5Vなので、乾電池2本でも動作します。リポ電池を使った小型ガジェットにも安定に使えます。
それから、アナログ出力だけでなくI2Cにも対応しました。このため、測距データの読み出しや、アクティベーションや細々した測定パラメータの変更が可能になりました。これはアナログポートの倹約になりますし、電線を引き回しても測定結果にノイズが乗りにくくなると思います。デフォルトのアドレスは固定になっていますが、不揮発性メモリを書き換えることで変更可能です。16通りのアドレスを設定できるので、一つのI2Cバスで16個のセンサを使えます。
さらにデバイスをスリープに入れられるようになりました。これは外部からGPIO1というピンを0に落とすか、I2Cでスリープ命令を送って実行します。このときの消費電力は20uA程度になるので、電池動作機器にはありがたい機能です。もっとありがたいことは、この機能を使って、複数のセンサの読み込みタイミングを操作できることです。
今までの測距センサは電源を入れると赤外線を発射し続けるので、例えば、センサを二つ並べておくと、隣のセンサの赤外光に反応して、誤動作をすることがあります。このような場合は、FETスイッチで各個に電源をON/OFFするしかありませんでしたが、この機能を使えば、測定したいセンサだけをアクティブにすることで、簡単に対応することが出来ます。
もう一つ良くなった点は、近すぎる物体の検出結果が改良されたことです。いままでの測距センサだと、近い方のリミット距離より近い対象物は、ずっと遠くにあるかのように測定されてしまいました。このため、移動ロボットなどでは、センサの搭載位置を工夫して、ロボットが壁などに接触しても、センサと壁が十分離れているようにする必要がありました。このセンサは、近すぎたり遠すぎたりする反応のときは、アナログ出力の場合、極端に低い電圧が出るので、近づきすぎを判断することができます。
このセンサは最小距離4cmで2.2V、最大距離50cmで0.55Vの電圧になりますが、その範囲外では、おおよそ0.1Vくらいの電圧になります。これは、ある距離をすぎると急激に電圧が落ちるので、範囲外になったことを容易に判別できます。これは障害物にぶつかるかもしれない移動ロボットのセンサとしては、使いやすい特性です。
ただし、以前のセンサより悪くなったと思われる点もあります。本の表紙のような大きくて平らな物体はよいのですが、ビールの缶のような円筒形で小さい物体は、距離の遠いところで、以前のセンサより読み取り数値がばらつくようです。
まず、簡単にアナログ出力で動作させてみます。→こちら
花岡ちゃんのウィークエンド:サブサンプション・エンジン
今回はエンジンの実装方法について考えます。実装方法としては大雑把に下記の方法が考えられます。
1:ROSを使う
ROSはそもそもノードと呼ばれる並列動作のプログラム間で、メッセージをやり取りするためのフレームワークですから、サブサンプション・アーキテクチャの実装は簡単に出来そうです。
2:マルチスレッドOSを使う
つまりWindowsとかlinuxとかのOS上で実装するということ。普通のパソコンアプリを作る感じですね。
3:マルチプロセッサを使う
複数のマイクロコンピュータを通信で結んで、ハード的に並列動作を実装しようと言う訳です。
4:インタープリタや仮想マシンを使う
ソフト的に並列動作をエミュレーションをさせる方式です。
今回のエンジンは、「ウィークエンド」の企画なので、簡単に作れることも重要です。そうなるとROSは別カテゴリーで苦労しているように、サンデープログラマには向いていません。OS方式はRasberry-PiとかBeagle Boneとかの高機能マイコンボードを使えば、小さなロボットに搭載出来ますが、ROSのようなフレームワークから自作する必要があり、結構大変そうです。マルチプロセッサはとても面白そうですが、ハンダ付けをいっぱいやらなければならないので、今日的ではなさそうです。ただ、「2001年宇宙の旅」に登場するHAL-9000のメモリーバンクみたいに作ると面白そうです。モジュールを抜き差しすると性格が変わったりしたら、ほんとに面白いですね。こんな感じに。
結果的にバンダイのサブサンプション・エンジンと同じように、インタープリタ(というかシーケンサ)を作るのが、製作も使用も簡単に済みそうです。同時にサブサンプションの原理が実験できるロボットも作ることにします。「ウィークエンド」なので、どちらも簡単に作れるようにしたいと考えています。
製作記はタイトルを変えて、このカテゴリに連載予定です。
花岡ちゃんのウィークエンド:サブサンプション・エンジン
デザインを始める前に、サブサンプション・アーキテクチャの「可能性」について考えておきましょう。つまり、どれくらいの能力のロボットを実現できるのかということです。
今まで見てきたサブサンプションの実装例は、まさに昆虫のように単純なビヘィビアばかりでした。解説がわかりやすいように、「障害物回避」「うろうろする」といった単純なビヘィビアを選んでいただけで、実際のところ、もっと高度なビヘィビアを使ってもかまわない訳です。
例えばこのような実装も考えられます。
これはマップ情報に基づいて、障害物や地形上通れないところを避けながら、目的地まで移動するロボットです。ちょっと見ると1回目の投稿で触れた、シェーキー式の外界モデルを使った移動ロボットと同じようですね。
「経路追従」というビヘィビアが、例えば「前へ1m進んで右に90°旋回、それから3mいくと目的地」というシーケンスを生成し、それを機械的に実行するなら、まさにその通りですが、ここでのビヘィビアは、「現在位置から目的地への経路を計算し、この経路に乗るようにモーターに制御信号を送る」というモノになっています。移動する空間に、目的地に至る見えない線を引き、その線をたどる「ライントレース」ビヘィビアだと考えるとわかりやすいでしょう。
このようなビヘィビアなら、優先度の高い「障害物回避」ビヘィビアが働いて位置が変わっても、目的地へのコースに再度乗ることが出来ます。つまり、マップにない障害物が現れても、簡単な実装で回避できる訳です。
サブサンプション的な実装というと、とかく簡単な反射行動が取り上げられ、あまり実用的でないように思われがちですが、このように高度なビヘィビアを包摂することで、実用的なロボット開発にも有効なアーキテクチャだと思います。
花岡ちゃんのウィークエンド:サブサンプション・エンジン
今回はバンダイ流サブサンプション・エンジンのもう一つの特徴を見ていきましょう。それは「パネル」という概念です。
これまでの説明でお分かりと思いますが、単純なサブサンプション的実装では、ある一つの仕事をさせることしか出来ません。「障害物を避けながら移動する」「目の前の物体を押す」という二つのビヘィビアを持たせたい場合は、何らかの方法で、文字通りアタマを「切り替え」る必要があります。
バンダイではコレを「パネル」を使って実装しています。まず、空の「パネル」を作り、それにビヘィビアをプログラムします。最後に、そのパネルからの出口を「どのセンサが反応したら、どのパネルにジャンプするか」を表す「パネルジャンプ命令」で定義します。こんな感じです。
BN-1には拍手に反応するサウンドセンサがあるので、これは障害物を回避しながら移動するビヘィビアと、近くの物体を押すビヘィビアを、拍手で切り替えています。もちろん、一つのパネルに複数のパネルジャンプを用意して、反応したセンサごとに違うパネルに切り替えることもできます。
バンダイのサブサンプション・エンジンでは、このパネルを多数用意することで、ペットプログラムを実装していると考えられます。この方式のよい点は、構造が単純でプログラムしやすいことだと思います。実際、ペットプログラムのように「なでられると機嫌が良くなる」といった状態遷移を記述するのは、とても簡単です。一方、単純であるが故に、同じようなビヘィビアを様々な状態ごとに用意しなければならないという欠点もあります。例えば、機嫌の良いときに移動するビヘィビアと、機嫌が悪いときに移動するビヘィビアは、「移動する」部分はほとんど同じで、歩き方とか目玉のグラフィックが違うだけ、というものになりがちです。
バンダイでもこの不都合には気づいていたようで、「パネル参照」という概念で、既存のパネルの内容を取り込み、さらに優先度の高い反射を追加することが出来るようになっています。例えば「壁沿いに歩く」というパネルを作っておき、そのようなビヘィビアが必要な際は、それを実行時に「参照」することで、同じようなパネルを作る無駄を省けるようになっています。しかし、複数のパネルを参照すること、つまり、複数の既存のビヘィビアを集めて新しいビヘィビアを作ることはできません。
ここまでで、サブサンプション・アーキテクチャとバンダイ流サブサンプション・エンジンの下調べはおしまいです。次回からは、これを元に花岡ちゃん流のサブサンプション・エンジンをデザインしたいと思います。
花岡ちゃんのウィークエンド:サブサンプション
今回はバンダイ流サブサンプション・エンジンを詳しく見ていきますが、その前に、サブサンプション・アーキテクチャをおさらいしておきましょう。
最初の投稿の図をちょっと省略して書き直したものです。青いブロックがビヘィビア(ふるまい)のプログラムモジュールで、包摂関係により、図のような優先順位がついています。
バンダイのサブサンプションの実装はこのようになっています。これは先の図と同じ内容をプログラムしたものです。
最初の図と大きく異なるのは、真ん中のプログラムモジュールです。「障害物回避」というまとまったビヘィビアではなく、「右センサ反応なら少し右旋回」といった単純な反射行動になっています。もう少しよく見てみると、「少し右旋回」「少し左旋回」「バックして旋回」の3つの反射行動の組み合わせで「障害物回避」というビヘィビアを実現していることがわかります。同様に、「時間が来たらランダムに旋回」と「どの反射もないときは前進」で「うろうろ」ビヘィビアを構成しています。
バンダイのサブサンプション・エンジンは「簡単にプログラムできる」ことを主眼点に置いているので、このようにしているようです。この方式なら、あらかじめ各個のビヘィビアの仕様を決めなくとも、プラクティカルに比較的複雑なビヘィビア(例のように複数のビヘィビアを包摂したもの)を構築できます。
ただ、ブルックスによると、十分にテストしたビヘィビアを包摂することで、新たなビヘィビアを比較的簡単に追加し、システムを成長させられるのが、サブサンプション・アーキテクチャの利点の一つなのですが、バンダイ流の実装だと、それは出来ません。小規模のロボットシステムの構築に限られるのではないかと思います。
バンダイのサブサンプション・エンジンには、もう一つの特徴があります。これは次回説明したいと思います。
花岡ちゃんのウィークエンド:サブサンプション・エンジン
電源が切れていると、ちょっと不気味な感じですが、動き出すとなかなかカワイイ動きをします。これは「脚車輪」構造で、前足にモーターで駆動される車輪がついています。後ろ足は従輪です。このロボットには「ペットプログラム」がROM化されて実装されているのですが、別売の「プログラミング・キット」を使うと、自分でプログラムすることが出来ます。
キットの内容はこんなところです。黒い箱がBN-1と赤外線通信するためのインターフェイスで、パソコンのシリアルポートに接続します。CDにはプログラミング環境「A.I.トレーナー」が収められています。
こんな風に、BN-1とインターフェイスを向かい合わせてプログラムを転送します。プログラム画面はこんな感じです。
バンダイでは「c言語などの知識がない人でも、自律ロボットを簡単にプログラムできる」ツールとして、サブサンプション・エンジンを使っています。3つのウィンドウが開いていますが、一番大きなウィンドウがプログラムを書き込む部分です。色々なセンサが反応した際のロボットの行動を定義することで、ロボットのビヘィビア(ふるまい)を創り出していきます。例えば、この画面では、「障害物をよけながら動き続ける」ビヘィビアをプログラムしています。実行結果が下の動画です。
花岡ちゃんのウィークエンド:サブサンプション・エンジン
真ん中の3つのボックスは上から「周囲を探検する」「うろうろする」「障害物を避ける」という行動を表しています。この実装で最終的に実現したいのは「周囲を探検する」という行動です。つまり、それがこのロボットの目的になります。
ボックスは、それぞれ独立のプログラムで、左側の「センサー情報」ボックスからの情報に基づいて行動を生成します。この結果、それぞれのボックスから、走行モーターを(右側のボックス)コントロールする信号が発生します。これが行動ボックスから出ている→です。
→をよく見ると、上の→が下の→を押さえ込む用に描かれていますが、これが重要です。これは「包摂」関係を表していて、例えば「障害物を避ける」という行動は「うろうろする」という行動に「包摂」されています。つまり、「障害物を避ける」行動は「うろうろする」行動の一部となっているのです。
これは簡単に思考実験できると思います。
例えば「障害物を避ける」行動とは障害物を発見すると、そこから離れるようにモーターへ信号を送ります。同様に「うろうろする」は一定時間前進し、ランダムに方向を変える信号をモーターに送ります。このような構造にすると、方向を変えて動き回りながら、障害物を回避する行動をプログラムすることが出来ます。
「包摂」関係を成り立たせるためには、「障害物を避ける」からの信号が、「うろうろする」信号を抑圧する、つまり、「障害物を避ける」からの信号が優先してモーターへ送られるようになっていればよい訳です。こうすれば「うろうろする」プログラムに従って行動中に、障害物を発見すると、回避行動の方が優先されるので、たとえそのとき「うろうろする」プログラムが、前進の信号をモーターに送っていたとしても、無事に障害物を回避できるのです。
ただし!上の説明はブルックスの有名な論文(下記)とはちょっと違っています。ブルックスの論文では、行動の優先順位はあくまで上になっているブロックにあるように見えます。つまり、上の説明とは逆です。それだとロボットはうっかりすると障害物にぶつかってしまいそうなものですが、ブルックスの仮想ロボットのブロック図を見ると確かにそうなっています。
ブルックスの仮想ロボットはかなり複雑で、さまざまなモジュールが相互に影響を及ぼすようになっています。また、優先信号には時間制限があり、これがどう影響するのかはよくわかりません。あるモジュールの信号と上位からの信号が交互にモーターに送られるということも考えられます。こうなると完全に下位のビヘィビアをブロックするのではなく、「効きを鈍くする」作用もでてくるでしょう。
ただ、ブルックスの「ビヘィビアを組み合わせて目的の行動を作る」という考え方からすると、上のような解釈が比較的合理性が高いのではないかと思います。もちろん、これは解釈の問題で、サブサンプションアーキテクチャの本質に関わるハナシではありません。この投稿のシリーズでは、この考え方で行こうと思います。
このようなアーキテクチャを使ったロボットは、シェーキーのような「正統派」の知能ロボットに比べ、単純なコンピュータで実現でき、また、反応速度が早くなります。実用的な作業ロボットを実現するには有効ということで、roombaの制御にも応用されています。もっとも、iRobotのスタートアップの一人がブルックスでしたが。
サブサンプション・アーキテクチャは昆虫の行動原理に似ています。たいしたことはできそうないという考え方もありますが、85年の有名なブルックスの論文には、結構複雑な行動をとるモデルへのアプローチもあり、研究しがいがありそうな技術です。
次回は、バンダイのロボットシリーズに使われている「サブサンプション・エンジン」について説明します。