Eigene Motoren und eigene BLDC-Treiber: Tunen der Räder-PID (Geschwindigkeit) und Stanley-Regler (Line Tracking)

AlexanderG

Lawn robot freak and project co-founder
Teammitglied
Werden Fremd-Motoren (Nicht-Ardumower) oder andere Motortreiber (Nicht-Ardumower) eingesetzt müssen in der Regel der PID-Regler und danach der Stanley-Regler neu eingestellt werden.

Für die Regler (PID für Geschwindigskeitsregelung der Räder, Stanley für Line Tracking) gehe ich so vor: Zunächst müssen die Räder optimal (schnell und flüssig) reagieren auf manuelle Steuerung (Roboter dafür aufbocken), d.h.:
1. der PID-Regler für die Geschwindigkeitsregelung der Räder sollte eine schnelle Geschwindigkeitsänderung durchführen können (schnelle Änderung bei manueller Steuerung, z.B. von 10% auf 100% Gas und wieder zurück auf 10% Gas )
2. aber auch ein flüssiges, langsames Fahren umsetzen können (z.B. 10% / wenig Gas bei manueller Steuerung)
3. kein "nachlaufen" etc. - das Rad sollte nicht nachlaufen und die Änderung über die manuelle Steuerung (10% Gas, 30% Gas, 50 Gas, 70% Gas, 100% Gas sofort umsetzen

Beim Alfred z.B. (welcher eine "Regelstrecke" mit relativ hoher Verzögerung hat aufgrund der Aufteilung mit Motortreiber über Low-Level PCB seriell angekoppelt an High-Level Linux hat) haben sich folgende PID-Parameter als gut erwiesen:
#define MOTOR_PID_KP 0.5
#define MOTOR_PID_KI 0.01
#define MOTOR_PID_KD 0.01
Nachdem optimale PID-Reglerparameter gefunden worden (1-2h dafür einplanen!) kann man sich mit dem Stanley-Regler (Line Tracking) beschäftigen. Dafür den Roboter fahren lassen und in der App "DEBUG IS ON" im Menü einstellen. Dann erscheinen ganze unten im Menü die Tuning-Optionen für den Stanley-Regler. Diese werden nicht gespeichert und dienen nur zum Testen. Für den Alfred z.B. haben sich folgende Parameter als gut erwiesen:

#define STANLEY_CONTROL_P_NORMAL 1.1 // for path tracking control (angular gain) when mowing
#define STANLEY_CONTROL_K_NORMAL 0.1 // for path tracking control (lateral gain) when mowing
Hier sollte man nicht zu hoch einstellen weil es dann schnell zum Überschwingen kommt. Auch hierfür ausreichend Zeit einplanen :)
Zum Verständnis der Stanley-Parameter gibt es eine Darstellung wo lateraler Fehler, Winkelfehler und die Stanley-Formel erklärt werden:
 
Zuletzt bearbeitet:
da die Handsteuerung doch arge Verzögerung aufweist, fällt es mir persönlich echt schwer die richtigen Einstellungen für den PID bei den JYQD zu finden.
Es ist auch sehr sehr zeitaufwendig da man ja jedes Mal die config.h PID-Werte anpassen und auf den M4 wieder laden muss.
Eine Plot-Test Funktion wäre super, wo unterschiedliche Geschwindigkeiten und Stops ablaufen könnten und man das Über oder Unterschwingen der Drehzahl sehen könnte und anpassen könnten. Tja wenn ich jetzt mich mit dem Plotten und Programmieren besser auskennen würde :-(
Vielleicht könnte hier mit Efahrung mir etwas unter die Arme greifen?
 
Ich habe mit der Sunary 230 die PID Werte für die JYQD_V7.3E3 getestet. Bis alles lief habe ich 2 lange Nachmittage im Garten benötigt.
Grundsätzlich bin ich nach Alexanders Anleitung vorgegangen. Ich habe mit eine Testkarte Rechteck mit guten FIX und 5 Mähbahnen erstellt. Die MOTOR_PID_KP habe ich solange verändert (Winkelgewinn; angular gain when mowing) bis er gut drehte und gerade zum Ziel fuhr. Dann die STANLEY_CONTROL_K_NORMAL (seitlicher Gewinn, lateral gain when mowing) verändert bis er nicht mehr Suchhund spielte und ganz gerade fuhr.
Für meine Motoren ergab das:
#define MOTOR_PID_KP 1.1 // Fehler-Vektor A nach B// do not change 2.0 (for non-Ardumower motors //or if the motor speed control is too fast you may try: KP=1.0, KI=0, KD=0)
#define MOTOR_PID_KI 0.01 // Ausrichtungsfehler // do not change 0.03
#define MOTOR_PID_KD 0.01 // Ableitung- Geschwindigkeit zum Ziel // do not change 0.03

Dann die STANLEY_CONTROL_P_NORMAL im Debugmodus per App vorsichtig ändern und notieren.
Ich habe die Testkarte bestimmt 20 mal gemäht!
Ergebnis:
#define STANLEY_CONTROL_P_NORMAL 1.1 // 3.0 for path tracking control (Winkelgewinn; angular gain) when mowing
#define STANLEY_CONTROL_K_NORMAL 0.05 // 1.0 for path tracking control (seitlicher Gewinn, lateral gain) when mowing

#define STANLEY_CONTROL_P_SLOW 1.0 // 3.0 for path tracking control (angular gain) when docking tracking
#define STANLEY_CONTROL_K_SLOW 0.1 // 0.1 for path tracking control (lateral gain) when docking tracking
In den höheren Sunary Versionen konnte ich entweder nur den Mähmotor oder die Fahrtmotoren aktivieren. Beides zusammen hat bisher nicht funktioniert.
 
Ich habe mit der Sunary 230 die PID Werte für die JYQD_V7.3E3 getestet. Bis alles lief habe ich 2 lange Nachmittage im Garten benötigt.
Grundsätzlich bin ich nach Alexanders Anleitung vorgegangen. Ich habe mit eine Testkarte Rechteck mit guten FIX und 5 Mähbahnen erstellt. Die MOTOR_PID_KP habe ich solange verändert (Winkelgewinn; angular gain when mowing) bis er gut drehte und gerade zum Ziel fuhr. Dann die STANLEY_CONTROL_K_NORMAL (seitlicher Gewinn, lateral gain when mowing) verändert bis er nicht mehr Suchhund spielte und ganz gerade fuhr.
Für meine Motoren ergab das:
#define MOTOR_PID_KP 1.1 // Fehler-Vektor A nach B// do not change 2.0 (for non-Ardumower motors //or if the motor speed control is too fast you may try: KP=1.0, KI=0, KD=0)
#define MOTOR_PID_KI 0.01 // Ausrichtungsfehler // do not change 0.03
#define MOTOR_PID_KD 0.01 // Ableitung- Geschwindigkeit zum Ziel // do not change 0.03

Dann die STANLEY_CONTROL_P_NORMAL im Debugmodus per App vorsichtig ändern und notieren.
Ich habe die Testkarte bestimmt 20 mal gemäht!
Ergebnis:
#define STANLEY_CONTROL_P_NORMAL 1.1 // 3.0 for path tracking control (Winkelgewinn; angular gain) when mowing
#define STANLEY_CONTROL_K_NORMAL 0.05 // 1.0 for path tracking control (seitlicher Gewinn, lateral gain) when mowing

#define STANLEY_CONTROL_P_SLOW 1.0 // 3.0 for path tracking control (angular gain) when docking tracking
#define STANLEY_CONTROL_K_SLOW 0.1 // 0.1 for path tracking control (lateral gain) when docking tracking
In den höheren Sunary Versionen konnte ich entweder nur den Mähmotor oder die Fahrtmotoren aktivieren. Beides zusammen hat bisher nicht funktioniert.

Danke Dir für Deine Werte, werde ich am Wochenende ausprobieren! Verwendest Du auch die Brushlessmotoren vom aktuellen Ardumower?

Bei mir laufen die gleichen Treiber für Mähmotor und Antriebe mit der Version 1.0273
in config.h
#define MOTOR_DRIVER_BRUSHLESS 1
#define MOTOR_DRIVER_BRUSHLESS_MOW_JYQD 1
#define MOTOR_DRIVER_BRUSHLESS_GEARS_JYQD 1

in der AmRobotDriver.cpp den Wert von HIGH auf LOW setzen
JYQD.enableActive = LOW;

hab gesehen in der Nachfolgeversion ist der Wert wohl schon geändert worden.
 
Zuletzt bearbeitet:
Danke für den Versionshinweis, teste ich heute noch.
Ich verwende nicht die aktuellen BL Motoren aus dem Shop.
Ich habe LINIX Brushless DC Motor 24VDC 8W 38r/min. Die liefen orginal mit 36 Volt.
 

Anhänge

  • Motor.jpg
    Motor.jpg
    8,4 KB · Aufrufe: 13
Hartmut, hab Deine Werte gestern mal kurz auf die schnelle mit der aktuellen Sunray 1.076 probiert, fährt schon besser, aber ich glaub muss an die Stanleywerte nochmal ran. Schätze auch weil mein Mäher 64cm breit ist und andere Motoren (die Brushless von marotronics) verwende, äußert sich das bei mir extremer. Die Geschwindigkeit mit der man den Rover mähen lässt, hat meiner Meinung nach auch einen Einfluss.

In der Sunray 1.076 muss in der AmRobotdriver.cpp übrigens auch wieder der Wert auf "JYQD.enableActive = LOW;" gesetzt werden.
 
Hallo Algo,
ja erst mit langsamer Geschwingkeit alles einstellen und zum Schluss mit hoher Geschwindigkeit das letzte Feintuning machen.

Habe gestern die 176 getestet. Mähmotor mit App on, Mov läuft an und wieder aus. Fehlermeldung: Motor current too low
0,0,-182,40 und average current apps-0.55,-0.10,-0.34
Es ist auch egal ob ich nur Bruslees 1 nehme oder zusätzlich noch Mov jyqd 1 und/ oder gear_jyqd 1. In jeder Kombination ist das Verhalten gleich. Fahrmotoren ok mow geht an und mit Fehlermeldung aus.
Ich habe das AdapterB. V1.1 dran.
Also wieder die 230 drauf, mit der mäht er gut und ohne Fehlermeldung.
 
Ja die Spannung stimmt. Der Strom ist aber ca 500mA zu hoch. 1A im Idl und 0.9 bis 1.0A beim Mähen.
 
#define STANLEY_CONTROL_P_NORMAL 1.1 // 3.0 for path tracking control (Winkelgewinn; angular gain) when mowing
#define STANLEY_CONTROL_K_NORMAL 0.05 // 1.0 for path tracking control (seitlicher Gewinn, lateral gain) when mowing

#define STANLEY_CONTROL_P_SLOW 1.0 // 3.0 for path tracking control (angular gain) when docking tracking
#define STANLEY_CONTROL_K_SLOW 0.1 // 0.1 for path tracking control (lateral gain) when docking tracking

Hab heute auch umgerüstet auf 2x JYQD Treiber für den Antrieb kombiniert mit einem A4931 als Mow Motor.
Mit den Default Werten eiert der Roboter in Schlangenlinien mit teilweise gerne mal +/- 30cm neben der Spur.
Aber mit @Hartmut Werten fährt er perfekt gerade Spuren!
Danke für die Arbeit!

Bist du damit noch unterwegs oder hast du noch Feintuning betrieben?
Bei mir ist der Roboter doch sehr häufig noch am rum schleichen.
Hab das Tempo mal auf 0.22 gestellt, schneller wird problematisch, aber die Geschwindigkeit nutzt er eh maximal 30-40% der Zeit.
 

Anhänge

  • 20220708_140735.jpg
    20220708_140735.jpg
    3,9 MB · Aufrufe: 15
Oben