8 Following a wall

Robot Programmer’s Bonanza
8
2011–11–10
白井ゼミ資料
Following a wall
物体の輪郭に沿ってロボットを移動させることが必要になる場合:
• ロボットが定められた経路に沿って移動中に計路上に物体を検出した場合、その物体を迂回す
ることが必要となる
• 例えばオフィスのようなところで郵便を配達するロボットの場合、壁に沿って廊下に出て、廊
下を通って順番にオフィスを訪れ、荷物の配送と受取りを行う
• 迷路を解くための方略の一つは、(左か右の)一方向に壁に沿って歩くというもの
本章では、物体に衝突することなくその形状にあわせて (近すぎず遠すぎず) ロボットが移動するた
めのいろいろな方法を学ぶ。
8.1
Constructing a wall
• アルゴリズムのテスト用に複雑な形状の障害物の設置が必要。
• ロボットの動きの概要: 障害物に当たるまで前進、障害物に当たったら前進をあきらめ、「壁
伝い (wall-following)」運動をする。
• 図 8.1 はそのテンプレート:メインプログラムが一つと三つのサブルーチン
– DrawWall — mPolygon と、一連の Data 文で作られる配列 Wall を使用し、壁を描画
– RoamAround — 障害物に当たるまでロボットを前進させる。障害物にぶつかったらメ
インに戻る
– FollowWall — 今のところ「空っぽ」。このアルゴリズムを本章で開発
8.2
Basic algorithm
• ロボットが壁に沿ってどのように動くかを理解するには—迷路で右手か左手を出して壁を触
りながら歩くことを想像してみよう。壁から離れすぎるとこれができないし、近すぎるとぶつ
かる。また壁がカーブしていれば、それに合わせて転回しなければならない。
• 図 8.2 はそのような方法の一つ。図 8.1 の FollowWall をこれで置き換えて使う。外側の whille-loop
はロボットに無限に壁伝いさせるもの。内側の while-loop はロボットの右の赤外線センサー
が壁を捉えている限りは壁から離れさせるもの。そうでなければ一歩進み、壁の方に 1 度向
く、ということを繰り返す。
1
8.2.1
Probelms with the basic algorithm
• このプログラムには二つの短所がある—図 8.3 からそれは明らか。
1. ロボットは壁に並行に動くというより弧をえがくように動く傾向がある
2. 急な角度のターンを必要とするようなところでロボットは衝突する
• このロジックがなぜ失敗したかを分析—その前に赤外線センサーのチェック:rDFeel() 関数と
Debug 文を使う
• 弧をえがくように動く理由
• 図 8.3 の衝突の理由
8.2.2
Improving the algorithm
• rFeel() & 3 ではなく rFeel() & 6 を使う (なぜか?)
その結果が図 8.4 =⇒ 動きが弧ではなく直線に近くなる
• 違うところで衝突する
バンパーセンサーを使うならばこのような状況のほとんどを防ぐことができよう
8.2.3
Using the bumpers
• 壁を右伝いするのと左伝いするのとの違い: 用いるセンサー、転回の向き
• 左転回するのと右転回するのを簡単に切り替えられるようにしたい—そのためのコードが
TurnDir = -1。この変数はスイッチのように機能する。 -1 なら左に、1 なら右に転回
• 図 8.5 に、これに関連したコードを載せる
• TurnDir の値を 1 にして、動きがどのように変わるかをチェックせよ
8.3
Staying Close on Sharp Corners
鋭角に物体が曲がっているときにロボットがかなりそれから離れて回る理由は、1 ピクセル進む
ときに最大 1o だけしか転回しないから
8.3.1
Initial algorithm
• 図 8.6 のアルゴリズムはこの問題に対する最初の解決案— 物体が鋭角に曲がっているときに
回転角度を大きくする
そのためには「物体が鋭角に曲がっている」ことの判定方法が必要: これが図 8.6 の 13 から
21 行目。変数 SFN の役割—回転方向に依存した 90o のセンサーのチェック
• TurnAmount の値を 5 にしてある—回転角度を大きく
この値を変えて試してみよ
• このアルゴリズムは左転回 (T urnDir = −1) ならそこそこうまくいくが、右転回では立ち往
生することになる
2
8.3.2
Finding the problem
立ち往生する原因をつきとめる。そのために 13 行目の前に Debug rFeel() をいれてみる
プログラムを走らせ、ストールしたら端末画面で Turn Debug On ボタンを押す。ステップを用
いてストール時点でのセンサーの値を表示させる。 rFeel()) の値が 5(00101) なら、それは右と前
のセンサーが反応しているが、45o の角度のセンサーは反応していないことを意味する—図 8.6 のプ
ログラムは 45o のセンサーを使って壁から回転するかどうかを決定しているので、なぜ回転しない
のかという理由が分かるだろう。すると「なぜ図 8.5 のプログラムは失敗しないのか」という疑問
にいきあたる。よく図 8.5 のコードを調べてみればその理由が分かるだろう—常に1ピクセル前に
移動しているのである。これにより 45o のセンサーが反応し、望み通りロボットは回転する。
8.3.3
Solving the problem
With a real-world robot it is often hard to test algorithms comprehensively due to the difficulty
of constructing various environments that may cause problems. A robot that seems to work well
in the limted testing environments will often fail when it is faced with an unanticipated situation.
With a simulator you can construct random enviroenments. You can construct numerous varieties
of environments. You can test the robot inside these environments for many hours or days. This
helps ensure that your algorithms have been well exercised and the possibiliteis of failure are
reduced, but as we have seen above, the debugger cannot substitute for thorough reasoning.
8.4
A different approach
• 赤外線センサーの問題: 障害物の見落としの可能性、センサーの探索範囲や障害物との距離の
調整の困難さ
• 赤外線センサーの代替としてのレンジセンサー。rRange() 関数の使用。引数なしの場合 (0 と
みなす) 前方の物体との距離を返し、引数を与えた場合はその角度にある物体との距離を返す。
• 引数は −90 から 90 の範囲。返す距離は先端からの物体までの距離。
8.5
Summary
1. いろいろなアルゴリズムとセンサーを用いて壁に沿ってロボットを動かす方法を学んだ
2. アルゴリズムの開発とデバッグのやりかたをみた
3. 予見しない状況がいかに起こり、またそれが分析しにくいことをみた
4. ロボットのプログラミングにはセンサーだけではなく、論理演算とビット演算の両方を処理す
る能力も必要なことを学んだ
5. rRange() 関数の拡張版を学んだ
6. 配列、Data、MPolygon についてさらに学習した
3
8.6
Exercises
1. 本章のサブルーチンを走らせ、その性能を評価せよ。デバッグ文を追加しロボットの振る舞い
を分析せよ。
2. 本章のすべてのアルゴリズムを、図 8.10 で述べた壁で試せ。なぜいくつかのアルゴリズムが
失敗するか、その理由が分かるだろうか?失敗しないアルゴリズムがいくつかある場合、ある
アルゴリズムが失敗しない他のアルゴリズムと比べて良いか悪いかはどのように判断するだ
ろうか?
3. 図 8.8 と図 8.6(ただし本文中で述べたように修正したもの)のアルゴリズムにおいて、パラ
メタを変えてそのパラメタがどのようにロボットの動きに影響しているかを考察せよ。図 8.8
において、ロボットを壁にもっと近づけるには動したら良いか?RangeLimit の値として最小
値はどのくらいか?またその理由は?
ヒント: rRange() 関数はロボットの先端からの相対値を返す。先端はロボットの中心線上の
点である。したがって、rRange(90) が 20 を返すとすれば、それは右端に障害物がほとんど
接していることを意味する。
4. 円や長方形や三角形をいくつか描き、これらの障害物でアルゴリズムを試せ。どのアルゴリズ
ムが、障害物の輪郭を忠実になぞる(すなわち、障害物が円なら円を、長方形なら長方形を、
三角形なら三角形をロボットは描く)だろうか?図 8.8 のアルゴリズムを用いてどのくらいロ
ボットは物体から離れるかを示せ。いろいろな距離で物体に沿って動くようにせよ。
4