Sunray-Firmware - Ideensammlung / ideas for improvement

Die Werte 100 und 400 sind in mm/s zu verstehen. Hier Könnte man noch MINSPEED und MAXSPEED in der config.h definieren. Habe ich auch gemacht.
Ausserdem kann man dann in der motor.setlinearangularspeed function noch eine min/max Abfrage des Speeds machen, falls das nicht schon anderweitig passiert.
Hi Mr. Tree, wie hast du das in der config.h definiert?
 
Einfach so, am Anfang der config.h:

//Speeds/Time for different movement operations
#define MOW_SPINUPTIME 5000 //Adds time to rotate mowingblades before starting moving (ms)
#define OVERLOADSPEED 0.15 //m/s
#define ROTATETOTARGETSPEED 1.0 //0.5=29degree/sec
#define TRACKSLOWSPEED 0.10 //m/s
#define APPROACHWAYPOINTSPEED 0.15 //m/s
#define FLOATSPEED 0.15 //m/s
#define SONARSPEED 0.10 //m/s
#define DOCKANGULARSPEED 0.1 //rad/s
#define OBSTACLEAVOIDANCESPEED 0.15 //m/s
#define GOHOMESPEED 0.59 //m/s
#define MINSPEED 0.07 //m/s
#define MAXSPEED 0.60 //m/s

////////////////////////////////////////////////////////////

// ------- Bluetooth4.0/BLE module -----------------------------------
// see Wiki on how to install the BLE module and configure the jumpers:
// https://wiki.ardumower.de/index.php?title=Ardumower_Sunray#Bluetooth_BLE_UART_module
//#define ENABLE_PASS 1 // comment out to disable password authentication
#define PASS 123456 // choose password for WiFi/BLE communication (NOTE: has to match the connection password in the App!)


-------------------------------------------------------------------
Damit das greift sind aber noch andere Dinge notwendig:

in motor.cpp function setLinearAngularSpeed:

void Motor::setLinearAngularSpeed(float linear, float angular, bool useLinearRamp){
setLinearAngularSpeedTimeout = millis() + 1000;
setLinearAngularSpeedTimeoutActive = true;
if ((activateLinearSpeedRamp) && (useLinearRamp)) {
linearSpeedSet = 0.9 * linearSpeedSet + 0.1 * linear;
} else {
if (linear >0){
linear = max(linear,MINSPEED); //If positive linear is less than MINSPEED, use MINSPEED as limit
linear = min(linear,MAXSPEED); //If positive linear is more than MAXSPEED, use MAXSPEED as limit
}
if (linear <0){
linear = min(linear,-1*MINSPEED); //If negative linear is more than -MINSPEED, use -MINSPEED as limit
linear = max(linear,-1*MAXSPEED); //If negative linear is less than -MAXSPEED, use -MAXSPEED as limit
}

linearSpeedSet = linear*pwmSpeedOffset;
}
angularSpeedSet = angular;



---------------------------------
Im Prinzip braucht man das aber nicht, wenn durch andere Funktionen nicht seltsame Werte herreinrauschen.
Trotzdem relativ hilfreich. Mit aktivierter Speedramp greift der Code in dieser Ausführung nicht.


Dazu sei aber gesagt, dass man am besten die Reglerparamter vom Stanley in diesen MIN und MAX Geschwindigkeiten
optimieren sollte, damit das gut funktioniert. Also wenn wer Zeit hat seinen Mower einfach mit fixer MIN und/oder MAX Geschwindigkeit durch den Garten jagt um die Parameter für k und p auszuprobieren und die Bahntreue zu dokumentieren.... :D
 
Zuletzt bearbeitet:
Mir ist aber aufgefallen, dass es wesentlich besser zu formulieren geht. Die negativ Bedingung braucht es glaube nicht, da die Rückwärtssteuerung durch einen Bool gelöst ist.
Weiterhin kann der check genau am Anfang der Funktion stehen, dann geht es für speedramp true und false gleichermaßen.
 
Ja, die ist bei mir raus.
Habe einen 2 Punktregler mit Hysterese programmiert. Mit Overload eigentlich ein 3 Punkt Regler..
Funktioniert soweit gut. Eine aufkommende Last wird fast gleich geregelt. Das braucht man unbedingt wenn man ein solides 4 Blatt Messer mit 29cm Durchmesser hat. Es bleibt sonst stehen. Der Code sollte aber auch wunderbar mit Mähteller laufen.
Das Problem bei dem Dynamik Gear Code ist einfach, das es viel zu kompliziert umgesetzt ist. Und auch noch falsch.
Diese Averagebildung ist falsch. Weiterhin ist falsch. das die PWM Werte der Motorfunktion manipuliert werden... ganz zu schweigen von einem Vergleich
ob eine Kurve gefahren wird. Damit hebelt man leichte Korrekturen aus. Im Code kann man doch rausfinden ob eine Kurve gefahren wird, in dem man z.b einfach nachsieht ob ein Angularwert größer Null vorgegeben wird. Und überhaupt, was kümmern uns Kurven? Wir wollen doch die Vorwärtsgeschwindigkeit beinflussen.. Ob ne Kurve gefahren werden muss schwebt doch darüber. Der Algo ob der Mower zu seinem Zielpfad findet macht das doch für uns. Hat nix mit Langsamer oder schneller zu tun. Das ganze Tracking kommt durcheinander. Völlig verbuggt.
Bei bedarf würde ich meinen Code präsentieren. Ich wollte aber noch einen PID Regler einbauen.. als Option. Bisher ist es halt nur ein 2 bzw. 3 Punktregler geworden, der aber gut funktioniert und easy einzustellen ist.
 
Zuletzt bearbeitet:
Bei bedarf würde ich meinen Code präsentieren. Ich wollte aber noch einen PID Regler einbauen.. als Option. Bisher ist es halt nur ein 2 bzw. 3 Punktregler geworden, der aber gut funktioniert und easy einzustellen ist.
na klar ist der Bedarf da :)
 
Zuletzt bearbeitet:
Ich werd das gerne bei Gelegenheit vorbereiten und posten, die Änderungen sind überschaubar.
Eigentlich wollte ich dazu einen Pull Request machen, aber dann soll der Code ja schön sauber sein.. Und ich kein erfahrener
Programmierer. Die Tage kommts aber, versprochen. Mit Einstelltips.

Also, wenn du die Dynamic Gear nur ganz wenig eingreifen lässt, funktioniert es halbwegs.
Aber weit entfernt von einer Lastregelung. Der MotorMowSenseLP Messwert gibt das auch garnicht her...
 
@AlexanderG
hab es zwar hier schon mal vorgeschlagen...wäre es möglich in der Sunray-App beim Berechnen der Mähbahnen eine Anzahl an zusätzlichen Perimeternbahnen an den Außenlinien/Ausgrenzungen vorzugeben wenn man mit Linien arbeitet?
Da der Rover ja länger als breit ist, hat mein Rover öfter Probleme beim Wenden an den Perimetern, wenn er dann die einzelnen Bahnen fahren will manchmal bleibt gar an meinem Zaun/Mauern mit seinem Arsch hängen. Wähle ich als Mähmuster Ringe aus, dann entschärft sich das Problem.
 
Da der Rover ja länger als breit ist, hat mein Rover öfter Probleme beim Wenden an den Perimetern, wenn er dann die einzelnen Bahnen fahren will manchmal bleibt gar an meinem Zaun/Mauern mit seinem Arsch hängen. Wähle ich als Mähmuster Ringe aus, dann entschärft sich das Problem.
Dann ist der Abstand zum Zaun/Mauer zu gering. Auch mit einer zweiten oder dritten Randmählinie hast du die Probleme nicht ganz weg an den Ecken.
 
@AlexanderG
hab es zwar hier schon mal vorgeschlagen...wäre es möglich in der Sunray-App beim Berechnen der Mähbahnen eine Anzahl an zusätzlichen Perimeternbahnen an den Außenlinien/Ausgrenzungen vorzugeben wenn man mit Linien arbeitet?
Da der Rover ja länger als breit ist, hat mein Rover öfter Probleme beim Wenden an den Perimetern, wenn er dann die einzelnen Bahnen fahren will manchmal bleibt gar an meinem Zaun/Mauern mit seinem Arsch hängen. Wähle ich als Mähmuster Ringe aus, dann entschärft sich das Problem.
Das feature: definieren der Randlinien würde ich mir auch wünschen.
 
Ja das macht Sinn. Das er automatisch mehrere Punkte zum "Überschleifen" von Ecken einbaut. Dann muss man das nicht von Hand in die Karte programmieren und es wird bei CalcMap automatisch eingefügt, nur bei Perimeterbahnen. Das ist ähnlich der Roboter oder CNC/Drucker Steuerungsablauf bzw. Physik auf Grund von bewegten Massen mit Trägheit. Finde übrigens auch, das Maptechnisch mit GCODE gearbeitet werden sollte.......
Jeder Slicer macht nichts anderes und du könntenst deine Karte im CAD Tool deiner wahl bearbeiten.. Die Erfindung der Kartenprogrammierung hier ist also fast wie das Rad nochmal zu erfinden, bzgl. Mähbahnen etc. Das ist äquivalent mit CAD CNC Prozessabläufen.
 
Zuletzt bearbeitet:
Dann ist der Abstand zum Zaun/Mauer zu gering. Auch mit einer zweiten oder dritten Randmählinie hast du die Probleme nicht ganz weg an den Ecken.
naja mit den Ecken gebe ich Dir Recht, aber das ist ja ein Problem, dass man nur durch Abstand lösen kann. Dann brauch ich aber auch keinen Mäher der auf ein paar Zentimeter genau fahren könnte, wenn ich zu allem einen halben Meter Abstand ein planen muss.

Hier mal ein Beispiel zwischen meinen Hochbeeten:

1655101031208.png

der schrub sich hier förmlich den Arsch Wund oder bleibt hängen und sucht sich dann wieder einen neuen Weg...der braucht hier für die paar Quadratmeter ewig. Natürlich könnte ich das mit der Hand schnell mähen oder die Linien alle handisch anpassen, aber das ja nicht der Sinn und Zweck.
 
Also wenn den Mähwinkel nicht änderst, dann könntest du zwischen den Hochbeeten die Mähspur der Länge nach machen. Vielleicht mal mit User Kermi reden der hat da Erfahrung. Aber zum Umdrehen innerhalb der Hochbeete auch wenn es nur am Ende ist, braucht er trotzdem etwas Platz. Oder Platten reinlegen und nicht mähen.
 
Also wenn den Mähwinkel nicht änderst, dann könntest du zwischen den Hochbeeten die Mähspur der Länge nach machen. Vielleicht mal mit User Kermi reden der hat da Erfahrung. Aber zum Umdrehen innerhalb der Hochbeete auch wenn es nur am Ende ist, braucht er trotzdem etwas Platz. Oder Platten reinlegen und nicht mähen.
entschärfen kann man alles wenn man will, aber das Grundproblem löst es doch nicht. Der Mäher ist länger als Breit, also wird es immer irgendwo dadurch Probleme geben.
Entweder man hat einen gleichbreiten und langen Mäher oder man muss wie Du schon schreibst weit aus mehr Abstand halten als es nötig wäre, zusätzliche Perimeter/Ausgrenzungsbahnen würden aber das Problem grundsätzlich lösen, denke andere Rasenmäherrobterumbauten haben ähnliche Abmessungen und dadurch das gleiche Problem.
 
Entweder man hat einen gleichbreiten und langen Mäher oder man muss wie Du schon schreibst weit aus mehr Abstand halten als es nötig wäre, zusätzliche Perimeter/Ausgrenzungsbahnen würden aber das Problem grundsätzlich lösen, denke andere Rasenmäherrobterumbauten haben ähnliche Abmessungen und dadurch das gleiche Problem.
Die Grundform bei den meisten mowern ist ja sehr ähnlich. 1x Messer relativ weit vorne, so schmal wie möglich, vordere Gehäuseteil so schmal wie möglich (ausreichend um Messer abzudecken und die Stützräder zu halten). Je breiter der Mower ist, je schlechter kommt er in Ecken, je mehr muss von hand nachgemäht werden.

Bei den STücken zwischen den Hochbeeten würde ich den Mähwinkel im 90° drehen. Auch wenn der Mower dort problemlos wenden kann und bis an den Rand kommt, ist das völlige Energie & Zeit verschwendung.
 
Oben