Получение робота, чтобы указать правильное направление - PullRequest
0 голосов
/ 22 февраля 2020

Я командую роботом с базовой станции с радио. Базовая станция получает информацию о местоположении / ориентации с воздушной камеры, используя метку AR на роботе (с openCV). Кроме того, база вычисляет путь, который должен пройти робот, чтобы достичь цели из информации о местоположении (A * с каждой сеткой 30 на 30 пикселей в камере). Мой робот может поворачиваться только влево / вправо (в его центральной точке) и go вперед / назад. Робот включает в себя Arduino Uno с двумя двигателями Le go NXT.

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

    def correctOrientation(self, rx: int, ry: int):
        #returns direction robot needs to point.
        direction = self.getDirection((self.sx, self.sy), (rx, ry))
        #method to stop robot.
        self.comms.stop()

        anglediff = (self.angle - direction + 180 + 360) % 360 - 180

        while not (abs(anglediff) < 15):
            #Decides which way to turn.
            if self.isTurnLeft(self.angle, direction):
                self.comms.turnLeft()
            else:
                self.comms.turnRight()
            #Put sleeps because there is a delay in camera feed. Allows it to get the location right
            time.sleep(0.3)
            self.comms.stop()
            #Updates position
            self.getPos()
            time.sleep(1)
            #Calculates orientation of robot and updates it
            self.angle = self.calcOrientation()
            anglediff = (self.angle - direction + 180 + 360) % 360 - 180
            print(anglediff)
            time.sleep(1)

Используются мои вспомогательные функции. Я рассчитываю ориентацию робота, используя две точки, известные на роботе, и рисую линию между этими двумя точками. Следовательно, линия становится параллельной с ориентацией.

    def isTurnLeft(self, angle, touchAngle):
        diff = touchAngle - angle
        if diff < 0:
            diff += 360
        if diff < 180:
           return False
        else:
            return True

    def calcOrientation(self) -> float:
        return self.getDirection(self.marker[0], self.marker[3])

    def getDirection(self, source: Tuple[int], target: Tuple[int]) -> float :
        return (math.degrees(math.atan2(target[1] - source[1], target[0] - source[0]))+360)%360

Я не могу понять, является ли мой код проблемным c в логи c. Если так, что я могу с этим поделать? Если код в порядке и проблема заключается в задержке / настройке системы, каковы другие способы управления роботом?

Спасибо за помощь.

1 Ответ

1 голос
/ 23 февраля 2020

Решил проблему, изменив библиотеку изображений для распознавания тегов AR. Мы использовали 2 тега для одного робота. Он значительно медленнее и не склонен обнаруживать два тега. Обновлен только один тег. Более того, переключился с вычисления на основе угла на вектор, что намного проще для понимания.

...