Ja ganz genau so habe ich das gemeint.

Die Formel die ich in meinem Thread gepostet habe, habe ich aus den dort genannten gründen selbst aufstellen müssen.
Es funktioniert aber wirklich sehr gut. Das Drehen ist nämlich sogut wie nie nötig, das ist ja der Clou dabei. Würdest du ein Slalom aufstellen würde dein Bot mit dem Grenzwert zu nem Hindernis hinfahren, Drehen,Vorwärts, Drehen Vorwärts fahren.

Mein Bot fährt dann tatsächlich ein Slalom, da er die Kettengeschwinigkeit direkt über diese Funktion "regelt". Die Zahlen stimmen nicht mehr ganz von der Funktion, da ich den Messbereich erweitert habe.

Kurz zur Erklärung für die Zahlen:

49: Das ist die "Mitte" des Sensors. Ich messe den Bereich von 25cm (=Stoßstange des Bots) bis 72 cm, die Mitte ist 49cm. (eigentlich 48.5). Bei 49 habe ich meinen Wendepunkt der Funktion. Dort schlägt er von Vorwärts auf Rückwärts um. Also bei einer Kette.

/2 :
Das dvidiert durch 2 beweirkt eine Abflachung der Funktion. Je größer die Zahl desto langsamer schlägt er um. Aber desto weicher ist auch die Steuerung. Ich habe da 2 genommen weil bei mir die PWM-Werte nur von 150-255 die Motoren beschleunigen. Hast du eine höhere Auflösung solltest du unbedingt eine höhere Zahl nehmen.

0.5:
Einfach lassen. Die Sigmoid-funktion muss einen estimmten Bereich haben, damit Sie "funktioniert"

510:
Ist quasi der Verstärkungsfaktor.
Er sorgt dafür, das letztendlich die Werte wirklich von -255 bis 255 reichen. Du musst die 2 und die 510 aufeinander abstimmen.

Ist nicht so kompliziert wie es sich anhört.

Ich würde bei dir das folgendermaßen realisieren:

Dein Bot fährt Vorwärts. Anstatt deine gesamte Umgebung zu scannen würde ich abwechselnd Links/Rechts schauen, falls ein Hindernis entdeckt wird mit immer größeren Ausschlägen. Also:

Servo = 0° (Hindernis)
Servo = -5° (Hindernis)
Servo = +5° (Hindernis)
Servo = -10°(Hindernis)
Servo = +10°(frei)

So kannst du immer zwischen Links und Rechts unterscheiden und schaffst dir zwei "logische" Sensoren, einen für Links und einen für Rechts. Wenn du jetzt noch die gemessenen Werte mit meiner Funktion koppelst sollte das funktionieren.

Das setzt natürlich voraus, dass dein Servo schnell genug ist. Mit der Funktion kannst du sowieso aber die Geschwindigkeit begrenzen also wenn der Servo zu langsam ist.

Das mit dem Links/Rechts schauen hat den Vorteil, dass es viel schneller geht. Während du beim Scannen als von -90 bis +90 abscannst, was ja ein Winkel von 180° ist bzw bei dir ja 100 Schritte. Und hier kommt wieder der Vorteil des IR-Sensors: Es reicht nur eine kleine Drehung um eindeutige Ergebnise zu erlangen. Beim US Sensor müsstest du viel mehr drehen.

Hier nochmal die Funktion zu verdeutlichung:
Bild hier  
Bild hier  

falls du matlab hast, hier die Funktion:
y=(int32(((1.0 ./ (1.0+exp(-((x-49)/4))))-0.5)* 510))

bzw kannst so wie es ist für dein C übernehmen. Ich weiß nicht ob das so geht mit dem avgcc.
das int32() nimmt nun den Ganzzahligen Anteil. das exp() ist einfach e^() e ist ja eine Konstante.

Achja:
Nett ist auch, dass du vollkommen ohne if-Abfrage auskommst. Wie du beim Grpahen siehst, egal wie groß oder klein die Zahlen sind, aber einem geweisen Punkt bleiben sie immer in deinem Bereich (bei mir 255).
also quasi:
lim(f(x)) = 255
x->∞
und
lim(f(x)) = -255
x->-∞

Wenn du mir die PWM-Werte deiner Motoren sagst und die gewünschten Bereiche kann ich dir die Funktionsgleichung gerne aufstellen, du müsstest si dann nurnoch anpassen bzgl der Servogeschwindigkeit,

Falls noch Fragen offen sind einfach stellen. Ich drücke mich manchmal sehr ungeschickt aus :-D