![]() |
![]() |
Управление колёсными роботами
|
Управление колёсными роботами
Это перевод, оригинал находится здесь ОбзорОбщим для многих роботов является наличие двухколёсной тележки с независимо управляемыми моторами. Такая схема использует независимо управляемые моторы. Этот механизм использует дифференциальное руление и может разворачиваться на месте. Есть другие возможные варианты устройства, которые управлюятся другими классами. Классы, которые контролируют таких колёсных роботов используют несколько уровней абстракции На самом нижнем - это моторы, которые вращают колёса. Моторы контролируются классом NXTRegulatedMotor class. Класс DifferentialPilot использует моторы чтоб контролировать элементарные движения: повороты на месте, движение по прямой линии или движение по дуге. На следующем уровне класс Navigator использует DifferentialPilot чтоб двигать робота по сложному пути на плоскости. Чтоб осуществлять навигацию, Navigator-у нужны местоположение робота и его направление ориентации. Он использует класс OdometeryPoseProvider чтоб поддерживать эту информацию актуальной. Отношения между этими классами показаны на следующей таблице.
Управление идёт сверху вниз: навигатор управляет пилотом который, в свою очередь, управляет моторами. Но поток информации идёт в обратном направлении. Пилот использует информацию от моторов, чтоб контролировать их. Pose provider использует информацию об одометрии от пилота, чтоб пересчитать текущую оценку позы робота. Поза состоит из координат робота (x и y) и угла азимута (направления, куда он "смотрит"). Навигатор использует эти данные чтоб рассчитать дистанцию и направление на точку назначения. Поток информации использует модель слушателей и событий. Пилот регистрируется как слушатель по отношению к моторам, которые информируют его когда вращение начинается или заканчивается. Pose provider регистрируется как слушатель по отношению к пилоту, который информирует его о начале и завершении каждого движения. Такой управляемый событиями поток информации работает автоматически. В дополнение к управляемому событиями потоку навигатор может запрашивать оценку позы у класса pose provider в любое время, даже когда робот движется. Такая цепочка слушателей устанавливается в момент создания экземпляров классов DifferentialPilot и Navigator. DifferentialPilot
Класс DifferentialPilot управляет тележкой, у которой есть два ведущих
колеса, каждое со своим мотором. Он рулит тележкой путём
изменения скорости и направления вращения моторов. Это
один из нескольких классов контроллеров движения, которые отличаются использованием разных механизмов,
но механизм дифференциального руления является самым простым.
Конструкторы:
Движение по прямойЧтоб упрвлять роботом при движении по прямой линии, используйте:
Чтоб управлять расстоянием, проходимым роботом, используйте:
Пример:
Можно заставить робота начать вращаться на месте, используя
Если angle положительное число, робот начнёт поворачиваться влево. Параметр immediateReturn имеет то же значение, что и в методах мотора – позволяя вызывающему потоку делать другую работу, пока выполняется поворот. Если другой метод вызывается в пилоте пока поворот в процессе выполнения, поворот прекращается. Значения wheelDiameter и trackWidth должны быть очень точными для того, чтоб этот метод работал правильно. Программа SquareTracer (объезжатель квадрата)Напишите программу, которая использует класс DifferentialPilot чтоб отследить квадрат, используя методы travel и void rotate(double degrees). Программа SquareTracer2 (объезжатель квадрата2)Напишите программу, которая описывает квадрат с возрастанием азимутального угла при поворотах и затем описывает тот же путь, но в обратном направлении. Модифицируйте метод traceSquare программы DifferentialPilot 1 так, чтоб он мог описывать квадрат в любом направлении и используйте его в этой программе. Это строгий тест на точность диаметра колёс и ширины колеи, которые вы передали классу pilot. Езда по кругу.Класс DifferentialPilot может также управлять роботом так, чтоб он ехал по кругу, используя такие методы:
Параметр turnRate определяет радиус закругления пути. Положительное число означает, что центр окружности будет слева от робота (так что левый мотор будет крутить внутреннее колесо). Отрицательное число означает, что левый мотор будет крутить наружное колесо. Абсолютное значение числа должно быть в пределах от 0 до 200 и оно означает отношение скоростей мотора, крутящего внешнее и внутреннее колёса. Внешний мотор крутит со скоростью, соответствующей установленной скорости движения робота. Внутренний мотор замедляется так, чтоб заставить робота поворачивать. При turn rate равном 0, соотношение скоростей колёс будет строго 1.0 и робот будет двигаться по прямой. При turn rate = 200 соотношение скоростей моторов будет -1 и робот будет разворачиваться на месте. Turn rate = 100 даёт соотношение скоростей моторов = 0, т.е. внутренний мотор не будет крутиться. Формула такая: соотн_скоростей_вращения_двигателей = 100 - abs(turnRate). Параметр angle определяет угол поворота при котором робот остановится. Если угол отрицательный, робот проследует путь по дуге с центром окружности, соответствующем данному turn rate, но двигаясь в обратном направлении. Программа SteerTesterНапишите программу, которая использует ButtonCounter чтоб ввести значение переменных turn rate и angle и затем вызывает метод steer(). Он делает это в цикле так, что вы можете попробовать разные значения этих параметров, чтоб управлять траекторией робота. Методы, начинающие движение робота по круговой траектории:
Если radius положительный, центр поворота слева от робота и наоборот, при нулевом радиусе - разворот на месте. Методы, которые выполняют движение по дуге с заданным угловым размером дуги:
Сообщение сOdometryPoseProvider
Класс OdometryPoseProvider отслеживает положение робота и его направление.
Для этого ему необходимо знать о каждом движении, которое делает DifferetnialPilot.
Таким образом, pose provider-у нужно регистрироваться как слушателю пилота, путём вызова метода
Другие методы класса DifferentialPilotЕсли нужно очень точное движение, вам может пригодиться возможность устанавливать точные значения скорости и ускорения, меньшие чем значения по умолчанию.
Compass PilotКласс CompassPilot - это расширение класса DifferentialPilot. В нём реализованы те же методы, но используется Compass Sensor для того, чтоб пилот не отклонялся от правильного угла ориентации. Необходимо подключить HiTechnic или Mindsensors compass сенсор в один из портов для сенсоров. Конструкторы класса CompassPilot аналогичны конструкторам класса DifferentialPilot, но с дополнительной информацией о порте compass sensor-а. Конструкторы:
Дополнительные методы CompassPilot:
Дополнительные методы класса CompassPilot:Напишите программу, делающую следующие шаги:
Совет: пока робот движется, попытайтесь сбить робота с правильного направления и проследите, как он будет возвращаться на правильное направление. OdometryPoseProvider
Этот класс отвечает за поддержание текущей позиции робота и направления, в котором он ориентирован..
Для указания направления робота используются Декартовы координаты, угол задаётся в градусах; 0 градусов - это положительное направление оси x, 90 градусов - положительное направление оси y.
Направление и координаты x и y хранятся в объекте Pose. API для Pose
описан здесь. Документация на OdometryPoseProvider
здесь
Единственные методы, которые вам, скорее всего, пригодятся:
Если вам интересно узнать о внутренней "кухне" классов - читайте дальше.
Одометрические данные содержатся в объекте Move. API этого класса-носителя данных описан здесь. Navigator
Класс Navigator использует класс pilot чтоб контролировать движения робота и
класс PoseProvider чтоб отслеживать положение робота. Навигатор
следует по маршруту, представленному последовательностью локаций(точек). Каждая локация(точка) - экземпляр класса Waypoint. API класса WayPoint здесь.
Путь - это экземпляр класса Path, API класса Path
здесь. Путь ведёт себя как очередь объектов. Когда очередная точка пути достигнута, она удаляется из объекта пути и робот идёт к следующей. Новые точки могут быть добавлены в конец пути в любой момент. Документация на Navigator находится здесь.
Конструкторы:
Оба конструктора зарегистрируют pose provider как слушатель MoveListener у pilot-а. Методы навигацииВсе методы (за одним исключением) в этом классе неблокирующие, т.е. возвращают управление немедленно.
класс ShortestPathFinder (искатель кратчайшего пути)Допустим, ваш робот в известном месте и "хочет" добраться до места назначения. Но есть препятствия на его пути. Препятствия обозначены на карте. Тогда какой маршрут он должен выбрать? Этот класс может найти кратчайший путь до точки назначения и сгенерировать маршрут (коллекцию WayPoint-ов) которая будет использована NavPathController-ом. Карта, которая нужна этому классу это LineMap которая, как подсказывает её имя, состоит из прямых линий. Полная документация на этот класс здесь. Использование этого класса очень просто. Конструктор:
После того, как вы сконструировали path finder, вы можете получить маршрут используя любой из методов поиска пути. Они оба используют Pose как начальную точку, которая может быть возвращена pose provider-ом, и WayPoint как точку назначения. Оба могут выбросить DestinationUnreachableException если маршрут не может быть найден.
Кратчайший путь, если это не прямая линия, будет содержать точки концов отрезков, такие как углы препятствий на карте. Но реальный робот это не точка, поэтому если центр робота попытается пройти через угол, будет авария. Одно решение этой трудности - преувеличить размеры препятсвий чтоб дать зазор для робота. Однако, это может быть нудно делать это вручную и сложно делать это программно. Более простая схема расширить все линии на оригинальной карте, что углы теперь будут представлены двумя точками, каждый на определённом расстоянии от реального угла. Чтоб модифицировать таким образом карту, используйте метод:
который добавляет сегменты длины delta в каждую линию на карте. Расширение delta должно, вероятно равняться как минимум ширине колеи робота плюс допуск на неточность местоположения робота. Есть несколько других путей поиска классов которые используют разные представления карт (maps). Смотрите ссылки в классах в пакете pathfinding здесь. |