Sonderfunktion: Klapptriebwerk


Ziel dieser Seite ist es zu erklären, wie man im Aerofly5 oder auch AeroflyFS ein Klapptriebwerk (KTW) in der TMD programmiert. Es soll erst anlaufen, wenn der Propeller ganz ausgefahren ist und erst wieder einfahren, nachdem der Propeller zum Stillstand gekommen ist und all das über einen einzigen Steuerungskanal.


Steuerungskanal

Als Steuerungsinput für das Klapptriebwerk wird ein einfaches Servo benutzt. An diesem Servo kann man auch später einstellen, wie schnell der gesamte Ablauf vom Ausfahren bis Vollgas dauern soll, über den Servospeed. Der Input dieses Servos stammt vom Empfänger, in diesem Fall “Glider-Engine”.
Die Startposition -1 definiert die Position des Klapptriebswerks, sodass das KTW beim Initialisieren des Modells im Aerofly eingefahren ist.

	<[string8][object][servoclassic]
            <[string8][Name][ThrottleSequence]>
            <[string8][Input][ThrottleInput.GetOutput]>
            <[float64][Speed][3]>
            <[float64][P0][0]>
            <[float64][P1][1]>
            <[float64][P2][0]>
            <[float64][P3][0]>
            <[float64][Position][-1]>
        >

Einfahren bei laufendem Motor verhindern

Zunächst soll das Einfahren behandelt werden. Es wird ein Linearservo zu einem Sensor umfunktioniert.
Es wird einem Linar-Servo die Motordrehzahl als Input übergeben und der Output so eingestellt, dass bei hohen Drehzahlen ein Wert nahe null augegeben wird.

        <[string8][object][servolinear]
            <[string8][Name][PropStopped]>
            <[string8][Input][DriveShaft.GetRotationSpeed]>
            <[float64][OutputSpeed][10]>
            <[float64][Position][1]>
            <[float64tmarray][InputPosition][ 0 0.5 0.5001  1 ]>
            <[float64tmarray][OutputPosition][1 1   0.05    0.05 0.05]>
        >

Überschreiben des User-Inputs

In nächsten Schritt wird der Output des Servos / Sensors mit dem Input der Sequenz / des Gebers multipliziert. Da der Sensor “PropStopped” erst bei stehendem Propeller einen Wert > 0 ausgibt, wird bei drehendem Propeller der Output immer 0 betragen. Egal wie die Position des Gebers also aussieht, solange der Propeller dreht wird immer 0 ausgegeben.

        <[string8][object][product]
            <[string8][Name][EnableRetract]>
            <[string8][Input0][PropStopped.GetOutput]>
            <[string8][Input1][ThrottleSequence.GetOutput]>
        >

Mapping

Der Output wird jetzt noch durch ein weiteres Linearservo übersetzt. Wenn der Propeller noch läuft wird ja 0 ausgegeben, in dem Fall soll aber das Klapptriebwerk an seiner ausgefahrenen Endposition (+1) stehen. Der Output wird also gemappt und zwar so, dass die untere Hälfte des Geberbereiches für das Ausklappen zuständig ist. Die obere Hälfte wird später dann für die Schubreglung genutzt:

		<[string8][object][servolinear]
            <[string8][Name][EnableRetractMapping]>
            <[string8][Input][EnableRetract.Output]>
            <[float64][OutputSpeed][10]>
            <[float64][Position][1]>
            <[float64tmarray][InputPosition][  -1 0 1 ]>
            <[float64tmarray][OutputPosition][ -1 1 1 ]>
        >

Anpassen an das Modell

Das nächste Servo stellt die Winkel ein, die das Klapptriebwerk fahren soll.
Eingefahren beträgt bei der ASH31 der Winkel 1.72 rad (Bogenmaß) und eingefahren 0.
Die Anfangsposition ist hier eingefahren also 1.72. Beim Initialisieren sieht man wie das Klapptriebwerk in den eingefahrenen Zustand springt. Dies könnte man mit diesem Parameter ändern, sodass es z.B. zunächst ausgefahren ist und dann erst einklappt.

        <[string8][object][servolinear]
            <[string8][Name][RetractPropellerMapping]>
            <[string8][Input][EnableRetractMapping.GetOutput]>
            <[float64][OutputSpeed][3]>
            <[float64][Position][1.72]>
            <[float64tmarray][InputPosition][ -1   -0.85  -0.1  1 ]>
            <[float64tmarray][OutputPosition][1.72 1.72   0.0 0.0 0.0 ]>
        >

Ein weiteres Servo steuert dann direkt das Einfahren des Motordoms:

		<[string8][object][servoclassic]
            <[string8][Name][ServoMotorRetract]>
            <[string8][Input][RetractPropellerMapping.GetOutput]>
            <[float64][Speed][0.4]>
            <[float64][P0][0]>
            <[float64][P1][1]>
            <[float64][P2][0]>
            <[float64][P3][0]>
            <[float64][Position][2]>
        >

Anlaufen verhindern, solange das KTW nicht ausklappt ist

Der nächste Abschnitt blockiert das Gasservo, bis das KTW ausgeklappt ist.
Auch hier wird ein Linearservos als Sensor entführt. In dem Fall ist das Klapptriebwerk so eingestellt, dass es erst anspringen kann, wenn es ein paar grad vor der Endposition angelangt ist. Wenn es erst flacher ausgefahren ist, wird wieder 0 ausgegeben.

		<[string8][object][servolinear]
            <[string8][Name][PropExtended]>
            <[string8][Input][ServoMotorRetract.GetOutput]>
            <[float64][OutputSpeed][10]>
            <[float64][Position][0]>
            <[float64tmarray][InputPosition][ 0.0  0.1 0.101 1.72]>
            <[float64tmarray][OutputPosition][1    1   0     0   0 ]>
        >

User-Input überschreiben

Mit dem Produkt wird auch hier der User-Input fürs Gasservo überschrieben.

        <[string8][object][product]
            <[string8][Name][EnableThrottle]>
            <[string8][Input0][PropExtended.GetOutput]>
            <[string8][Input1][ThrottleInput.GetOutput]>
        >

Mapping die zweite

Jetzt wird der Output des Produkts wieder interpretiert und übersetzt per Mapping.
Hier wird die obere Hälfte des Gebers als Gasservo genutzt.

        <[string8][object][servolinear]
            <[string8][Name][ThrottleMapping]>
            <[string8][Input][EnableThrottle.Output]>
            <[float64][OutputSpeed][10]>
            <[float64][Position][-1]>
            <[float64tmarray][InputPosition][ -1  0 1 ]>
            <[float64tmarray][OutputPosition][-1 -1 1 1]>
        >

Schubkontrolle

Um einen kleinen Offset zu erreichen und auch die Leerlaufdrehzahl zu gewähleisten wird ein hier anstatt einem normalen Servo ein Linearservo genutzt um das Gas zu steuern. Dieses Servo hier dient direkt als Gasservo für den Motor.

        <[string8][object][servolinear]
            <[string8][Name][ServoThrottle]>
            <[string8][Input][ThrottleMapping.GetOutput]>
            <[float64][OutputSpeed][0.5]>
            <[float64][Position][-1]>
            <[float64tmarray][InputPosition][ -1 -0.981 -0.98 -0.5 1 ]>
            <[float64tmarray][OutputPosition][-1 -1     -0.2  -0.2 1  1 ]>
        >

Abdeckklappen ansteuern

So ähnlich wie der Sensor für die Schubkontrolle werden auch die Klappen angesteuert, die den Klapptriebwerksschacht zudecken. Nur wird hier ein anders Mapping genutzt, dass zu jeder Stellung des Motordoms die entsprechende Position der Klappen ausgibt. Diese Positionen zu ermitteln benötigt genauer Anpassung an das 3D Modell.

        <[string8][object][servolinear]
            <[string8][Name][ServoEngineFlapMapping]>
            <[string8][Input][ServoMotorRetract.GetOutput]>
            <[float64][OutputSpeed][10]>
            <[float64][Position][-1.3]>
            <[float64tmarray][InputPosition][ 0.0    1.3  1.4   1.6  1.65 1.7 1.72]>
            <[float64tmarray][OutputPosition][-0.75 -0.75 -1  -1.15 -1.15 0.1 0    0 ]>
        >

Ein Standardservo wird weiter dazu genutzt, die Geschwindigkeit der Klappenbewegung zu reduzieren. Dies kann man auch anders realisieren, wie ich mittlerweile weiß.

		
		<[string8][object][servoclassic]
            <[string8][Name][ServoEngineFlap]>
            <[string8][Input][ServoEngineFlapMapping.GetOutput]>
            <[float64][Speed][2]>
            <[float64][P0][0]>
            <[float64][P1][1]>
            <[float64][P2][0]>
            <[float64][P3][0]>
            <[float64][Position][0]>
        >

Ziel erreicht

Mit diesen paar Servos und “Sensoren” fährt das Klapptriebwerk sauber ein, auch wenn man noch so sehr versucht es aus dem Takt zu bringen. Auch die Abdeckklappen passen so gut wie perfekt immer an das 3D Modell vom Motordoms.

Leave a comment

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