- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 5 von 5

Thema: Größten Wert herausfinden

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.02.2005
    Beiträge
    385

    Größten Wert herausfinden

    Anzeige

    Praxistest und DIY Projekte
    Hi,
    es geht immernoch darum Servos gleichzeitig zu bewegen. Das klappt mit 2 Servos schon wunderbar. Ich frage also immer ab welcher den größen Weg zurücklegen muss, gib ihm als Step 1 und den anderen einen Wert kleiner als 1. Beim setzen der Servoposition wird dann auf int gerundet und fertig.
    Ich muss jetzt aber 4 Servos synchronisieren. Meine Frage ist: Wie mache ich das am performantesten mit dem größten Weg? Klar normalerweise gehe ich alle Werte durch und ersetze eine temp. Variable immer mit dem aktuell größten aber ich muss mir ja irgendwie merken ob das jetzt servo1 oder servo2 usw. war.
    Hat de jemand nen eleganten Lösungsvorschlag?

    mfg
    jagdfalke

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    29.07.2005
    Beiträge
    219
    Code:
    for (i=0; i<4;i++)
    {
            if ( max < servo_weg(i) ) {
                   max = servo_weg(i);
                   i_max = i;
            }
    }
    viel einfacher wird es nicht gehen...

    Du könntest u.U. die Servos "sortieren", wenn sich deren Weglänge selten verändert, dürfte sich das lohnen.

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.02.2005
    Beiträge
    385
    Der Servo bleibt eben nicht immer der gleiche. Aber ich habe es gerade eben geschafft: Ich habe einfach nur den großten Wert herausgesucht. Und wenn ich dann den Step berechne und den Soll-Weg durch den größten Wert teile kommt ja bei diesem Servo sowieso 1 raus. Dann muss ich auch nicht beachten was passiert wenn 2 Servos den gleichen weg machen müssen usw.

    Ja, Sortieralgorithmen sind schon lustig. Hab mal in Java nen Quicksort programmiert. Aber hier ist die anwendung doch eher sinnlos

    mfg
    jagdfalke

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    29.07.2005
    Beiträge
    219
    Sortieralgorithmen dürften sich gewaltig lohnen - wenn immer nur ein Servo seinen Wert ändert (und diesen womöglich auch nur wenig)

    Wenn du vier Servos mit unterschiedlichen Weglängen hast, sind spätestens nach dem ersten Sortierdurchgang alle sortiert.

    Dann nimmst du das "oberste" und bewegst es ein bisschen

    Dann schaust du nach, ob es noch das "oberste" ist (vergleiche es mit dem nächstunteren)- wenn nicht sortierst du es entsprechend nach unten.

    Das nächste mit dem "oberste" liegt dann schon bereit.

    Du musst dann nur eine Array-Organissation finden, mit der du nicht immer alles neu herumschieben musst. (verkettete List z.B. oder direktadressierte Elemente)

    ärgerlich ist dann nur, wenn die Sollwerte geändert werden und alle Servos neu sortiert werden müssen. Aber so oft wird das vielleicht nicht vorkommen?

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.02.2005
    Beiträge
    385
    also ich hab das jetzt mal so gelöst:
    Code:
    	//GET GREATEST VALUE
    	uint8_t largest_way_servo = shoulder_absolute;
    	if(elbow_absolute > largest_way_servo) { largest_way_servo = elbow_absolute; }
    	if(wrist_absolute > largest_way_servo) { largest_way_servo =  wrist_absolute; }
    	if(gripper_absolute > largest_way_servo) { largest_way_servo = gripper_absolute; }
    
    	//SET STEP DEPENDING ON GREATEST VALUE (BIGGEST STEP=1)
    	shoulder_step = (shoulder_absolute/largest_way_servo) * signum(shoulder_to_go);
    	elbow_step = (elbow_absolute/largest_way_servo) * signum(elbow_to_go);
    	wrist_step = (wrist_absolute/largest_way_servo) * signum(wrist_to_go);
    	gripper_step = (gripper_absolute/largest_way_servo) * signum(gripper_to_go);
    Oder ist das performance-technisch Mist? Also hier finde ich einen Sortieralgo nicht so prickelnd, da es ja in 4 Zeilen erledigt ist.

    Danke für die Antworten.
    mfg
    jagdfalke

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test