Je commande un robot depuis une station de base avec radio. La station de base prend les informations de localisation/orientation d'une caméra aérienne à l'aide de la balise AR sur le robot (avec openCV). De plus, la base calcule le chemin que le robot doit emprunter pour atteindre la cible à partir des informations de localisation (A* avec chaque grille mesurant 30 par 30 pixels dans la caméra). Mon robot ne peut que tourner à gauche/droite (sur son point central) et avancer/reculer. Le robot comprend un Arduino Uno avec deux moteurs Lego NXT.

J'utilise le code suivant pour que le robot pointe dans la bonne direction. Cependant, lorsque le robot s'approche de l'angle auquel il est censé se déplacer, au lieu d'arrêter d'avancer, il essaie de fixer son orientation à l'infini.

    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)

Ma fonction d'aide qui sont utilisées. Je calcule l'orientation du robot en utilisant deux points connus sur le robot et en traçant une ligne entre ces deux points. Par conséquent, la ligne devient parallèle à l'orientation.

    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

Je ne peux pas savoir si mon code est problématique en logique. Si oui, que puis-je y faire ? Si le code est correct et que le problème est le retard/la configuration du système, quelles sont les autres manières de contrôler le robot ?

Merci pour l'aide.

1
Ege Elgun 22 févr. 2020 à 02:50

1 réponse

Meilleure réponse

Résolution du problème en modifiant la bibliothèque d'images pour la reconnaissance des balises AR. Nous utilisions 2 balises pour un robot. Il est nettement plus lent et susceptible de ne pas détecter deux balises. Mise à jour pour n'avoir qu'une seule balise. De plus, je suis passé des calculs basés sur l'angle à des calculs vectoriels, ce qui est beaucoup plus simple à comprendre.

1
Ege Elgun 23 févr. 2020 à 19:05