Initial Commit
Signed-off-by: fly <merspieler@airmail.cc>
This commit is contained in:
commit
23b8abf455
20 changed files with 3314 additions and 0 deletions
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
|
@ -0,0 +1,3 @@
|
|||
# vim swap files
|
||||
*.swp
|
||||
*.swo
|
52
CHANGELOG.md
Normal file
52
CHANGELOG.md
Normal file
|
@ -0,0 +1,52 @@
|
|||
# Change Log
|
||||
|
||||
All notable changes to this project will be documented in this file.
|
||||
This project adheres to [Semantic Versioning](http://semver.org/). Release
|
||||
canidates are not covered by this file.
|
||||
|
||||
<!--
|
||||
tags:
|
||||
`Added` for new features.
|
||||
`Changed` for changes in existing functionality.
|
||||
`Major Changes` for changes in existing functionality which break backward compatibility.
|
||||
`Deprecated` for once-stable features removed in upcoming releases.
|
||||
`Removed` for deprecated features removed in this release.
|
||||
`Fixed` for any bug fixes.
|
||||
`Security` to invite users to upgrade in case of vulnerabilities.
|
||||
-->
|
||||
|
||||
## v2.0.2
|
||||
### Changed
|
||||
* File structure: Nasal files now under "Nasal/Autopush" directory.
|
||||
|
||||
## v2.0.1
|
||||
### Changed
|
||||
* Satellite view: accessible from dialog; always switch to when entering route
|
||||
* Settings of the view used for satellite view are now restored after use
|
||||
### Fixed
|
||||
* Satelite view due to upcoming removal of `Model View`
|
||||
|
||||
## v2.0
|
||||
### Major Changes
|
||||
* Moved the autopush property sub tree from `/sim/model/pushback/` to `/sim/model/autopush`. See issue #19
|
||||
Make sure you update all references to the properties.
|
||||
* Moved the configuration out of the -set.xml. See issue #18
|
||||
### Added
|
||||
* Top down view for entering the route
|
||||
* Option to display wing tip path.
|
||||
* Check for too tight turns
|
||||
* Auto push resuming
|
||||
* Pitch offset to properly calculate the force for aircraft with high parking pitch
|
||||
* Added documentation on how to implement steering, chocks control and availability. See the last step of installation instruction.
|
||||
* Push and Pull support
|
||||
### Changed
|
||||
* Coefficients adjusted for smoother performance
|
||||
* Dialog sliders improved for better control
|
||||
### Fixed
|
||||
* Missed points make the driver turn around and try to catch it again.
|
||||
* The integration was taking input change instead of the input, which resulted in strange behaviour.
|
||||
* Fixed derivative part of PID not working
|
||||
* Stopping too early at last point
|
||||
|
||||
## v1.0
|
||||
Initial release.
|
45
CONTRIBUTING.md
Normal file
45
CONTRIBUTING.md
Normal file
|
@ -0,0 +1,45 @@
|
|||
# CONTRIBUTING
|
||||
Contribution rules for the autopush project.
|
||||
## General
|
||||
By contributing you agree that your work will be published under the GPL2.
|
||||
|
||||
Where possible, text width should not exceed 70 characters.
|
||||
|
||||
## Code style
|
||||
### XML
|
||||
For `.xml` files the following rules apply.
|
||||
* While there is no preference for indent style or code formatting, it must be consistent within each file.
|
||||
* No whitespace-only lines and trailing whitespace allowed.
|
||||
* Whitespace between tags and their data is forbidden, for example ``<tag> 10.0 </tag>`` is not acceptable.
|
||||
* If a tag has children, it has to be on it's own line.
|
||||
|
||||
Example:
|
||||
```xml
|
||||
<parent>
|
||||
<child n="1">3</child>
|
||||
<child n="2">100</child>
|
||||
<othertag/>
|
||||
</parent>
|
||||
```
|
||||
|
||||
### Nasal
|
||||
For `.nas` files the following rules apply.
|
||||
* While there is no preference for indent style or code formatting, it must be consistent within each file.
|
||||
* No whitespace-only lines and trailing whitespace allowed.
|
||||
* For names use camelCase or snake_case.
|
||||
* Prefix "private" vars and functions with a `_`.
|
||||
* Use coments for blocks of codes and only when something is not clear (eg. starting iterating from 3).
|
||||
|
||||
Example:
|
||||
```js
|
||||
# This function does something non obvious.
|
||||
var function = func() {
|
||||
if (a == b) {
|
||||
var a = geo.Coord.new();
|
||||
} else {
|
||||
var b = 0;
|
||||
}
|
||||
}
|
||||
```
|
||||
## Git
|
||||
Please add a descriptive commit message to **every** commit.
|
339
LICENSE.TXT
Normal file
339
LICENSE.TXT
Normal file
|
@ -0,0 +1,339 @@
|
|||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
License is intended to guarantee your freedom to share and change free
|
||||
software--to make sure the software is free for all its users. This
|
||||
General Public License applies to most of the Free Software
|
||||
Foundation's software and to any other program whose authors commit to
|
||||
using it. (Some other Free Software Foundation software is covered by
|
||||
the GNU Lesser General Public License instead.) You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
this service if you wish), that you receive source code or can get it
|
||||
if you want it, that you can change the software or use pieces of it
|
||||
in new free programs; and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
anyone to deny you these rights or to ask you to surrender the rights.
|
||||
These restrictions translate to certain responsibilities for you if you
|
||||
distribute copies of the software, or if you modify it.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must give the recipients all the rights that
|
||||
you have. You must make sure that they, too, receive or can get the
|
||||
source code. And you must show them these terms so they know their
|
||||
rights.
|
||||
|
||||
We protect your rights with two steps: (1) copyright the software, and
|
||||
(2) offer you this license which gives you legal permission to copy,
|
||||
distribute and/or modify the software.
|
||||
|
||||
Also, for each author's protection and ours, we want to make certain
|
||||
that everyone understands that there is no warranty for this free
|
||||
software. If the software is modified by someone else and passed on, we
|
||||
want its recipients to know that what they have is not the original, so
|
||||
that any problems introduced by others will not reflect on the original
|
||||
authors' reputations.
|
||||
|
||||
Finally, any free program is threatened constantly by software
|
||||
patents. We wish to avoid the danger that redistributors of a free
|
||||
program will individually obtain patent licenses, in effect making the
|
||||
program proprietary. To prevent this, we have made it clear that any
|
||||
patent must be licensed for everyone's free use or not licensed at all.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License applies to any program or other work which contains
|
||||
a notice placed by the copyright holder saying it may be distributed
|
||||
under the terms of this General Public License. The "Program", below,
|
||||
refers to any such program or work, and a "work based on the Program"
|
||||
means either the Program or any derivative work under copyright law:
|
||||
that is to say, a work containing the Program or a portion of it,
|
||||
either verbatim or with modifications and/or translated into another
|
||||
language. (Hereinafter, translation is included without limitation in
|
||||
the term "modification".) Each licensee is addressed as "you".
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running the Program is not restricted, and the output from the Program
|
||||
is covered only if its contents constitute a work based on the
|
||||
Program (independent of having been made by running the Program).
|
||||
Whether that is true depends on what the Program does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Program's
|
||||
source code as you receive it, in any medium, provided that you
|
||||
conspicuously and appropriately publish on each copy an appropriate
|
||||
copyright notice and disclaimer of warranty; keep intact all the
|
||||
notices that refer to this License and to the absence of any warranty;
|
||||
and give any other recipients of the Program a copy of this License
|
||||
along with the Program.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy, and
|
||||
you may at your option offer warranty protection in exchange for a fee.
|
||||
|
||||
2. You may modify your copy or copies of the Program or any portion
|
||||
of it, thus forming a work based on the Program, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) You must cause the modified files to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
b) You must cause any work that you distribute or publish, that in
|
||||
whole or in part contains or is derived from the Program or any
|
||||
part thereof, to be licensed as a whole at no charge to all third
|
||||
parties under the terms of this License.
|
||||
|
||||
c) If the modified program normally reads commands interactively
|
||||
when run, you must cause it, when started running for such
|
||||
interactive use in the most ordinary way, to print or display an
|
||||
announcement including an appropriate copyright notice and a
|
||||
notice that there is no warranty (or else, saying that you provide
|
||||
a warranty) and that users may redistribute the program under
|
||||
these conditions, and telling the user how to view a copy of this
|
||||
License. (Exception: if the Program itself is interactive but
|
||||
does not normally print such an announcement, your work based on
|
||||
the Program is not required to print an announcement.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Program,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Program, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Program.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Program
|
||||
with the Program (or with a work based on the Program) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may copy and distribute the Program (or a work based on it,
|
||||
under Section 2) in object code or executable form under the terms of
|
||||
Sections 1 and 2 above provided that you also do one of the following:
|
||||
|
||||
a) Accompany it with the complete corresponding machine-readable
|
||||
source code, which must be distributed under the terms of Sections
|
||||
1 and 2 above on a medium customarily used for software interchange; or,
|
||||
|
||||
b) Accompany it with a written offer, valid for at least three
|
||||
years, to give any third party, for a charge no more than your
|
||||
cost of physically performing source distribution, a complete
|
||||
machine-readable copy of the corresponding source code, to be
|
||||
distributed under the terms of Sections 1 and 2 above on a medium
|
||||
customarily used for software interchange; or,
|
||||
|
||||
c) Accompany it with the information you received as to the offer
|
||||
to distribute corresponding source code. (This alternative is
|
||||
allowed only for noncommercial distribution and only if you
|
||||
received the program in object code or executable form with such
|
||||
an offer, in accord with Subsection b above.)
|
||||
|
||||
The source code for a work means the preferred form of the work for
|
||||
making modifications to it. For an executable work, complete source
|
||||
code means all the source code for all modules it contains, plus any
|
||||
associated interface definition files, plus the scripts used to
|
||||
control compilation and installation of the executable. However, as a
|
||||
special exception, the source code distributed need not include
|
||||
anything that is normally distributed (in either source or binary
|
||||
form) with the major components (compiler, kernel, and so on) of the
|
||||
operating system on which the executable runs, unless that component
|
||||
itself accompanies the executable.
|
||||
|
||||
If distribution of executable or object code is made by offering
|
||||
access to copy from a designated place, then offering equivalent
|
||||
access to copy the source code from the same place counts as
|
||||
distribution of the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
4. You may not copy, modify, sublicense, or distribute the Program
|
||||
except as expressly provided under this License. Any attempt
|
||||
otherwise to copy, modify, sublicense or distribute the Program is
|
||||
void, and will automatically terminate your rights under this License.
|
||||
However, parties who have received copies, or rights, from you under
|
||||
this License will not have their licenses terminated so long as such
|
||||
parties remain in full compliance.
|
||||
|
||||
5. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Program or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Program (or any work based on the
|
||||
Program), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Program or works based on it.
|
||||
|
||||
6. Each time you redistribute the Program (or any work based on the
|
||||
Program), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute or modify the Program subject to
|
||||
these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties to
|
||||
this License.
|
||||
|
||||
7. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Program at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Program by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Program.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under
|
||||
any particular circumstance, the balance of the section is intended to
|
||||
apply and the section as a whole is intended to apply in other
|
||||
circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system, which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
8. If the distribution and/or use of the Program is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Program under this License
|
||||
may add an explicit geographical distribution limitation excluding
|
||||
those countries, so that distribution is permitted only in or among
|
||||
countries not thus excluded. In such case, this License incorporates
|
||||
the limitation as if written in the body of this License.
|
||||
|
||||
9. The Free Software Foundation may publish revised and/or new versions
|
||||
of the General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Program
|
||||
specifies a version number of this License which applies to it and "any
|
||||
later version", you have the option of following the terms and conditions
|
||||
either of that version or of any later version published by the Free
|
||||
Software Foundation. If the Program does not specify a version number of
|
||||
this License, you may choose any version ever published by the Free Software
|
||||
Foundation.
|
||||
|
||||
10. If you wish to incorporate parts of the Program into other free
|
||||
programs whose distribution conditions are different, write to the author
|
||||
to ask for permission. For software which is copyrighted by the Free
|
||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||
make exceptions for this. Our decision will be guided by the two goals
|
||||
of preserving the free status of all derivatives of our free software and
|
||||
of promoting the sharing and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||
REPAIR OR CORRECTION.
|
||||
|
||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
convey the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License along
|
||||
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program is interactive, make it output a short notice like this
|
||||
when it starts in an interactive mode:
|
||||
|
||||
Gnomovision version 69, Copyright (C) year name of author
|
||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, the commands you use may
|
||||
be called something other than `show w' and `show c'; they could even be
|
||||
mouse-clicks or menu items--whatever suits your program.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your
|
||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||
necessary. Here is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||
|
||||
<signature of Ty Coon>, 1 April 1989
|
||||
Ty Coon, President of Vice
|
||||
|
||||
This General Public License does not permit incorporating your program into
|
||||
proprietary programs. If your program is a subroutine library, you may
|
||||
consider it more useful to permit linking proprietary applications with the
|
||||
library. If this is what you want to do, use the GNU Lesser General
|
||||
Public License instead of this License.
|
260
README.TXT
Normal file
260
README.TXT
Normal file
|
@ -0,0 +1,260 @@
|
|||
AUTOMATIC PUSHBACK FOR FLIGHTGEAR
|
||||
https://gitea.merspieler.tk/fly/autopush
|
||||
|
||||
Version 2.0.1
|
||||
|
||||
Copyright (c) 2018 Autopush authors:
|
||||
Joshua Davidson http://github.com/Octal450
|
||||
Merspieler http://gitlab.com/merspieler
|
||||
Some of the code (c) FlightGear
|
||||
Distribute under the terms of GPLv2.
|
||||
|
||||
|
||||
This project aims to develop a generic pushback for JSBSim and YASim
|
||||
aircraft, with the following characteristics.
|
||||
|
||||
1. Do the pushback procedure automatically.
|
||||
2. Scale to different aircraft with minimum changes to their logic.
|
||||
3. Use no computer resources in flight.
|
||||
|
||||
|
||||
INSTALLATION
|
||||
|
||||
Minimum FlightGear version: 2018.0
|
||||
|
||||
NOTE: these steps cover the minimal testing setup. To get the most
|
||||
realism out of Autopush, you will have to add logic aircraft-side as
|
||||
described in the last step.
|
||||
|
||||
1. Copy everything from from "YourAircraftDir" into your aircraft,
|
||||
while keeping the directory structure:
|
||||
|
||||
Models/Autopush cursor models and the animation for
|
||||
FGDATA pushbacks.
|
||||
Nasal/Autopush Autopush logic
|
||||
gui/dialogs/autopush.xml GUI dialog
|
||||
autopush-config.xml.template Configuration of autopush
|
||||
|
||||
2. Set up the pushback logic.
|
||||
|
||||
Add the following line under <sim><model> of your set.xml
|
||||
|
||||
<autopush include="autopush-config.xml"/>
|
||||
|
||||
Rename autopush-config.xml.template to autopush-config.xml and edit
|
||||
the file as described below.
|
||||
|
||||
Alternatively, you can copy the contents of
|
||||
autopush-config.xml.template to under <sim><model><autopush> of your
|
||||
set.xml and make these modifications there.
|
||||
|
||||
Change the aliases to point to the following data:
|
||||
|
||||
steer-cmd-norm nose wheel steering command norm
|
||||
yaw nose wheel steering output norm or angle (see below)
|
||||
chocks chocks command bool (or leave it until step 7)
|
||||
available pushback availability bool (or leave it until step 7)
|
||||
|
||||
Replace the MULTIPLIER in yaw-mult with:
|
||||
|
||||
max steering angle if yaw is norm
|
||||
1.0 if yaw is degrees
|
||||
57.3 if yaw is radians
|
||||
|
||||
Replace PITCH with the pushback's pitch relative to aircraft. If your
|
||||
aircraft's ground pitch varies greatly, you can make an alias to
|
||||
property with calculated relative pitch.
|
||||
|
||||
Replace MIN_RADIUS with the minimum allowed turning radius in m of the
|
||||
center of the aircraft during pushback procedure.
|
||||
|
||||
NOTE: on some aircraft the turning radius is different for taxi and
|
||||
pushback. Please check the aircraft's literature.
|
||||
|
||||
Replace STOP_DIST with the stopping distance in m from pushback speed.
|
||||
|
||||
Add under <nasal> of your set.xml:
|
||||
|
||||
<autopush>
|
||||
<file>Nasal/Autopush/autopush.nas</file>
|
||||
</autopush>
|
||||
<autopush_driver>
|
||||
<file>Nasal/Autopush/driver.nas</file>
|
||||
</autopush_driver>
|
||||
<dynarr>
|
||||
<file>Nasal/Autopush/dynarr.nas</file>
|
||||
</dynarr>
|
||||
<autopush_route>
|
||||
<file>Nasal/Autopush/route.nas</file>
|
||||
</autopush_route>
|
||||
|
||||
Add under <sim><aircraft-data> of your set.xml:
|
||||
|
||||
<path>/sim/model/autopush/route/show</path>
|
||||
<path>/sim/model/autopush/route/show-wingtip</path>
|
||||
|
||||
3. Connect the force to FDM.
|
||||
|
||||
3.a. JSBSim:
|
||||
|
||||
3.a.1. Add the following under <external_reactions> of your JSBSim
|
||||
XML.
|
||||
|
||||
<force name="tractor" frame="BODY">
|
||||
<location unit="M">
|
||||
<x>FRONT-X</x>
|
||||
<y>FRONT-Y</y>
|
||||
<z>FRONT-Z</z>
|
||||
</location>
|
||||
<direction>
|
||||
<x>1.0</x>
|
||||
<y>0.0</y>
|
||||
<z>0.0</z>
|
||||
</direction>
|
||||
</force>
|
||||
|
||||
Replace FRONT-X, FRONT-Y, FRONT-Z with coordinates of your front
|
||||
bogey.
|
||||
|
||||
3.a.2. Add the following under <fdm><jsbsim><external_reactions> of
|
||||
your set.xml.
|
||||
|
||||
<tractor>
|
||||
<magnitude alias="/sim/model/autopush/force-lbf"/>
|
||||
<x alias="/sim/model/autopush/force-x"/>
|
||||
<y alias="/sim/model/autopush/force-y"/>
|
||||
<z alias="/sim/model/autopush/force-z"/>
|
||||
</tractor>
|
||||
|
||||
3.b. YASim. Add the following under <airplane> of your YASim xml.
|
||||
|
||||
<thruster x="FRONT-X" y="FRONT-Y" z="FRONT-Z" vx="1" vy="0" vz="0" thrust="100000.0">
|
||||
<control-input axis="/sim/model/autopush/force-x-yasim" control="THROTTLE" src0="-1" src1="1" dst0="-1" dst1="1"/>
|
||||
</thruster>
|
||||
<thruster x="FRONT-X" y="FRONT-Y" z="FRONT-Z" vx="0" vy="1" vz="0" thrust="100000.0">
|
||||
<control-input axis="/sim/model/autopush/force-y-yasim" control="THROTTLE" src0="-1" src1="1" dst0="-1" dst1="1"/>
|
||||
</thruster>
|
||||
<thruster x="FRONT-X" y="FRONT-Y" z="FRONT-Z" vx="0" vy="0" vz="1" thrust="100000.0">
|
||||
<control-input axis="/sim/model/autopush/force-z-yasim" control="THROTTLE" src0="-1" src1="1" dst0="-1" dst1="1"/>
|
||||
</thruster>
|
||||
|
||||
Replace FRONT-X, FRONT-Y, FRONT-Z with coordinates of your front
|
||||
bogey.
|
||||
|
||||
4. Add the pushback model to your Model XML:
|
||||
|
||||
<model>
|
||||
<name>Pushback</name>
|
||||
<path>MODEL</path>
|
||||
<offsets>
|
||||
<x-m>FRONT-X</x-m>
|
||||
<y-m>FRONT-Y</y-m>
|
||||
<z-m>FRONT-Z</z-m>
|
||||
</offsets>
|
||||
</model>
|
||||
|
||||
Replace FRONT-X, FRONT-Y, FRONT-Z with coordinates of your front
|
||||
bogey. Replace MODEL with one of the following file names:
|
||||
|
||||
Autopush/Goldhofert.xml for Goldhofer towbarless pushback
|
||||
|
||||
Edit the "SETTINGS" part in the beginning of respective file to match
|
||||
your setup.
|
||||
|
||||
5. Add gui/dialogs/autopush.xml to your aircraft's menu (see
|
||||
FlightGear documentation for editing the menu).
|
||||
|
||||
6. If you have a bug tracker, please add a note, that autopush related
|
||||
bugs should be reported here:
|
||||
|
||||
To merspieler on the forum
|
||||
|
||||
7. Launch the simulator and try Autopush. After making sure it works,
|
||||
complete the support by implementing some logic in your aircraft
|
||||
and connecting the rest of the interface.
|
||||
|
||||
CAUTION.
|
||||
1. Make sure to HAVE A BACK-UP COPY of your work.
|
||||
2. If anything is not clear in the instruction below, do not guess --
|
||||
contact the authors.
|
||||
|
||||
7.1. When pushback is connected ("/sim/model/autopush/connected"),
|
||||
nose wheel steering must actuate at different speed, depending
|
||||
on its rollspeed. The exact dependency is different per aircraft
|
||||
and used pushback visual, and for most aircraft the only way to
|
||||
find it is trial and error until it "looks right":
|
||||
- the input must be taken from pushback steering command norm
|
||||
(set by autopush-config.xml, default:
|
||||
"/controls/flight/rudder");
|
||||
- the output must be written to pushback orientation in degrees,
|
||||
radians or norm (set by autopush-config.xml, default:
|
||||
"/gear/gear[0]/steering-norm").
|
||||
|
||||
7.2. Set or alias (in autopush-config.xml) the availability property
|
||||
"/sim/model/autopush/available". It must be false if e.g. the
|
||||
aircraft is moving too fast, the front wheel is not touching
|
||||
the ground, the aircraft is damaged or is outside of an airport
|
||||
etc.
|
||||
|
||||
7.3. Make Autopush remove wheel chocks by setting the alias in
|
||||
autopush-config.xml to the chocks property. (default:
|
||||
"/controls/gear/wheel-chocks").
|
||||
|
||||
7.4. Optionally, Autopush may be made visible in multiplayer by
|
||||
duplicating the properties used in its model.xml into some
|
||||
unused MP properties. See the list in
|
||||
|
||||
https://sourceforge.net/p/flightgear/flightgear/ci/next/tree/src/MultiPlayer/multiplaymgr.cxx
|
||||
|
||||
around line 215, and then using those properties in the
|
||||
"SETTINGS" part of Autopush model.xml.
|
||||
|
||||
After making these changes check the Autopush model.xml's settings
|
||||
and make sure they match the setup. Launch the simulator and try
|
||||
Autopush.
|
||||
|
||||
|
||||
TUNING
|
||||
|
||||
There should normally be no need to change the coefficients, because
|
||||
the inertia of different aircraft is already taken into account. But
|
||||
the gear setup may differ enough to require some tuning.
|
||||
|
||||
If these settings are changed during simulation, they take effect
|
||||
after disconnecting and reconnecting the pushback.
|
||||
|
||||
Pushback (/sim/model/autopush):
|
||||
|
||||
Coefficient Unit Description
|
||||
|
||||
K_p ((km/h)/s)/(km/h) Proportional coefficient of PID.
|
||||
Defines the start/stop throttle
|
||||
and immediate response to speed
|
||||
difference deltaV = V_set - V.
|
||||
|
||||
F_p (km/h)/s Proportional clipping.
|
||||
|
||||
K_i ((km/h)/s)/((km/h)*s) Integral coefficient of PID.
|
||||
Defines how fast the steady
|
||||
throttle is ramped during the
|
||||
push.
|
||||
|
||||
F_i (km/h)/s Integral clipping.
|
||||
|
||||
K_d -((km/h)/s)/((km/h)/s) Differential coefficient of PID.
|
||||
Stabilizes the approaching of
|
||||
steady throttle.
|
||||
|
||||
F_d (km/h)/s Differential clipping.
|
||||
|
||||
Pushback driver (/sim/model/autopush/driver):
|
||||
|
||||
Coefficient Unit Description
|
||||
|
||||
F_V km/h Max towing speed in auto mode.
|
||||
K_psi 1/deg Amount of steering per heading correction.
|
||||
F_psi 1/deg Max steering per heading correction.
|
||||
K_deltapsi -1/(deg/s) Amount of steering compensation per heading
|
||||
derivative.
|
||||
F_psi 1/(deg/s) Max amount of steering compensation per
|
||||
heading derivative.
|
151
YourAircraftDir/Models/Autopush/Goldhofert.xml
Normal file
151
YourAircraftDir/Models/Autopush/Goldhofert.xml
Normal file
|
@ -0,0 +1,151 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
|
||||
<!-- SETTINGS -->
|
||||
|
||||
<!DOCTYPE PropertyList [
|
||||
<!-- Property defining whether the pushback is connected. -->
|
||||
<!ENTITY CONNECTED-PROP "sim/model/autopush/connected">
|
||||
<!-- Property for aircraft's front wheel rollspeed in m/s. -->
|
||||
<!ENTITY ROLLSPEED-PROP "gear/gear[0]/rollspeed-ms">
|
||||
<!-- Property for front wheel steering. -->
|
||||
<!ENTITY YAW-PROP "sim/model/autopush/yaw">
|
||||
<!-- Scaling factor for the steering property, must be equal to /sim/model/autopush/yaw-mult. -->
|
||||
<!ENTITY YAW-MULT "60.0">
|
||||
<!-- Property for gear compression in ft. -->
|
||||
<!ENTITY COMPRESSION-PROP "gear/gear[0]/compression-ft">
|
||||
<!-- Property for aircraft pitch in degrees, or pushback's pitch if it is variable. -->
|
||||
<!ENTITY PITCH-PROP "orientation/pitch-deg">
|
||||
<!-- Scaling factor for the pitch property. -->
|
||||
<!ENTITY PITCH-FACTOR "0.0">
|
||||
<!-- Pitch offset, must be equal to /sim/model/autopush/pitch-deg. If pitch is variable, must be "0.0". -->
|
||||
<!ENTITY PITCH-OFFSET "-7.0">
|
||||
]>
|
||||
|
||||
|
||||
<!--
|
||||
|
||||
AUTOPUSH
|
||||
|
||||
Copyright (c) 2018 Autopush authors:
|
||||
Joshua Davidson http://github.com/Octal450
|
||||
Merspieler http://github.com/merspieler
|
||||
Original code (c) FlightGear
|
||||
Distribute under the terms of GPLv2.
|
||||
|
||||
-->
|
||||
|
||||
|
||||
<PropertyList>
|
||||
<path>Models/Airport/Pushback/Goldhofert.ac</path>
|
||||
|
||||
<!-- Trucks models and artworks courtesy of XPGoodWay Team
|
||||
(http://www.xpgoodwayteam.org/site_xpushback/) -->
|
||||
|
||||
<model>
|
||||
<path>Models/Airport/Pushback/Goldhofert-warning-light.xml</path>
|
||||
<offsets>
|
||||
<x-m>-2.908</x-m>
|
||||
<y-m>0.260</y-m>
|
||||
<z-m>1.326</z-m>
|
||||
<heading-deg>0</heading-deg>
|
||||
</offsets>
|
||||
</model>
|
||||
|
||||
<model>
|
||||
<path>Models/Airport/Pushback/Goldhofert-warning-light.xml</path>
|
||||
<offsets>
|
||||
<x-m>-1.781</x-m>
|
||||
<y-m>0.260</y-m>
|
||||
<z-m>1.326</z-m>
|
||||
<heading-deg>90</heading-deg>
|
||||
</offsets>
|
||||
</model>
|
||||
|
||||
<animation>
|
||||
<type>spin</type>
|
||||
<object-name>wheelfl</object-name>
|
||||
<object-name>wheelfr</object-name>
|
||||
<property>&ROLLSPEED-PROP;</property>
|
||||
<factor>-16.3</factor>
|
||||
<center>
|
||||
<x-m>-2.8976</x-m>
|
||||
<y-m>0</y-m>
|
||||
<z-m>0.5809</z-m>
|
||||
</center>
|
||||
<axis>
|
||||
<x>0</x>
|
||||
<y>1</y>
|
||||
<z>0</z>
|
||||
</axis>
|
||||
</animation>
|
||||
|
||||
<animation>
|
||||
<type>spin</type>
|
||||
<object-name>wheelrl</object-name>
|
||||
<object-name>wheelrr</object-name>
|
||||
<property>&ROLLSPEED-PROP;</property>
|
||||
<factor>-16.3</factor>
|
||||
<center>
|
||||
<x-m>2.0501</x-m>
|
||||
<y-m>0</y-m>
|
||||
<z-m>0.5735</z-m>
|
||||
</center>
|
||||
<axis>
|
||||
<x>0</x>
|
||||
<y>1</y>
|
||||
<z>0</z>
|
||||
</axis>
|
||||
</animation>
|
||||
|
||||
<animation>
|
||||
<type>select</type>
|
||||
<condition>
|
||||
<property>&CONNECTED-PROP;</property>
|
||||
</condition>
|
||||
</animation>
|
||||
|
||||
<animation>
|
||||
<type>rotate</type>
|
||||
<property>&YAW-PROP;</property>
|
||||
<factor>&YAW-MULT;</factor>
|
||||
<center>
|
||||
<x-m>0</x-m>
|
||||
<y-m>0</y-m>
|
||||
<z-m>0</z-m>
|
||||
</center>
|
||||
<axis>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<z>-1</z>
|
||||
</axis>
|
||||
</animation>
|
||||
|
||||
<animation>
|
||||
<type>translate</type>
|
||||
<property>&COMPRESSION-PROP;</property>
|
||||
<factor>0.3048</factor>
|
||||
<axis>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<z>1</z>
|
||||
</axis>
|
||||
</animation>
|
||||
|
||||
<animation>
|
||||
<type>rotate</type>
|
||||
<property>&PITCH-PROP;</property>
|
||||
<factor>&PITCH-FACTOR;</factor>
|
||||
<offset-deg>&PITCH-OFFSET;</offset-deg>
|
||||
<center>
|
||||
<x-m>0</x-m>
|
||||
<y-m>0</y-m>
|
||||
<z-m>0</z-m>
|
||||
</center>
|
||||
<axis>
|
||||
<x>0</x>
|
||||
<y>1</y>
|
||||
<z>0</z>
|
||||
</axis>
|
||||
</animation>
|
||||
</PropertyList>
|
589
YourAircraftDir/Models/Autopush/cursor.ac
Normal file
589
YourAircraftDir/Models/Autopush/cursor.ac
Normal file
|
@ -0,0 +1,589 @@
|
|||
AC3Db
|
||||
MATERIAL "autopush cursor" rgb 0.0000 0.0000 0.0000 amb 0.0000 0.0000 0.0000 emis 1.000 0.173 0.545 spec 0.0000 0.0000 0.0000 shi 50 trans 0.0000
|
||||
OBJECT world
|
||||
name "Blender_exporter_v2.26__cursor.ac"
|
||||
kids 1
|
||||
OBJECT poly
|
||||
name "Circle"
|
||||
data 11
|
||||
Circle.mesh
|
||||
crease 40.0
|
||||
numvert 128
|
||||
0 0.2 -0.75
|
||||
0 0.2 -1
|
||||
-0.09802 0.2 -0.99518
|
||||
-0.19509 0.2 -0.98079
|
||||
-0.29028 0.2 -0.95694
|
||||
-0.38268 0.2 -0.92388
|
||||
-0.4714 0.2 -0.88192
|
||||
-0.55557 0.2 -0.83147
|
||||
-0.63439 0.2 -0.77301
|
||||
-0.70711 0.2 -0.70711
|
||||
-0.77301 0.2 -0.63439
|
||||
-0.83147 0.2 -0.55557
|
||||
-0.88192 0.2 -0.4714
|
||||
-0.92388 0.2 -0.38268
|
||||
-0.95694 0.2 -0.29028
|
||||
-0.98079 0.2 -0.19509
|
||||
-0.99518 0.2 -0.09802
|
||||
-1 0.2 0
|
||||
-0.99518 0.2 0.09802
|
||||
-0.98079 0.2 0.19509
|
||||
-0.95694 0.2 0.29028
|
||||
-0.92388 0.2 0.38268
|
||||
-0.88192 0.2 0.4714
|
||||
-0.83147 0.2 0.55557
|
||||
-0.77301 0.2 0.63439
|
||||
-0.70711 0.2 0.70711
|
||||
-0.63439 0.2 0.77301
|
||||
-0.55557 0.2 0.83147
|
||||
-0.4714 0.2 0.88192
|
||||
-0.38268 0.2 0.92388
|
||||
-0.29028 0.2 0.95694
|
||||
-0.19509 0.2 0.98079
|
||||
-0.09802 0.2 0.99518
|
||||
0 0.2 1
|
||||
0.09802 0.2 0.99518
|
||||
0.19509 0.2 0.98079
|
||||
0.29029 0.2 0.95694
|
||||
0.38268 0.2 0.92388
|
||||
0.4714 0.2 0.88192
|
||||
0.55557 0.2 0.83147
|
||||
0.63439 0.2 0.77301
|
||||
0.70711 0.2 0.70711
|
||||
0.77301 0.2 0.63439
|
||||
0.83147 0.2 0.55557
|
||||
0.88192 0.2 0.4714
|
||||
0.92388 0.2 0.38268
|
||||
0.95694 0.2 0.29028
|
||||
0.98079 0.2 0.19509
|
||||
0.99518 0.2 0.09802
|
||||
1 0.2 0
|
||||
0.99518 0.2 -0.09802
|
||||
0.98079 0.2 -0.19509
|
||||
0.95694 0.2 -0.29028
|
||||
0.92388 0.2 -0.38268
|
||||
0.88192 0.2 -0.4714
|
||||
0.83147 0.2 -0.55557
|
||||
0.77301 0.2 -0.63439
|
||||
0.70711 0.2 -0.70711
|
||||
0.6344 0.2 -0.77301
|
||||
0.55557 0.2 -0.83147
|
||||
0.4714 0.2 -0.88192
|
||||
0.38269 0.2 -0.92388
|
||||
0.29029 0.2 -0.95694
|
||||
0.19509 0.2 -0.98078
|
||||
0.09802 0.2 -0.99518
|
||||
-0.07351 0.2 -0.74639
|
||||
-0.14632 0.2 -0.73559
|
||||
-0.21771 0.2 -0.71771
|
||||
-0.28701 0.2 -0.69291
|
||||
-0.35355 0.2 -0.66144
|
||||
-0.41668 0.2 -0.6236
|
||||
-0.47579 0.2 -0.57976
|
||||
-0.53033 0.2 -0.53033
|
||||
-0.57976 0.2 -0.47579
|
||||
-0.6236 0.2 -0.41668
|
||||
-0.66144 0.2 -0.35355
|
||||
-0.69291 0.2 -0.28701
|
||||
-0.71771 0.2 -0.21771
|
||||
-0.73559 0.2 -0.14632
|
||||
-0.74639 0.2 -0.07351
|
||||
-0.75 0.2 0
|
||||
-0.74639 0.2 0.07351
|
||||
-0.73559 0.2 0.14632
|
||||
-0.71771 0.2 0.21771
|
||||
-0.69291 0.2 0.28701
|
||||
-0.66144 0.2 0.35355
|
||||
-0.6236 0.2 0.41668
|
||||
-0.57976 0.2 0.4758
|
||||
-0.53033 0.2 0.53033
|
||||
-0.47579 0.2 0.57976
|
||||
-0.41668 0.2 0.6236
|
||||
-0.35355 0.2 0.66144
|
||||
-0.28701 0.2 0.69291
|
||||
-0.21771 0.2 0.71771
|
||||
-0.14632 0.2 0.73559
|
||||
-0.07351 0.2 0.74639
|
||||
0 0.2 0.75
|
||||
0.07351 0.2 0.74639
|
||||
0.14632 0.2 0.73559
|
||||
0.21771 0.2 0.71771
|
||||
0.28701 0.2 0.69291
|
||||
0.35355 0.2 0.66144
|
||||
0.41668 0.2 0.6236
|
||||
0.4758 0.2 0.57976
|
||||
0.53033 0.2 0.53033
|
||||
0.57976 0.2 0.47579
|
||||
0.6236 0.2 0.41668
|
||||
0.66144 0.2 0.35355
|
||||
0.69291 0.2 0.28701
|
||||
0.71771 0.2 0.21771
|
||||
0.73559 0.2 0.14632
|
||||
0.74639 0.2 0.07351
|
||||
0.75 0.2 0
|
||||
0.74639 0.2 -0.07351
|
||||
0.73559 0.2 -0.14632
|
||||
0.71771 0.2 -0.21771
|
||||
0.69291 0.2 -0.28701
|
||||
0.66144 0.2 -0.35355
|
||||
0.6236 0.2 -0.41668
|
||||
0.57976 0.2 -0.47579
|
||||
0.53033 0.2 -0.53033
|
||||
0.4758 0.2 -0.57976
|
||||
0.41668 0.2 -0.6236
|
||||
0.35355 0.2 -0.66144
|
||||
0.28701 0.2 -0.69291
|
||||
0.21772 0.2 -0.7177
|
||||
0.14632 0.2 -0.73559
|
||||
0.07352 0.2 -0.74639
|
||||
numsurf 64
|
||||
SURF 0X10
|
||||
mat 0
|
||||
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 0
|
||||
refs 4
|
||||
12 0.06988 0.617849
|
||||
75 0.08366 0.588387
|
||||
74 0.086025 0.604169
|
||||
11 0.073033 0.638893
|
||||
SURF 0X10
|
||||
mat 0
|
||||
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 0
|
||||
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 0
|
||||
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 0
|
||||
refs 4
|
||||
24 0.076687 0.341402
|
||||
87 0.088765 0.381051
|
||||
86 0.086025 0.39583
|
||||
23 0.073033 0.361107
|
||||
SURF 0X10
|
||||
mat 0
|
||||
refs 4
|
||||
37 0.148918 0.26903
|
||||
100 0.142938 0.326773
|
||||
99 0.138607 0.320574
|
||||
36 0.143143 0.260765
|
||||
SURF 0X10
|
||||
mat 0
|
||||
refs 4
|
||||
50 0.187199 0.524504
|
||||
113 0.171649 0.518378
|
||||
112 0.171875 0.5
|
||||
49 0.1875 0.5
|
||||
SURF 0X10
|
||||
mat 0
|
||||
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 0
|
||||
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 0
|
||||
refs 4
|
||||
23 0.073033 0.361107
|
||||
86 0.086025 0.39583
|
||||
85 0.08366 0.411613
|
||||
22 0.06988 0.382151
|
||||
SURF 0X10
|
||||
mat 0
|
||||
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 0
|
||||
refs 4
|
||||
49 0.1875 0.5
|
||||
112 0.171875 0.5
|
||||
111 0.171649 0.481622
|
||||
48 0.187199 0.475496
|
||||
SURF 0X10
|
||||
mat 0
|
||||
refs 4
|
||||
62 0.143143 0.739235
|
||||
125 0.138607 0.679426
|
||||
124 0.142938 0.673227
|
||||
61 0.148918 0.73097
|
||||
SURF 0X10
|
||||
mat 0
|
||||
refs 4
|
||||
9 0.080806 0.676777
|
||||
72 0.091854 0.632583
|
||||
71 0.095263 0.644939
|
||||
8 0.08535 0.693253
|
||||
SURF 0X10
|
||||
mat 0
|
||||
refs 4
|
||||
22 0.06988 0.382151
|
||||
85 0.08366 0.411613
|
||||
84 0.081693 0.428247
|
||||
21 0.067258 0.404329
|
||||
SURF 0X10
|
||||
mat 0
|
||||
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 0
|
||||
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 0
|
||||
refs 4
|
||||
61 0.148918 0.73097
|
||||
124 0.142938 0.673227
|
||||
123 0.147097 0.66536
|
||||
60 0.154463 0.72048
|
||||
SURF 0X10
|
||||
mat 0
|
||||
refs 4
|
||||
8 0.08535 0.693253
|
||||
71 0.095263 0.644939
|
||||
70 0.098958 0.6559
|
||||
7 0.090277 0.707867
|
||||
SURF 0X10
|
||||
mat 0
|
||||
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 0
|
||||
refs 4
|
||||
34 0.131126 0.251204
|
||||
97 0.129595 0.313403
|
||||
96 0.125 0.3125
|
||||
33 0.125 0.25
|
||||
SURF 0X10
|
||||
mat 0
|
||||
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 0
|
||||
refs 4
|
||||
60 0.154463 0.72048
|
||||
123 0.147097 0.66536
|
||||
122 0.151043 0.6559
|
||||
59 0.159723 0.707867
|
||||
SURF 0X10
|
||||
mat 0
|
||||
refs 4
|
||||
7 0.090277 0.707867
|
||||
70 0.098958 0.6559
|
||||
69 0.102903 0.66536
|
||||
6 0.095538 0.72048
|
||||
SURF 0X10
|
||||
mat 0
|
||||
refs 4
|
||||
20 0.065191 0.427429
|
||||
83 0.080143 0.445572
|
||||
82 0.079026 0.46342
|
||||
19 0.063701 0.451227
|
||||
SURF 0X10
|
||||
mat 0
|
||||
refs 4
|
||||
33 0.125 0.25
|
||||
96 0.125 0.3125
|
||||
95 0.120406 0.313403
|
||||
32 0.118874 0.251204
|
||||
SURF 0X10
|
||||
mat 0
|
||||
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 0
|
||||
refs 4
|
||||
59 0.159723 0.707867
|
||||
122 0.151043 0.6559
|
||||
121 0.154737 0.644939
|
||||
58 0.16465 0.693252
|
||||
SURF 0X10
|
||||
mat 0
|
||||
refs 4
|
||||
6 0.095538 0.72048
|
||||
69 0.102903 0.66536
|
||||
68 0.107062 0.673227
|
||||
5 0.101082 0.73097
|
||||
SURF 0X10
|
||||
mat 0
|
||||
refs 4
|
||||
19 0.063701 0.451227
|
||||
82 0.079026 0.46342
|
||||
81 0.078351 0.481622
|
||||
18 0.062801 0.475496
|
||||
SURF 0X10
|
||||
mat 0
|
||||
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 0
|
||||
refs 4
|
||||
45 0.182743 0.404329
|
||||
108 0.168307 0.428247
|
||||
107 0.16634 0.411613
|
||||
44 0.18012 0.382151
|
||||
SURF 0X10
|
||||
mat 0
|
||||
refs 4
|
||||
58 0.16465 0.693252
|
||||
121 0.154737 0.644939
|
||||
120 0.158146 0.632582
|
||||
57 0.169194 0.676776
|
||||
SURF 0X10
|
||||
mat 0
|
||||
refs 4
|
||||
5 0.101082 0.73097
|
||||
68 0.107062 0.673227
|
||||
67 0.111393 0.679426
|
||||
4 0.106857 0.739235
|
||||
SURF 0X10
|
||||
mat 0
|
||||
refs 4
|
||||
18 0.062801 0.475496
|
||||
81 0.078351 0.481622
|
||||
80 0.078125 0.5
|
||||
17 0.0625 0.5
|
||||
SURF 0X10
|
||||
mat 0
|
||||
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 0
|
||||
refs 4
|
||||
44 0.18012 0.382151
|
||||
107 0.16634 0.411613
|
||||
106 0.163975 0.395831
|
||||
43 0.176967 0.361108
|
||||
SURF 0X10
|
||||
mat 0
|
||||
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 0
|
||||
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 0
|
||||
refs 4
|
||||
17 0.0625 0.5
|
||||
80 0.078125 0.5
|
||||
79 0.078351 0.518378
|
||||
16 0.062801 0.524504
|
||||
SURF 0X10
|
||||
mat 0
|
||||
refs 4
|
||||
30 0.106857 0.260765
|
||||
93 0.111393 0.320574
|
||||
92 0.107062 0.326772
|
||||
29 0.101082 0.26903
|
||||
SURF 0X10
|
||||
mat 0
|
||||
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 0
|
||||
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 0
|
||||
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 0
|
||||
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 0
|
||||
refs 4
|
||||
29 0.101082 0.26903
|
||||
92 0.107062 0.326772
|
||||
91 0.102903 0.33464
|
||||
28 0.095538 0.27952
|
||||
SURF 0X10
|
||||
mat 0
|
||||
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 0
|
||||
refs 4
|
||||
55 0.176967 0.638892
|
||||
118 0.163975 0.604169
|
||||
117 0.16634 0.588387
|
||||
54 0.18012 0.617849
|
||||
SURF 0X10
|
||||
mat 0
|
||||
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 0
|
||||
refs 4
|
||||
28 0.095538 0.27952
|
||||
91 0.102903 0.33464
|
||||
90 0.098958 0.344099
|
||||
27 0.090277 0.292132
|
||||
SURF 0X10
|
||||
mat 0
|
||||
refs 4
|
||||
41 0.169194 0.323223
|
||||
104 0.158146 0.367418
|
||||
103 0.154737 0.355061
|
||||
40 0.16465 0.306747
|
||||
SURF 0X10
|
||||
mat 0
|
||||
refs 4
|
||||
54 0.18012 0.617849
|
||||
117 0.16634 0.588387
|
||||
116 0.168307 0.571753
|
||||
53 0.182743 0.595671
|
||||
SURF 0X10
|
||||
mat 0
|
||||
refs 4
|
||||
0 0.125 0.6875
|
||||
1 0.125 0.75
|
||||
2 0.118874 0.748796
|
||||
65 0.120406 0.686597
|
||||
SURF 0X10
|
||||
mat 0
|
||||
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 0
|
||||
refs 4
|
||||
27 0.090277 0.292132
|
||||
90 0.098958 0.344099
|
||||
89 0.095263 0.35506
|
||||
26 0.08535 0.306747
|
||||
SURF 0X10
|
||||
mat 0
|
||||
refs 4
|
||||
40 0.16465 0.306747
|
||||
103 0.154737 0.355061
|
||||
102 0.151042 0.344099
|
||||
39 0.159723 0.292133
|
||||
SURF 0X10
|
||||
mat 0
|
||||
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 0
|
||||
refs 4
|
||||
13 0.067258 0.595671
|
||||
76 0.081693 0.571753
|
||||
75 0.08366 0.588387
|
||||
12 0.06988 0.617849
|
||||
SURF 0X10
|
||||
mat 0
|
||||
refs 4
|
||||
26 0.08535 0.306747
|
||||
89 0.095263 0.35506
|
||||
88 0.091854 0.367417
|
||||
25 0.080806 0.323223
|
||||
SURF 0X10
|
||||
mat 0
|
||||
refs 4
|
||||
39 0.159723 0.292133
|
||||
102 0.151042 0.344099
|
||||
101 0.147097 0.33464
|
||||
38 0.154462 0.27952
|
||||
SURF 0X10
|
||||
mat 0
|
||||
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 0
|
||||
refs 4
|
||||
1 0.125 0.75
|
||||
0 0.125 0.6875
|
||||
127 0.129595 0.686597
|
||||
64 0.131126 0.748796
|
||||
SURF 0X10
|
||||
mat 0
|
||||
refs 4
|
||||
38 0.154462 0.27952
|
||||
101 0.147097 0.33464
|
||||
100 0.142938 0.326773
|
||||
37 0.148918 0.26903
|
||||
kids 0
|
45
YourAircraftDir/Models/Autopush/cursor.xml
Normal file
45
YourAircraftDir/Models/Autopush/cursor.xml
Normal file
|
@ -0,0 +1,45 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
|
||||
AUTOPUSH
|
||||
Cursor model.
|
||||
|
||||
Copyright (c) 2018 Autopush authors:
|
||||
Joshua Davidson http://github.com/Octal450
|
||||
Merspieler http://gitlab.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/autopush/stopping-distance-m</property>
|
||||
<z-factor>0.0</z-factor>
|
||||
<z-min>1.0</z-min>
|
||||
</animation>
|
||||
|
||||
<animation>
|
||||
<type>material</type>
|
||||
<condition>
|
||||
<property>/sim/model/autopush/route/invalid</property>
|
||||
</condition>
|
||||
<diffuse>
|
||||
<red>1.0</red>
|
||||
<green>0.0</green>
|
||||
<blue>0.0</blue>
|
||||
</diffuse>
|
||||
<emission>
|
||||
<red>1.0</red>
|
||||
<green>0.0</green>
|
||||
<blue>0.0</blue>
|
||||
</emission>
|
||||
</animation>
|
||||
|
||||
</PropertyList>
|
133
YourAircraftDir/Models/Autopush/cursor_reverse.ac
Normal file
133
YourAircraftDir/Models/Autopush/cursor_reverse.ac
Normal file
|
@ -0,0 +1,133 @@
|
|||
AC3Db
|
||||
MATERIAL "autopush cursor" rgb 0.0000 0.0000 0.0000 amb 0.0000 0.0000 0.0000 emis 1.000 0.173 0.545 spec 0.0000 0.0000 0.0000 shi 50 trans 0.0000
|
||||
OBJECT world
|
||||
name "Blender_exporter_v2.26__cursor_reverse.ac"
|
||||
kids 1
|
||||
OBJECT poly
|
||||
name "Circle"
|
||||
data 11
|
||||
Circle.mesh
|
||||
crease 40.0
|
||||
numvert 36
|
||||
-0.86603 0.2 0.15
|
||||
-0.64952 0.2 0.15
|
||||
-0.64952 0.2 -0.375
|
||||
-0.86603 0.2 -0.15
|
||||
-0.64952 0.2 -0.15
|
||||
-0.86603 0.2 -0.5
|
||||
-0.56292 0.2 -0.675
|
||||
-0.45466 0.2 -0.4875
|
||||
-0 0.2 -0.75
|
||||
-0 0.2 -1
|
||||
-0.30311 0.2 -0.825
|
||||
-0.19486 0.2 -0.6375
|
||||
0.30311 0.2 -0.825
|
||||
0.19486 0.2 -0.6375
|
||||
0.64952 0.2 -0.375
|
||||
0.86603 0.2 -0.5
|
||||
0.56292 0.2 -0.675
|
||||
0.45466 0.2 -0.4875
|
||||
0.86603 0.2 -0.15
|
||||
0.64952 0.2 -0.15
|
||||
0.86603 0.2 0.5
|
||||
0.86603 0.2 0.15
|
||||
0.64952 0.2 0.15
|
||||
0.64952 0.2 0.375
|
||||
0.56292 0.2 0.675
|
||||
0.45466 0.2 0.4875
|
||||
0.30311 0.2 0.825
|
||||
0.19486 0.2 0.6375
|
||||
-0 0.2 0.75
|
||||
-0 0.2 1
|
||||
-0.30311 0.2 0.825
|
||||
-0.19486 0.2 0.6375
|
||||
-0.64952 0.2 0.375
|
||||
-0.86603 0.2 0.5
|
||||
-0.56292 0.2 0.675
|
||||
-0.45466 0.2 0.4875
|
||||
numsurf 12
|
||||
SURF 0X10
|
||||
mat 0
|
||||
refs 4
|
||||
2 0.078125 0.40625
|
||||
5 0.0625 0.375
|
||||
3 0.0625 0.5
|
||||
4 0.078125 0.5
|
||||
SURF 0X10
|
||||
mat 0
|
||||
refs 4
|
||||
32 0.078125 0.40625
|
||||
1 0.078125 0.5
|
||||
0 0.0625 0.5
|
||||
33 0.0625 0.375
|
||||
SURF 0X10
|
||||
mat 0
|
||||
refs 4
|
||||
8 0.078125 0.40625
|
||||
9 0.0625 0.375
|
||||
10 0.0625 0.5
|
||||
11 0.078125 0.5
|
||||
SURF 0X10
|
||||
mat 0
|
||||
refs 4
|
||||
2 0.078125 0.40625
|
||||
7 0.078125 0.5
|
||||
6 0.0625 0.5
|
||||
5 0.0625 0.375
|
||||
SURF 0X10
|
||||
mat 0
|
||||
refs 4
|
||||
14 0.078125 0.40625
|
||||
15 0.0625 0.375
|
||||
16 0.0625 0.5
|
||||
17 0.078125 0.5
|
||||
SURF 0X10
|
||||
mat 0
|
||||
refs 4
|
||||
8 0.078125 0.40625
|
||||
13 0.078125 0.5
|
||||
12 0.0625 0.5
|
||||
9 0.0625 0.375
|
||||
SURF 0X10
|
||||
mat 0
|
||||
refs 4
|
||||
23 0.078125 0.40625
|
||||
20 0.0625 0.375
|
||||
21 0.0625 0.5
|
||||
22 0.078125 0.5
|
||||
SURF 0X10
|
||||
mat 0
|
||||
refs 4
|
||||
14 0.078125 0.40625
|
||||
19 0.078125 0.5
|
||||
18 0.0625 0.5
|
||||
15 0.0625 0.375
|
||||
SURF 0X10
|
||||
mat 0
|
||||
refs 4
|
||||
28 0.078125 0.40625
|
||||
29 0.0625 0.375
|
||||
26 0.0625 0.5
|
||||
27 0.078125 0.5
|
||||
SURF 0X10
|
||||
mat 0
|
||||
refs 4
|
||||
23 0.078125 0.40625
|
||||
25 0.078125 0.5
|
||||
24 0.0625 0.5
|
||||
20 0.0625 0.375
|
||||
SURF 0X10
|
||||
mat 0
|
||||
refs 4
|
||||
32 0.078125 0.40625
|
||||
33 0.0625 0.375
|
||||
34 0.0625 0.5
|
||||
35 0.078125 0.5
|
||||
SURF 0X10
|
||||
mat 0
|
||||
refs 4
|
||||
28 0.078125 0.40625
|
||||
31 0.078125 0.5
|
||||
30 0.0625 0.5
|
||||
29 0.0625 0.375
|
||||
kids 0
|
45
YourAircraftDir/Models/Autopush/cursor_reverse.xml
Normal file
45
YourAircraftDir/Models/Autopush/cursor_reverse.xml
Normal file
|
@ -0,0 +1,45 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
|
||||
AUTOPUSH
|
||||
Cursor model.
|
||||
|
||||
Copyright (c) 2018 Autopush authors:
|
||||
Joshua Davidson http://github.com/Octal450
|
||||
Merspieler http://gitlab.com/merspieler
|
||||
Distribute under the terms of GPLv2.
|
||||
|
||||
-->
|
||||
<PropertyList>
|
||||
|
||||
<path>cursor_reverse.ac</path>
|
||||
|
||||
<animation>
|
||||
<enable-hot>false</enable-hot>
|
||||
</animation>
|
||||
|
||||
<animation>
|
||||
<type>scale</type>
|
||||
<property>/sim/model/autopush/stopping-distance-m</property>
|
||||
<z-factor>0.0</z-factor>
|
||||
<z-min>1.0</z-min>
|
||||
</animation>
|
||||
|
||||
<animation>
|
||||
<type>material</type>
|
||||
<condition>
|
||||
<property>/sim/model/autopush/route/invalid</property>
|
||||
</condition>
|
||||
<diffuse>
|
||||
<red>1.0</red>
|
||||
<green>0.0</green>
|
||||
<blue>0.0</blue>
|
||||
</diffuse>
|
||||
<emission>
|
||||
<red>1.0</red>
|
||||
<green>0.0</green>
|
||||
<blue>0.0</blue>
|
||||
</emission>
|
||||
</animation>
|
||||
|
||||
</PropertyList>
|
67
YourAircraftDir/Models/Autopush/cursor_sharp.ac
Normal file
67
YourAircraftDir/Models/Autopush/cursor_sharp.ac
Normal file
|
@ -0,0 +1,67 @@
|
|||
AC3Db
|
||||
MATERIAL "autopush cursor" rgb 0.0000 0.0000 0.0000 amb 0.0000 0.0000 0.0000 emis 1.000 0.173 0.545 spec 0.0000 0.0000 0.0000 shi 50 trans 0.0000
|
||||
OBJECT world
|
||||
name "Blender_exporter_v2.26__cursor_sharp.ac"
|
||||
kids 1
|
||||
OBJECT poly
|
||||
name "Circle"
|
||||
data 11
|
||||
Circle.mesh
|
||||
crease 40.0
|
||||
numvert 12
|
||||
0 0.2 -0.75
|
||||
0 0.2 -1
|
||||
0.64952 0.2 -0.375
|
||||
0.86603 0.2 -0.5
|
||||
0.64952 0.2 0.375
|
||||
0.86603 0.2 0.5
|
||||
0 0.2 0.75
|
||||
0 0.2 1
|
||||
-0.64952 0.2 0.375
|
||||
-0.86603 0.2 0.5
|
||||
-0.64952 0.2 -0.375
|
||||
-0.86603 0.2 -0.5
|
||||
numsurf 6
|
||||
SURF 0X10
|
||||
mat 0
|
||||
refs 4
|
||||
0 0.125 0.6875
|
||||
2 0.171875 0.59375
|
||||
3 0.1875 0.625
|
||||
1 0.125 0.75
|
||||
SURF 0X10
|
||||
mat 0
|
||||
refs 4
|
||||
2 0.171875 0.59375
|
||||
4 0.171875 0.40625
|
||||
5 0.1875 0.375
|
||||
3 0.1875 0.625
|
||||
SURF 0X10
|
||||
mat 0
|
||||
refs 4
|
||||
4 0.171875 0.40625
|
||||
6 0.125 0.3125
|
||||
7 0.125 0.25
|
||||
5 0.1875 0.375
|
||||
SURF 0X10
|
||||
mat 0
|
||||
refs 4
|
||||
6 0.125 0.3125
|
||||
8 0.078125 0.40625
|
||||
9 0.0625 0.375
|
||||
7 0.125 0.25
|
||||
SURF 0X10
|
||||
mat 0
|
||||
refs 4
|
||||
8 0.078125 0.40625
|
||||
10 0.078125 0.59375
|
||||
11 0.0625 0.625
|
||||
9 0.0625 0.375
|
||||
SURF 0X10
|
||||
mat 0
|
||||
refs 4
|
||||
10 0.078125 0.59375
|
||||
0 0.125 0.6875
|
||||
1 0.125 0.75
|
||||
11 0.0625 0.625
|
||||
kids 0
|
45
YourAircraftDir/Models/Autopush/cursor_sharp.xml
Normal file
45
YourAircraftDir/Models/Autopush/cursor_sharp.xml
Normal file
|
@ -0,0 +1,45 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
|
||||
AUTOPUSH
|
||||
Cursor model.
|
||||
|
||||
Copyright (c) 2018 Autopush authors:
|
||||
Joshua Davidson http://github.com/Octal450
|
||||
Merspieler http://gitlab.com/merspieler
|
||||
Distribute under the terms of GPLv2.
|
||||
|
||||
-->
|
||||
<PropertyList>
|
||||
|
||||
<path>cursor_sharp.ac</path>
|
||||
|
||||
<animation>
|
||||
<enable-hot>false</enable-hot>
|
||||
</animation>
|
||||
|
||||
<animation>
|
||||
<type>scale</type>
|
||||
<property>/sim/model/autopush/stopping-distance-m</property>
|
||||
<z-factor>0.0</z-factor>
|
||||
<z-min>1.0</z-min>
|
||||
</animation>
|
||||
|
||||
<animation>
|
||||
<type>material</type>
|
||||
<condition>
|
||||
<property>/sim/model/autopush/route/invalid</property>
|
||||
</condition>
|
||||
<diffuse>
|
||||
<red>1.0</red>
|
||||
<green>0.0</green>
|
||||
<blue>0.0</blue>
|
||||
</diffuse>
|
||||
<emission>
|
||||
<red>1.0</red>
|
||||
<green>0.0</green>
|
||||
<blue>0.0</blue>
|
||||
</emission>
|
||||
</animation>
|
||||
|
||||
</PropertyList>
|
276
YourAircraftDir/Models/Autopush/waypoint.ac
Normal file
276
YourAircraftDir/Models/Autopush/waypoint.ac
Normal file
|
@ -0,0 +1,276 @@
|
|||
AC3Db
|
||||
MATERIAL "autopush cursor" rgb 0.0000 0.0000 0.0000 amb 0.0000 0.0000 0.0000 emis 1.000 0.173 0.545 spec 0.0000 0.0000 0.0000 shi 50 trans 0.0000
|
||||
OBJECT world
|
||||
name "Blender_exporter_v2.26__waypoint.ac"
|
||||
kids 3
|
||||
OBJECT poly
|
||||
name "Waypoint"
|
||||
data 11
|
||||
Circle.mesh
|
||||
crease 40.0
|
||||
numvert 33
|
||||
0.03902 0.2 -0.19616
|
||||
0.07654 0.2 -0.18478
|
||||
0.11111 0.2 -0.16629
|
||||
0.14142 0.2 -0.14142
|
||||
0.16629 0.2 -0.11111
|
||||
0.18478 0.2 -0.07654
|
||||
0.19616 0.2 -0.03902
|
||||
0.2 0.2 0
|
||||
0.19616 0.2 0.03902
|
||||
0.18478 0.2 0.07654
|
||||
0.16629 0.2 0.11111
|
||||
0.14142 0.2 0.14142
|
||||
0.11111 0.2 0.16629
|
||||
0.07654 0.2 0.18478
|
||||
0.03902 0.2 0.19616
|
||||
0 0.2 0.2
|
||||
-0.03902 0.2 0.19616
|
||||
-0.07654 0.2 0.18478
|
||||
-0.11111 0.2 0.16629
|
||||
-0.14142 0.2 0.14142
|
||||
-0.16629 0.2 0.11111
|
||||
-0.18478 0.2 0.07654
|
||||
-0.19616 0.2 0.03902
|
||||
-0.2 0.2 0
|
||||
-0.19616 0.2 -0.03902
|
||||
-0.18478 0.2 -0.07654
|
||||
-0.16629 0.2 -0.11111
|
||||
-0.14142 0.2 -0.14142
|
||||
-0.11111 0.2 -0.16629
|
||||
-0.07654 0.2 -0.18478
|
||||
-0.03902 0.2 -0.19616
|
||||
0 0.2 -0.2
|
||||
0 0.2 0
|
||||
numsurf 32
|
||||
SURF 0X0
|
||||
mat 0
|
||||
refs 3
|
||||
32 0.125 0.5
|
||||
18 0.090277 0.292133
|
||||
17 0.101082 0.26903
|
||||
SURF 0X0
|
||||
mat 0
|
||||
refs 3
|
||||
32 0.125 0.5
|
||||
31 0.125 0.75
|
||||
30 0.112807 0.745197
|
||||
SURF 0X0
|
||||
mat 0
|
||||
refs 3
|
||||
32 0.125 0.5
|
||||
4 0.176967 0.638893
|
||||
3 0.169194 0.676777
|
||||
SURF 0X0
|
||||
mat 0
|
||||
refs 3
|
||||
32 0.125 0.5
|
||||
17 0.101082 0.26903
|
||||
16 0.112807 0.254804
|
||||
SURF 0X0
|
||||
mat 0
|
||||
refs 3
|
||||
32 0.125 0.5
|
||||
30 0.112807 0.745197
|
||||
29 0.101082 0.73097
|
||||
SURF 0X0
|
||||
mat 0
|
||||
refs 3
|
||||
32 0.125 0.5
|
||||
3 0.169194 0.676777
|
||||
2 0.159723 0.707868
|
||||
SURF 0X0
|
||||
mat 0
|
||||
refs 3
|
||||
32 0.125 0.5
|
||||
16 0.112807 0.254804
|
||||
15 0.125 0.25
|
||||
SURF 0X0
|
||||
mat 0
|
||||
refs 3
|
||||
32 0.125 0.5
|
||||
29 0.101082 0.73097
|
||||
28 0.090277 0.707868
|
||||
SURF 0X0
|
||||
mat 0
|
||||
refs 3
|
||||
32 0.125 0.5
|
||||
2 0.159723 0.707868
|
||||
1 0.148918 0.73097
|
||||
SURF 0X0
|
||||
mat 0
|
||||
refs 3
|
||||
32 0.125 0.5
|
||||
15 0.125 0.25
|
||||
14 0.137193 0.254804
|
||||
SURF 0X0
|
||||
mat 0
|
||||
refs 3
|
||||
32 0.125 0.5
|
||||
28 0.090277 0.707868
|
||||
27 0.080806 0.676777
|
||||
SURF 0X0
|
||||
mat 0
|
||||
refs 3
|
||||
32 0.125 0.5
|
||||
1 0.148918 0.73097
|
||||
0 0.137193 0.745197
|
||||
SURF 0X0
|
||||
mat 0
|
||||
refs 3
|
||||
32 0.125 0.5
|
||||
14 0.137193 0.254804
|
||||
13 0.148918 0.26903
|
||||
SURF 0X0
|
||||
mat 0
|
||||
refs 3
|
||||
32 0.125 0.5
|
||||
27 0.080806 0.676777
|
||||
26 0.073033 0.638893
|
||||
SURF 0X0
|
||||
mat 0
|
||||
refs 3
|
||||
32 0.125 0.5
|
||||
0 0.137193 0.745197
|
||||
31 0.125 0.75
|
||||
SURF 0X0
|
||||
mat 0
|
||||
refs 3
|
||||
32 0.125 0.5
|
||||
13 0.148918 0.26903
|
||||
12 0.159723 0.292133
|
||||
SURF 0X0
|
||||
mat 0
|
||||
refs 3
|
||||
32 0.125 0.5
|
||||
26 0.073033 0.638893
|
||||
25 0.067258 0.595671
|
||||
SURF 0X0
|
||||
mat 0
|
||||
refs 3
|
||||
32 0.125 0.5
|
||||
12 0.159723 0.292133
|
||||
11 0.169194 0.323224
|
||||
SURF 0X0
|
||||
mat 0
|
||||
refs 3
|
||||
32 0.125 0.5
|
||||
25 0.067258 0.595671
|
||||
24 0.063701 0.548773
|
||||
SURF 0X0
|
||||
mat 0
|
||||
refs 3
|
||||
32 0.125 0.5
|
||||
11 0.169194 0.323224
|
||||
10 0.176967 0.361108
|
||||
SURF 0X0
|
||||
mat 0
|
||||
refs 3
|
||||
32 0.125 0.5
|
||||
24 0.063701 0.548773
|
||||
23 0.0625 0.5
|
||||
SURF 0X0
|
||||
mat 0
|
||||
refs 3
|
||||
32 0.125 0.5
|
||||
10 0.176967 0.361108
|
||||
9 0.182743 0.404329
|
||||
SURF 0X0
|
||||
mat 0
|
||||
refs 3
|
||||
32 0.125 0.5
|
||||
23 0.0625 0.5
|
||||
22 0.063701 0.451228
|
||||
SURF 0X0
|
||||
mat 0
|
||||
refs 3
|
||||
32 0.125 0.5
|
||||
9 0.182743 0.404329
|
||||
8 0.186299 0.451228
|
||||
SURF 0X0
|
||||
mat 0
|
||||
refs 3
|
||||
32 0.125 0.5
|
||||
22 0.063701 0.451228
|
||||
21 0.067258 0.404329
|
||||
SURF 0X0
|
||||
mat 0
|
||||
refs 3
|
||||
32 0.125 0.5
|
||||
8 0.186299 0.451228
|
||||
7 0.1875 0.5
|
||||
SURF 0X0
|
||||
mat 0
|
||||
refs 3
|
||||
32 0.125 0.5
|
||||
21 0.067258 0.404329
|
||||
20 0.073033 0.361108
|
||||
SURF 0X0
|
||||
mat 0
|
||||
refs 3
|
||||
32 0.125 0.5
|
||||
7 0.1875 0.5
|
||||
6 0.186299 0.548773
|
||||
SURF 0X0
|
||||
mat 0
|
||||
refs 3
|
||||
32 0.125 0.5
|
||||
20 0.073033 0.361108
|
||||
19 0.080806 0.323223
|
||||
SURF 0X0
|
||||
mat 0
|
||||
refs 3
|
||||
32 0.125 0.5
|
||||
6 0.186299 0.548773
|
||||
5 0.182742 0.595671
|
||||
SURF 0X0
|
||||
mat 0
|
||||
refs 3
|
||||
32 0.125 0.5
|
||||
19 0.080806 0.323223
|
||||
18 0.090277 0.292133
|
||||
SURF 0X0
|
||||
mat 0
|
||||
refs 3
|
||||
32 0.125 0.5
|
||||
5 0.182742 0.595671
|
||||
4 0.176967 0.638893
|
||||
kids 0
|
||||
OBJECT poly
|
||||
name "WingtipL"
|
||||
data 15
|
||||
Circle.mesh.001
|
||||
crease 40.0
|
||||
numvert 4
|
||||
-0.1 0.2 -0.1
|
||||
-0.1 0.2 0.1
|
||||
0.1 0.2 -0.1
|
||||
0.1 0.2 0.1
|
||||
numsurf 1
|
||||
SURF 0X0
|
||||
mat 0
|
||||
refs 4
|
||||
0 0 0
|
||||
1 0 0
|
||||
3 0 0
|
||||
2 0 0
|
||||
kids 0
|
||||
OBJECT poly
|
||||
name "WingtipR"
|
||||
data 15
|
||||
Circle.mesh.007
|
||||
crease 40.0
|
||||
numvert 4
|
||||
-0.1 0.2 -0.1
|
||||
-0.1 0.2 0.1
|
||||
0.1 0.2 -0.1
|
||||
0.1 0.2 0.1
|
||||
numsurf 1
|
||||
SURF 0X0
|
||||
mat 0
|
||||
refs 4
|
||||
0 0 0
|
||||
1 0 0
|
||||
3 0 0
|
||||
2 0 0
|
||||
kids 0
|
86
YourAircraftDir/Models/Autopush/waypoint.xml
Normal file
86
YourAircraftDir/Models/Autopush/waypoint.xml
Normal file
|
@ -0,0 +1,86 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
|
||||
AUTOPUSH
|
||||
Waypoint model.
|
||||
|
||||
Copyright (c) 2018 Autopush authors:
|
||||
Joshua Davidson http://github.com/Octal450
|
||||
Merspieler http://gitlab.com/merspieler
|
||||
Distribute under the terms of GPLv2.
|
||||
|
||||
-->
|
||||
<PropertyList>
|
||||
|
||||
<path>waypoint.ac</path>
|
||||
|
||||
<animation>
|
||||
<enable-hot>false</enable-hot>
|
||||
</animation>
|
||||
|
||||
<animation>
|
||||
<type>select</type>
|
||||
<object-name>WingtipL</object-name>
|
||||
<object-name>WingtipR</object-name>
|
||||
<condition>
|
||||
<property>/sim/model/autopush/route/show-wingtip</property>
|
||||
</condition>
|
||||
</animation>
|
||||
|
||||
<animation>
|
||||
<type>translate</type>
|
||||
<object-name>WingtipL</object-name>
|
||||
<property>/sim/model/autopush/route/wingspan-m</property>
|
||||
<factor>0.5</factor>
|
||||
<axis>
|
||||
<x>0</x>
|
||||
<y>1</y>
|
||||
<z>0</z>
|
||||
</axis>
|
||||
<z-factor>0.0</z-factor>
|
||||
<z-min>1.0</z-min>
|
||||
</animation>
|
||||
|
||||
<animation>
|
||||
<type>translate</type>
|
||||
<object-name>WingtipR</object-name>
|
||||
<property>/sim/model/autopush/route/wingspan-m</property>
|
||||
<factor>-0.5</factor>
|
||||
<axis>
|
||||
<x>0</x>
|
||||
<y>1</y>
|
||||
<z>0</z>
|
||||
</axis>
|
||||
<z-factor>0.0</z-factor>
|
||||
<z-min>1.0</z-min>
|
||||
</animation>
|
||||
|
||||
<animation>
|
||||
<type>scale</type>
|
||||
<!-- Object names must be here, because we need to scale each separately, not the the whole thing at once. -->
|
||||
<object-name>Waypoint</object-name>
|
||||
<object-name>WingtipL</object-name>
|
||||
<object-name>WingtipR</object-name>
|
||||
<property>/sim/model/autopush/stopping-distance-m</property>
|
||||
<z-factor>0.0</z-factor>
|
||||
<z-min>1.0</z-min>
|
||||
</animation>
|
||||
|
||||
<animation>
|
||||
<type>material</type>
|
||||
<condition>
|
||||
<property>/sim/model/autopush/route/invalid</property>
|
||||
</condition>
|
||||
<diffuse>
|
||||
<red>1.0</red>
|
||||
<green>0.0</green>
|
||||
<blue>0.0</blue>
|
||||
</diffuse>
|
||||
<emission>
|
||||
<red>1.0</red>
|
||||
<green>0.0</green>
|
||||
<blue>0.0</blue>
|
||||
</emission>
|
||||
</animation>
|
||||
|
||||
</PropertyList>
|
141
YourAircraftDir/Nasal/Autopush/autopush.nas
Normal file
141
YourAircraftDir/Nasal/Autopush/autopush.nas
Normal file
|
@ -0,0 +1,141 @@
|
|||
# AUTOPUSH
|
||||
# Basic pushback logic class.
|
||||
#
|
||||
# Copyright (c) 2018 Autopush authors:
|
||||
# Joshua Davidson http://github.com/Octal450
|
||||
# Merspieler http://gitlab.com/merspieler
|
||||
# Distribute under the terms of GPLv2.
|
||||
|
||||
|
||||
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 _V = 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/autopush/available")) {
|
||||
_stop();
|
||||
return;
|
||||
}
|
||||
var force = 0.0;
|
||||
var x = 0.0;
|
||||
var y = 0.0;
|
||||
var z = 0.0;
|
||||
# Rollspeed is only adequate if the wheel is touching the ground.
|
||||
if (getprop("/gear/gear[0]/wow")) {
|
||||
var V = getprop("/gear/gear[0]/rollspeed-ms") * 3.6;
|
||||
var deltaV = getprop("/sim/model/autopush/target-speed-km_h") - V;
|
||||
var minus_dV = _V - V;
|
||||
var time = getprop("/sim/time/elapsed-sec");
|
||||
var prop = math.min(math.max(_K_p * deltaV, -_F_p), _F_p);
|
||||
var dt = time - _time;
|
||||
var deriv = 0.0;
|
||||
# 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 * deltaV * dt, -_F_i), _F_i);
|
||||
}
|
||||
if(dt > 0.002) {
|
||||
deriv = math.min(math.max(_K_d * minus_dV / dt, -_F_d), _F_d);
|
||||
}
|
||||
}
|
||||
var accel = prop + _int + deriv;
|
||||
if (_debug > 2) {
|
||||
print("pushback prop " ~ prop ~ ", _int " ~ _int ~ ", deriv " ~ deriv);
|
||||
}
|
||||
_V = V;
|
||||
_time = time;
|
||||
if (!_yasim) {
|
||||
force = accel * getprop("/fdm/jsbsim/inertia/weight-lbs") * _unitconv;
|
||||
} else {
|
||||
force = accel * getprop("/fdm/yasim/gross-weight-lbs") * _unitconv;
|
||||
}
|
||||
var pitch = getprop("/sim/model/autopush/pitch-deg") * D2R;
|
||||
z = math.sin(pitch);
|
||||
var pz = math.cos(pitch);
|
||||
var yaw = getprop("/sim/model/autopush/yaw") * _K_yaw;
|
||||
x = math.cos(yaw) * pz;
|
||||
y = math.sin(yaw) * pz;
|
||||
setprop("/sim/model/autopush/force-x", x);
|
||||
setprop("/sim/model/autopush/force-y", y);
|
||||
# JSBSim force's z is down.
|
||||
setprop("/sim/model/autopush/force-z", -z);
|
||||
}
|
||||
setprop("/sim/model/autopush/force-lbf", force);
|
||||
if (_yasim) {
|
||||
# The force is divided by YASim thrust="100000.0" setting.
|
||||
setprop("/sim/model/autopush/force-x-yasim", x * force * 0.00001);
|
||||
# YASim force's y is to the left.
|
||||
setprop("/sim/model/autopush/force-y-yasim", -y * force * 0.00001);
|
||||
setprop("/sim/model/autopush/force-z-yasim", z * force * 0.00001);
|
||||
}
|
||||
}
|
||||
|
||||
var _timer = maketimer(0.0167, func{_loop()});
|
||||
_timer.simulatedTime = 1;
|
||||
|
||||
var _start = func() {
|
||||
# Else overwritten by dialog.
|
||||
settimer(func() {
|
||||
setprop("/sim/model/autopush/target-speed-km_h", 0.0)
|
||||
}, 0.1, 1);
|
||||
_K_p = getprop("/sim/model/autopush/K_p");
|
||||
_F_p = getprop("/sim/model/autopush/F_p");
|
||||
_K_i = getprop("/sim/model/autopush/K_i");
|
||||
_F_i = getprop("/sim/model/autopush/F_i");
|
||||
_K_d = getprop("/sim/model/autopush/K_d");
|
||||
_F_d = getprop("/sim/model/autopush/F_d");
|
||||
_F = getprop("/sim/model/autopush/F");
|
||||
_T_f = getprop("/sim/model/autopush/T_f");
|
||||
_K_yaw = getprop("/sim/model/autopush/yaw-mult") * D2R;
|
||||
_yasim = (getprop("/sim/flight-model") == "yasim");
|
||||
_debug = getprop("/sim/model/autopush/debug") or 0;
|
||||
_int = 0.0;
|
||||
_V = 0.0;
|
||||
_time = getprop("/sim/time/elapsed-sec");
|
||||
setprop("/sim/model/autopush/connected", 1);
|
||||
if (!_timer.isRunning) {
|
||||
if (getprop("/sim/model/autopush/chocks")) {
|
||||
setprop("/sim/model/autopush/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/autopush/force-lbf", 0.0);
|
||||
if (_yasim) {
|
||||
setprop("/sim/model/autopush/force-x-yasim", 0.0);
|
||||
setprop("/sim/model/autopush/force-y-yasim", 0.0);
|
||||
}
|
||||
setprop("/sim/model/autopush/connected", 0);
|
||||
setprop("/sim/model/autopush/enabled", 0);
|
||||
}
|
||||
|
||||
setlistener("/sim/model/autopush/enabled", func(p) {
|
||||
var enabled = p.getValue();
|
||||
if ((enabled) and getprop("/sim/model/autopush/available")) {
|
||||
_start();
|
||||
} else {
|
||||
_stop();
|
||||
}
|
||||
}, 1, 0);
|
155
YourAircraftDir/Nasal/Autopush/driver.nas
Normal file
155
YourAircraftDir/Nasal/Autopush/driver.nas
Normal file
|
@ -0,0 +1,155 @@
|
|||
# AUTOPUSH
|
||||
# Pushback driver class.
|
||||
#
|
||||
# Command the pushback to tow/push the aircraft.
|
||||
#
|
||||
# Copyright (c) 2018 Autopush authors:
|
||||
# Joshua Davidson http://github.com/Octal450
|
||||
# Merspieler http://gitlab.com/merspieler
|
||||
# Distribute under the terms of GPLv2.
|
||||
|
||||
|
||||
var _K_V = nil;
|
||||
var _F_V = nil;
|
||||
var _R_turn_min = nil;
|
||||
var _D_stop = nil;
|
||||
var _K_psi = nil;
|
||||
var _F_psi = nil;
|
||||
var _K_psidot = nil;
|
||||
var _F_psidot = nil;
|
||||
var _debug = nil;
|
||||
var _psi = nil;
|
||||
var _time = nil;
|
||||
|
||||
var _route = nil;
|
||||
var _route_reverse = nil;
|
||||
var _push = nil;
|
||||
var _sign = nil;
|
||||
|
||||
var _to_wp = 0;
|
||||
var _is_last_wp = 0;
|
||||
var _is_reverse_wp = 0;
|
||||
|
||||
|
||||
var _advance_wp = func(flip_sign = 0) {
|
||||
_to_wp += 1;
|
||||
_is_last_wp = (_to_wp == (size(_route) - 1));
|
||||
_is_reverse_wp = (_route_reverse[_to_wp]);
|
||||
if (flip_sign) {
|
||||
_sign *= -1;
|
||||
_push = !_push;
|
||||
}
|
||||
if (_debug == 1) {
|
||||
print("autopush_driver to_wp " ~ _to_wp);
|
||||
}
|
||||
}
|
||||
|
||||
var _loop = func() {
|
||||
if (!getprop("/sim/model/autopush/connected")) {
|
||||
stop();
|
||||
return;
|
||||
}
|
||||
var (A, D) = courseAndDistance(_route[_to_wp]);
|
||||
D *= NM2M;
|
||||
var (psi_leg, D_leg) = courseAndDistance(_route[_to_wp - 1], _route[_to_wp]);
|
||||
var deltapsi = geo.normdeg180(A - psi_leg);
|
||||
var psi = getprop("/orientation/heading-deg") + _push * 180.0;
|
||||
var deltaA = math.min(math.max(_K_psi * geo.normdeg180(A - psi), -_F_psi), _F_psi);
|
||||
var time = getprop("/sim/time/elapsed-sec");
|
||||
var dt = time - _time;
|
||||
var minus_psidot = (dt > 0.002) * math.min(math.max(_K_psidot * (_psi - psi) / dt, -_F_psidot), _F_psidot);
|
||||
_psi = psi;
|
||||
_time = time;
|
||||
# TODO Either use _K_V and total remaining distance or turn radius to calculate speed.
|
||||
# TODO Make slider input override speed.
|
||||
var V = _F_V;
|
||||
if (_is_reverse_wp or _is_last_wp) {
|
||||
if ((D < _D_stop) or (abs(deltapsi) > 90.0)) {
|
||||
if (_is_last_wp) {
|
||||
_done();
|
||||
return;
|
||||
}
|
||||
if (_is_reverse_wp) {
|
||||
_advance_wp(1);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if ((D < _R_turn_min) or (abs(deltapsi) > 90.0)) {
|
||||
_advance_wp();
|
||||
}
|
||||
}
|
||||
var steering = math.min(math.max(_sign * (deltaA + minus_psidot), -1.0), 1.0);
|
||||
if (_debug > 1) {
|
||||
print("autopush_driver to_wp " ~ _to_wp ~ ", A " ~ geo.normdeg(A) ~ ", deltaA " ~ deltaA ~ ", minus_psidot " ~ minus_psidot);
|
||||
}
|
||||
setprop("/sim/model/autopush/target-speed-km_h", _sign * V);
|
||||
setprop("/sim/model/autopush/steer-cmd-norm", steering);
|
||||
}
|
||||
|
||||
var _timer = maketimer(0.051, func{_loop()});
|
||||
_timer.simulatedTime = 1;
|
||||
|
||||
var _done = func() {
|
||||
stop();
|
||||
autopush_route.clear();
|
||||
screen.log.write("(pushback): Pushback complete, please set parking brake.");
|
||||
}
|
||||
|
||||
var start = func() {
|
||||
if (_timer.isRunning) {
|
||||
gui.popupTip("Already moving");
|
||||
return;
|
||||
}
|
||||
if (!getprop("/sim/model/autopush/connected")) {
|
||||
gui.popupTip("Pushback not connected");
|
||||
return;
|
||||
}
|
||||
_route = autopush_route.route();
|
||||
_route_reverse = autopush_route.route_reverse();
|
||||
if ((_route == nil) or size(_route) < 2) {
|
||||
gui.popupTip("Pushback route empty or invalid");
|
||||
return;
|
||||
} else {
|
||||
autopush_route.done();
|
||||
}
|
||||
_K_V = getprop("/sim/model/autopush/driver/K_V");
|
||||
_F_V = getprop("/sim/model/autopush/driver/F_V");
|
||||
_R_turn_min = getprop("/sim/model/autopush/min-turn-radius-m");
|
||||
_D_stop = getprop("/sim/model/autopush/stopping-distance-m");
|
||||
_K_psi = getprop("/sim/model/autopush/driver/K_psi");
|
||||
_F_psi = getprop("/sim/model/autopush/driver/F_psi");
|
||||
_K_psidot = getprop("/sim/model/autopush/driver/K_psidot");
|
||||
_F_psidot = getprop("/sim/model/autopush/driver/F_psidot");
|
||||
_debug = getprop("/sim/model/autopush/debug") or 0;
|
||||
if (!_to_wp) {
|
||||
var (psi_park, D_park) = courseAndDistance(_route[0], _route[1]);
|
||||
_push = (abs(geo.normdeg180(getprop("/orientation/heading-deg") - psi_park)) > 90.0);
|
||||
_sign = 1.0 - 2.0 * _push;
|
||||
_advance_wp();
|
||||
_psi = 0.0;
|
||||
}
|
||||
_time = getprop("/sim/time/elapsed-sec");
|
||||
_timer.start();
|
||||
var endsign = _sign;
|
||||
for (ii = _to_wp; ii < size(_route_reverse); ii += 1) {
|
||||
if (_route_reverse[ii]) {
|
||||
endsign = -endsign;
|
||||
}
|
||||
}
|
||||
var (psi_twy, D_twy) = courseAndDistance(_route[size(_route) - 2], _route[size(_route) - 1]);
|
||||
if (endsign < 0.0) {
|
||||
screen.log.write("(pushback): Push back facing " ~ math.round(geo.normdeg(psi_twy + 180.0 - magvar()), 1.0) ~ ".");
|
||||
} else {
|
||||
screen.log.write("(pushback): Tow facing " ~ math.round(geo.normdeg(psi_twy - magvar()), 1.0) ~ ".");
|
||||
}
|
||||
}
|
||||
|
||||
var pause = func() {
|
||||
_timer.stop();
|
||||
setprop("/sim/model/autopush/target-speed-km_h", 0.0);
|
||||
}
|
||||
|
||||
var stop = func() {
|
||||
pause();
|
||||
_to_wp = 0;
|
||||
}
|
60
YourAircraftDir/Nasal/Autopush/dynarr.nas
Normal file
60
YourAircraftDir/Nasal/Autopush/dynarr.nas
Normal file
|
@ -0,0 +1,60 @@
|
|||
# Class for dynamic arrays
|
||||
#
|
||||
# Copyright (c) 2018 dynamic arrays authors:
|
||||
# Merspieler http://gitlab.com/merspieler
|
||||
# Distribute under the terms of GPLv2.
|
||||
|
||||
## 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;
|
||||
},
|
||||
|
||||
# delete an element from the array
|
||||
del: func(id)
|
||||
{
|
||||
me.size -= 1;
|
||||
for(ii = id; ii < me.size - 1; ii += 1){
|
||||
me.arr[ii] = me.arr[ii + 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];
|
||||
}
|
||||
};
|
432
YourAircraftDir/Nasal/Autopush/route.nas
Normal file
432
YourAircraftDir/Nasal/Autopush/route.nas
Normal file
|
@ -0,0 +1,432 @@
|
|||
# AUTOPUSH
|
||||
# Visual entry of pushback route.
|
||||
#
|
||||
# Copyright (c) 2018 Autopush authors:
|
||||
# Joshua Davidson http://github.com/Octal450
|
||||
# Merspieler http://gitlab.com/merspieler
|
||||
# Distribute under the terms of GPLv2.
|
||||
|
||||
|
||||
var _listener = nil;
|
||||
var _view_listener = nil;
|
||||
var _user_points = dynarr.dynarr.new(4);
|
||||
var _user_point_modes = dynarr.dynarr.new(4); # Modes: 0 = Bezier node, 1 = Bezier end/start node, 2 = Reverse
|
||||
var _route = [];
|
||||
var _route_hdg = [];
|
||||
var _route_reverse = [];
|
||||
var _top_view_index = nil;
|
||||
var _top_view_heading_offset_deg = 180.0;
|
||||
var _reset_view_index = nil;
|
||||
var _view_z_offset = nil;
|
||||
var _view_pitch_offset_deg = nil;
|
||||
var _view_heading_offset_deg = nil;
|
||||
var _user_point_models = [];
|
||||
var _waypoint_models = [];
|
||||
var _N = 0;
|
||||
var _show = 0;
|
||||
var _R_turn_min = 0;
|
||||
var _invalid = 0;
|
||||
|
||||
# Make top-down view point north in old FG.
|
||||
var __fg_version = num(string.replace(getprop("/sim/version/flightgear"),".",""));
|
||||
if (__fg_version < 201920) {
|
||||
_top_view_heading_offset_deg = 94.5;
|
||||
}
|
||||
|
||||
|
||||
var _add = func(pos) {
|
||||
if (_N) {
|
||||
var (A, S) = courseAndDistance(_user_points.arr[_N - 1], pos);
|
||||
S *= NM2M;
|
||||
if (S < _R_turn_min) {
|
||||
gui.popupTip("Too close to the previous point,\ntry again");
|
||||
return;
|
||||
}else if (S > 10000.0) {
|
||||
gui.popupTip("Too far from the previous point,\ntry again");
|
||||
return;
|
||||
}
|
||||
}
|
||||
_user_points.add(geo.Coord.new(pos));
|
||||
|
||||
if (_user_point_modes.maxsize == 1 and _user_point_modes.size == 1) {
|
||||
_user_point_modes.arr[0] = 0;
|
||||
} else {
|
||||
_user_point_modes.add(0);
|
||||
}
|
||||
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_route();
|
||||
_place_waypoint_models();
|
||||
}
|
||||
}
|
||||
|
||||
var delete_last = func() {
|
||||
if (_listener == nil) {
|
||||
return;
|
||||
}
|
||||
if (_N > 1) {
|
||||
_N -= 1;
|
||||
_user_points.del(_N);
|
||||
_user_point_modes.del(_N);
|
||||
_user_point_models[_N].remove();
|
||||
_user_point_models[_N] = nil;
|
||||
setsize(_user_point_models, _N);
|
||||
_calculate_route();
|
||||
_place_waypoint_models();
|
||||
}
|
||||
}
|
||||
|
||||
var _stop = func(fail = 0) {
|
||||
if (_listener != nil) {
|
||||
removelistener(_listener);
|
||||
_listener = nil;
|
||||
if (!fail) {
|
||||
settimer(func() {
|
||||
_finalize_top_view();
|
||||
gui.popupTip("Done");
|
||||
}, 1.0, 1);
|
||||
} else {
|
||||
_finalize_top_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 = 0; ii < _N; ii += 1) {
|
||||
var model = "Models/Autopush/cursor.xml";
|
||||
if (_user_point_modes.arr[ii] == 1) {
|
||||
model = "Models/Autopush/cursor_sharp.xml";
|
||||
} else if (_user_point_modes.arr[ii] == 2) {
|
||||
model = "Models/Autopush/cursor_reverse.xml";
|
||||
}
|
||||
_user_point_models[ii] = geo.put_model(model, 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], _route_hdg[ii]);
|
||||
}
|
||||
}
|
||||
|
||||
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 top_view = func() {
|
||||
if (_view_listener != nil) {
|
||||
return;
|
||||
}
|
||||
_top_view_index = view.indexof("Chase View Without Yaw");
|
||||
_reset_view_index = getprop("/sim/current-view/view-number");
|
||||
setprop("/sim/current-view/view-number", _top_view_index);
|
||||
_view_pitch_offset_deg = getprop("/sim/current-view/pitch-offset-deg");
|
||||
_view_heading_offset_deg = getprop("/sim/current-view/heading-offset-deg");
|
||||
_view_z_offset = getprop("/sim/current-view/z-offset-m");
|
||||
setprop("/sim/current-view/z-offset-m", -500.0);
|
||||
setprop("/sim/current-view/heading-offset-deg", _top_view_heading_offset_deg);
|
||||
setprop("/sim/current-view/pitch-offset-deg", 90.0);
|
||||
_view_listener = setlistener("/sim/current-view/name", func {
|
||||
_finalize_top_view();
|
||||
}, 0, 0);
|
||||
}
|
||||
|
||||
var _finalize_top_view = func() {
|
||||
if (_view_listener == nil) {
|
||||
return;
|
||||
}
|
||||
removelistener(_view_listener);
|
||||
_view_listener = nil;
|
||||
# Go back to the view to restore settings, in case user has switched away.
|
||||
setprop("/sim/current-view/view-number", _top_view_index);
|
||||
setprop("/sim/current-view/z-offset-m", _view_z_offset);
|
||||
setprop("/sim/current-view/heading-offset-deg", _view_heading_offset_deg);
|
||||
setprop("/sim/current-view/pitch-offset-deg", _view_pitch_offset_deg);
|
||||
setprop("/sim/current-view/view-number", _reset_view_index);
|
||||
if (!_show) {
|
||||
_clear_user_point_models();
|
||||
_clear_waypoint_models();
|
||||
}
|
||||
}
|
||||
|
||||
var _calculate_route = func() {
|
||||
_route = [];
|
||||
_route_reverse = [];
|
||||
var user_points = _user_points.get_sliced();
|
||||
var route = dynarr.dynarr.new();
|
||||
# add the first point cause it will be fix at this pos
|
||||
route.add(geo.Coord.new(user_points[0]));
|
||||
n = size(user_points);
|
||||
var base = 0;
|
||||
# Detect points where push/pull direction is reversed.
|
||||
for (var i = 0; i < n; i += 1) {
|
||||
if (i and (i < n - 1)) {
|
||||
if((_user_point_modes.arr[i] == 1) or (_user_point_modes.arr[i] == 2)) {
|
||||
var newmode = 1;
|
||||
var deltaA = abs(geo.normdeg180(user_points[i - 1].course_to(user_points[i]) - user_points[i].course_to(user_points[i + 1])));
|
||||
if (deltaA > 91.0) {
|
||||
newmode = 2;
|
||||
}
|
||||
if(newmode != _user_point_modes.arr[i]){
|
||||
_set_userpoint_mode(i, newmode);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
# Clear reverse for first and last points.
|
||||
if(_user_point_modes.arr[i] == 2) {
|
||||
if(_user_point_modes.arr[i] != 1){
|
||||
_set_userpoint_mode(i, 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
for (var i = 0; i < n; i += 1) {
|
||||
if (_user_point_modes.arr[i] or (i == n - 1)) {
|
||||
if (i - base > 0) {
|
||||
var bezier = _calculate_bezier(user_points[base:i]);
|
||||
if (bezier != nil) {
|
||||
var m = size(bezier);
|
||||
for (var j = 0; j < m; j += 1) {
|
||||
route.add(geo.Coord.new(bezier[j]));
|
||||
}
|
||||
}
|
||||
}
|
||||
base = i;
|
||||
route.add(geo.Coord.new(user_points[i]));
|
||||
if (_user_point_modes.arr[i] == 2) {
|
||||
var route_size = size(route.get_sliced());
|
||||
setsize(_route_reverse, route_size);
|
||||
_route_reverse[route_size - 1] = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
var PNumber = size(user_points);
|
||||
_route = route.get_sliced();
|
||||
setsize(_route_reverse, size(_route));
|
||||
_check_turn_radius();
|
||||
_calculate_hdg();
|
||||
}
|
||||
|
||||
var _calculate_bezier = func(user_points) {
|
||||
var route = dynarr.dynarr.new();
|
||||
|
||||
var PNumber = size(user_points);
|
||||
|
||||
if (PNumber > 1) {
|
||||
var pointList = [];
|
||||
setsize(pointList, PNumber);
|
||||
for (var i = 0; i < PNumber; i += 1) {
|
||||
pointList[i] = [];
|
||||
setsize(pointList[i], PNumber);
|
||||
}
|
||||
|
||||
pointList[0] = user_points;
|
||||
|
||||
var len = 0;
|
||||
for (var i = 0; i < PNumber - 1; i += 1) {
|
||||
len += user_points[i].distance_to(user_points[i + 1]);
|
||||
}
|
||||
|
||||
if (len < _R_turn_min) {
|
||||
route.add(geo.Coord.new(user_points[PNumber - 1]))
|
||||
} else {
|
||||
var step = _R_turn_min / len;
|
||||
|
||||
for (var i = step; i < 1 - step; 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);
|
||||
}
|
||||
}
|
||||
pointList[PNumber - 1][0].set_alt(geo.elevation(pointList[PNumber - 1][0].lat(),pointList[PNumber - 1][0].lon()));
|
||||
route.add(geo.Coord.new(pointList[PNumber - 1][0]));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return route.get_sliced();
|
||||
}
|
||||
|
||||
var _calculate_hdg = func() {
|
||||
_route_hdg = [];
|
||||
var route_hdg = dynarr.dynarr.new();
|
||||
var ilast = size(_route) - 1;
|
||||
for (i = 0; i < ilast; i += 1) {
|
||||
var hdg = _route[i].course_to(_route[i + 1]);
|
||||
route_hdg.add(hdg);
|
||||
}
|
||||
# Last heading would be undefined, so just repeat the one before the last.
|
||||
route_hdg.add(route_hdg.get_sliced()[ilast - 1]);
|
||||
_route_hdg = route_hdg.get_sliced();
|
||||
}
|
||||
|
||||
# Checks each waypoint's turn radius and marks the route invalid if
|
||||
# it is smaller than the aircraft's turn radius.
|
||||
var _check_turn_radius = func() {
|
||||
# A waypoint's turn radius is the radius of a circle circumscribed around the waypoint, previous and next waypoints.
|
||||
# Formula source: https://math.stackexchange.com/questions/947882/radius-of-circumscribed-circle-of-triangle-as-function-of-the-sides
|
||||
|
||||
var len = size(_route);
|
||||
_invalid = 0;
|
||||
|
||||
# We can't calculate the radius for the first and last point
|
||||
for (i = 1; i < len - 2; i += 1) {
|
||||
# Disable check for push and pull points
|
||||
if (_route_reverse[i] != 1) {
|
||||
var a = _route[i].distance_to(_route[i + 1]);
|
||||
var b = _route[i].distance_to(_route[i - 1]);
|
||||
var c = _route[i - 1].distance_to(_route[i + 1]);
|
||||
|
||||
|
||||
var margin = _R_turn_min / 5000;
|
||||
|
||||
# Stright line check with marging to prevent floating point error
|
||||
if (a + b + margin >= c and a + b - margin <= c) {
|
||||
var r = - 1;
|
||||
} else {
|
||||
var r = (a * b * c) / math.sqrt(
|
||||
2 * a * a * b * b
|
||||
+ 2 * a * a * c * c
|
||||
+ 2 * b * b * c * c
|
||||
- a * a * a * a
|
||||
- b * b * b * b
|
||||
- c * c * c * c
|
||||
);
|
||||
}
|
||||
|
||||
if ((r < _R_turn_min) and (r != -1)) {
|
||||
_invalid = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
setprop("/sim/model/autopush/route/invalid", _invalid);
|
||||
}
|
||||
|
||||
setlistener("/sim/model/autopush/route/show", func(p) {
|
||||
var show = p.getValue();
|
||||
if (_listener == nil) {
|
||||
if (show) {
|
||||
_place_user_point_models();
|
||||
_place_waypoint_models();
|
||||
} else {
|
||||
_clear_user_point_models();
|
||||
_clear_waypoint_models();
|
||||
}
|
||||
}
|
||||
_show = show;
|
||||
}, 1, 0);
|
||||
|
||||
|
||||
var enter = func() {
|
||||
clear();
|
||||
top_view();
|
||||
_R_turn_min = getprop("/sim/model/autopush/min-turn-radius-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());
|
||||
});
|
||||
# This property can be overridden manually, if needed.
|
||||
var wingspan = getprop("/sim/model/autopush/route/wingspan-m");
|
||||
if ((wingspan == nil) or (wingspan == 0.0)) {
|
||||
# JSBSim
|
||||
wingspan = getprop("/fdm/jsbsim/metrics/bw-ft");
|
||||
if (wingspan != nil) {
|
||||
wingspan *= FT2M;
|
||||
} else {
|
||||
# YAsim
|
||||
wingspan = getprop("/fdm/yasim/model/wings/wing/wing-span");
|
||||
}
|
||||
setprop("/sim/model/autopush/route/wingspan-m", wingspan);
|
||||
}
|
||||
}
|
||||
|
||||
var _set_userpoint_mode = func(id, mode) {
|
||||
if (_user_point_modes.arr[id] != mode) {
|
||||
_user_point_modes.arr[id] = mode;
|
||||
}
|
||||
if (_user_point_models[id] != nil) {
|
||||
_user_point_models[id].remove();
|
||||
var model = "Models/Autopush/cursor.xml";
|
||||
if (_user_point_modes.arr[id] == 1) {
|
||||
model = "Models/Autopush/cursor_sharp.xml";
|
||||
} else if (_user_point_modes.arr[id] == 2) {
|
||||
model = "Models/Autopush/cursor_reverse.xml";
|
||||
}
|
||||
_user_point_models[id] = geo.put_model(model, _user_points.get_sliced()[id], 0.0);
|
||||
}
|
||||
}
|
||||
|
||||
var toggle_sharp = func() {
|
||||
if (_listener == nil) {
|
||||
return;
|
||||
}
|
||||
id = _N - 1;
|
||||
if (_user_point_modes.arr[id]) {
|
||||
_set_userpoint_mode(id, 0);
|
||||
} else {
|
||||
_set_userpoint_mode(id, 1);
|
||||
}
|
||||
}
|
||||
|
||||
var done = func() {
|
||||
_stop(0);
|
||||
}
|
||||
|
||||
var clear = func() {
|
||||
autopush_driver.stop();
|
||||
_stop(1);
|
||||
_clear_user_point_models();
|
||||
_clear_waypoint_models();
|
||||
_N = 0;
|
||||
_user_points = dynarr.dynarr.new(4);
|
||||
_user_point_modes = dynarr.dynarr.new(1);
|
||||
}
|
||||
|
||||
var route = func() {
|
||||
if (_invalid or (_N < 2)) {
|
||||
return nil;
|
||||
}
|
||||
return _route;
|
||||
}
|
||||
|
||||
var route_reverse = func() {
|
||||
if (_invalid or (_N < 2)) {
|
||||
return nil;
|
||||
}
|
||||
return _route_reverse;
|
||||
}
|
30
YourAircraftDir/autopush-config.xml.template
Normal file
30
YourAircraftDir/autopush-config.xml.template
Normal file
|
@ -0,0 +1,30 @@
|
|||
<PropertyList>
|
||||
<steer-cmd-norm alias="/controls/flight/rudder"/>
|
||||
<yaw alias="/gear/gear[0]/steering-norm"/>
|
||||
<yaw-mult type="float">MULTIPLIER</yaw-mult>
|
||||
<pitch-deg type="float">PITCH</pitch-deg>
|
||||
<min-turn-radius-m type="float">MIN_RADIUS</min-turn-radius-m>
|
||||
<stopping-distance-m type="float">STOP_DIST</stopping-distance-m>
|
||||
<chocks alias="/controls/gear/wheel-chocks"/>
|
||||
<available type="int">1</available>
|
||||
<enabled type="int"/>
|
||||
<connected type="bool">false</connected>
|
||||
<target-speed-km_h type="float">0.0</target-speed-km_h>
|
||||
<K_p type="float">0.5</K_p>
|
||||
<F_p type="float">0.15</F_p>
|
||||
<K_i type="float">0.25</K_i>
|
||||
<F_i type="float">0.1</F_i>
|
||||
<K_d type="float">0.0</K_d>
|
||||
<F_d type="float">0.0</F_d>
|
||||
<driver>
|
||||
<F_V type="float">8.0</F_V>
|
||||
<K_psi type="float">0.03</K_psi>
|
||||
<F_psi type="float">1.0</F_psi>
|
||||
<K_psidot type="float">0.03</K_psidot>
|
||||
<F_psidot type="float">1.0</F_psidot>
|
||||
</driver>
|
||||
<route>
|
||||
<show type="bool"/>
|
||||
</route>
|
||||
<debug type="int">0</debug>
|
||||
</PropertyList>
|
360
YourAircraftDir/gui/dialogs/autopush.xml
Normal file
360
YourAircraftDir/gui/dialogs/autopush.xml
Normal file
|
@ -0,0 +1,360 @@
|
|||
<?xml version="1.0"?>
|
||||
|
||||
<!--
|
||||
|
||||
AUTOPUSH
|
||||
Pushback dialog.
|
||||
|
||||
Copyright (c) 2018 Autopush authors:
|
||||
Joshua Davidson http://github.com/Octal450
|
||||
Merspieler http://gitlab.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/autopush/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><</legend>
|
||||
<binding>
|
||||
<command>property-adjust</command>
|
||||
<property>/sim/model/autopush/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/autopush/steer-cmd-norm</property>
|
||||
<step>0.1</step>
|
||||
<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>></legend>
|
||||
<binding>
|
||||
<command>property-adjust</command>
|
||||
<property>/sim/model/autopush/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/autopush/steer-cmd-norm</property>
|
||||
<value>0.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><</legend>
|
||||
<binding>
|
||||
<command>property-adjust</command>
|
||||
<property>/sim/model/autopush/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/autopush/target-speed-km_h</property>
|
||||
<step>1.0</step>
|
||||
<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>></legend>
|
||||
<binding>
|
||||
<command>property-adjust</command>
|
||||
<property>/sim/model/autopush/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/autopush/target-speed-km_h</property>
|
||||
<value>0.0</value>
|
||||
</binding>
|
||||
<binding>
|
||||
<command>nasal</command>
|
||||
<script>autopush_driver.pause();</script>
|
||||
</binding>
|
||||
</button>
|
||||
|
||||
<text>
|
||||
<row>1</row>
|
||||
<col>5</col>
|
||||
<pref-width>16</pref-width>
|
||||
<property>/sim/model/autopush/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>Pause</legend>
|
||||
<binding>
|
||||
<command>nasal</command>
|
||||
<script>autopush_driver.pause();</script>
|
||||
</binding>
|
||||
</button>
|
||||
|
||||
<button>
|
||||
<row>0</row>
|
||||
<col>3</col>
|
||||
<pref-width>50</pref-width>
|
||||
<pref-height>25</pref-height>
|
||||
<legend>View</legend>
|
||||
<halign>left</halign>
|
||||
<binding>
|
||||
<command>nasal</command>
|
||||
<script>autopush_route.top_view();</script>
|
||||
</binding>
|
||||
</button>
|
||||
|
||||
<text>
|
||||
<row>1</row>
|
||||
<col>0</col>
|
||||
<label>Route:</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>
|
||||
<halign>left</halign>
|
||||
<label>Always Show</label>
|
||||
<property>/sim/model/autopush/route/show</property>
|
||||
<live>true</live>
|
||||
<binding>
|
||||
<command>dialog-apply</command>
|
||||
</binding>
|
||||
</checkbox>
|
||||
|
||||
<text>
|
||||
<row>2</row>
|
||||
<col>0</col>
|
||||
<label>Last Point:</label>
|
||||
<halign>left</halign>
|
||||
</text>
|
||||
|
||||
<button>
|
||||
<row>2</row>
|
||||
<col>1</col>
|
||||
<pref-width>50</pref-width>
|
||||
<pref-height>25</pref-height>
|
||||
<legend>Sharp</legend>
|
||||
<binding>
|
||||
<command>nasal</command>
|
||||
<script>autopush_route.toggle_sharp();</script>
|
||||
</binding>
|
||||
</button>
|
||||
|
||||
<button>
|
||||
<row>2</row>
|
||||
<col>2</col>
|
||||
<pref-width>50</pref-width>
|
||||
<pref-height>25</pref-height>
|
||||
<legend>Delete</legend>
|
||||
<binding>
|
||||
<command>nasal</command>
|
||||
<script>autopush_route.delete_last();</script>
|
||||
</binding>
|
||||
</button>
|
||||
|
||||
<checkbox>
|
||||
<row>2</row>
|
||||
<col>3</col>
|
||||
<halign>left</halign>
|
||||
<label>Show Wingtip</label>
|
||||
<live>true</live>
|
||||
<property>/sim/model/autopush/route/show-wingtip</property>
|
||||
<binding>
|
||||
<command>dialog-apply</command>
|
||||
</binding>
|
||||
</checkbox>
|
||||
|
||||
</group>
|
||||
|
||||
</group>
|
||||
|
||||
</PropertyList>
|
Loading…
Reference in a new issue