А давайте все-таки предположим, что помещение представляет собой достаточно замысловатую систему коридоров, комнат, и препятствий любых размеров.
И все это нужно пропылесосить...
Этап №1
1. Едем вдоль стенки (стенка, предположим, слева), лучше - слегка касаясь ее.
2. Если обнаружили проем (поворот стены налево) - поворачиваем налево
3. Если обнаружили выемку (поворот стены направо, или препятствие) - поворачиваем направо
4. С помощью энкодеров запоминаем (ясное дело, примерно) пройденное расстояние, и направление движения.
Если линии на построенной таким образом виртуальной карте - сошлись, тогда переходим к этапу №2, иначе - см. п.1
Этап №2
1. Делим получившуюся карту на прямоугольные области.
Делается это достаточно просто: все линии продляются до ближайшего пересечения.
Пример:
- Карта, сформированная роботом, с выделенными прямоугольными областями
- cleaner_1.gif (4.32 КиБ) Просмотров: 7894
2. Те прямоугольники, которые не касаются "стен", соединяем с первыми прямоугольниками.
3. Продолжаем движение "по стеночке" до ближайшего угла любой из выделенных прямоугольных областей
4. Если прямоугольник очень маленький по длине или ширине - просто единожды проезжаем по нему. Иначе, начинаем объезжать прямоугольник: например, любимой здесь змейкой, тщательно отмечая на виртуальной карте виртуально пройденный путь.
5. В случае обнаружения препятствия на пути!!! Объезжаем это препятствие по кругу (см. этап 1), отмечая границу препятствия на карте.
Затем - достраиваем карту (т.е. по сути, идем в п. 1 этапа 2).
Вот пример движения робота в случае обнаружения препятствия:
- Обработка препятствий сложной формы
- cleaner_2.gif (7.56 КиБ) Просмотров: 7876
6. Начало и конец объезда будет в углу текущего прямоугольника, т.е. скорее всего около стеночки. Стеночка, кстати, и ее повороты - являются в данном алгоритме регулирующим и корректирующим фактором, заменяя маяки. В общем, после окончания обработки одного прямоугольника, по стеночке движемся до угла следующего необработанного прямоугольника, и переходим к п.4
Замечание: в случае наличия непрямых углов, вписываем непрямоугольные геометрические фигуры в прямоугольники.
Например:
- Непрямые углы
- cleaner_3.gif (5.15 КиБ) Просмотров: 7857
В этом случае робот будет двигаться змейкой, но имея в виду, что если он достигнет препятствия немного раньше, то просто повернет назад и продолжит змейку.
Преимущества подхода:
1. Чаще всего будут пылесоситься пространства около стен и в углах - т.е., как раз наиболее запыленные участки
2. С помощью такого алгоритма могут быть пропылесосены даже очень захламленные помещения, типа наших русских квартир :)
Недостатки:
1. В случае наличия непрямых углов, возможен пропуск препятствия, т.к. робот не начнет объезжать его, а продолжит змейку, если расстояние от края прямоугольника до препятствия будет небольшим и будет списано на погрешность измерения расстояния.
Требования к роботу:
1. Выставленный чуть влево датчик касания, фиксирующий движение вдоль плинтуса
2. Энкодеры
3. Бамперы для объезда препятствий
4. Возможность поворота на месте (!!!, это возможно, например, при использовании гусеничного хода) на строго заданный угол
P.S. Сильно не пинать, особенно ногами! Алгоритм придуман навскидку за 5 минут и нисколечко не протестирован.
Но если кто-то полагает, что написать такого рода программу будет очень сложно - могу только посоветовать отказаться от микроконтроллеров и заставить роботов "думать" чем-нибудь помощнее :)