Offboard Software

Inhaltsverzeichnis[Anzeigen]

Überblick

 

Die Offboard Software ist im allgemeinen für die Navigation der Gondel mittels IPS zuständig. Hier wird der nächste anzufliegende Wegpunkt bestimmt und die Position relativ zur Gondel in Polarkoordinaten an die Gondel übertragen. Auch die Auswertung der IPS-Daten wird offboard berechnet.

IPS

Zur Postionsbestimmung wird das IPS (Indoor-Positioning-System) verwendet. Ein von diesem Team neuentwickeltes Konzept sieht vor, dass durch Verwendung von zwei Ultrschallsendern nicht nur die Position sondern auch die Ausrichtung der Gondel bestimmt werden soll. Die Synchronisation der Sendesignale findet durch ein Funksignal statt, welches zeitgleich mit jeweils einem der abwechselnd sendenden Ultraschallsendern sendet. Derzeit ist das Doppel-IPS in der Bestimmung der Gondelausrichtung aufgrund zu hoher Ungenauigkeit der Positionsbestimmung beider Ultraschallsender nicht verwendbar.

 

Wegfindung

Mithilfe der vom IPS erzeugten Positionsdaten wird die Richtung und Distanz des nächsten anzufliegenden Wegpunktes berechnet und an die Gondel übermittelt. Sollte ein Wegpunkt verfehlt werden, wird der nächste Wegpunkt angesteuert. Bei Eintritt in die Paketabwurfszone wird die Distanz zum Mittelpunkt der Abwurfszone betrachtet. Steigt diese Distanz wieder an, so wird der Befehl zum Abwurf gegeben.

 

        #Gondelwinkel
        winkx = self.filterdlocations[0][0] - self.filterdlocations[1][0]
        winky = self.filterdlocations[0][1] - self.filterdlocations[1][1]
        if(winky!=0):
          if(math.atan(winkx/winky)!=0):
            self.winkel_gondel = 180/math.pi*(math.atan(winkx/winky))
        
        #create global x,y
        self.main.filterdPos[0] = (self.filterdlocations[0][0] + self.filterdlocations[1][0])/2
        self.main.filterdPos[1] = (self.filterdlocations[0][1] + self.filterdlocations[1][1])/2
        
        #create distance and wegpktern winkel to next waypoint
        buf0 = self.main.waypoints[self.currentWP][0] - self.main.filterdPos[0]
        buf1 = self.main.waypoints[self.currentWP][1] - self.main.filterdPos[1]
        
        self.distance = (buf0**2+buf1**2)**(0.5)/10
        self.distance = self.distance + 180
        if(buf1!=0):
          if(math.atan(buf0/buf1)!=0):
            self.winkel_wegpkt = 180 / math.pi * (math.atan(buf0/buf1))

Kommunikation

Zur Kommunikation werden zwei Arduinos mit Funkmodulen verwendet. Dies erlaubt die getrennte Betrachtung des Funkverkehrs mit der Gondel und dem IPS zur Untersuchung und Fehlerbeseitigung. Um eine mögliche Kombination des Funkverkehrs auf einem Arduino nicht auszuschließen, wurde das Funkprotokoll des Gondelfunk-Arduinos jedoch IPS-kompatibel auf 12 Byte pro Sendevorgang ausgelegt. Zur Auswertung der empfangenen Daten wird die IPS-Software verwendet.

Zur Übertragung an den Arduino müssen die Daten in Bytes übermittelt werden:

 

        #formatting
        buf0 = self.distance
        buf1 = self.winkel_wegpkt
        buf2 = self.winkel_gondel
          
        if(buf0 < 0):
          buf0 += 65536
        if(buf1 < 0):
          buf1 += 65536
        if(buf2 < 0):
          buf2 += 65536
        
        bybuf0 = chr(int(buf0%256))
        bybuf2 = chr(int(buf1%256))
        bybuf1 = chr(int(buf0/256))
        bybuf3 = chr(int(buf1/256))
        bybuf4 = chr(int(buf2%256))
        bybuf5 = chr(int(buf2/256))
         
        if (self.distance < 30):
          self.currentWP = self.currentWP + 1
      
        #Kommunikation mit Gondel: Senden der neuen Flugorder
        self.serial.write(bytes(('{a}{b}{c}{d}{e}{f}'.format(a=bybuf0, b=bybuf2, c=bybuf1, d=bybuf3, e=bybuf4, f=bybuf5)).encode('UTF-8')))
        self.serial.flush()

Die Software des Arduino lässt sich als State-Machine darstellen, die zwischen Senden und Empfangen umschaltet: