2015-02-16 2 views
0

В моем проекте я просто пытаюсь создать робота, который исследует как можно большую часть сетки, не делая один и тот же путь дважды. Кроме того, у него есть датчик, чтобы увидеть, лежит ли объект на своем пути (объект может находиться только в коридоре). Но у меня возникают проблемы с попыткой заставить робота избежать того же пути.Программирование робота для изучения сетки

Я попытался решить эту проблему, создав 2D-массив для хранения целочисленного значения для каждого квадрата в сетке. Значение 0 означает, что робот еще не был на этом квадрате в сетке, значение 1 означает, что квадрат заблокирован в сетке, а значение 2 означает, что робот находился на этом квадрате раньше. Если робот видит, что квадрат перед его текущим заголовком имеет значение 2, он будет продолжать вращаться, чтобы найти квадрат со значением 0, но если квадрат значения 0 вокруг робота не существует, он начинает отступать.

Моя проблема может быть объяснено более четко с этим примером:

enter image description here

Треугольник представляет робот и его начальное положение, нижний левый угол считается положение (0,0) в моя сетка. Зеленые круги представляют элементы, блокирующие его путь. Красный квадрат - это цель для робота. робот может перемещаться только на белые квадраты в сетке.

Когда я запускаю свою программу роботом, движется вперед (восток, так как это текущий заголовок), пока не доберется до перехода непосредственно перед зелеными кругами. Он смотрит в будущее и обнаруживает объект на своем пути, поэтому он вращается на 90 градусов против часовой стрелки и проверяет наличие другой блокировки, что снова происходит, и теперь он снова вращается против часовой стрелки. Итак, теперь робот находится в позиции (0,2), направляясь на запад. Он может двигаться только на запад, чтобы избежать выхода из сетки или удара объекта, поэтому он возвращается в исходное положение, но все еще движется на запад. Теперь он будет вращаться на 90 градусов по часовой стрелке до тех пор, пока не найдет направление, которое будет удерживать его на сетке, т. Е. До тех пор, пока он снова не выйдет на восток. Таким образом, сетка теперь выглядит следующим образом:

enter image description here

Но теперь я хочу, чтобы игнорировать идти вперед и на тот же путь, игнорируя это направление и поворот на 90 градусов против часовой стрелки снова выходят окнами на север, так что мой робот может двигаться на север, в новый путь. Я мог бы просто игнорировать направление и просто продолжать вращаться, чтобы найти новый путь, но что, если меня окружают перед путями, и я хочу, чтобы мой робот вернулся к своему последнему соединению. Как я могу эффективно это делать. Также как я могу эффективно определить, когда мне нужно отступить.

Спасибо

ответ

1

Решение затруднительное на рисунке 2 может быть столь же просто, как проверка других white квадратов вокруг робота, прежде чем сделать ход. На рисунке 2 робот увидит, что квадрат, с которым он сталкивается, «серовато» и решил проверить все остальные направления и, в конце концов, найти пустой белый квадрат к северу от него.

Редактировать: Не понял, что это был настоящий робот.

Поскольку единственный способ узнать, что находится в ячейке, это обращение к этой ячейке и использование датчика, робот должен будет совершить некоторое количество поворота, независимо от того, что вы делаете. Когда он встречает стену или зеленый объект, он должен будет повернуться, пока не найдет новый путь к путешествию. Вы можете оптимизировать его, не обращая внимания на стены корпуса. Например, когда робот возвращается в исходное положение, обращенное на запад, вы уже знаете, что есть стена к югу из-за того, что ее координатное положение (0, -1) недействительно. Это позволяет вам понять, что открытая плитка находится на севере, потому что вы уже посетили плитку на восток, требуя всего один оборот.

Кроме того, когда робот в конце концов перемещается на север, плитка (0,6), вы знаете, что есть стена на севере и на запад из-за ее положения. Тогда вы могли бы разумно предположить, что открытый слот должен быть на востоке, потому что западная плитка (-1,6) недействительна и (0,7) также недействительна.

Не меняя датчик, чтобы увидеть 2 блока или установить больше датчиков на роботе (то есть по одному с каждой стороны), оптимизация, которая может быть выполнена из-за ограниченного доступа к информации, невелика.

+0

Проблема в том, что это физический робот, и его датчик может только ощутить, что впереди. Поэтому, чтобы определить, следует ли возвращаться назад, нужно будет повернуть 4 раза на каждом перекрестке, чтобы проверить проходы. Я ищу более эффективный метод по сравнению с этим –

+0

О, хорошо, не понял, что это был настоящий робот. Знаете ли вы размер корпуса? – hhanesand

+0

Да, я знаю точное количество пыли между соединениями –

Смежные вопросы