адаптивная карта / adaptive mapping
- Войдите на сайт для отправки комментариев
Чт, 15/12/2011 - 19:33
Добрый день Всем,
Сам я новичок что касается программирование и Arduino.:(, по этому нужна ваша помощь :)
В Общем задача такая: вот этот "робот" (http://i40.tinypic.com/tz9kl.jpg) с двумя моторами и двумя датчиками поворота колес. научить сканировать комнату с помощью PING и IR датчиков. И всю информацию записать на SD карту. Получится должно что то похожое на это (http://www.youtube.com/watch?v=N7zDiSPa3_E).
Нашел WAVEFRONT ALGORITHM переделанный под Arduino. Но не очень понимаю этот код..:( Может кто нибудь поможет понять и разобраться с ним?:)
Вот ссылка на код - http://gigapeta.com/dl/1996913a7854be
за ранее спасибо!
Для начала наберитесь опыта в ардуино, постройте робота, научите его обьезжать препятствия, потом пишите все действия робота на карту память, а на компьютере уже рисуйте схему и графики движения. Опять же понадобятся навыки программирования на компьютере. Но боюсь что так сразу и всё за вас никто ничего не сделает. Далее навешаете кучу датчиков, посадите его на гусеницы, чтоб идеально на месте разворачиваля на определенный угол, прицепите электронный компас и гироскопа для определения направления и ориентации(строить карту помещения) вобщем знаний надо будет немерянно, не простое это дело правильно сканировать комнату. А потом купите за немерянные деньги лазерный сканнер:) Вобщем я веду к тому что начните с простого робота.
Adessit - большое спасибо за ваш ответ!
Хоть я и новичок, немного практики у меня уже есть. Oбъезжать препятствие это не трудно.. компас есть у меня но думаю для начала хватит датчиков поворота колес. Вы наверно немного не так поняли чего я хочу.. я не хочу сканировать комнату в 3D или в 2D, и потом эти данные превратить в картинку или схему.. Мое "сканирование" дает лишь информацию может ли робот проехать или нет. То Есть например квадрат (X-5, Y-3) true или false. А каждый квадрат такого же размера как и робот.
Я вот думаю только вместо (x-5, y-3) использовать такие вот цифры (505503) первые три числа координаты x, другие y. Как на рисунки видно:
500500 - Это начальная точка и станция зарядки робота (docking station).
497502 - Это цель.
И вот теперь самый главный вопрос - как должен выглядеть алгоритм который указывает дорогу?
Например если смотрим на рисунок и видем: робот проехал с 500500 пo 497502. значит алгоритм должен выглядеть как то так:
read current position;
read target position;
currentpostion = 500500;
target position = 497502;
if(current position != target position)
и вот здесь умный алгоритм..:)
if (500501 == true) {
go to new postion = 500501;
}
Единственное в этих числах не указано направление робота а только x и y координаты. Но это можно будет работать в будущем.
Так может у кого есть идеи как написать ту умную строку кода?
Привет честно говоря я не програмировал именно на ардуино, но опыт есть. Вот моя идея: Предположим что робот стоит по направлению 0. Если начало=500500, а тебе нужно попасть на 497502, то нужно делать сравнение координаты X и Y с соответствующими числами. Если введенное значение (497) <500, то точка находится левее робота (270 градусов по компасу, если был 0 или азимуту в +270 градусов относительно начально направления) на разницу чисел (500-497=3, при этом 1=размеру робота (30см на 30см к примеру)). Если значение >500, то точка правее робота на разницу чисел( на 90 градусов соответственно). Дальше с Y тоже самое.
Извиняюсь если поздно, но если так то надеюсь другим поможет.
Если у кого есть вопросы обращайтесь, постараюсь ответить.
Я бы делал так: сначала сделать простой алгоритм по принципу сначала доедь до нужной координаты х, потом езжай к нужной координате у. Когда будет так правильно находить, то можно будет уже алгоритм и усложнять/оптимировать
Именно это я и подразумевал, главное есть алгоритм.
А вот усложнение алгоритма. Усложнение состоит в том чтобы ехать сразу к точке. Вот пример:
Возьмем известные нам данные (см сообщение выше). Так вот, при расчете нахождения координат мы получили треугольник (2 катета-это отрезки по X и по Y, гипотенуза это отрезок напрямую к точке) катеты нам известны, и по теореме Пифагора(квадрат гипотенузы=сумме квадратов катетов) посчитаем длину гипотенузы (если брали 497502, то получаем что она=2*2+3*3=13, корень из 13=3.6). Гипотенузу нашли. Теперь нужен азимут поворота, если считаем что изначально направление на 0 (север), то будем считать по теореме cos: AB^2=AC^2+BC^2+AC*BC*cosC, следовательно cosC=AB^2:(AC^2+BC^2+AC*BC), получаем: уголC=4:(9+13+10.8), C=4:32.8, C=0.1 градусов. Впринципе это все, ну думаю не надо объяснять что с этим дальше делать и как сделать алгоритм движения.
Надеюсь было полезно.