PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Größten Wert herausfinden



jagdfalke
12.12.2005, 16:00
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

sep
12.12.2005, 18:20
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.

jagdfalke
12.12.2005, 18:25
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 :D

mfg
jagdfalke

sep
12.12.2005, 18:39
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?

jagdfalke
12.12.2005, 18:46
also ich hab das jetzt mal so gelöst:

//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