Servosound 4


Auf dieser Seite möchte ich kurz erläutern, wie man im Aerofly5 Servosounds realisieren kann. Schritt für Schritt werde ich hier an einem Beispiel hoffentlich verständlich erklären wie sich das Prinzip umsetzen lässt.

Hilfreiches Gundwissen:
Servokonfiguration
Mischer im Aerofly5

Das Prinzip ist Folgendes:
Es gibt zwei Servos, die denselben Input erhalten.
Eines der Servos ist sehr schnell, das andere hat eine realistische langsamere Geschwindigkeit.
Nun wird die Differenz der beiden Servoausschläge gebildet, diese Differenz existiert nur solange, bis beide Servos ihr Endposition erreicht haben.
Ein drittes Servo erhält diese Differenz als Inputwert, es dient später nur als Input für den Sound.

Als Beispiel dient hier das Querruder-Servo aus der Katana unlimited.

Das Querruderservo sieht in der tmd so aus:

        <[string8][object][servoclassic]
            <[string8][Name][ServoLeftAileron]>
            <[string8][Input][AileronInput.GetOutput]>
            <[float64][Speed][8]>
            <[float64][P0][0]>
            <[float64][P1][0.9]>
            <[float64][P2][0]>
            <[float64][P3][0]>
            <[float64][Position][0]>
        >

Es hat einen Weg von 0.9 bei einer Servogeschwindigkeit von 8.
Ein zweites fiktives Servo wird erstellt mit einer höheren Geschwindigkeit und exakt gleichgroßem Maximalausschlag allerdings mit umgekehrtem Vorzeichen:

        <[string8][object][servoclassic]
            <[string8][Name][ServoAileronInput]>
            <[string8][Input][AileronInput.GetOutput]>
            <[float64][Speed][10]>
            <[float64][P0][0]>
            <[float64][P1][-0.9]>
            <[float64][P2][0]>
            <[float64][P3][0]>
            <[float64][Position][0]>
        >

Diese beiden Servos machen also das gleiche, nur eines eben etwas schneller und in die andere Richtung.
Die beiden Servopositionen werden dann mit Servo.Position einem Mischer übergeben, der beide Inputs addiert.

        <[string8][object][mixlinear]
            <[string8][Name][MixServoAileronMovement]>
            <[string8][Input0][ServoAileronInput.Position]>
            <[string8][Input1][ServoLeftAileron.Position]>
            <[float64][Weight0][1]>
            <[float64][Weight1][1]>
            <[float64][Offset][0]>
        >

Der Mischer gibt dann die Summe der Servowege aus, in dem Falle also eine Differenz, da das eine Servo in die andere Richtung läuft.

Der Output des Mischers wird jetzt nur noch an ein drittes Servo übergeben.
Zur Überprüfung des Ergebnisses kann man dieses Servo als Steuerung für eines der Ruder “anschließen”.

        <[string8][object][servoclassic]
            <[string8][Name][ServoAileronMovement]>
            <[string8][Input][MixServoAileronMovement.Output]>
            <[float64][Speed][10]>
            <[float64][P0][0]>
            <[float64][P1][1]>
            <[float64][P2][0]>
            <[float64][P3][0]>
            <[float64][Position][0]>
        >

Somit ist die Grundlage für den Sound geschaffen. Wir erhalten einen Output, solange das Steuerungsservo noch nicht auf der gewünschten Position angekommen ist.


Nun gilt es den Input auch im Abschnitt “sound” in der tmd richtig einzustellen.
Dafür behelfen wir uns ein wenig mit dem AeroflyFS Soundmodell. Das was jetzt an Quellcode folgt, ist also in noch bisher keinem anderen Modell im Aerofly5 zu finden.

Zunächst rufen wir den Servoausschlag von oben ab, damit wir ihn auch im Abschnitt sound nutzen können.

        <[string8][object][soundinput]
            <[string8][Name][ServoAileronMovement]>
            <[uint32][InputID][ServoAileronMovement.Position]>
        >

Jetzt wird gemappt. Unter einem Soundmapping verstehe ich eine Funktionszuordnung, die mir bei einem Inputwert immer einen definierten Output liefert. Wie dieser Output aussehen soll wird im Map festgelegt.
In unserem Beispiel nutzen wir den Soundinput als Eingangsgröße und wollen als Output einen Wert für die Servolautstärke erhalten. Denn wir wollen ja eigentlich nichts höhren, wenn sich das Servo auch nicht bewegt (sämtliches Servobrummen lasse ich mal außen vor, uns gehts hier um das laute Getriebegeräusch).

        <[string8][object][soundmapping]
            <[string8][Name][AileronMovementVolumeMapping]>
            <[string8][Input][ServoAileronMovement.Output]>
            <[tmvector2d][Map][ (-1 0.1)(-0.002 0.1)(-0.000001 0.1)( 0 0.0 )(0.000001 0.1)(0.002 0.1)(1.0 0.1) ]>
        >

Jetzt möchten wir gerne, dass man auch einen Unterschied in der Servogeschwindigkeit hören kann.
Also erstellen wir uns ein zweites Mapping, das dafür sorgt, dass der Sound in einer höheren Frequenz abgespielt werden kann. Die Outputwerte muss man ggf. an das verwendete Sample anpassen.

        <[string8][object][soundmapping]
            <[string8][Name][AileronMovementPitchMapping]>
            <[string8][Input][ServoAileronMovement.Output]>
            <[tmvector2d][Map][ (-1 5) (-0.0001 2)( 0 2 )(0.0001 2) (1.0 5) ]>
        >

Und zu guter Letzt, wollen wir auch endlich was hören 😀
Wir nutzen dafür einen soundloop, als Lautstärke (Volume) geben wir unser erstes und als Frequenz (Pitch) geben wir unser zweites Mapping an.
Unter SoundFile könnten wir ein besseres Sample angeben, sofern wir eins hätten, ein Seglermotor hört sich ja nicht wirklich wie ein Servomotor an. Aber Not macht ja bekanntlich erfinderisch und so muss erstmal das Standard-Sample herhalten.

        <[string8][object][soundloop]
            <[string8][Name][LeftAileronMovementLoop]>
            <[string8][InputVolume][AileronMovementVolumeMapping.Output]>
            <[string8][InputPitch][AileronMovementPitchMapping.Output]>
            <[uint32][PositionID][LeftWing.R]>
            <[uint32][VelocityID][LeftWing.V]>
            <[string8][SoundFile][eglider_02.wav]>
        <

Autor: Jan


Leave a comment

Your email address will not be published. Required fields are marked *

4 thoughts on “Servosound

  • Jonas Schnell

    Hallo Jan,
    ist es derzeit auch in Aerofly5 möglich wenn eine bedingung (also z.b. wenn Seitenruder und Querruder voll aus linkem ausschlag stehen) das dann eine .wav Datei in voller länge abgespielt wird? Wenn das geht, wie würde dann der .tmd eintrag lauten?
    PS: Deine Know-How Seiten hier sind echt hilfreich!!
    Liebe Grüße Jonas

    • Jet-Pack Post author

      Hi,
      bin ich mir nicht ganz sicher. Schau mal beim aeroflyFS Discus rein, dort wird bei der Entrieglung der Bremsklappen ein Sound abgespielt, vielleicht suchst du etwas ähnliches? Irgendwie geht es bestimmt. Wüsste jetzt aber auch nicht genau wie.

      Viele Erfolg,
      Jan

      • Jonas Schnell

        Naja ich möchte bei eurem Quadrocopter wenn man die Motoren startet eine piep melodie ertönt. Also muss die Tondatei erklingen wenn man seitenruder und queruder voll linksausschlag gibt. Vondaher ist die bremsklappenveriegelung nicht ganz das richtige.
        Liebe Grüße, Jonas Schnell

        • Jet-Pack Post author

          Ja, ich denke das ließe sich machen. Das Problem ist, du müsstest ziemlich tief in den code einsteigen, ich hab grade null Zeit um dir dabei zu helfen. (Er ist etwas kommentiert, das könnte helfen)