Das GUI ist mittlerweile schon wieder veraltet, bin im mom dabei das Echolot noch zu integrieren.
Werde bei Gelegenheit mal das neue posten.

Ich mitlerweile meine Motorsteuerung implementiert.
Da mein ROV keinerlei Ruder hat wird es sowohl in der horizontalen wie auch in der vertikalen Ebene nur über je 2 Motoren gesteuert.
Die Richtung wir je Ebene über einen Stick auf meinem Gamepad vorgegeben :
Bild hier  
Die Steuerknüppelposition wird als Integerwert von -100 bis 100 ausgelesen wobei 0 die Ruhelage ist.
Anhand dieser sollen dann die jeweiligen Motordrehzahlen errechnet werden ( -100 für rechtsrum Vollgas / 0 für Stop /100 für linksrum Vollgas).
Dabei kamen dann folgende Grafik und Funktionen heraus:
Bild hier  
Hier noch mal in Groß: Klick
L und R stehen jeweils für die Leistung in % des jeweils Rechten oder Linken Motors.
Da das Gamepad nie genau 0 in der Ruhelage sendet hab ich noch einen Offset von +- 10 einprogrammiert.
Desweiteren läuft der Stick auch nicht genau auf einer Kreisbahn, was zur Folge hatte das die Werte für die Motordrehzahl schon einmal auf über 100% kommen (Zeichnung unten rechts).
Das habe ich umgangen indem ich zusätzlich in der Implementierung noch eine If-Abfrage eingebaut habe.
Und so schaut das ganze dann in Code aus :
Code:
'------------------------------------
        '---------V-Mischer Vorschub---------
        '------------------------------------

        If (state.X > -10) And (state.X < 10) And (-10 < state.Y) And (state.Y < 10) Then          '<----- Uhrsprung
            MotorschubHR = 0
            MotorschubHL = 0

        ElseIf (state.X > -10) And (state.X < 10) And ((state.Y < -10) Or (state.Y > 10)) Then     '<----- X Achse 0
            MotorschubHR = -state.Y
            MotorschubHL = -state.Y

        ElseIf (state.Y > -10) And (state.Y < 10) And ((state.X < -10) Or (state.X > 10)) Then     '<----- Y Achse 0
            MotorschubHR = -state.X
            MotorschubHL = state.X

        ElseIf (state.X > 10) And (state.Y < -10) Then                                             '<----- I Bereich
            MotorschubHR = Math.Atan(-state.Y / state.X) * (180 / Math.PI) * (20 / 9) - 100
            MotorschubHL = Math.Sqrt((state.X) ^ 2 + (state.Y) ^ 2)
            If MotorschubHL > 100 Then MotorschubHL = 100

        ElseIf (state.X > 10) And (state.Y > 10) Then                                              '<----- II Bereich
            MotorschubHR = -(Math.Atan(state.Y / state.X) * (180 / Math.PI) * (20 / 9) - 100)
            MotorschubHL = -Math.Sqrt((state.X) ^ 2 + (state.Y) ^ 2)
            If MotorschubHL < -100 Then MotorschubHL = -100

        ElseIf (state.X < -10) And (state.Y > 10) Then                                             '<----- III Bereich
            MotorschubHR = -Math.Sqrt((state.X) ^ 2 + (state.Y) ^ 2)
            MotorschubHL = -(Math.Atan(state.Y / -state.X) * (180 / Math.PI) * (20 / 9) - 100)
            If MotorschubHR < -100 Then MotorschubHR = -100

        ElseIf (state.X < -10) And (state.Y < -10) Then                                            '<----- IV Bereich                                                                                 
            MotorschubHR = Math.Sqrt((state.X) ^ 2 + (state.Y) ^ 2)
            MotorschubHL = -(Math.Atan(-state.Y / state.X) * (180 / Math.PI) * (20 / 9) + 100)
            If MotorschubHR > 100 Then MotorschubHR = 100
        End If
Es gibt sicher noch ein paar andere Mischerprofile aber ich denke mit dem "schwimme" ich ganz gut
Aber das wird sich wohl erst zeigen wenn ich das Ding im Wasser habe.