Umrisserkennung beschleunigen, aber wie?



  • Kleines Gedankenspielchen... vielleicht kannst du die Kante des Objekts in "Schlangenlinien" nachverfolgen:
    Zuerst wird ein Punkt auf der Kante gesucht, wie es schon bisher war. Dann wählst du in der Nähe des gefundenen Punktes P einen Punkt M. Ihr Abstand r sollte umso kleiner sein, je höher die Genauigkeit sein muss. Nun fährt der Sensor in einer Kreisbewegung um M, bis er auf die Kante trifft. P' sei der gefundene Punkt. M' sei der Punkt auf der Halbgeraden [PP' mit dem Abstand r von P'. Wiederhole die Kreisbewegung in abwechselnden Drehrichtungen, wobei P und M durch P' und M' ersetzt werden, solange bis der Pfad anzeigt, dass wir uns einmal um das Objekt bewegt haben.
    Das Verfahren hat ganz sicher ein Problem, wenn das Objekt feine Details oder bestimmte Formen hat. Zum Beispiel wäre es nicht möglich die Kante eines dünnen Objekts, das schmaler ist als r, nachzuverfolgen. Aber es wäre so ähnlich wie das, was du schon hast.
    geloescht



  • Jester schrieb:

    Vielleicht gibts auch was passendes für Deine Aufgabenstellung? Kleine mittlere Krümmung oder ähnliches klingt mir nicht nach nem völlig esoterischen Kriterium. Da könnte es durchaus schon was geben.

    Vielleicht schon, ich finde nur keinen. Wirklich gute Bahngeneratoren gelten nach wie vor als wohlgehütete Betriebsgeheimnisse.
    Ich habe in TurboPascal6 mal so ein Ding fabriziert, aber der war eher Käse, obwohl ich da lange hingefummelt habe. Muß deswegen auch nicht weinen, daß er verschütt ist.
    Ein Kunde von mir hat bei einem sehr spezifischen Problem länger erfolglos versucht, die optimalen Wege zu finden, letztlich war das Ganze sogar noch "strategiefreundlich", weil man den Generator zwingen durfte, die Bahnen kreisförmig anzulegen, trotzdem haben die mit Unterbrechungen zehn Jahre gebraucht, bis das Ding so war, daß man sagen konnte "da gibts nichts zu verbessern, jetzt machen wir die Bugs raus". 🤡

    Es gibt ja z.B. den kürzesten Weg und den, der die Punkte mit den geringsten Knickwinkeln "aufzuspießen" versucht. Zwei mitunter völlig gegensätzliche Strategien. Denn ein wenig abseits vom Weg A->B liegt Punkt C. Rentiert es sich, soweit zu bremsen, daß man C mitmißt und dann nach B weiterfährt oder kann man Punkt C in eine andere Schnellfahrt einbauen? Je nachdem ist das eine oder andere schneller.
    Also müssen richtige Suchbäume mit Hashtables und was weiß ich noch her.

    Das mit den Grid- Cells ist durchaus naheliegend, aber wenn man dann weiterdenkt, steckt der Teufel im Detail 😡.
    Weiters habe ich leider keinen Multicore- Prozessor, der sich drum kümmern kann, sondern nur einen Controller, der über größere CNC- Dateien bereits ins meditieren gerät. 😉



  • beschreibe nochmal, was die einschränkungen für die geschwindigkeit des sensors sind, und wie im allgemeinen die rohlinge aussehen. kann man z.b. kreise mit großem radius schnell abfahren?



  • Non Sequitur schrieb:

    beschreibe nochmal, was die einschränkungen für die geschwindigkeit des sensors sind, und wie im allgemeinen die rohlinge aussehen. kann man z.b. kreise mit großem radius schnell abfahren?

    Naja, das übliche Kreuztisch- Schrittmotorantriebs- Problem wie bei jedem Plotter. Manche juckeln deswegen ohnehin nur mit konstanter Start/Stop- Geschwindigkeit vor sich hin, meist wird aber eine Beschleunigung über eine Rampentabelle endlicher Länge implementiert.
    Wenn Du eine Fahrt hast, ist das wie eine Vektorkette, die über die Punkte A, B, C geht. Je länger der einzelne Weg, desto höher kann man beschleunigen. Natürlich verlängert sich auch der Bremsweg entsprechend. Man kann aber anhand der bewegten Massen ein Regelwerk aufstellen, daß der Knickwinkel bei B untersucht wird und z.B. gesagt wird, bei 2° Knickwinkel interessiert es mich nicht, ich muß nicht voll abbremsen, sondern nur auf 98%, weil der Motor da genug Drehmomentreserve hat, um das "en passant" nachzuliefern.
    Der Betriebs- "GAU" ist in der Hinsicht, wenn C und A zusammenfallen, so daß A->B->A ansteht, d.h. die bewegte Masse muß nicht nur angehalten, sondern in die Gegenrichtung beschleunigt werden. Ist echt heftig und bringt Mechanik und Motor an die Grenzen.

    Mit den kleinen Kreisen habe ich kurze, eher winkelige Teilvektoren und durch das Zurücksetzen komme ich in die Nähe des "harten" Belastungsfalls.
    Richtig ist, daß große Kreise sehr zügig durchfahren werden können. 🙂

    Bei den Rohlingen handelt es sich um Grabsteine, wie unterschiedlich die sind, kannst Du hier sehen: http://www.grabstein.at/products.php Bei Refreshen des Browsers werden neue Modelle nachgeladen.

    @geloescht:
    Klingt interessant, spart mir das Zurücksetzen und damit Hauptteil der Rappelei. Dürfte sich auch noch leicht umbauen lassen, ich probier's mal aus!
    🙂



  • pointercrash() schrieb:

    Mit den kleinen Kreisen habe ich kurze, eher winkelige Teilvektoren und durch das Zurücksetzen komme ich in die Nähe des "harten" Belastungsfalls.
    Richtig ist, daß große Kreise sehr zügig durchfahren werden können. 🙂

    Gut. Man kann natürlich jeden Kreis mit genug Punkten rastern, dass jede Ecke weniger als 2 Grad hat. Wie groß ist also ein großer, wie groß ein kleiner Kreis, im Verhältnis zum Stein? Und wieviel schneller ist 'schnell' gegenüber 'langsam'? Würde es z.B. was bringen so eine Bahn für die grobrasterung zu benutzen?



  • Non Sequitur schrieb:

    Gut. Man kann natürlich jeden Kreis mit genug Punkten rastern, dass jede Ecke weniger als 2 Grad hat. Wie groß ist also ein großer, wie groß ein kleiner Kreis, im Verhältnis zum Stein? Und wieviel schneller ist 'schnell' gegenüber 'langsam'? Würde es z.B. was bringen so eine Bahn für die grobrasterung zu benutzen?

    Start/Stop- Frequenz habe ich bei 1,2 kHz, im Reversierungsfall muß ich auf 600 Hz runter, Fullspeed liegt bei 20 kHz. Das Ganze ist natürlich über Riementrieb und Kugelrollspindelsteigungen für jede Achse eigens skaliert, so daß diese Antriebsverhältnisse motorseitig für alle Achsen in etwa gleich sind.

    Problemlos "groß" für alle Achsen hat ein Kreis von 20 cm plus, ein durchschnittlicher Stein ist etwa 120 cm * 80 cm, unterhalb von 5 cm Radius hört man schon, daß sich die Mechanik plagt und keine echte Speed mehr aufnimmt.

    Zur Abtastkurve: Würde nahezu ungebremst durchlaufen, aber wie geht's dann weiter?



  • pointercrash() schrieb:

    Zur Abtastkurve: Würde nahezu ungebremst durchlaufen, aber wie geht's dann weiter?

    Das war nichts lösungsrelevantes, nur Brainstorming. Ich würde erstmal schauen, ob der Vorschlag von geloescht schon ausreicht.

    Eine weitere straightforward-Lösung: nimm einen Kreisradius R, der am schnellsten durchlaufen wird. Ziehe einen Kreis, der 2 Schnittpunkte mit der Objektkante hat. Bestimme neuen Mittelpunkt für einen Kreis aus den Schnittpunkten (hier schlau sein.). Der Mittelpunkt zweimal die gewünschte Auflösung vom alten entfernt. Nun schwenkst du auf vom alten auf den neuen Kreis, wieder möglichst schlau, oder auf der nächsten Tangente beider Kreise. Dann wiederholst du das Ganze, bis du einmal rum bist.

    Auf diese Weise erhälst du pro Drehung ~ 2 neue Randpunkte. Durch geeignete Wahl des Radius und der Mittelpunkt-Schrittweite sind sie näherungsweise gleichverteilt (2R mod s = 0.5 prbbly) (zumindest auf der Geraden).

    Mögliche Nachteile wären: Das ist schon relativ komplex, also Codewartung höher, Instabilität des Algos möglich, könnte sein, dass es gar nichts bringt. Und du fährst die Hälfte der Zeit rückwärts.

    Vorteile: Du bist die hohen zweiten Ableitungen los.



  • Erstmal Dank an alle Poster für's Grübeln und die Vorschläge!

    Bin gerade dabei, den Ansatz von geloescht zu coden ... auf dem Prototyp- Modell der Anlage sehe ich schon die ersten Moves ... 🙂
    Bin gespannt, ob das bereits ausreicht, wenn nicht, geh' ich euch wieder auf den Zeiger.
    😃



  • falls der rohling auf nem untergrund liegt der immer gleich ist, koenntest du eventuell mit ner billigen webcam schon sehen wie die umrisse sind, das ist relativ einfach implementiert, denk ich mir. notfalls noch nen schnell rotierenden laserptr 😉

    naja, auch nur brainstorming.



  • rapso schrieb:

    ... mit ner billigen webcam schon sehen wie die umrisse sind, das ist relativ einfach implementiert, denk ich mir. notfalls noch nen schnell rotierenden laserptr 😉 naja, auch nur brainstorming.

    Hi rapso, mit einer Kamera wär's theoretisch möglich. Rumexperimentiert hab' ich da auch schon, da ich dem Werkzeugbahngenerator in der Vorschau auch Bitmaps unterlegen kann (hab' mir dazu extra eine EOS ausgeliehen) - und es dann ganz schnell aufgegeben. Problem sind die Optiken, die mal gut und gerne um ein paar Zentimeter verzeichnen, eine perspektivische Entzerrung wird da schon schwer bis unmöglich. Bei einer VGA- Webcam kannstes sowieso vergessen, weil da ein Pixel so 10 cm² Arbeitsfläche abdeckt.
    Irgendwo in den Bereich +/- 5 mm sollte es hingehen.

    Rotationslaserscanner scheitert schlicht an pekuniären Gründen, der erwähnte Sensor ist eigentlich ein Triangulationslaserdistanzsensor, bei dem ich in diesem Fall nur das "object in range"- Signal auswerte. Den brauche ich auch zu anderen Zwecken und für weiteres Gerümpel habe ich sowieso keinen Platz mehr auf der Konsole 😉 .

    Bisher schaut die Lösung von geloescht gar nicht mal schlecht aus, irgendwo hab' ich noch an Bug drin, weil er manchmal die Kontur verliert und dann irgendwo endlos im Nirvana seine Kreise zieht, aber die Moves sind eindeutig smoother als das, was ich vorher hatte. 🙂



  • die dinge muessen sich ja nicht ausschliessen.
    soweit ich das problem verstanden habe ist dein 'plotter' blind und kann nur true/false liefern, gleichzeitig auch noch sehr traege, wenn auch genau.
    die camera ist wiederrum schnell, weitsichtig, aber ungenau.

    du koenntest nun also die cam nutzen um den kolos einzuweisen, nur fuer den fall dass die bisherigen vorschlaege nicht ausreichend sind.



  • rapso schrieb:

    du koenntest nun also die cam nutzen um den kolos einzuweisen, nur fuer den fall dass die bisherigen vorschlaege nicht ausreichend sind.

    Fast. Lies mal weiter oben nach, das Ding nimmt ja nach so drei Zentimetern echt Fahrt auf und zumindest ein Fußpunkt ist bekannt. Wenn ich da drüberrausche, weiß ich zumindest für den Anfang der Mäanderfahrt, wo es losgehen sollte.

    Bin übrigens mit dem Modell eigentlich fertig, der Bug war ein Hystereseproblem. Bei erreichen des "Objekt da" habe ich die Auswertung vorgenommen, um den neuen Kreis zu berechnen, aber die Mechanik schwingt ja nach und das Signal toggelt ein paarmal. Manchmal bin ich mit dem nächsten Mäander auf "Objekt weg" gestartetet, schon rutscht das irgendwohin, Danke.

    Bin gespannt, was die "echte" Maschine dazu sagt, wird morgen damit gefüttert.

    EDIT: Naja, toll ist es nicht, das große Ding rumpelt dann doch ziemlich herum. Zumindest doppelt so schnell und halb so laut ist es, ich werde noch ein wenig mit den Radien herumspielen und evtl. zwei, drei Meßfahrten ansetzen und dann sehen, ob es sich lohnt, Einzelsegmente zu beschleunigen ...


Anmelden zum Antworten