Let's now have some fun and apply this to an actual car problem.
The one I'll using is a bit simplified as always,
but it does relate to real world path planning as is done, for example, by Google Maps.
Suppose we have a car down here.
This car now has its state an x, a y, and an orientation, theta.
By orientation for simplicity is chosen from 4 possible directions--up, down, left, and right.
As I quiz you in the beginning, I'd like to get to the location over here, facing left.
Realize that now the state space is 3-dimensional, just like in our localization example.
I now would like to implement a dynamic programming planner
that gives me the optimal path for going from here to here
and that let's me play with cost functions.
There are three principle actions.
One is move in which the car just goes 1 grid cell forward in its present orientation.
It doesn't turn at all. That could be applied anywhere in the maze in any direction.
One is turn left and then move.
This car in this position in the cell over here could chose
the turn left and move, which makes it move over here.
The last one is turn right and move,
in which case it would, from this cell over here,
turn over here and head in this direction.
Here's our world again.
You can see there is a street over here that's navigable, one over here that's navigable.
You see the loop on the right side.
Remember that now this state space is 3-dimensional, not 2- dimensional.
Our goal is to move to cell [2, 0], which is the one over here.
Our initial state is up here,
and the initial state has not just a position of [4, 3] but also an orientation of 0.
It's a 3-dimensional state.
Here are my orientations--0, 1, 2, and 3.
The first one makes the robot go up, the second go left,
third one go down, and the fourth one go right.
Here are the names associated with it---up, left, down, and right.
This thing here is interesting.
As actions, we have 3 actions.
We can add to the index orientation -1, 0, or 1.
If we add -1 we jump 1 up in the cyclic array over here,
which is the same as doing a right turn.
For example, if you go from go left to go up, that the same as turning right.
If we add +1, that's the same as turning left.
If we leave the orientation unchanged,
then we go straight, which is indicated by this hash symbol over here.
These actions come with different costs.
Right now the left turn costs me 2, going straight costs me 1,
and going right costs me 1 as well, which, as we all know,
makes the left turn the preferred solution over here.
Indeed, as I run it, you can see how the car turns left over here to the goal location.
If I were to increase the cost for the left action to 20, then my solution changes.
You can see the car dashes straight ahead over here, turns right over here,
right over here, right over here, and then goes straight to the goal location.
That software I want you to implement. There is one more hint.
The value function itself is 3-dimensional, and here is the code that I've been using.
Not necessarily the most efficient, but it has inside 4 identical arrays
of the size of the grid concatenated into a megagrid
and initialized all by a very large value--999 in this case.
You need functions just like these, and it turns out this makes it more difficult to write the code.
This is our last quiz in this lecture.
Our last programming assignment, and you might spend some time.
It took me a while to program it myself to get an output just like this over here.
それではこれを実際の車の問題に
応用してみましょう
使用するものは
いつものように少し簡略化されていますが
現実世界の経路計画に関連しており
Googleマップなどで応用されています
ここに車があるとしましょう
この車は状態としてx、yと
方向であるθを持っています
分かりやすくするために方向は
4方向から選択します
上下左右の4つです
以前の小テストと同じように
この場所に左を向いて到達したいと思います
位置推定の例と同様
今回の状態空間は三次元だと理解していますね
ではダイナミック・プログラミング
プランナを実装し
ここからここまでの最適な経路を見つけます
そしてコスト関数で遊んでみましょう
主な動作は3つあります
1つ目は車が現在の方向に向かって
グリッドセル1つ前進する動作です
直進のみの動作で迷路のどの場所でも
どの方向にも応用できます
2つ目は車が左折して前進する動作です
車がこのセルの位置にいる場合
左折することができ このセルに移動します
最後の3つ目は右折して前進する動作です
その場合 車はこのセルから右折し
このセルに移動します
私たちの世界をもう一度見てみましょう
ここに通行できる道があり横の道も通行できます
右側はループになっています
この状態空間は二次元ではなく
三次元だということを思い出してください
私たちのゴールは[2,0]に移動することです
初期状態はここです
初期状態は[4,3]という位置だけでなく
0という方向も持っています
つまり三次元の状態です
ここにあるのが方向です
0、1、2、3です
ロボットはここで上へ次で左へ進みます
ここでは下へ そして右へ進みます
ここの名前は上、左、下、右に関連しています
これは興味深いことです
私たちには3つの動作があり
方向のインデックスに-1、0、1を追加できます
-1を追加した場合
ここにある循環配列で1つ上に行き
右折を行うのと同じことになります
例えば左折して上に進むと
右折したことと同じになります
+1を加えると左折と同じことになります
方向を変更せずに直進する場合は
ここにある#記号で示されます
これらの動作には異なるコストがかかり
左折のコストは2で直進のコストは1です
そして右折のコストも1です
皆さんもお分かりのとおり
ここで左折するのが好ましい解答です
実際にこれを実行すると車がここで左折して
ゴール位置に向かうのが分かります
もし私が左折のコストを20に増やしたとしたら
私の解答は変わります
車はここで直進し ここで右折
ここで右折、また右折して
ゴール位置まで直進します
これが皆さんに実装してほしいソフトウェアで
ヒントが1つあります
価値関数自体は三次元で
これが私が使用しているコードです
効率的ではありませんが
この関数にはグリッド内に
同一の配列が4つあり
巨大なグリッドとして統合されています
この場合は非常に大きな値999で
すべて初期化されています
皆さんはこれに似た関数が必要であり
コードの記述が難しくなっています
この講義の最後のプログラミング課題は
多少時間がかかるかもしれません
私自身もプログラミングしてこの出力を得るまでに
少し時間がかかりました
Давайте теперь иметь некоторую потеху и применить это к фактической автомобиля проблему.
Один, я буду использовать немного упрощен, как всегда,
но он относиться к реальным миром путь планирования, как это делается, например, Google Maps.
Предположим, что у нас есть автомобиль вниз здесь.
Этот автомобиль теперь имеет свое состояние x, y и ориентации, тета.
По ориентации для простоты выбирается из 4 возможных направлений--вверх, вниз, влево и вправо.
Как я викторины вам в начале, я хотел добраться до места здесь, перед слева.
Понимаю, что теперь пространства государства является 3-мерной, так же, как в нашем примере локализации.
Я хотел бы теперь реализации динамического программирования планировщик
Это дает мне оптимальный путь для идти здесь здесь
и что меня поиграем с функций издержек.
Есть три принципа действия.
Один является двигаться в котором автомобиль просто идет 1 ячейке вперед в своей нынешней ориентации.
Это не получится вообще. Что могут применяться в любом месте в лабиринте в любом направлении.
Можно повернуть налево, а затем перейти.
Этот автомобиль в этой позиции в ячейку над здесь мог бы выбрал
Поверните налево и двигаться, что делает его наведите здесь.
Последний является повернуть направо и двигаться,
в этом случае она будет, от этой ячейки над здесь,
Переверните здесь и голову в этом направлении.
Вот наш мир снова.
Вы можете видеть есть улица здесь, является судоходным, один над здесь, что судоходна.
Вы видите петлю на правой стороне.
Помните, что теперь это государство пространство является 3-мерной, не 2-мерных.
Наша цель – чтобы перейти к ячейке [2, 0], который является одним над здесь.
Наши начальное состояние является здесь,
и начальное состояние имеет не только позицию [4, 3] но также ориентация 0.
Это 3-мерного государство.
Вот мои ориентации--0, 1, 2 и 3.
Первый из них делает робот идти вверх, второй идем налево,
Третий один идти вниз, и четвертый идти прямо.
Вот имена, связанные с ним---вверх, влево, вниз и вправо.
Эта вещь здесь интересно.
Как действия у нас есть 3 действия.
Мы можем добавить в индекс ориентации -1, 0 или 1.
Если мы добавим -1 мы перепрыгнуть 1 вверх в массиве циклических здесь,
Это так же, как делает правый поворот.
Например, если вы идете от идем налево идти вверх, что так же, как поворотный правый.
Если мы добавим + 1, это то же самое, как поворот налево.
Если мы оставить без изменений, ориентация
Тогда мы идем прямо, который обозначается этим символом хэш здесь.
Эти действия поставляются с различными затратами.
Сейчас левый поворот расходы мне 2, идя прямые затраты меня 1,
и собирается правый расходы мне 1 а, который, как мы все знаем,
делает левый поворот предпочтительное решение здесь.
Действительно как я запускаю его, вы можете увидеть, как автомобиль оказывается осталось здесь местоположение цели.
Если я, чтобы увеличить стоимость для левой действий до 20, мое решение изменяется.
Вы можете увидеть тире автомобиль прямо над здесь, оказывается прямо над здесь,
прямо здесь, прямо над здесь и затем идет прямо к местоположение цели.
Это программное обеспечение, я хочу вам реализовать. Существует еще один намек.
Сама функция значение 3-мерного, и вот код, который я использую.
Не обязательно наиболее эффективным, но она имеет внутри 4 идентичных массивы
размера сетки, объединены в megagrid
и инициализируется все на очень большое значение — 999 в данном случае.
Вам нужно функции так же, как эти, и оказывается, это делает его более трудным для написания кода.
Это наш последний викторины в этой лекции.
Наши последние программирования уступки и вы могли бы потратить некоторое время.
Он взял меня некоторое время, чтобы программировать себя, чтобы получить выход, как это здесь.