Added autopush v1.0-rc

Signed-off-by: merspieler <merspieler@users.noreply.github.com>
This commit is contained in:
merspieler 2018-08-03 01:40:28 +02:00
parent 11f8857825
commit 46b0613da2
13 changed files with 1771 additions and 8 deletions

View file

@ -28,10 +28,31 @@
<model>
<pushback>
<kp type="double">5000</kp>
<ki type="double">200</ki>
<kd type="double">500</kd>
<position-norm type="double">0</position-norm>
<position-norm>0</position-norm>
<enabled type="int"/>
<available type="int">1</available>
<chocks alias="/controls/gear/wheel-chocks"/>
<steer-cmd-norm alias="/controls/flight/rudder"/>
<yaw alias="/gear/gear[0]/steering-norm"/>
<yaw-mult type="float">1.0</yaw-mult>
<target-speed-km_h type="float">0.0</target-speed-km_h>
<K_p type="float">1.0</K_p>
<F_p type="float">0.1</F_p>
<K_i type="float">0.01</K_i>
<F_i type="float">2.0</F_i>
<K_d type="float">0.0</K_d>
<F_d type="float">0.0</F_d>
<driver>
<K_V type="float">5.5</K_V>
<F_V type="float">5.5</F_V>
<D_min-m type="float">5.0</D_min-m>
<K_psi type="float">0.03</K_psi>
<debug type="bool">true</debug>
</driver>
<route>
<show type="bool"/>
<view type="string">Model View</view>
</route>
</pushback>
<icing>
<iceable>
@ -223,8 +244,11 @@
<item>
<label>Pushback</label>
<binding>
<command>dialog-show</command>
<dialog-name>pushback</dialog-name>
<command>nasal</command>
<script>
var autopush_dlg = gui.Dialog.new("sim/gui/dialogs/announce/dialog", "Aircraft/IDG-A32X/AircraftConfig/autopush.xml");
autopush_dlg.open();
</script>
</binding>
</item>
<item>
@ -1501,6 +1525,28 @@
<icing>
<file>Aircraft/IDG-A32X/Nasal/icing.nas</file>
</icing>
<autopush>
<file>Nasal/autopush.nas</file>
</autopush>
<autopush_driver>
<file>Nasal/autopush_driver.nas</file>
</autopush_driver>
<dynarr>
<file>Nasal/dynarr.nas</file>
</dynarr>
<autopush_route>
<file>Nasal/autopush_route.nas</file>
</autopush_route>
</nasal>
<fdm>
<jsbsim>
<external_reactions>
<tractor>
<magnitude alias="/sim/model/pushback/force-lbf"/>
<x alias="/sim/model/pushback/force-x"/>
<y alias="/sim/model/pushback/force-y"/>
</tractor>
</external_reactions>
</jsbsim>
</fdm>
</PropertyList>

297
AircraftConfig/autopush.xml Normal file
View file

@ -0,0 +1,297 @@
<?xml version="1.0"?>
<!--
AUTOPUSH
Pushback dialog.
Copyright (c) 2018 Autopush authors:
Michael Danilov <mike.d.ft402 -eh- gmail.com>
Joshua Davidson http://github.com/it0uchpods
Merspieler http://github.com/merspieler
Original code (c) FlightGear
Distribute under the terms of GPLv2.
-->
<PropertyList>
<name>autopush</name>
<layout>vbox</layout>
<group>
<layout>hbox</layout>
<text>
<label>Pushback</label>
</text>
<empty>
<stretch>true</stretch>
</empty>
<button>
<halign>right</halign>
<pref-width>16</pref-width>
<pref-height>16</pref-height>
<legend/>
<key>Esc</key>
<binding>
<command>dialog-close</command>
</binding>
</button>
</group>
<hrule/>
<group>
<stretch>true</stretch>
<layout>vbox</layout>
<halign>center</halign>
<valign>top</valign>
<checkbox>
<halign>left</halign>
<label>Connect</label>
<property>/sim/model/pushback/enabled</property>
<live>true</live>
<binding>
<command>dialog-apply</command>
</binding>
</checkbox>
<group>
<layout>table</layout>
<text>
<row>0</row>
<col>0</col>
<label>Steering:</label>
<halign>left</halign>
</text>
<button>
<row>0</row>
<col>1</col>
<pref-width>25</pref-width>
<pref-height>25</pref-height>
<legend>&lt;</legend>
<binding>
<command>property-adjust</command>
<property>/sim/model/pushback/steer-cmd-norm</property>
<min>-1.0</min>
<max>1.0</max>
<step>-0.02</step>
<wrap>false</wrap>
</binding>
</button>
<slider>
<row>0</row>
<col>2</col>
<min>-1.0</min>
<max>1.0</max>
<property>/sim/model/pushback/steer-cmd-norm</property>
<live>true</live>
<binding>
<command>dialog-apply</command>
</binding>
</slider>
<button>
<row>0</row>
<col>3</col>
<pref-width>25</pref-width>
<pref-height>25</pref-height>
<legend>&gt;</legend>
<binding>
<command>property-adjust</command>
<property>/sim/model/pushback/steer-cmd-norm</property>
<min>-1.0</min>
<max>1.0</max>
<step>0.02</step>
<wrap>false</wrap>
</binding>
</button>
<button>
<row>0</row>
<col>4</col>
<pref-width>50</pref-width>
<pref-height>25</pref-height>
<legend>Center</legend>
<binding>
<command>property-assign</command>
<property>/sim/model/pushback/steer-cmd-norm</property>
<value>0</value>
</binding>
</button>
<text>
<row>1</row>
<col>0</col>
<label>Speed:</label>
<halign>left</halign>
</text>
<button>
<row>1</row>
<col>1</col>
<pref-width>25</pref-width>
<pref-height>25</pref-height>
<legend>&lt;</legend>
<binding>
<command>property-adjust</command>
<property>/sim/model/pushback/target-speed-km_h</property>
<min>-25</min>
<max>25</max>
<step>-1</step>
<wrap>false</wrap>
</binding>
</button>
<slider>
<row>1</row>
<col>2</col>
<min>-25</min>
<max>25</max>
<property>/sim/model/pushback/target-speed-km_h</property>
<live>true</live>
<binding>
<command>dialog-apply</command>
</binding>
</slider>
<button>
<row>1</row>
<col>3</col>
<pref-width>25</pref-width>
<pref-height>25</pref-height>
<legend>&gt;</legend>
<binding>
<command>property-adjust</command>
<property>/sim/model/pushback/target-speed-km_h</property>
<min>-25</min>
<max>25</max>
<step>1</step>
<wrap>false</wrap>
</binding>
</button>
<button>
<row>1</row>
<col>4</col>
<pref-width>50</pref-width>
<pref-height>25</pref-height>
<legend>Stop</legend>
<binding>
<command>property-assign</command>
<property>/sim/model/pushback/target-speed-km_h</property>
<value>0</value>
</binding>
</button>
<text>
<row>1</row>
<col>5</col>
<pref-width>16</pref-width>
<property>/sim/model/pushback/target-speed-km_h</property>
<format>%3.0f</format>
<live>true</live>
<halign>right</halign>
</text>
<text>
<row>1</row>
<col>6</col>
<label> km/h</label>
<halign>left</halign>
</text>
</group>
<hrule/>
<group>
<layout>table</layout>
<text>
<row>0</row>
<col>0</col>
<label>Auto push:</label>
<halign>left</halign>
</text>
<button>
<row>0</row>
<col>1</col>
<pref-width>50</pref-width>
<pref-height>25</pref-height>
<legend>Start</legend>
<binding>
<command>nasal</command>
<script>autopush_driver.start();</script>
</binding>
</button>
<button>
<row>0</row>
<col>2</col>
<pref-width>50</pref-width>
<pref-height>25</pref-height>
<legend>Stop</legend>
<binding>
<command>nasal</command>
<script>autopush_driver.stop();</script>
</binding>
</button>
<text>
<row>1</row>
<col>0</col>
<label>Route in advance:</label>
<halign>left</halign>
</text>
<button>
<row>1</row>
<col>1</col>
<pref-width>50</pref-width>
<pref-height>25</pref-height>
<legend>Enter</legend>
<binding>
<command>nasal</command>
<script>autopush_route.enter();</script>
</binding>
</button>
<button>
<row>1</row>
<col>2</col>
<pref-width>50</pref-width>
<pref-height>25</pref-height>
<legend>Done</legend>
<binding>
<command>nasal</command>
<script>autopush_route.done();</script>
</binding>
</button>
<checkbox>
<row>1</row>
<col>3</col>
<label>Show</label>
<property>/sim/model/pushback/route/show</property>
<binding>
<command>dialog-apply</command>
</binding>
</checkbox>
</group>
</group>
</PropertyList>

View file

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<PropertyList>
<inherits-from>Effects/model-combined-deferred</inherits-from>
<parameters>
<lightmap-enabled type="int">1</lightmap-enabled>
<lightmap-color type="vec3d" n="0">1.0 1.0 1.0</lightmap-color>
<texture n="3">
<image>cursor.png</image>
</texture>
</parameters>
</PropertyList>

589
Models/Autopush/cursor.ac Normal file
View file

@ -0,0 +1,589 @@
AC3Db
MATERIAL "DefaultWhite" rgb 1.0000 1.0000 1.0000 amb 0.2000 0.2000 0.2000 emis 0.0000 0.0000 0.0000 spec 0.5000 0.5000 0.5000 shi 10 trans 0.0000
MATERIAL "autopush cursor" rgb 1.0000 1.0000 1.0000 amb 0.0000 0.0000 0.0000 emis 0.0000 0.0000 0.0000 spec 0.0000 0.0000 0.0000 shi 50 trans 0.0000
OBJECT world
name "Blender_export__cursor.ac"
kids 1
OBJECT poly
name "Circle"
texture "cursor.png"
texrep 1 1
numvert 128
0.0000001 0.1999999 -0.7499999
0.0000000 0.1999999 -1.0000000
-0.0980171 0.1999999 -0.9951847
-0.1950903 0.1999999 -0.9807853
-0.2902847 0.1999999 -0.9569404
-0.3826835 0.1999999 -0.9238795
-0.4713967 0.1999999 -0.8819212
-0.5555702 0.1999999 -0.8314696
-0.6343933 0.1999999 -0.7730105
-0.7071068 0.1999999 -0.7071068
-0.7730104 0.1999999 -0.6343933
-0.8314696 0.1999999 -0.5555703
-0.8819212 0.1999999 -0.4713968
-0.9238795 0.1999999 -0.3826834
-0.9569404 0.1999999 -0.2902846
-0.9807853 0.1999999 -0.1950902
-0.9951847 0.1999999 -0.0980170
-1.0000000 0.1999999 0.0000002
-0.9951847 0.1999999 0.0980173
-0.9807853 0.1999999 0.1950906
-0.9569402 0.1999999 0.2902850
-0.9238794 0.1999999 0.3826837
-0.8819211 0.1999999 0.4713970
-0.8314694 0.1999999 0.5555705
-0.7730102 0.1999999 0.6343936
-0.7071064 0.1999999 0.7071071
-0.6343929 0.1999999 0.7730108
-0.5555698 0.1999999 0.8314700
-0.4713962 0.1999999 0.8819215
-0.3826828 0.1999999 0.9238798
-0.2902840 0.1999999 0.9569405
-0.1950896 0.1999999 0.9807854
-0.0980164 0.1999999 0.9951848
0.0000008 0.1999999 1.0000000
0.0980180 0.1999999 0.9951847
0.1950912 0.1999999 0.9807851
0.2902856 0.1999999 0.9569401
0.3826843 0.1999999 0.9238791
0.4713976 0.1999999 0.8819208
0.5555711 0.1999999 0.8314691
0.6343941 0.1999999 0.7730098
0.7071076 0.1999999 0.7071060
0.7730110 0.1999999 0.6343926
0.8314700 0.1999999 0.5555696
0.8819215 0.1999999 0.4713963
0.9238797 0.1999999 0.3826831
0.9569404 0.1999999 0.2902845
0.9807853 0.1999999 0.1950904
0.9951847 0.1999999 0.0980174
1.0000000 0.1999999 0.0000005
0.9951848 0.1999999 -0.0980165
0.9807854 0.1999999 -0.1950895
0.9569407 0.1999999 -0.2902837
0.9238800 0.1999999 -0.3826823
0.8819219 0.1999999 -0.4713955
0.8314705 0.1999999 -0.5555689
0.7730116 0.1999999 -0.6343918
0.7071083 0.1999999 -0.7071053
0.6343950 0.1999999 -0.7730090
0.5555723 0.1999999 -0.8314682
0.4713991 0.1999999 -0.8819200
0.3826860 0.1999999 -0.9238784
0.2902876 0.1999999 -0.9569395
0.1950935 0.1999999 -0.9807847
0.0980206 0.1999999 -0.9951844
-0.0735127 0.1999999 -0.7463885
-0.1463176 0.1999999 -0.7355889
-0.2177134 0.1999999 -0.7177052
-0.2870125 0.1999999 -0.6929096
-0.3535474 0.1999999 -0.6614408
-0.4166775 0.1999999 -0.6236022
-0.4757948 0.1999999 -0.5797578
-0.5303299 0.1999999 -0.5303301
-0.5797577 0.1999999 -0.4757949
-0.6236020 0.1999999 -0.4166776
-0.6614408 0.1999999 -0.3535475
-0.6929095 0.1999999 -0.2870125
-0.7177051 0.1999999 -0.2177134
-0.7355888 0.1999999 -0.1463176
-0.7463884 0.1999999 -0.0735127
-0.7499999 0.1999999 0.0000002
-0.7463884 0.1999999 0.0735131
-0.7355888 0.1999999 0.1463180
-0.7177050 0.1999999 0.2177138
-0.6929094 0.1999999 0.2870128
-0.6614407 0.1999999 0.3535478
-0.6236019 0.1999999 0.4166780
-0.5797575 0.1999999 0.4757953
-0.5303296 0.1999999 0.5303304
-0.4757945 0.1999999 0.5797582
-0.4166772 0.1999999 0.6236025
-0.3535470 0.1999999 0.6614412
-0.2870120 0.1999999 0.6929099
-0.2177129 0.1999999 0.7177055
-0.1463171 0.1999999 0.7355891
-0.0735121 0.1999999 0.7463887
0.0000008 0.1999999 0.7500001
0.0735136 0.1999999 0.7463886
0.1463185 0.1999999 0.7355889
0.2177143 0.1999999 0.7177051
0.2870134 0.1999999 0.6929094
0.3535483 0.1999999 0.6614407
0.4166785 0.1999999 0.6236019
0.4757957 0.1999999 0.5797574
0.5303308 0.1999999 0.5303296
0.5797584 0.1999999 0.4757945
0.6236026 0.1999999 0.4166773
0.6614413 0.1999999 0.3535473
0.6929099 0.1999999 0.2870124
0.7177054 0.1999999 0.2177135
0.7355891 0.1999999 0.1463179
0.7463887 0.1999999 0.0735131
0.7500001 0.1999999 0.0000004
0.7463887 0.1999999 -0.0735123
0.7355892 0.1999999 -0.1463170
0.7177056 0.1999999 -0.2177127
0.6929102 0.1999999 -0.2870116
0.6614416 0.1999999 -0.3535465
0.6236030 0.1999999 -0.4166766
0.5797589 0.1999999 -0.4757938
0.5303314 0.1999999 -0.5303289
0.4757964 0.1999999 -0.5797567
0.4166794 0.1999999 -0.6236011
0.3535495 0.1999999 -0.6614400
0.2870147 0.1999999 -0.6929088
0.2177158 0.1999999 -0.7177045
0.1463203 0.1999999 -0.7355884
0.0735156 0.1999999 -0.7463882
numsurf 64
SURF 0X10
mat 1
refs 4
25 0.080806 0.323223
88 0.091854 0.367417
87 0.088765 0.381051
24 0.076687 0.341402
SURF 0X10
mat 1
refs 4
12 0.069880 0.617849
75 0.083660 0.588387
74 0.086025 0.604169
11 0.073033 0.638893
SURF 0X10
mat 1
refs 4
51 0.186299 0.548772
114 0.170974 0.536579
113 0.171649 0.518378
50 0.187199 0.524504
SURF 0X10
mat 1
refs 4
64 0.131126 0.748796
127 0.129595 0.686597
126 0.134145 0.683897
63 0.137193 0.745196
SURF 0X10
mat 1
refs 4
11 0.073033 0.638893
74 0.086025 0.604169
73 0.088765 0.618949
10 0.076687 0.658598
SURF 0X10
mat 1
refs 4
24 0.076687 0.341402
87 0.088765 0.381051
86 0.086025 0.395830
23 0.073033 0.361107
SURF 0X10
mat 1
refs 4
37 0.148918 0.269030
100 0.142938 0.326773
99 0.138607 0.320574
36 0.143143 0.260765
SURF 0X10
mat 1
refs 4
50 0.187199 0.524504
113 0.171649 0.518378
112 0.171875 0.500000
49 0.187500 0.500000
SURF 0X10
mat 1
refs 4
63 0.137193 0.745196
126 0.134145 0.683897
125 0.138607 0.679426
62 0.143143 0.739235
SURF 0X10
mat 1
refs 4
10 0.076687 0.658598
73 0.088765 0.618949
72 0.091854 0.632583
9 0.080806 0.676777
SURF 0X10
mat 1
refs 4
23 0.073033 0.361107
86 0.086025 0.395830
85 0.083660 0.411613
22 0.069880 0.382151
SURF 0X10
mat 1
refs 4
36 0.143143 0.260765
99 0.138607 0.320574
98 0.134145 0.316103
35 0.137193 0.254804
SURF 0X10
mat 1
refs 4
49 0.187500 0.500000
112 0.171875 0.500000
111 0.171649 0.481622
48 0.187199 0.475496
SURF 0X10
mat 1
refs 4
62 0.143143 0.739235
125 0.138607 0.679426
124 0.142938 0.673227
61 0.148918 0.730970
SURF 0X10
mat 1
refs 4
9 0.080806 0.676777
72 0.091854 0.632583
71 0.095263 0.644939
8 0.085350 0.693253
SURF 0X10
mat 1
refs 4
22 0.069880 0.382151
85 0.083660 0.411613
84 0.081693 0.428247
21 0.067258 0.404329
SURF 0X10
mat 1
refs 4
35 0.137193 0.254804
98 0.134145 0.316103
97 0.129595 0.313403
34 0.131126 0.251204
SURF 0X10
mat 1
refs 4
48 0.187199 0.475496
111 0.171649 0.481622
110 0.170974 0.463421
47 0.186299 0.451227
SURF 0X10
mat 1
refs 4
61 0.148918 0.730970
124 0.142938 0.673227
123 0.147097 0.665360
60 0.154463 0.720480
SURF 0X10
mat 1
refs 4
8 0.085350 0.693253
71 0.095263 0.644939
70 0.098958 0.655900
7 0.090277 0.707867
SURF 0X10
mat 1
refs 4
21 0.067258 0.404329
84 0.081693 0.428247
83 0.080143 0.445572
20 0.065191 0.427429
SURF 0X10
mat 1
refs 4
34 0.131126 0.251204
97 0.129595 0.313403
96 0.125000 0.312500
33 0.125000 0.250000
SURF 0X10
mat 1
refs 4
47 0.186299 0.451227
110 0.170974 0.463421
109 0.169857 0.445572
46 0.184809 0.427429
SURF 0X10
mat 1
refs 4
60 0.154463 0.720480
123 0.147097 0.665360
122 0.151043 0.655900
59 0.159723 0.707867
SURF 0X10
mat 1
refs 4
7 0.090277 0.707867
70 0.098958 0.655900
69 0.102903 0.665360
6 0.095538 0.720480
SURF 0X10
mat 1
refs 4
20 0.065191 0.427429
83 0.080143 0.445572
82 0.079026 0.463420
19 0.063701 0.451227
SURF 0X10
mat 1
refs 4
33 0.125000 0.250000
96 0.125000 0.312500
95 0.120406 0.313403
32 0.118874 0.251204
SURF 0X10
mat 1
refs 4
46 0.184809 0.427429
109 0.169857 0.445572
108 0.168307 0.428247
45 0.182743 0.404329
SURF 0X10
mat 1
refs 4
59 0.159723 0.707867
122 0.151043 0.655900
121 0.154737 0.644939
58 0.164650 0.693252
SURF 0X10
mat 1
refs 4
6 0.095538 0.720480
69 0.102903 0.665360
68 0.107062 0.673227
5 0.101082 0.730970
SURF 0X10
mat 1
refs 4
19 0.063701 0.451227
82 0.079026 0.463420
81 0.078351 0.481622
18 0.062801 0.475496
SURF 0X10
mat 1
refs 4
32 0.118874 0.251204
95 0.120406 0.313403
94 0.115855 0.316103
31 0.112807 0.254804
SURF 0X10
mat 1
refs 4
45 0.182743 0.404329
108 0.168307 0.428247
107 0.166340 0.411613
44 0.180120 0.382151
SURF 0X10
mat 1
refs 4
58 0.164650 0.693252
121 0.154737 0.644939
120 0.158146 0.632582
57 0.169194 0.676776
SURF 0X10
mat 1
refs 4
5 0.101082 0.730970
68 0.107062 0.673227
67 0.111393 0.679426
4 0.106857 0.739235
SURF 0X10
mat 1
refs 4
18 0.062801 0.475496
81 0.078351 0.481622
80 0.078125 0.500000
17 0.062500 0.500000
SURF 0X10
mat 1
refs 4
31 0.112807 0.254804
94 0.115855 0.316103
93 0.111393 0.320574
30 0.106857 0.260765
SURF 0X10
mat 1
refs 4
44 0.180120 0.382151
107 0.166340 0.411613
106 0.163975 0.395831
43 0.176967 0.361108
SURF 0X10
mat 1
refs 4
57 0.169194 0.676776
120 0.158146 0.632582
119 0.161235 0.618949
56 0.173313 0.658598
SURF 0X10
mat 1
refs 4
4 0.106857 0.739235
67 0.111393 0.679426
66 0.115855 0.683897
3 0.112807 0.745196
SURF 0X10
mat 1
refs 4
17 0.062500 0.500000
80 0.078125 0.500000
79 0.078351 0.518378
16 0.062801 0.524504
SURF 0X10
mat 1
refs 4
30 0.106857 0.260765
93 0.111393 0.320574
92 0.107062 0.326772
29 0.101082 0.269030
SURF 0X10
mat 1
refs 4
43 0.176967 0.361108
106 0.163975 0.395831
105 0.161235 0.381051
42 0.173313 0.341402
SURF 0X10
mat 1
refs 4
56 0.173313 0.658598
119 0.161235 0.618949
118 0.163975 0.604169
55 0.176967 0.638892
SURF 0X10
mat 1
refs 4
3 0.112807 0.745196
66 0.115855 0.683897
65 0.120406 0.686597
2 0.118874 0.748796
SURF 0X10
mat 1
refs 4
16 0.062801 0.524504
79 0.078351 0.518378
78 0.079026 0.536579
15 0.063701 0.548773
SURF 0X10
mat 1
refs 4
29 0.101082 0.269030
92 0.107062 0.326772
91 0.102903 0.334640
28 0.095538 0.279520
SURF 0X10
mat 1
refs 4
42 0.173313 0.341402
105 0.161235 0.381051
104 0.158146 0.367418
41 0.169194 0.323223
SURF 0X10
mat 1
refs 4
55 0.176967 0.638892
118 0.163975 0.604169
117 0.166340 0.588387
54 0.180120 0.617849
SURF 0X10
mat 1
refs 4
15 0.063701 0.548773
78 0.079026 0.536579
77 0.080143 0.554428
14 0.065191 0.572571
SURF 0X10
mat 1
refs 4
28 0.095538 0.279520
91 0.102903 0.334640
90 0.098958 0.344099
27 0.090277 0.292132
SURF 0X10
mat 1
refs 4
41 0.169194 0.323223
104 0.158146 0.367418
103 0.154737 0.355061
40 0.164650 0.306747
SURF 0X10
mat 1
refs 4
54 0.180120 0.617849
117 0.166340 0.588387
116 0.168307 0.571753
53 0.182743 0.595671
SURF 0X10
mat 1
refs 4
0 0.125000 0.687500
1 0.125000 0.750000
2 0.118874 0.748796
65 0.120406 0.686597
SURF 0X10
mat 1
refs 4
14 0.065191 0.572571
77 0.080143 0.554428
76 0.081693 0.571753
13 0.067258 0.595671
SURF 0X10
mat 1
refs 4
27 0.090277 0.292132
90 0.098958 0.344099
89 0.095263 0.355060
26 0.085350 0.306747
SURF 0X10
mat 1
refs 4
40 0.164650 0.306747
103 0.154737 0.355061
102 0.151042 0.344099
39 0.159723 0.292133
SURF 0X10
mat 1
refs 4
53 0.182743 0.595671
116 0.168307 0.571753
115 0.169857 0.554428
52 0.184809 0.572571
SURF 0X10
mat 1
refs 4
13 0.067258 0.595671
76 0.081693 0.571753
75 0.083660 0.588387
12 0.069880 0.617849
SURF 0X10
mat 1
refs 4
26 0.085350 0.306747
89 0.095263 0.355060
88 0.091854 0.367417
25 0.080806 0.323223
SURF 0X10
mat 1
refs 4
39 0.159723 0.292133
102 0.151042 0.344099
101 0.147097 0.334640
38 0.154462 0.279520
SURF 0X10
mat 1
refs 4
52 0.184809 0.572571
115 0.169857 0.554428
114 0.170974 0.536579
51 0.186299 0.548772
SURF 0X10
mat 1
refs 4
1 0.125000 0.750000
0 0.125000 0.687500
127 0.129595 0.686597
64 0.131126 0.748796
SURF 0X10
mat 1
refs 4
38 0.154462 0.279520
101 0.147097 0.334640
100 0.142938 0.326773
37 0.148918 0.269030
kids 0

BIN
Models/Autopush/cursor.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 B

View file

@ -0,0 +1,34 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
AUTOPUSH
Cursor model.
Copyright (c) 2018 Autopush authors:
Michael Danilov <mike.d.ft402 -eh- gmail.com>
Joshua Davidson http://github.com/it0uchpods
Merspieler http://github.com/merspieler
Distribute under the terms of GPLv2.
-->
<PropertyList>
<path>cursor.ac</path>
<animation>
<enable-hot>false</enable-hot>
</animation>
<animation>
<type>scale</type>
<property>/sim/model/pushback/driver/D_min-m</property>
<z-factor>0.0</z-factor>
<z-min>1.0</z-min>
</animation>
<effect>
<object-name>Circle</object-name>
<inherits-from>Effects/cursor</inherits-from>
</effect>
</PropertyList>

238
Models/Autopush/waypoint.ac Normal file
View file

@ -0,0 +1,238 @@
AC3Db
MATERIAL "DefaultWhite" rgb 1.0000 1.0000 1.0000 amb 0.2000 0.2000 0.2000 emis 0.0000 0.0000 0.0000 spec 0.5000 0.5000 0.5000 shi 10 trans 0.0000
MATERIAL "autopush cursor" rgb 1.0000 1.0000 1.0000 amb 0.0000 0.0000 0.0000 emis 0.0000 0.0000 0.0000 spec 0.0000 0.0000 0.0000 shi 50 trans 0.0000
OBJECT world
name "Blender_export__waypoint.ac"
kids 1
OBJECT poly
name "Circle"
texture "cursor.png"
texrep 1 1
numvert 33
0.0390178 0.2000000 -0.1961571
0.0765364 0.2000000 -0.1847760
0.1111138 0.2000000 -0.1662941
0.1414212 0.2000000 -0.1414215
0.1662938 0.2000000 -0.1111143
0.1847758 0.2000000 -0.0765369
0.1961570 0.2000000 -0.0390183
0.2000000 0.2000000 -0.0000002
0.1961571 0.2000000 0.0390179
0.1847760 0.2000000 0.0765365
0.1662940 0.2000000 0.1111139
0.1414215 0.2000000 0.1414213
0.1111141 0.2000000 0.1662939
0.0765368 0.2000000 0.1847759
0.0390181 0.2000000 0.1961570
0.0000001 0.2000000 0.2000000
-0.0390180 0.2000000 0.1961571
-0.0765367 0.2000000 0.1847759
-0.1111140 0.2000000 0.1662939
-0.1414214 0.2000000 0.1414214
-0.1662939 0.2000000 0.1111140
-0.1847759 0.2000000 0.0765367
-0.1961571 0.2000000 0.0390180
-0.2000000 0.2000000 -0.0000000
-0.1961571 0.2000000 -0.0390181
-0.1847759 0.2000000 -0.0765367
-0.1662939 0.2000000 -0.1111140
-0.1414214 0.2000000 -0.1414214
-0.1111140 0.2000000 -0.1662939
-0.0765367 0.2000000 -0.1847759
-0.0390181 0.2000000 -0.1961571
0.0000000 0.2000000 -0.2000000
0.0000000 0.2000000 0.0000000
numsurf 32
SURF 0X0
mat 1
refs 3
32 0.125000 0.500000
18 0.090277 0.292133
17 0.101082 0.269030
SURF 0X0
mat 1
refs 3
32 0.125000 0.500000
31 0.125000 0.750000
30 0.112807 0.745197
SURF 0X0
mat 1
refs 3
32 0.125000 0.500000
4 0.176967 0.638893
3 0.169194 0.676777
SURF 0X0
mat 1
refs 3
32 0.125000 0.500000
17 0.101082 0.269030
16 0.112807 0.254804
SURF 0X0
mat 1
refs 3
32 0.125000 0.500000
30 0.112807 0.745197
29 0.101082 0.730970
SURF 0X0
mat 1
refs 3
32 0.125000 0.500000
3 0.169194 0.676777
2 0.159723 0.707868
SURF 0X0
mat 1
refs 3
32 0.125000 0.500000
16 0.112807 0.254804
15 0.125000 0.250000
SURF 0X0
mat 1
refs 3
32 0.125000 0.500000
29 0.101082 0.730970
28 0.090277 0.707868
SURF 0X0
mat 1
refs 3
32 0.125000 0.500000
2 0.159723 0.707868
1 0.148918 0.730970
SURF 0X0
mat 1
refs 3
32 0.125000 0.500000
15 0.125000 0.250000
14 0.137193 0.254804
SURF 0X0
mat 1
refs 3
32 0.125000 0.500000
28 0.090277 0.707868
27 0.080806 0.676777
SURF 0X0
mat 1
refs 3
32 0.125000 0.500000
1 0.148918 0.730970
0 0.137193 0.745197
SURF 0X0
mat 1
refs 3
32 0.125000 0.500000
14 0.137193 0.254804
13 0.148918 0.269030
SURF 0X0
mat 1
refs 3
32 0.125000 0.500000
27 0.080806 0.676777
26 0.073033 0.638893
SURF 0X0
mat 1
refs 3
32 0.125000 0.500000
0 0.137193 0.745197
31 0.125000 0.750000
SURF 0X0
mat 1
refs 3
32 0.125000 0.500000
13 0.148918 0.269030
12 0.159723 0.292133
SURF 0X0
mat 1
refs 3
32 0.125000 0.500000
26 0.073033 0.638893
25 0.067258 0.595671
SURF 0X0
mat 1
refs 3
32 0.125000 0.500000
12 0.159723 0.292133
11 0.169194 0.323224
SURF 0X0
mat 1
refs 3
32 0.125000 0.500000
25 0.067258 0.595671
24 0.063701 0.548773
SURF 0X0
mat 1
refs 3
32 0.125000 0.500000
11 0.169194 0.323224
10 0.176967 0.361108
SURF 0X0
mat 1
refs 3
32 0.125000 0.500000
24 0.063701 0.548773
23 0.062500 0.500000
SURF 0X0
mat 1
refs 3
32 0.125000 0.500000
10 0.176967 0.361108
9 0.182743 0.404329
SURF 0X0
mat 1
refs 3
32 0.125000 0.500000
23 0.062500 0.500000
22 0.063701 0.451228
SURF 0X0
mat 1
refs 3
32 0.125000 0.500000
9 0.182743 0.404329
8 0.186299 0.451228
SURF 0X0
mat 1
refs 3
32 0.125000 0.500000
22 0.063701 0.451228
21 0.067258 0.404329
SURF 0X0
mat 1
refs 3
32 0.125000 0.500000
8 0.186299 0.451228
7 0.187500 0.500000
SURF 0X0
mat 1
refs 3
32 0.125000 0.500000
21 0.067258 0.404329
20 0.073033 0.361108
SURF 0X0
mat 1
refs 3
32 0.125000 0.500000
7 0.187500 0.500000
6 0.186299 0.548773
SURF 0X0
mat 1
refs 3
32 0.125000 0.500000
20 0.073033 0.361108
19 0.080806 0.323223
SURF 0X0
mat 1
refs 3
32 0.125000 0.500000
6 0.186299 0.548773
5 0.182742 0.595671
SURF 0X0
mat 1
refs 3
32 0.125000 0.500000
19 0.080806 0.323223
18 0.090277 0.292133
SURF 0X0
mat 1
refs 3
32 0.125000 0.500000
5 0.182742 0.595671
4 0.176967 0.638893
kids 0

View file

@ -0,0 +1,34 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
AUTOPUSH
Waypoint model.
Copyright (c) 2018 Autopush authors:
Michael Danilov <mike.d.ft402 -eh- gmail.com>
Joshua Davidson http://github.com/it0uchpods
Merspieler http://github.com/merspieler
Distribute under the terms of GPLv2.
-->
<PropertyList>
<path>waypoint.ac</path>
<animation>
<enable-hot>false</enable-hot>
</animation>
<animation>
<type>scale</type>
<property>/sim/model/pushback/driver/D_min-m</property>
<z-factor>0.0</z-factor>
<z-min>1.0</z-min>
</animation>
<effect>
<object-name>Circle</object-name>
<inherits-from>Effects/cursor</inherits-from>
</effect>
</PropertyList>

136
Nasal/autopush.nas Normal file
View file

@ -0,0 +1,136 @@
# AUTOPUSH
# Basic pushback logic class.
#
# Copyright (c) 2018 Autopush authors:
# Michael Danilov <mike.d.ft402 -eh- gmail.com>
# Joshua Davidson http://github.com/it0uchpods
# Merspieler http://github.com/merspieler
# Distribute under the terms of GPLv2.
var _enabled = 0;
var _K_p = nil;
var _F_p = nil;
var _K_i = nil;
var _F_i = nil;
var _K_d = nil;
var _F_d = nil;
var _F = nil;
var _int = nil;
var _deltaV = nil;
var _T_f = nil;
var _K_yaw = nil;
var _yasim = 0;
var _time = nil;
# (ft / s^2) / ((km / h) / s)
var _unitconv = M2FT / 3.6;
var _debug = nil;
var _loop = func() {
if (!getprop("/sim/model/pushback/available")) {
_stop();
return;
}
var force = 0.0;
var x = 0.0;
var y = 0.0;
# Rollspeed is only adequate if the wheel is touching the ground.
if (getprop("/gear/gear[0]/wow")) {
var deltaV = getprop("/sim/model/pushback/target-speed-km_h");
deltaV -= getprop("/gear/gear[0]/rollspeed-ms") * 3.6;
var dV = deltaV - _deltaV;
var time = getprop("/sim/time/elapsed-sec");
var prop = math.min(math.max(_K_p * deltaV, -_F_p), _F_p);
var speedup = getprop("/sim/speed-up");
dt = time - _time;
# XXX Sanitising dt. Smaller chance of freakout on lag spike.
if(dt > 0.0) {
if(dt < 0.05) {
_int = math.min(math.max(_int + _K_i * dV * dt, -_F_i), _F_i);
}
if(dt > 0.002) {
var deriv = math.min(math.max(_K_d * dV / dt, -_F_d), _F_d);
}
}
var accel = prop + _int + deriv;
if (_debug > 2) {
print("pushback prop " ~ prop ~ ", _int " ~ _int ~ ", deriv " ~ deriv);
}
_deltaV = deltaV;
_time = time;
if (!_yasim) {
force = accel * getprop("/fdm/jsbsim/inertia/weight-lbs") * _unitconv;
} else {
force = accel * getprop("/fdm/yasim/gross-weight-lbs") * _unitconv;
}
var yaw = getprop("/sim/model/pushback/yaw") * _K_yaw;
x = math.cos(yaw);
y = math.sin(yaw);
setprop("/sim/model/pushback/force-x", x);
setprop("/sim/model/pushback/force-y", y);
}
setprop("/sim/model/pushback/force-lbf", force);
if (_yasim) {
# The force is divided by YASim thrust="100000.0" setting.
setprop("/sim/model/pushback/force-x-yasim", x * force * 0.00001);
# YASim's y is to the left.
setprop("/sim/model/pushback/force-y-yasim", -y * force * 0.00001);
}
}
var _timer = maketimer(0.0167, func{_loop()});
var _start = func() {
# Else overwritten by dialog.
settimer(func() {
setprop("/sim/model/pushback/target-speed-km_h", 0.0)
}, 0.1);
_K_p = getprop("/sim/model/pushback/K_p");
_F_p = getprop("/sim/model/pushback/F_p");
_K_i = getprop("/sim/model/pushback/K_i");
_F_i = getprop("/sim/model/pushback/F_i");
_K_d = getprop("/sim/model/pushback/K_d");
_F_d = getprop("/sim/model/pushback/F_d");
_F = getprop("/sim/model/pushback/F");
_T_f = getprop("/sim/model/pushback/T_f");
_K_yaw = getprop("/sim/model/pushback/yaw-mult") * D2R;
_yasim = (getprop("/sim/flight-model") == "yasim");
_debug = getprop("/sim/model/pushback/debug") or 0;
_int = 0.0;
_deltaV = 0.0;
_time = getprop("/sim/time/elapsed-sec");
setprop("/sim/model/pushback/connected", 1);
if (!_timer.isRunning) {
if (getprop("/sim/model/pushback/chocks")) {
setprop("/sim/model/pushback/chocks", 0);
screen.log.write("(pushback): Pushback connected, chocks removed. Please release brakes.");
} else {
screen.log.write("(pushback): Pushback connected, please release brakes.");
}
}
_timer.start();
}
var _stop = func() {
if (_timer.isRunning) {
screen.log.write("(pushback): Pushback and bypass pin removed.");
}
_timer.stop();
setprop("/sim/model/pushback/force-lbf", 0.0);
if (_yasim) {
setprop("/sim/model/pushback/force-x-yasim", 0.0);
setprop("/sim/model/pushback/force-y-yasim", 0.0);
}
setprop("/sim/model/pushback/connected", 0);
setprop("/sim/model/pushback/enabled", 0);
}
setlistener("/sim/model/pushback/enabled", func(p) {
var enabled = p.getValue();
if ((enabled > _enabled) and getprop("/sim/model/pushback/available")) {
_start();
} else if (enabled < _enabled) {
_stop();
}
_enabled = enabled;
});

99
Nasal/autopush_driver.nas Normal file
View file

@ -0,0 +1,99 @@
# AUTOPUSH
# Pushback driver class.
#
# Command the pushback to tow/push the aircraft.
#
# Copyright (c) 2018 Autopush authors:
# Michael Danilov <mike.d.ft402 -eh- gmail.com>
# Joshua Davidson http://github.com/it0uchpods
# Merspieler http://github.com/merspieler
# Distribute under the terms of GPLv2.
var _K_V = nil;
var _F_V = nil;
var _D_min = nil;
var _K_psi = nil;
var _debug = nil;
var _route = nil;
var _push = nil;
var _sign = nil;
var _psi_park = nil;
var _to_wp = nil;
var _loop = func() {
if (!getprop("/sim/model/pushback/connected")) {
stop();
return;
}
var psi = getprop("/orientation/heading-deg") + _push * 180.0;
var (A, D) = courseAndDistance(_route[_to_wp]);
D *= NM2M;
# FIXME Use _K_V and total remaining distance.
var V = _F_V;
if ((D < _D_min) or (abs(geo.normdeg180(A - psi) > 90.0))) {
_to_wp += 1;
if (_to_wp == size(_route)) {
_done();
autopush_route.clear();
return;
}
if (_debug) {
print("pushback_driver wp " ~ _to_wp);
}
}
if (_debug > 1) {
print("pushback_driver psi_target " ~ geo.normdeg(A) ~ ", deltapsi " ~ _sign * geo.normdeg180(A - psi));
}
setprop("/sim/model/pushback/target-speed-km_h", _sign * V);
steering = math.min(math.max(_sign * _K_psi * geo.normdeg180(A - psi), -1.0), 1.0);
setprop("/sim/model/pushback/steer-cmd-norm", steering);
}
var _timer = maketimer(0.051, func{_loop()});
var _done = func() {
stop();
screen.log.write("(pushback): Pushback complete, please set parking brake.");
}
var start = func() {
if (_timer.isRunning) {
stop();
}
if (!getprop("/sim/model/pushback/connected")) {
gui.popupTip("Pushback must be connected");
return;
}
_route = autopush_route.route();
if ((_route == nil) or size(_route) < 2) {
autopush_route.enter(1);
return;
}
_K_V = getprop("/sim/model/pushback/driver/K_V");
_F_V = getprop("/sim/model/pushback/driver/F_V");
_D_min = getprop("/sim/model/pushback/driver/D_min-m");
_K_psi = getprop("/sim/model/pushback/driver/K_psi");
_debug = getprop("/sim/model/pushback/debug") or 0;
var (psi_park, D_park) = courseAndDistance(_route[0], _route[1]);
var (psi_twy, D_twy) = courseAndDistance(_route[size(_route) - 2], _route[size(_route) - 1]);
_psi_park = psi_park;
_push = (abs(geo.normdeg180(getprop("/orientation/heading-deg") - psi_park)) > 90.0);
_sign = 1.0 - 2.0 * _push;
_to_wp = 0;
_timer.start();
if (_sign < 0.0) {
screen.log.write("(pushback): Push back facing " ~ int(geo.normdeg(psi_twy + 180.0 - magvar())) ~ ".");
} else {
screen.log.write("(pushback): Tow facing " ~ int(geo.normdeg(psi_twy - magvar())) ~ ".");
}
}
var stop = func() {
_timer.stop();
setprop("/sim/model/pushback/target-speed-km_h", 0.0);
autopush_route.clear();
}

224
Nasal/autopush_route.nas Normal file
View file

@ -0,0 +1,224 @@
# AUTOPUSH
# Visual entry of pushback route.
#
# Copyright (c) 2018 Autopush authors:
# Michael Danilov <mike.d.ft402 -eh- gmail.com>
# Joshua Davidson http://github.com/it0uchpods
# Merspieler http://github.com/merspieler
# Distribute under the terms of GPLv2.
var _listener = nil;
var _view_listener = nil;
var _user_points = dynarr.dynarr.new(4);
var _route = [];
var _view_index = nil;
var _user_point_models = [];
var _waypoint_models = [];
var _N = 0;
var _show = 0;
var _view_changed_or_external = 0;
var _start_immediately = nil;
var _D_min = nil;
# TODO find a proper value or add a calculated value so we can get ridge
setprop("/demo/prec/", 10);
var _add = func(pos) {
if (_N) {
var (A, S) = courseAndDistance(_user_points.arr[_N - 1], pos);
if (S * NM2M < 3 * _D_min) {
gui.popupTip("Too close to the previous point,\ntry again");
return;
}
}
_user_points.add(geo.Coord.new(pos));
setsize(_user_point_models, _N + 1);
_user_point_models[_N] = geo.put_model("Models/Autopush/cursor.xml", pos, 0.0);
_N += 1;
if (_N == 1) {
gui.popupTip("Click waypoints, press \"Done\" to finish");
} else {
_calculate_bezier();
_place_waypoint_models();
}
}
var _stop = func(fail = 0) {
if (_listener != nil) {
removelistener(_listener);
_listener = nil;
if (!fail) {
settimer(func() {
_reset_view();
if (_start_immediately) {
autopush_driver.start();
} else {
gui.popupTip("Done");
}
}, 1.0);
} else {
_reset_view();
}
}
}
var _place_user_point_models = func() {
_clear_user_point_models();
setsize(_user_point_models, _N);
var user_points = _user_points.get_sliced();
for (var ii = 1; ii < _N; ii += 1) {
_user_point_models[ii] = geo.put_model("Models/Autopush/cursor.xml", user_points[ii], 0.0);
}
}
var _clear_user_point_models = func() {
for (var ii = 0; ii < size(_user_point_models); ii += 1) {
if (_user_point_models[ii] != nil) {
_user_point_models[ii].remove();
_user_point_models[ii] = nil;
}
}
setsize(_user_point_models, 0);
}
var _place_waypoint_models = func() {
_clear_waypoint_models();
setsize(_waypoint_models, size(_route));
for (var ii = 0; ii < size(_route); ii += 1) {
_waypoint_models[ii] = geo.put_model("Models/Autopush/waypoint.xml", _route[ii], 0.0);
}
}
var _clear_waypoint_models = func() {
for (var ii = 0; ii < size(_waypoint_models); ii += 1) {
if (_waypoint_models[ii] != nil) {
_waypoint_models[ii].remove();
_waypoint_models[ii] = nil;
}
}
setsize(_waypoint_models, 0);
}
var _set_view = func() {
if(!getprop("/sim/current-view/internal")){
_view_changed_or_external = 1;
return;
}
_view_index = getprop("/sim/current-view/view-number");
setprop("/sim/current-view/view-number", view.indexof("Model View"));
_view_changed_or_external = 0;
_view_listener = setlistener("/sim/current-view/name", func {
_view_changed_or_external = 1;
});
}
var _reset_view = func() {
if (!_view_changed_or_external) {
setprop("/sim/current-view/view-number", _view_index);
}
if (_view_listener != nil) {
removelistener(_view_listener);
_view_listener = nil;
}
if (!_show) {
_clear_user_point_models();
_clear_waypoint_models();
}
}
var _calculate_bezier = func() {
# add the first point cause it will be fix at this pos
_route = [];
user_points = _user_points.get_sliced();
var route = dynarr.dynarr.new();
route.add(geo.Coord.new(user_points[0]));
PNumber = size(user_points);
if (PNumber > 2) {
var pointList = [];
setsize(pointList, PNumber);
for (var i = 0; i < PNumber; i += 1) {
pointList[i] = [];
setsize(pointList[i], PNumber);
}
pointList[0] = user_points;
prec = getprop("/demo/prec");
step = prec / 100;
for (var i = step; i < 1; i+= step) {
# start iterating from 1 cause we don't need to iterate over Pn
for (var j = 1; j < PNumber; j += 1) {
for (var k = 0; k < PNumber - j; k += 1) {
pointList[j][k] = geo.Coord.new(pointList[j - 1][k]);
var dist = pointList[j - 1][k].distance_to(pointList[j - 1][k + 1]);
var course = pointList[j - 1][k].course_to(pointList[j - 1][k + 1]);
pointList[j][k].apply_course_distance(course, dist * i);
}
}
route.add(geo.Coord.new(pointList[PNumber - 1][0]));
}
}
if (PNumber > 1) {
# append last user point to route
route.add(geo.Coord.new(user_points[-1]));
}
_route = route.get_sliced();
}
setlistener("/sim/model/pushback/route/show", func(p) {
var show = p.getValue();
if (_listener == nil) {
if (show > _show) {
_place_user_point_models();
_place_waypoint_models();
} else if (show < _show) {
_clear_user_point_models();
_clear_waypoint_models();
}
}
_show = show;
});
var enter = func(start_immediately = 0) {
clear();
_set_view();
_D_min = getprop("/sim/model/pushback/driver/D_min-m");
var wp = geo.aircraft_position();
var H = geo.elevation(wp.lat(), wp.lon());
if (H != nil) {
wp.set_alt(H);
}
_add(wp);
_listener = setlistener("/sim/signals/click", func {
_add(geo.click_position());
});
_start_immediately = start_immediately;
}
var done = func() {
_stop(0);
}
var clear = func() {
_stop(1);
_clear_user_point_models();
_clear_waypoint_models();
_N = 0;
_user_points = dynarr.dynarr.new(4);
}
var route = func() {
if (_N < 2) {
return nil;
}
_calculate_bezier();
return _route;
}

55
Nasal/dynarr.nas Normal file
View file

@ -0,0 +1,55 @@
# Class for dynamic arrays
#
# Copyright (c) 2018 dynamic arrays authors:
# Michael Danilov <mike.d.ft402 -eh- gmail.com>
# Merspieler http://gitlab.com/merspieler
# Distribute under the terms of GPLv2.
## ERRATA
# delitation of objects
## Useage
# to create a new object: var <name> = dynarr.new();
# to add elements: <name>.add(<element>);
# you can access the full stored array as: <name>.arr
# to get only the used area of the array: var <spliced_array> = <name>.get_spliced()
var dynarr =
{
new: func(size = 8)
{
var this = {parents:[dynarr]};
this.maxsize = size;
this.size = 0;
this.arr = setsize([], size);
return this;
},
# add a new element to the array
add: func(obj)
{
# case there's no space left
if (me.size + 1 >= me.maxsize)
{
# double array size
me.maxsize *= 2;
me.arr = setsize(me.arr, me.maxsize);
}
# add object and increase used counter
me.arr[me.size] = obj;
me.size += 1;
},
# returns only the filled part of the array or nil if array is empty
get_sliced: func()
{
if (me.size == 0)
{
return nil;
}
return me.arr[0:me.size - 1];
}
};

View file

@ -8,7 +8,7 @@
-->
<external_reactions>
<force name="pushback" frame="BODY">
<force name="tractor" frame="BODY">
<location unit="M">
<x> 7.52385 </x>
<y> 0 </y>