Willkommen! Anmelden Ein neues Profil erzeugen

Erweiterte Suche

[Repetier] Z-Probe und AutoBedLevel Bug und Lösung

geschrieben von felko 
[Repetier] Z-Probe und AutoBedLevel Bug und Lösung
21. January 2015 12:21
Moin Moin
Hier im Forum sind ja einige Themen zum AutoBedLeveling, das nicht funktioniert, aktiv.
Ich hatte das Problem schon mal hier (KLICK) angesprochen aber es dann auf meine Unfähigkeit geschoben und nicht weiter verfolgt.

Nun bin ich aber mit einen Prusa i3 auch in die Problematik gestolpert. Meine Unfähigkeit hält sich also doch in Grenzen ;-).

Es ist ein ziemlich blöder Bug der nur dann auftritt wenn die Startposition der Z-Probe größer ist als die Auslöseposition der ersten Probe des Z-Sensors plus der "Z_PROBE_BED_DISTANCE" (EEPROM Wert:"Max. z-probe - bed dist. [mm]").
im Code sieht das so aus(Printer.cpp Zeile 1384, aktuelle GitHub Version):
        currentPositionSteps[Z_AXIS] += stepsRemainingAtZHit; // now current position is correct
        if(r == 0 && first)  // Modify start z position on first probe hit to speed the ZProbe process
        {
            int32_t newLastCorrection = currentPositionSteps[Z_AXIS] + (int32_t)((float)EEPROM::zProbeBedDistance() * axisStepsPerMM[Z_AXIS]);
            if(newLastCorrection < lastCorrection)
            {
                updateZ = lastCorrection - newLastCorrection;
                lastCorrection = newLastCorrection;				
            }
        }

Ich bin mir nicht sicher was Repetier mit dem Code will, ich vermute er will auf "Max. z-probe - bed dist. [mm]" fahren vergisst aber das zu tun-> ändert aber trotzdem die Position(lastCorrection) was natürlich je nach Startposition eine heftige Abweichung erzeugt. Die Variable "updateZ " wird nicht verwendet(daher die Vermutung).

Ihr könnt dem Bug aus dem Weg gehen wenn ihr den Wert "Z_PROBE_BED_DISTANCE" oder im EEprom"Max. z-probe - bed dist. [mm]" auf maximale Druckerhöhe setzt.


Verdammt, das hat mich drei Tage gekostet yawning smiley


Grüsse
Felix

2-mal bearbeitet. Zuletzt am 21.01.15 12:29.
Re: [Repetier] Z-Probe und AutoBedLevel Bug und Lösung
21. January 2015 14:47
So wie ich das verstehe, macht er das, um lastCorrection nicht in der Schleife setzen zu müssen.
Der erste der 5 Werte ist dann nicht mehr fehlerbehaftet.
Man könnte es so machen:
if(r == 0 && first)  // Modify start z position on first probe hit to speed the ZProbe process
        {
            int32_t newLastCorrection = currentPositionSteps[Z_AXIS] + (int32_t)((float)EEPROM::zProbeBedDistance() * axisStepsPerMM[Z_AXIS]);
            if(newLastCorrection < lastCorrection)
            {
                sum = stepsRemainingAtZHit;
                lastCorrection = newLastCorrection;				
            }
        }

Herzl. Grüße
Re: [Repetier] Z-Probe und AutoBedLevel Bug und Lösung
22. January 2015 09:45
Moin AlterBastler

Ich glaube dein Vorschlag funktioniert nicht. In "stepsRemainingAtZHit" sind die verbleibenden Steps die noch übrig sind wenn die ZProbe ausgelöst wurde.
Das ist hier die doppelte Druckerhöhe! das geht also auch schief.
die Lösung ist glaube ich in der Zeile 1403:
float distance = static_cast(sum) * invAxisStepsPerMM[Z_AXIS] / static_cast(repeat) + EEPROM::zProbeHeight();

die sollte so lauten:

float distance = static_cast((sum)/ static_cast(repeat) +updateZ)  * invAxisStepsPerMM[Z_AXIS] + EEPROM::zProbeHeight();

Grüsse
Felix

1-mal bearbeitet. Zuletzt am 22.01.15 09:50.
Re: [Repetier] Z-Probe und AutoBedLevel Bug und Lösung
22. January 2015 09:57
Du hast Recht. Dann kannst Du aber auch sum=updateZ setzen.

Herzl. Grüße
Re: [Repetier] Z-Probe und AutoBedLevel Bug und Lösung
22. January 2015 10:05
Ich vermute, updateZ wurde irgendwann durch sum ersetzt und an dieser Stelle vergessen zu entfernen.

Herzl. Grüße
Re: [Repetier] Z-Probe und AutoBedLevel Bug und Lösung
22. January 2015 10:11
Quote
felko
die sollte so lauten:

float distance = static_cast((sum)/ static_cast(repeat) +updateZ)  * invAxisStepsPerMM[Z_AXIS] + EEPROM::zProbeHeight();


besser so: der erste Meßvorgang ist in repeat ja auch enthalten!

float distance = static_cast(sum+updateZ)/ static_cast(repeat)  * invAxisStepsPerMM[Z_AXIS] + EEPROM::zProbeHeight();

Herzl. Grüße
Re: [Repetier] Z-Probe und AutoBedLevel Bug und Lösung
22. January 2015 10:38
Hi

Quote
AlterBastler

besser so: der erste Meßvorgang ist in repeat ja auch enthalten!

Herzl. Grüße

Ja, aber nur einmal!

Grüsse
Felix
Re: [Repetier] Z-Probe und AutoBedLevel Bug und Lösung
22. January 2015 10:51
Wir reden hier doch von repeat Messungen an ein und demselben Meßpunkt, von denen dann der Mittelwert gebildet wird, oder nicht?

Herzl. Grüße
Re: [Repetier] Z-Probe und AutoBedLevel Bug und Lösung
22. January 2015 11:14
Ich sehe jetzt, was Du meinst. updateZ wird außerhalb der Schleife auf 0 gesetzt. Dann mußt Du aber auch durch (repeat-1) teilen.
Am Besten entfernt man updateZ komplett und macht es so:

if(r == 0 && first)  // Modify start z position on first probe hit to speed the ZProbe process
        {
            int32_t newLastCorrection = currentPositionSteps[Z_AXIS] + (int32_t)((float)EEPROM::zProbeBedDistance() * axisStepsPerMM[Z_AXIS]);
            if(newLastCorrection < lastCorrection)
            {
                sum = lastCorrection - newLastCorrection;
                lastCorrection = newLastCorrection;				
            }
        }

Herzl. Grüße
Re: [Repetier] Z-Probe und AutoBedLevel Bug und Lösung
22. January 2015 11:32
Hi

in der updateZ Variable wird die Differenz gespeichert die Zwischen der Startposition und der Endposition der ZProbe besteht.

Will heisen:
Wir starten bei 10 -> wollen aber nach der Probe nicht wieder auf 10 zurückfahren sonder nur auf Z_PROBE_BED_DISTANCE (wenn die kleiner ist)

jetzt machen wir die probe-> zählen die steps bis zur auslösung-> teilen das ganze durch die Wiederholung und ziehen dann die Differenz zwischen Start und End(updateZ) ab. und sagen wir befinden uns auf der zHöhe:xxxx

So verstehe ich den Code.

Grüsse
Felix
Re: [Repetier] Z-Probe und AutoBedLevel Bug und Lösung
22. January 2015 15:30
Ich habe nochmal nachgedacht, und bin zu dem Ergebnis gekommen, daß beide Lösungen falsch sind.
Ich habe einen von mir kommentierten Auszug der Routine, so wie ich sie verstehe, mal angehängt.
Was meinst Du dazu?

Herzl. Grüße
Anhänge:
Öffnen | Download - AuszugausPrinter.cpp (5 KB)
Re: [Repetier] Z-Probe und AutoBedLevel Bug und Lösung
25. January 2015 06:07
@felko Gute analyse. Zu wissen wann genau ein Problem auftritt ist die halbe Lösung.

Die Idee von Z_PROBE_BED_DISTANCE war, das wenn man bei hohem Z ein G32 startet, das die Probe nicht immer komplett zurückfährt, sondern nur so viel wie nötig. Die Idee an sich find ich immer noch gut, nur das Ergebnis ist so wie es war nicht zu gebrauchen. Ich habe daher den Parameter etwas umdefiniert. Jetzt geht er erst mit Z so tief das Z maximal dieser wert ist, und dann fängt er an zu testen. Damit ist diese Korrektur aus der Schleife heraus und verursacht darin keinen Fehler mehr, wird aber immer noch zum reduzieren der Wege genutzt.

Der letzte patch in 0.92 sollte damit das Problem beheben.


Repetier-Software - the home of Repetier-Host (Windows, Linux and Mac OS X) and Repetier-Firmware.
Repetier-Server - the solution to control your printer from everywhere.
Visit us on Facebook and Twitter!
In diesem Forum dürfen leider nur registrierte Teilnehmer schreiben.

Klicke hier, um Dich einzuloggen