Я командую роботом с базовой станции с радио. Базовая станция получает информацию о местоположении / ориентации с воздушной камеры, используя метку 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. Если так, что я могу с этим поделать? Если код в порядке и проблема заключается в задержке / настройке системы, каковы другие способы управления роботом?
Спасибо за помощь.