├── .gitignore ├── .screenshots ├── Figure_1.png ├── Figure_hdg_pd.png ├── Figure_hdg_pid.png ├── Figure_vs_pi.png ├── Screenshot 2020-11-30 15_03_52.png ├── Screenshot from 2019-10-10 09-35-38.png ├── Screenshot from 2019-10-10 09-38-07.png ├── Screenshot from 2019-10-10 09-45-32.png ├── autopilot.png ├── takeoff.png └── test_figure.png ├── .sols ├── alt_nested.py ├── fgclient.py ├── hdg_pd.py ├── hdg_pid.py └── vs_pi.py ├── README.md ├── README_windows.md ├── apreset.py ├── fgclient.py ├── fgplot.py ├── getaircraft.sh ├── hdg_p.py ├── logs ├── fglog191010135444.csv ├── fglog191010160201.csv ├── fglog201209163356.csv ├── fglog201209171929.csv └── fglog201209172907.csv ├── model.ipynb ├── model.py ├── requirements.txt ├── runfg.sh ├── takeoff.py ├── test_interface.py ├── vs_comp.py ├── vs_p.py └── vs_record.py /.gitignore: -------------------------------------------------------------------------------- 1 | __pycache__ 2 | venv 3 | J3Cub* 4 | Allegro* 5 | fglog*.csv 6 | .ipynb_checkpoints 7 | *.pyc 8 | .pylint.d 9 | -------------------------------------------------------------------------------- /.screenshots/Figure_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arthurrichards77/control_tutorial/dfab96bd258d409388115d3b35f4e33142e1565c/.screenshots/Figure_1.png -------------------------------------------------------------------------------- /.screenshots/Figure_hdg_pd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arthurrichards77/control_tutorial/dfab96bd258d409388115d3b35f4e33142e1565c/.screenshots/Figure_hdg_pd.png -------------------------------------------------------------------------------- /.screenshots/Figure_hdg_pid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arthurrichards77/control_tutorial/dfab96bd258d409388115d3b35f4e33142e1565c/.screenshots/Figure_hdg_pid.png -------------------------------------------------------------------------------- /.screenshots/Figure_vs_pi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arthurrichards77/control_tutorial/dfab96bd258d409388115d3b35f4e33142e1565c/.screenshots/Figure_vs_pi.png -------------------------------------------------------------------------------- /.screenshots/Screenshot 2020-11-30 15_03_52.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arthurrichards77/control_tutorial/dfab96bd258d409388115d3b35f4e33142e1565c/.screenshots/Screenshot 2020-11-30 15_03_52.png -------------------------------------------------------------------------------- /.screenshots/Screenshot from 2019-10-10 09-35-38.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arthurrichards77/control_tutorial/dfab96bd258d409388115d3b35f4e33142e1565c/.screenshots/Screenshot from 2019-10-10 09-35-38.png -------------------------------------------------------------------------------- /.screenshots/Screenshot from 2019-10-10 09-38-07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arthurrichards77/control_tutorial/dfab96bd258d409388115d3b35f4e33142e1565c/.screenshots/Screenshot from 2019-10-10 09-38-07.png -------------------------------------------------------------------------------- /.screenshots/Screenshot from 2019-10-10 09-45-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arthurrichards77/control_tutorial/dfab96bd258d409388115d3b35f4e33142e1565c/.screenshots/Screenshot from 2019-10-10 09-45-32.png -------------------------------------------------------------------------------- /.screenshots/autopilot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arthurrichards77/control_tutorial/dfab96bd258d409388115d3b35f4e33142e1565c/.screenshots/autopilot.png -------------------------------------------------------------------------------- /.screenshots/takeoff.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arthurrichards77/control_tutorial/dfab96bd258d409388115d3b35f4e33142e1565c/.screenshots/takeoff.png -------------------------------------------------------------------------------- /.screenshots/test_figure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arthurrichards77/control_tutorial/dfab96bd258d409388115d3b35f4e33142e1565c/.screenshots/test_figure.png -------------------------------------------------------------------------------- /.sols/alt_nested.py: -------------------------------------------------------------------------------- 1 | from fgclient import FgClient 2 | c = FgClient() 3 | c.ap_pitch_off() 4 | 5 | initial_altitide = c.altitude_ft() 6 | integral_error = 0.0 7 | kk = 0 8 | dt = 0.5 9 | while True: 10 | kk += 1 11 | c.tic() 12 | if kk > 10: 13 | alt_des = initial_altitide + 100 14 | else: 15 | alt_des = initial_altitide 16 | alt = c.altitude_ft() 17 | vs_des = 0.03*(alt_des - alt) 18 | vs = c.vertical_speed_fps() 19 | integral_error = integral_error + dt*(vs_des - vs) 20 | c.set_elevator(-0.014*((vs_des - vs) + 0.4*integral_error)) 21 | print(alt_des,alt,vs_des,vs) 22 | c.toc(dt) 23 | -------------------------------------------------------------------------------- /.sols/fgclient.py: -------------------------------------------------------------------------------- 1 | import socket 2 | import time 3 | import logging 4 | from warnings import warn 5 | import os 6 | 7 | fgclient_logger = logging.getLogger('fgclient') 8 | 9 | class FgClient: 10 | 11 | def __init__(self,host='127.0.0.1',port=5051,savelog=True): 12 | self._logger = None 13 | if savelog: 14 | self.init_logger() 15 | self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 16 | self.sock.connect((host,port)) 17 | self.term = bytes([13,10]) 18 | msg = b'data'+self.term 19 | self.sock.sendall(msg) 20 | self._tic = None 21 | 22 | def init_logger(self): 23 | self._logger = logging.getLogger('fgclient') 24 | self._logger.setLevel(logging.INFO) 25 | self._logger.handlers = [] # turn off hanging files 26 | if not os.path.isdir('logs'): 27 | os.mkdir('logs') 28 | filehandler = logging.FileHandler('logs/fglog'+time.strftime('%y%m%d%H%M%S')+'.csv') 29 | self._logger.addHandler(filehandler) 30 | 31 | def tic(self): 32 | self._tic = time.time() 33 | 34 | def toc(self,time_step): 35 | if self._tic: 36 | sleep_time = self._tic + time_step - time.time() 37 | if sleep_time>0.0: 38 | time.sleep(sleep_time) 39 | else: 40 | warn('time step overrun {0:4.2f}/{1:4.2f}'.format(time_step-sleep_time,time_step)) 41 | 42 | def _get_prop(self,prop_name): 43 | msg = bytes('get '+prop_name,encoding='utf8')+self.term 44 | self.sock.sendall(msg) 45 | data = self.sock.recv(1024) 46 | if self._logger: 47 | self._logger.debug('{},{},{},G'.format(time.time(),prop_name,str(data))) 48 | return(data) 49 | 50 | def get_prop_str(self,prop_name): 51 | return(str(self._get_prop(prop_name))) 52 | 53 | def get_prop_float(self,prop_name): 54 | res = float(self._get_prop(prop_name)) 55 | if self._logger: 56 | self._logger.info('{},{},{},G'.format(time.time(),prop_name,res)) 57 | return(res) 58 | 59 | def set_prop(self,prop_name,new_value): 60 | st = 'set {} {}'.format(prop_name,new_value) 61 | msg = bytes(st,encoding='utf8')+self.term 62 | self.sock.sendall(msg) 63 | if self._logger: 64 | self._logger.info('{},{},{},S'.format(time.time(),prop_name,new_value)) 65 | 66 | def log_entry(self,log_name,value): 67 | if self._logger: 68 | self._logger.info('{},{},{},L'.format(time.time(),log_name,value)) 69 | 70 | def vertical_speed_fps(self): 71 | return(self.get_prop_float('/velocities/vertical-speed-fps')) 72 | 73 | def heading_deg(self): 74 | return(self.get_prop_float('/orientation/heading-deg')) 75 | 76 | def altitude_ft(self): 77 | return(self.get_prop_float('/position/altitude-ft')) 78 | 79 | def get_elevator(self): 80 | return(self.get_prop_float('/controls/flight/elevator')) 81 | 82 | def get_aileron(self): 83 | return(self.get_prop_float('/controls/flight/aileron')) 84 | 85 | def set_elevator(self,val): 86 | self.set_prop('/controls/flight/elevator',val) 87 | 88 | def set_aileron(self,val): 89 | self.set_prop('/controls/flight/aileron',val) 90 | 91 | def ap_pitch_off(self): 92 | self.set_prop('/autopilot/locks/altitude','') 93 | 94 | def ap_pitch_vs(self,vs=0.0): 95 | self.set_prop('/autopilot/locks/altitude','vertical-speed-hold') 96 | self.set_prop('/autopilot/settings/vertical-speed-fpm',vs) 97 | 98 | def ap_roll_off(self): 99 | self.set_prop('/autopilot/locks/heading','') 100 | 101 | def ap_roll_hdg(self,hdg): 102 | self.set_prop('/autopilot/locks/heading','dg-heading-hold') 103 | self.set_prop('/autopilot/settings/heading-bug-deg',hdg) 104 | 105 | # little test routine: set autopilot on and print key data 106 | if __name__=="__main__": 107 | c = FgClient() 108 | # centre controls 109 | c.set_elevator(0.0) 110 | c.set_aileron(0.0) 111 | # AP on level and south 112 | c.ap_pitch_vs() 113 | c.ap_roll_hdg(180.0) 114 | while True: 115 | print(c.altitude_ft(),c.vertical_speed_fps(),c.heading_deg()) 116 | -------------------------------------------------------------------------------- /.sols/hdg_pd.py: -------------------------------------------------------------------------------- 1 | from fgclient import FgClient 2 | c = FgClient() 3 | 4 | hdg_des = c.heading_deg()+15 5 | if hdg_des<0: 6 | hdg_des+=360 7 | if hdg_des>360: 8 | hdg_des-=360 9 | 10 | c.ap_pitch_vs() 11 | c.ap_roll_off() 12 | 13 | last_hdg = None 14 | kk = 0 15 | while True: 16 | kk+=1 17 | c.tic() 18 | hdg = c.heading_deg() 19 | ail = 0.005*(hdg_des - hdg) 20 | if last_hdg: 21 | ail += -0.05*(hdg - last_hdg)/0.5 #comment between -0.0 and 5 to disable 22 | last_hdg = hdg 23 | c.set_aileron(ail) 24 | print(hdg_des,hdg,ail) 25 | c.toc(0.5) 26 | -------------------------------------------------------------------------------- /.sols/hdg_pid.py: -------------------------------------------------------------------------------- 1 | """ 2 | Implement PID control on the heading of FlightGear simulated aircraft 3 | """ 4 | from fgclient import FgClient 5 | c = FgClient() 6 | c.ap_roll_off() 7 | 8 | kk = 0 9 | dt = 0.5 10 | integral_error = 0.0 11 | initial_hdg = c.heading_deg() 12 | last_hdg = initial_hdg 13 | while True: 14 | kk += 1 15 | c.tic() 16 | if kk > 10: 17 | hdg_des = initial_hdg+15 18 | else: 19 | hdg_des = initial_hdg 20 | hdg = c.heading_deg() 21 | # differentiate 22 | hdg_deriv = (hdg - last_hdg)/dt 23 | last_hdg = hdg 24 | # integrate 25 | integral_error += dt*(hdg_des - hdg) 26 | c.set_aileron(0.01*((hdg_des - hdg) - 4*hdg_deriv + 0.03*integral_error)) 27 | print(hdg_des, hdg) 28 | c.toc(dt) 29 | -------------------------------------------------------------------------------- /.sols/vs_pi.py: -------------------------------------------------------------------------------- 1 | from fgclient import FgClient 2 | c = FgClient() 3 | c.ap_pitch_off() 4 | 5 | integral_error = 0.0 6 | kk = 0 7 | dt = 0.5 8 | while True: 9 | kk += 1 10 | c.tic() 11 | if kk > 10: 12 | vs_des = 5.0 13 | else: 14 | vs_des = 0.0 15 | vs = c.vertical_speed_fps() 16 | integral_error = integral_error + dt*(vs_des - vs) 17 | c.set_elevator(-0.014*((vs_des - vs) + 0.4*integral_error)) 18 | print(vs) 19 | c.toc(dt) 20 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # control_tutorial 2 | 3 | This is the Linux version! See also the [Windows version](README_windows.md). 4 | 5 | Control tutorial examples using FlightGear simulator. 6 | 7 | We're using aircraft as a case study for control because the dynamics responses are interesting but, 8 | for the trainer aircraft we'll experiment with, quite forgiving. We'll use [FlightGear](https://www.flightgear.org/) as its free, makes a good 9 | job of representing the aircraft dynamics, and provides an easy back door for interfacing with external programs. 10 | We will implement those programs in Python, using a custom interface class provided in this project. 11 | 12 | ## Installation 13 | 14 | See also the [instruction video](https://youtu.be/eEwiY_MJ2H4) on Youtube. 15 | 16 | ### FlightGear 17 | 18 | Install FlightGear using `sudo apt install flightgear`. Time for a cup of tea: it's quite a big install. 19 | 20 | ### Python FlightGear Interface 21 | 22 | Clone this repository somewhere on your PC: `git clone https://github.com/arthurrichards77/control_tutorial.git` 23 | 24 | ### The Allegro 2000 Aircraft 25 | 26 | The default aircraft models in FlightGear all have fancy autopilots that are hard to mess around with. Instead, we'll use an add-on aircraft that is easy to fly and easy to customize: the Allegro 2000 (wheeled version). You could install it anywhere, but I recommend putting it in your new `control_tutorial` folder: 27 | 28 | ``` 29 | cd control_tutorial 30 | source getaircraft.sh 31 | ``` 32 | 33 | > All this does is download and unzip a file: 34 | > ``` 35 | > wget http://mirrors.ibiblio.org/flightgear/ftp/Aircraft/Allegro-2000.zip 36 | > unzip Allegro-2000.zip 37 | > ``` 38 | 39 | ## Getting in the Air 40 | 41 | ### First Run and Testing 42 | 43 | Start FlightGear using our convenience script by running `source runfg.sh`. Sit back and you should arrive in Hawaii! Honolulu airport to be precise, which is FlightGear's default location. 44 | 45 | > The formal command line, enclosed in the script, is: 46 | > ``` 47 | > fgfs --aircraft=allegroW --fg-aircraft= --timeofday=morning --telnet=5051 48 | > ``` 49 | > The 'aircraft' but selects the Allegro-2000 with wheels and the 'fg-aircraft' tells FlightGear where to find it. 50 | > The 'timeofday' bit ensures you have daylight. Otherwise FlightGear uses the real time at the simulated location - and it's dark in Hawaii. 51 | > The 'telnet' bit opens a server port for us to access and manipulate the simulator data - this is the back door for Python. 52 | 53 | > All the Python code in this tutorial needs Python 3.x, hence all the examples are shown to be run using the `python3` command. If you have Python 3 as your default, perhaps in a virtual environment, you can just type `python`. 54 | 55 | Now, in a second terminal, run `python3 test_interface.py`. You should see numbers appear, changing but very close to zero, and if you go back over to FlightGear and press `H` (for head-up display) you should see an indicator move over on the left. These mean, respectively, that Python is able to read your vertical speed and fiddle with your elevator. 56 | 57 | ![Ready for takeoff](https://github.com/arthurrichards77/control_tutorial/raw/master/.screenshots/Screenshot%202020-11-30%2015_03_52.png) 58 | 59 | Kill the python script and now run `python3 fgplot.py` and you should see a plot similar to the one below. You can do this at any time, and the last set of signals both read from and written to FlightGear will be plotted for you. 60 | 61 | ![Test data plot](https://github.com/arthurrichards77/control_tutorial/raw/master/.screenshots/test_figure.png) 62 | 63 | ### First Flight 64 | 65 | We're not here to learn to fly... but we need to get our aircraft in the air before we can do much. The Allegro is a fairly forgiving trainer aircraft so will *almost* fly itself. To take off: 66 | 67 | 1. Press "Page Up" and hold for 5 seconds, to get the throttle all the way open. (You might see a little knob move in the cockpit.) 68 | 2. Press } three times to turn on the ignition. 69 | 2. Press S and hold for a second to start the engine. 70 | 2. Press Shift+B to take the brake off. 71 | 3. Just let the aircraft accelerate and after about five seconds, hit the down arrow twice, and you should take to the air. (If you really want to fly it, use 0 and Enter to steer using the rudder.) 72 | 4. When you get into the air, use the left and right arrow keys to bank, but use only small taps and then back to centre. Try and keep yourself about level, but don't worry if you climb in a spiral - we just need to gain height. 73 | 74 | > Need a breather? Press P at any time to pause the simulator. 75 | 76 | ![Flying](https://github.com/arthurrichards77/control_tutorial/raw/master/.screenshots/takeoff.png) 77 | 78 | Let's be lazy! Although the Allegro aircraft has minimal avionics, FlightGear provides us with a generic autopilot to control it. We need to get straight and level, flying north. 79 | 80 | 1. Press F11 to open the autopilot dialog. 81 | 2. Check the button next to "Heading Bug" and enter "0" as the desired heading. 82 | 3. Check the box next to "Heading Control" 83 | 4. Check the button next to "Vertical Speed" and ensure "0" is entered as the desired value. 84 | 5. Check the box next to "Pitch/Altitude Control" 85 | 6. Close the autopilot dialog and centre all other controls by pressing 5 on the numeric keypad. 86 | 87 | ![Autopilot](https://github.com/arthurrichards77/control_tutorial/raw/master/.screenshots/autopilot.png) 88 | 89 | You should now be able to relax as your aircraft flies itself off over the island and out to sea (although watch out for the mountains, and use the vertical speed to climb more if you have to...) 90 | 91 | > That should be it for the simulator. I recommend you pause it when not experimenting. If you crash, hit Shift+Esc to reset and start again from takeoff. 92 | 93 | ## Time to close a loop 94 | 95 | Look inside the file `vs_p.py` (meaning vertical speed, proportional control) using your favorite text editor (`gedit`? `nano`?) to view it. 96 | 97 | First, the FlightGear client module is loaded and we make a new client. We also turn off the autopilot pitch loop. 98 | ```python 99 | from fgclient import FgClient 100 | c = FgClient() 101 | c.ap_pitch_off() 102 | ``` 103 | Next, we start an infinite loop. The `c.tic()` call starts a timer in the client. We are going to try a step change in vertical speed: the desired value `vs_des` jumps from 0 to 5 after 10 steps. 104 | ```python 105 | kk = 0 106 | while True: 107 | kk+=1 108 | c.tic() 109 | if kk>10: 110 | vs_des = 5.0 111 | else: 112 | vs_des = 0.0 113 | ``` 114 | Now a simple proportional controller. Get the vertical speed, find the error between that and the desired vertical speed, and set the elevator to a multiple of that error. The multiplier here, `-0.01`, is known as the *proportional gain*. It's slightly weird for it to be negative: but in FlightGear, negative elevator points you upwards. 115 | ```python 116 | vs = c.vertical_speed_fps() 117 | c.set_elevator(-0.01*(vs_des - vs)) 118 | ``` 119 | Finally we print the speed, just to watch, and then check the timer. The `toc(0.5)` call means *wait until 0.5 seconds have passed since I last called tic()*. It allows for the fact that talking to FlightGear burns some time. 120 | ```python 121 | print(vs) 122 | c.toc(0.5) 123 | ``` 124 | 125 | Run the file using `python3 vs_p.py` and watch your aircraft. Did you see it climb? Kill vs_p.py again using Ctrl+C. To turn the autopilot back on and get yourself straight and level again, use `python3 apreset.py`. 126 | 127 | To see what happened in more detail, the client logs all the signals for us. Use `ls logs` to see what's in the log file directory. Files are tagged with the date and time they were started, so you should be able to choose the latest one. To view the results as a graph, use `python3 fgplot.py logs/fglog.csv`. As a shortcut, `python3 fgplot.py` will just use the last log created. 128 | 129 | ![Result plot](https://github.com/arthurrichards77/control_tutorial/raw/master/.screenshots/Figure_1.png) 130 | 131 | ### Time to do some work 132 | 133 | Play around with the proportional gain and investigate its effect. Pay particular attention to: 134 | * Stability: do we converge at all? 135 | * Overshoot: how far the other side to we go first? 136 | * Time to reach target - the *rise time* - even if shooting past it 137 | * Steady state error: how close to 5 FPS do we get? 138 | 139 | ## Challenges 140 | 141 | ### PI control 142 | 143 | Add *integral action* to your vertical speed controller, *i.e.* add a term to the control signal proportional to the integral of all past errors. 144 | 145 | > No need to be too worried about accuracy: a simple cumulative sum of the errors will do for the integral. 146 | 147 | Again, mess around with the gains, and identify which key measures (stability, overshoot, rise time, steady state error) are affected. Here's an example of how it can work. 148 | 149 | ![PI example result](https://github.com/arthurrichards77/control_tutorial/raw/master/.screenshots/Figure_vs_pi.png) 150 | 151 | ### Nested control 152 | 153 | Take your best vertical speed controller and add an *outer loop* that chooses the desired VS to control the altitude to a particular target. 154 | 155 | > * Use `c.altitude_ft()` to retrieve the altitude 156 | > * Just use small steps, say 10-50 feet. 157 | > * Consider putting limits on what VS can be requested by the outer loop. 158 | 159 | Mess around with the gain on the outer loop and evaluate the results, especially considering the rise times of the VS control and the altitude control. 160 | 161 | > Sadly, the interface with the FlightGear telnet server seems pretty slow, and it can take more than 1/10th of a second to fetch or send a piece of data. You might start seeing "overrun" messages with the nested loop, when you have to get altitude as well as vertical speed. Try increasing the time step in the `toc()` call to stop the messages. 162 | 163 | ### Heading control 164 | 165 | Adapt the VS controller to use heading control. *Set the integral gain to zero to begin, but leave the code in place.* Use `c.heading_deg()` to get the heading and `c.set_aileron(x)` to control the banking. 166 | 167 | > This should be a disaster, weaving around the sky in ever-increasing oscillations. Why? 168 | 169 | ### Derivative control 170 | 171 | Add derivative action to your heading controller, *i.e.* add a term in the control signal that is proportional to the rate of change of the heading. 172 | 173 | > Again, no need to be too worried about accurate differentiation: you can just use simple differencing. 174 | 175 | Investigate the effect of the gain on this term, *i.e.* the *derivative gain*. Make sure you look at the aileron signal as well as the heading. Here's an example. 176 | 177 | ![Example heading control result using PD](https://github.com/arthurrichards77/control_tutorial/raw/master/.screenshots/Figure_hdg_pd.png) 178 | 179 | ### PID 180 | 181 | With the proportional and derivative gains at values you like, re-introduce the integral gain to your heading controller. What is the effect? 182 | 183 | This controller with all three elements is a standard and common type of controller: Proportional + Integral + Derivative or PID for short. 184 | 185 | ### Tuning 186 | 187 | Can you tune your gains to achieve heading control to the following specification for a 15 degree heading change? 188 | * Rise time (time to first reach 90% of step) less than 5s 189 | * Overshoot <15% (i.e. go no more than 15% of 15 degrees beyond the target heading) 190 | * Settling time (time to converge within 5% of the steo around the target heading) less than 20s 191 | 192 | If this can't be done, how close can you get? What must I compromise on? 193 | 194 | ## Moving On 195 | 196 | Now have a look at the [Jupyter notebook on a model-based approach to control design](model.ipynb). 197 | -------------------------------------------------------------------------------- /README_windows.md: -------------------------------------------------------------------------------- 1 | # control_tutorial 2 | 3 | This is the Windows version! See also the [Linux version](README.md). 4 | 5 | Control tutorial examples using FlightGear simulator. 6 | 7 | We're using aircraft as a case study for control because the dynamics responses are interesting but, 8 | for the trainer aircraft we'll experiment with, quite forgiving. We'll use [FlightGear](https://www.flightgear.org/) as its free, makes a good 9 | job of representing the aircraft dynamics, and provides an easy back door for interfacing with external programs. 10 | We will implement those programs in Python, using a custom interface class provided in this project. 11 | 12 | ## Installation 13 | 14 | See also the [instruction video](https://youtu.be/k22bB9KeypE) on Youtube. 15 | 16 | ### Git 17 | 18 | Download via (https://git-scm.com/download/win) and install following the instructions. 19 | 20 | ### Anaconda 21 | 22 | > Anaconda is convenient but optional. Any combination of a terminal, an editor and a Python interpreter will work. I now use VS Code for this tutorial. 23 | 24 | Download via (https://www.anaconda.com/products/individual) and make sure you include the Spyder IDE (I think it's included by default). 25 | 26 | ### FlightGear 27 | 28 | *Watch out for all the ads on the website!* They all masquerade as download links. 29 | 30 | Install FlightGear by visiting (https://www.flightgear.org/download/) and selecting the Windows version. You'll be bounced to SourceForge for the download, and it may help to click 'Problems Downloading' and change to a UK mirror. Time for a cup of tea: it's quite a big install. 31 | 32 | ### Python FlightGear Interface 33 | 34 | Clone this repository somewhere on your PC: `git clone https://github.com/arthurrichards77/control_tutorial.git` 35 | 36 | ### The Allegro 2000 Aircraft 37 | 38 | Run FlightGear and select the Aircraft tab in the start-up wizard. Click Browse at the top centre and click Add Default Hangar over on the right. You should see lots of aircraft. Unselect the Filter option at the top left and then scroll down to Allegro 2000 (Wheels). CLick install. 39 | 40 | ## Getting in the Air 41 | 42 | ### First Run and Testing 43 | 44 | Start FlightGear from the Start menu and then 45 | * In the aircraft tab, select the Allegro 2000 46 | * In the location tab, choose Honolulu airport and runway 04L 47 | * In the environment tab, ensure time says Morning 48 | * In the settings tab, ensure that option `--props=5051` is included in the big command line box at the bottom 49 | * Click Fly 50 | 51 | Now, run Spyder by looking under ANaconda in your Start menu. Once inside, load `test_interface.py` from your cloned `control_tutorial` folder and run it by pressing F5. You should see numbers appear, changing but very close to zero, and if you go back over to FlightGear and press `H` (for head-up display) you should see an indicator move over on the left. These mean, respectively, that Python is able to read your vertical speed and fiddle with your elevator. 52 | 53 | ![Ready for takeoff](https://github.com/arthurrichards77/control_tutorial/raw/master/.screenshots/Screenshot%202020-11-30%2015_03_52.png) 54 | 55 | Kill the python script by pushing Ctrl+C in the console on the bottom right. Now load `fgplot.py` and run it by pressing F5. You should see a plot similar to the one below, either in a new window or in the Plots tab of the top right window pane. You can run `fgplot.py` at any time, and the last set of signals both read from and written to FlightGear will be plotted for you. 56 | 57 | ![Test data plot](https://github.com/arthurrichards77/control_tutorial/raw/master/.screenshots/test_figure.png) 58 | 59 | ### First Flight 60 | 61 | > You can skip all this and just run `takeoff.py`. It's not great automation as it tends to drift off the runway, but it should get you in the air. 62 | 63 | We're not here to learn to fly... but we need to get our aircraft in the air before we can do much. The Allegro is a fairly forgiving trainer aircraft so will *almost* fly itself. To take off: 64 | 65 | 1. Press "Page Up" and hold for 5 seconds, to get the throttle all the way open. (You might see a little knob move in the cockpit.) 66 | 2. Press } three times to turn on the ignition. 67 | 2. Press S and hold for a second to start the engine. 68 | 2. Press Shift+B to take the brake off. 69 | 3. Just let the aircraft accelerate and after about five seconds, hit the down arrow twice, and you should take to the air. (If you really want to fly it, use 0 and Enter to steer using the rudder.) 70 | 4. When you get into the air, use the left and right arrow keys to bank, but use only small taps and then back to centre. Try and keep yourself about level, but don't worry if you climb in a spiral - we just need to gain height. 71 | 72 | > Need a breather? Press P at any time to pause the simulator. 73 | 74 | ![Flying](https://github.com/arthurrichards77/control_tutorial/raw/master/.screenshots/takeoff.png) 75 | 76 | Let's be lazy! Although the Allegro aircraft has minimal avionics, FlightGear provides us with a generic autopilot to control it. We need to get straight and level, flying north. 77 | 78 | 1. Press F11 to open the autopilot dialog. 79 | 2. Check the button next to "Heading Bug" and enter "0" as the desired heading. 80 | 3. Check the box next to "Heading Control" 81 | 4. Check the button next to "Vertical Speed" and ensure "0" is entered as the desired value. 82 | 5. Check the box next to "Pitch/Altitude Control" 83 | 6. Close the autopilot dialog and centre all other controls by pressing 5 on the numeric keypad. 84 | 85 | ![Autopilot](https://github.com/arthurrichards77/control_tutorial/raw/master/.screenshots/autopilot.png) 86 | 87 | You should now be able to relax as your aircraft flies itself off over the island and out to sea (although watch out for the mountains, and use the vertical speed to climb more if you have to...) 88 | 89 | > That should be it for the simulator. I recommend you pause it when not experimenting. If you crash, hit Shift+Esc to reset and start again from takeoff. 90 | 91 | ## Time to close a loop 92 | 93 | Look inside the file `vs_p.py` (meaning vertical speed, proportional control) in Spyder. 94 | 95 | First, the FlightGear client module is loaded and we make a new client. We also turn off the autopilot pitch loop. 96 | ```python 97 | from fgclient import FgClient 98 | c = FgClient() 99 | c.ap_pitch_off() 100 | ``` 101 | Next, we start an infinite loop. The `c.tic()` call starts a timer in the client. We are going to try a step change in vertical speed: the desired value `vs_des` jumps from 0 to 5 after 10 steps. 102 | ```python 103 | kk = 0 104 | while True: 105 | kk+=1 106 | c.tic() 107 | if kk>10: 108 | vs_des = 5.0 109 | else: 110 | vs_des = 0.0 111 | ``` 112 | Now a simple proportional controller. Get the vertical speed, find the error between that and the desired vertical speed, and set the elevator to a multiple of that error. The multiplier here, `-0.01`, is known as the *proportional gain*. It's slightly weird for it to be negative: but in FlightGear, negative elevator points you upwards. 113 | ```python 114 | vs = c.vertical_speed_fps() 115 | c.set_elevator(-0.01*(vs_des - vs)) 116 | ``` 117 | Finally we print the speed, just to watch, and then check the timer. The `toc(0.5)` call means *wait until 0.5 seconds have passed since I last called tic()*. It allows for the fact that talking to FlightGear burns some time. 118 | ```python 119 | print(vs) 120 | c.toc(0.5) 121 | ``` 122 | 123 | Run the file using F5 and watch your aircraft. Did you see it climb? Kill vs_p.py again using Ctrl+C. To turn the autopilot back on and get yourself straight and level again, run `apreset.py`. 124 | 125 | To see what happened in more detail, the client logs all the signals for us. Use `ls logs` to see what's in the log file directory. Files are tagged with the date and time they were started, so you should be able to choose the latest one. To view the results as a graph, use `fgplot.py logs/fglog.csv`. As a shortcut, `fgplot.py` will just use the last log created. 126 | 127 | ![Result plot](https://github.com/arthurrichards77/control_tutorial/raw/master/.screenshots/Figure_1.png) 128 | 129 | ### Time to do some work 130 | 131 | Play around with the proportional gain and investigate its effect. Pay particular attention to: 132 | * Stability: do we converge at all? 133 | * Overshoot: how far the other side to we go first? 134 | * Time to reach target - the *rise time* - even if shooting past it 135 | * Steady state error: how close to 5 FPS do we get? 136 | 137 | ## Challenges 138 | 139 | ### PI control 140 | 141 | Add *integral action* to your vertical speed controller, *i.e.* add a term to the control signal proportional to the integral of all past errors. 142 | 143 | > No need to be too worried about accuracy: a simple cumulative sum of the errors will do for the integral. 144 | 145 | Again, mess around with the gains, and identify which key measures (stability, overshoot, rise time, steady state error) are affected. Here's an example of how it can work. 146 | 147 | ![PI example result](https://github.com/arthurrichards77/control_tutorial/raw/master/.screenshots/Figure_vs_pi.png) 148 | 149 | ### Nested control 150 | 151 | Take your best vertical speed controller and add an *outer loop* that chooses the desired VS to control the altitude to a particular target. 152 | 153 | > * Use `c.altitude_ft()` to retrieve the altitude 154 | > * Just use small steps, say 10-50 feet. 155 | > * Consider putting limits on what VS can be requested by the outer loop. 156 | 157 | Mess around with the gain on the outer loop and evaluate the results, especially considering the rise times of the VS control and the altitude control. 158 | 159 | > Sadly, the interface with the FlightGear telnet server seems pretty slow, and it can take more than 1/10th of a second to fetch or send a piece of data. You might start seeing "overrun" messages with the nested loop, when you have to get altitude as well as vertical speed. Try increasing the time step in the `toc()` call to stop the messages. 160 | 161 | ### Heading control 162 | 163 | Adapt the VS controller to use heading control. *Set the integral gain to zero to begin, but leave the code in place.* Use `c.heading_deg()` to get the heading and `c.set_aileron(x)` to control the banking. 164 | 165 | > This should be a disaster, weaving around the sky in ever-increasing oscillations. Why? 166 | 167 | ### Derivative control 168 | 169 | Add derivative action to your heading controller, *i.e.* add a term in the control signal that is proportional to the rate of change of the heading. 170 | 171 | > Again, no need to be too worried about accurate differentiation: you can just use simple differencing. 172 | 173 | Investigate the effect of the gain on this term, *i.e.* the *derivative gain*. Make sure you look at the aileron signal as well as the heading. Here's an example. 174 | 175 | ![Example heading control result using PD](https://github.com/arthurrichards77/control_tutorial/raw/master/.screenshots/Figure_hdg_pd.png) 176 | 177 | ### PID 178 | 179 | With the proportional and derivative gains at values you like, re-introduce the integral gain to your heading controller. What is the effect? 180 | 181 | This controller with all three elements is a standard and common type of controller: Proportional + Integral + Derivative or PID for short. 182 | 183 | ### Tuning 184 | 185 | Can you tune your gains to achieve heading control to the following specification for a 15 degree heading change? 186 | * Rise time (time to first reach 90% of step) less than 5s 187 | * Overshoot <15% (i.e. go no more than 15% of 15 degrees beyond the target heading) 188 | * Settling time (time to converge within 5% of the steo around the target heading) less than 20s 189 | 190 | If this can't be done, how close can you get? What must I compromise on? 191 | 192 | ## Moving On 193 | 194 | Now have a look at the [Jupyter notebook on a model-based approach to control design](model.ipynb). 195 | -------------------------------------------------------------------------------- /apreset.py: -------------------------------------------------------------------------------- 1 | from fgclient import FgClient 2 | 3 | c = FgClient(savelog=False) 4 | # centre controls 5 | c.set_elevator(0.0) 6 | c.set_aileron(0.0) 7 | # AP on level and south 8 | c.ap_pitch_vs() 9 | c.ap_roll_hdg(180.0) 10 | -------------------------------------------------------------------------------- /fgclient.py: -------------------------------------------------------------------------------- 1 | import socket 2 | import time 3 | import logging 4 | from warnings import warn 5 | import os 6 | 7 | fgclient_logger = logging.getLogger('fgclient') 8 | 9 | class FgClient: 10 | 11 | def __init__(self,host='127.0.0.1',port=5051,savelog=True): 12 | self._logger = None 13 | if savelog: 14 | self.init_logger() 15 | self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 16 | self.sock.connect((host,port)) 17 | self.term = bytes([13,10]) 18 | msg = b'data'+self.term 19 | self.sock.sendall(msg) 20 | self._tic = None 21 | 22 | def init_logger(self): 23 | self._logger = logging.getLogger('fgclient') 24 | self._logger.setLevel(logging.INFO) 25 | self._logger.handlers = [] # turn off hanging files 26 | if not os.path.isdir('logs'): 27 | os.mkdir('logs') 28 | filehandler = logging.FileHandler('logs/fglog'+time.strftime('%y%m%d%H%M%S')+'.csv') 29 | self._logger.addHandler(filehandler) 30 | 31 | def tic(self): 32 | self._tic = time.time() 33 | 34 | def toc(self,time_step): 35 | if self._tic: 36 | sleep_time = self._tic + time_step - time.time() 37 | if sleep_time>0.0: 38 | time.sleep(sleep_time) 39 | else: 40 | warn('time step overrun {0:4.2f}/{1:4.2f}'.format(time_step-sleep_time,time_step)) 41 | 42 | def _get_prop(self,prop_name): 43 | msg = bytes('get '+prop_name,encoding='utf8')+self.term 44 | self.sock.sendall(msg) 45 | data = self.sock.recv(1024) 46 | if self._logger: 47 | self._logger.debug('{},{},{},G'.format(time.time(),prop_name,str(data))) 48 | return(data) 49 | 50 | def get_prop_str(self,prop_name): 51 | return(str(self._get_prop(prop_name))) 52 | 53 | def get_prop_float(self,prop_name): 54 | res = float(self._get_prop(prop_name)) 55 | if self._logger: 56 | self._logger.info('{},{},{},G'.format(time.time(),prop_name,res)) 57 | return(res) 58 | 59 | def set_prop(self,prop_name,new_value): 60 | st = 'set {} {}'.format(prop_name,new_value) 61 | msg = bytes(st,encoding='utf8')+self.term 62 | self.sock.sendall(msg) 63 | if self._logger: 64 | self._logger.info('{},{},{},S'.format(time.time(),prop_name,new_value)) 65 | 66 | def log_entry(self,log_name,value): 67 | if self._logger: 68 | self._logger.info('{},{},{},L'.format(time.time(),log_name,value)) 69 | 70 | def vertical_speed_fps(self): 71 | return(self.get_prop_float('/velocities/vertical-speed-fps')) 72 | 73 | def heading_deg(self): 74 | return(self.get_prop_float('/orientation/heading-deg')) 75 | 76 | def altitude_ft(self): 77 | return(self.get_prop_float('/position/altitude-ft')) 78 | 79 | def get_elevator(self): 80 | return(self.get_prop_float('/controls/flight/elevator')) 81 | 82 | def get_aileron(self): 83 | return(self.get_prop_float('/controls/flight/aileron')) 84 | 85 | def set_elevator(self,val): 86 | self.set_prop('/controls/flight/elevator',val) 87 | 88 | def set_aileron(self,val): 89 | self.set_prop('/controls/flight/aileron',val) 90 | 91 | def ap_pitch_off(self): 92 | self.set_prop('/autopilot/locks/altitude','') 93 | 94 | def ap_pitch_vs(self,vs=0.0): 95 | self.set_prop('/autopilot/locks/altitude','vertical-speed-hold') 96 | self.set_prop('/autopilot/settings/vertical-speed-fpm',vs) 97 | 98 | def ap_roll_off(self): 99 | self.set_prop('/autopilot/locks/heading','') 100 | 101 | def ap_roll_hdg(self,hdg): 102 | self.set_prop('/autopilot/locks/heading','dg-heading-hold') 103 | self.set_prop('/autopilot/settings/heading-bug-deg',hdg) 104 | 105 | # little test routine: set autopilot on and print key data 106 | if __name__=="__main__": 107 | c = FgClient() 108 | # centre controls 109 | c.set_elevator(0.0) 110 | c.set_aileron(0.0) 111 | # AP on level and south 112 | c.ap_pitch_vs() 113 | c.ap_roll_hdg(180.0) 114 | while True: 115 | print(c.altitude_ft(),c.vertical_speed_fps(),c.heading_deg()) 116 | -------------------------------------------------------------------------------- /fgplot.py: -------------------------------------------------------------------------------- 1 | import csv 2 | import sys 3 | import os 4 | import matplotlib.pyplot as plt 5 | 6 | def import_log(file_name): 7 | 8 | print('Opening {}'.format(file_name)) 9 | data_dict = {} 10 | 11 | with open(file_name) as csv_file: 12 | csv_reader = csv.reader(csv_file, delimiter=',') 13 | line_count = 0 14 | for row in csv_reader: 15 | line_count += 1 16 | if not row[1] in data_dict.keys(): 17 | data_dict[row[1]] = ([], []) 18 | value = None 19 | stamp = None 20 | try: 21 | value = float(row[2]) 22 | stamp = float(row[0]) 23 | except ValueError: 24 | pass 25 | if stamp: 26 | data_dict[row[1]][0].append(stamp) 27 | data_dict[row[1]][1].append(value) 28 | print('Processed {} lines.'.format(line_count)) 29 | return(data_dict) 30 | 31 | def plot_log(file_name): 32 | 33 | data_dict = import_log(file_name) 34 | 35 | plot_keys = [k for k in data_dict if len(data_dict[k][0]) > 1] 36 | print(plot_keys) 37 | 38 | for i, key in enumerate(plot_keys): 39 | if i == 0: 40 | this_ax = plt.subplot(len(plot_keys), 1, i+1) 41 | top_ax = this_ax 42 | else: 43 | this_ax = plt.subplot(len(plot_keys), 1, i+1, sharex=top_ax) 44 | plt.plot(data_dict[key][0], data_dict[key][1]) 45 | plt.title(key) 46 | plt.show() 47 | 48 | def last_log_filename(): 49 | file_list = [fn for fn in os.listdir('logs') if fn.endswith('.csv')] 50 | file_list.sort() 51 | if len(file_list) == 0: 52 | raise FileNotFoundError('Unable to find last log file') 53 | file_name = 'logs/'+file_list[-1] 54 | return file_name 55 | 56 | if __name__ == '__main__': 57 | if len(sys.argv) == 2: 58 | file_name = sys.argv[1] 59 | else: 60 | file_name = last_log_filename() 61 | plot_log(file_name) 62 | -------------------------------------------------------------------------------- /getaircraft.sh: -------------------------------------------------------------------------------- 1 | wget http://mirrors.ibiblio.org/flightgear/ftp/Aircraft/Allegro-2000.zip 2 | unzip Allegro-2000.zip 3 | -------------------------------------------------------------------------------- /hdg_p.py: -------------------------------------------------------------------------------- 1 | from fgclient import FgClient 2 | c = FgClient() 3 | c.ap_roll_off() 4 | 5 | kk = 0 6 | dt = 0.5 7 | initial_hdg = c.heading_deg() 8 | while True: 9 | kk += 1 10 | c.tic() 11 | if kk > 10: 12 | hdg_des = initial_hdg+15 13 | else: 14 | hdg_des = initial_hdg 15 | hdg = c.heading_deg() 16 | c.set_aileron(0.01*(hdg_des - hdg)) 17 | print(hdg_des,hdg) 18 | c.toc(dt) 19 | -------------------------------------------------------------------------------- /logs/fglog191010135444.csv: -------------------------------------------------------------------------------- 1 | 1570712084.4529872,/autopilot/locks/altitude,,S 2 | 1570712084.9063742,/velocities/vertical-speed-fps,0.01184896566,G 3 | 1570712085.3062668,/controls/flight/elevator,0.0,G 4 | 1570712085.7059724,/velocities/vertical-speed-fps,0.01213056222,G 5 | 1570712086.1053247,/controls/flight/elevator,0.0,G 6 | 1570712086.5048602,/velocities/vertical-speed-fps,0.01280013658,G 7 | 1570712086.9046278,/controls/flight/elevator,0.0,G 8 | 1570712087.3047388,/velocities/vertical-speed-fps,0.01354167517,G 9 | 1570712087.704207,/controls/flight/elevator,0.0,G 10 | 1570712088.1041782,/velocities/vertical-speed-fps,0.01409235317,G 11 | 1570712088.5028975,/controls/flight/elevator,0.0,G 12 | 1570712088.9025545,/velocities/vertical-speed-fps,0.01486830879,G 13 | 1570712089.3022606,/controls/flight/elevator,0.0,G 14 | 1570712089.7028167,/velocities/vertical-speed-fps,0.01554726902,G 15 | 1570712090.102413,/controls/flight/elevator,0.0,G 16 | 1570712090.5023065,/velocities/vertical-speed-fps,0.01633886993,G 17 | 1570712090.9012623,/controls/flight/elevator,0.0,G 18 | 1570712091.3011303,/velocities/vertical-speed-fps,0.01700218581,G 19 | 1570712091.700502,/controls/flight/elevator,0.0,G 20 | 1570712092.1009028,/velocities/vertical-speed-fps,0.01769366302,G 21 | 1570712092.500793,/controls/flight/elevator,0.0,G 22 | 1570712092.9000862,/velocities/vertical-speed-fps,0.01839765348,G 23 | 1570712093.2994325,/controls/flight/elevator,0.0,G 24 | 1570712093.69896,/velocities/vertical-speed-fps,0.01917673834,G 25 | 1570712094.0985415,/controls/flight/elevator,0.0,G 26 | 1570712094.4982405,/velocities/vertical-speed-fps,0.01983379759,G 27 | 1570712094.897783,/controls/flight/elevator,0.0,G 28 | 1570712095.2974749,/velocities/vertical-speed-fps,0.02042827941,G 29 | 1570712095.6972892,/controls/flight/elevator,0.0,G 30 | 1570712096.09684,/velocities/vertical-speed-fps,0.02128245682,G 31 | 1570712096.4969382,/controls/flight/elevator,0.0,G 32 | 1570712096.896669,/velocities/vertical-speed-fps,0.02208031341,G 33 | 1570712097.2967775,/controls/flight/elevator,0.0,G 34 | 1570712097.6956093,/velocities/vertical-speed-fps,0.02295639366,G 35 | 1570712098.0947773,/controls/flight/elevator,-0.05,G 36 | 1570712098.4946039,/velocities/vertical-speed-fps,0.6134241223,G 37 | 1570712098.895242,/controls/flight/elevator,-0.05,G 38 | 1570712099.294278,/velocities/vertical-speed-fps,2.03940177,G 39 | 1570712099.693602,/controls/flight/elevator,-0.05,G 40 | 1570712100.093543,/velocities/vertical-speed-fps,3.336642981,G 41 | 1570712100.493025,/controls/flight/elevator,-0.05,G 42 | 1570712100.8937576,/velocities/vertical-speed-fps,4.461822033,G 43 | 1570712101.2931278,/controls/flight/elevator,-0.05,G 44 | 1570712101.692375,/velocities/vertical-speed-fps,5.376135826,G 45 | 1570712102.0927744,/controls/flight/elevator,-0.05,G 46 | 1570712102.4919288,/velocities/vertical-speed-fps,6.056304455,G 47 | 1570712102.891795,/controls/flight/elevator,-0.05,G 48 | 1570712103.290999,/velocities/vertical-speed-fps,6.490779877,G 49 | 1570712103.7068293,/controls/flight/elevator,-0.05,G 50 | 1570712104.0910451,/velocities/vertical-speed-fps,6.693520546,G 51 | 1570712104.5064375,/controls/flight/elevator,-0.05,G 52 | 1570712104.9064226,/velocities/vertical-speed-fps,6.671859264,G 53 | 1570712105.305963,/controls/flight/elevator,-0.05,G 54 | 1570712105.7058642,/velocities/vertical-speed-fps,6.451506615,G 55 | 1570712106.1058676,/controls/flight/elevator,-0.05,G 56 | 1570712106.5061195,/velocities/vertical-speed-fps,6.065446854,G 57 | 1570712106.9037046,/controls/flight/elevator,-0.05,G 58 | 1570712107.3047554,/velocities/vertical-speed-fps,5.549236298,G 59 | 1570712107.704039,/controls/flight/elevator,-0.05,G 60 | 1570712108.0922353,/velocities/vertical-speed-fps,4.940886974,G 61 | 1570712108.5036168,/controls/flight/elevator,-0.05,G 62 | 1570712108.90275,/velocities/vertical-speed-fps,4.279053688,G 63 | 1570712109.3024912,/controls/flight/elevator,-0.05,G 64 | 1570712109.702336,/velocities/vertical-speed-fps,3.60101223,G 65 | 1570712110.1023781,/controls/flight/elevator,-0.05,G 66 | 1570712110.501415,/velocities/vertical-speed-fps,2.941619158,G 67 | 1570712110.901901,/controls/flight/elevator,-0.05,G 68 | 1570712111.3012035,/velocities/vertical-speed-fps,2.331627369,G 69 | 1570712111.7004752,/controls/flight/elevator,-0.05,G 70 | 1570712112.1008122,/velocities/vertical-speed-fps,1.796843767,G 71 | 1570712112.500308,/controls/flight/elevator,-0.05,G 72 | 1570712112.9002957,/velocities/vertical-speed-fps,1.356698751,G 73 | 1570712113.2998116,/controls/flight/elevator,-0.05,G 74 | 1570712113.6995618,/velocities/vertical-speed-fps,1.027496457,G 75 | 1570712114.0990164,/controls/flight/elevator,-0.05,G 76 | 1570712114.4984436,/velocities/vertical-speed-fps,0.8085800409,G 77 | 1570712114.898377,/controls/flight/elevator,-0.05,G 78 | 1570712115.2981226,/velocities/vertical-speed-fps,0.7042922378,G 79 | 1570712115.6975627,/controls/flight/elevator,-0.05,G 80 | 1570712116.0973334,/velocities/vertical-speed-fps,0.708763361,G 81 | 1570712116.4969866,/controls/flight/elevator,-0.05,G 82 | 1570712116.8969836,/velocities/vertical-speed-fps,0.8108640909,G 83 | 1570712117.2967734,/controls/flight/elevator,-0.05,G 84 | 1570712117.6969533,/velocities/vertical-speed-fps,0.9957917929,G 85 | 1570712118.0965166,/controls/flight/elevator,-0.05,G 86 | 1570712118.4958534,/velocities/vertical-speed-fps,1.245699525,G 87 | 1570712118.8953242,/controls/flight/elevator,-0.05,G 88 | 1570712119.2944055,/velocities/vertical-speed-fps,1.541154027,G 89 | 1570712119.6950412,/controls/flight/elevator,-0.05,G 90 | 1570712120.0942214,/velocities/vertical-speed-fps,1.862280607,G 91 | 1570712120.4941554,/controls/flight/elevator,-0.05,G 92 | 1570712120.893354,/velocities/vertical-speed-fps,2.189940453,G 93 | 1570712121.2930403,/controls/flight/elevator,-0.05,G 94 | 1570712121.693269,/velocities/vertical-speed-fps,2.506598949,G 95 | 1570712122.0932753,/controls/flight/elevator,-0.05,G 96 | 1570712122.4923859,/velocities/vertical-speed-fps,2.797482252,G 97 | 1570712122.8924701,/controls/flight/elevator,-0.05,G 98 | 1570712123.2915647,/velocities/vertical-speed-fps,3.050177813,G 99 | 1570712123.6913202,/controls/flight/elevator,-0.05,G 100 | 1570712124.0912714,/velocities/vertical-speed-fps,3.255965471,G 101 | 1570712124.4915676,/controls/flight/elevator,-0.05,G 102 | 1570712124.9063187,/velocities/vertical-speed-fps,3.410418272,G 103 | 1570712125.30699,/controls/flight/elevator,-0.05,G 104 | 1570712125.7063718,/velocities/vertical-speed-fps,3.508088589,G 105 | 1570712126.1061714,/controls/flight/elevator,-0.05,G 106 | 1570712126.5054643,/velocities/vertical-speed-fps,3.551398039,G 107 | 1570712126.9051213,/controls/flight/elevator,-0.05,G 108 | 1570712127.3048522,/velocities/vertical-speed-fps,3.543635368,G 109 | 1570712127.7051651,/controls/flight/elevator,-0.05,G 110 | 1570712128.1045544,/velocities/vertical-speed-fps,3.490548134,G 111 | 1570712128.5044608,/controls/flight/elevator,-0.05,G 112 | 1570712128.9038408,/velocities/vertical-speed-fps,3.399147987,G 113 | 1570712129.3028774,/controls/flight/elevator,-0.05,G 114 | 1570712129.702904,/velocities/vertical-speed-fps,3.27776432,G 115 | 1570712130.1026826,/controls/flight/elevator,-0.05,G 116 | 1570712130.5027041,/velocities/vertical-speed-fps,3.135370255,G 117 | 1570712130.9025223,/controls/flight/elevator,-0.05,G 118 | 1570712131.3021116,/velocities/vertical-speed-fps,2.981051922,G 119 | 1570712131.7014527,/controls/flight/elevator,-0.05,G 120 | 1570712132.101926,/velocities/vertical-speed-fps,2.823626995,G 121 | 1570712132.5026445,/controls/flight/elevator,-0.05,G 122 | 1570712132.9002862,/velocities/vertical-speed-fps,2.671214342,G 123 | 1570712133.299921,/controls/flight/elevator,-0.05,G 124 | 1570712133.7001333,/velocities/vertical-speed-fps,2.530850887,G 125 | 1570712134.099708,/controls/flight/elevator,-0.05,G 126 | 1570712134.4987168,/velocities/vertical-speed-fps,2.408387423,G 127 | 1570712134.8983006,/controls/flight/elevator,-0.05,G 128 | 1570712135.29876,/velocities/vertical-speed-fps,2.308946371,G 129 | 1570712135.6978076,/controls/flight/elevator,-0.05,G 130 | 1570712136.0979168,/velocities/vertical-speed-fps,2.233152866,G 131 | 1570712136.4973454,/controls/flight/elevator,-0.05,G 132 | 1570712136.8974392,/velocities/vertical-speed-fps,2.183416605,G 133 | 1570712137.2974234,/controls/flight/elevator,-0.05,G 134 | 1570712137.6972923,/velocities/vertical-speed-fps,2.159640551,G 135 | 1570712138.096276,/controls/flight/elevator,-0.05,G 136 | 1570712138.4958396,/velocities/vertical-speed-fps,2.161980867,G 137 | 1570712138.8960729,/controls/flight/elevator,-0.05,G 138 | 1570712139.294709,/velocities/vertical-speed-fps,2.184008121,G 139 | 1570712139.6944165,/controls/flight/elevator,-0.05,G 140 | 1570712140.0945501,/velocities/vertical-speed-fps,2.224967957,G 141 | 1570712140.494233,/controls/flight/elevator,-0.05,G 142 | 1570712140.8944027,/velocities/vertical-speed-fps,2.280326605,G 143 | 1570712141.2934122,/controls/flight/elevator,-0.05,G 144 | 1570712141.69296,/velocities/vertical-speed-fps,2.345760345,G 145 | 1570712142.0930386,/controls/flight/elevator,-0.05,G 146 | 1570712142.4932272,/velocities/vertical-speed-fps,2.417004347,G 147 | 1570712142.8925693,/controls/flight/elevator,-0.05,G 148 | 1570712143.2925363,/velocities/vertical-speed-fps,2.489624977,G 149 | 1570712143.6912768,/controls/flight/elevator,-0.05,G 150 | 1570712144.091531,/velocities/vertical-speed-fps,2.559651852,G 151 | 1570712144.508124,/controls/flight/elevator,-0.05,G 152 | 1570712144.891179,/velocities/vertical-speed-fps,2.624475479,G 153 | 1570712145.3064082,/controls/flight/elevator,-0.05,G 154 | 1570712145.7063434,/velocities/vertical-speed-fps,2.680103302,G 155 | 1570712146.106201,/controls/flight/elevator,-0.05,G 156 | 1570712146.506836,/velocities/vertical-speed-fps,2.725074291,G 157 | 1570712146.9057455,/controls/flight/elevator,-0.05,G 158 | 1570712147.3057005,/velocities/vertical-speed-fps,2.758096218,G 159 | 1570712147.704874,/controls/flight/elevator,-0.05,G 160 | 1570712148.1045165,/velocities/vertical-speed-fps,2.77872467,G 161 | 1570712148.504844,/controls/flight/elevator,-0.05,G 162 | 1570712148.905102,/velocities/vertical-speed-fps,2.786227703,G 163 | 1570712149.3042643,/controls/flight/elevator,-0.05,G 164 | 1570712149.7034032,/velocities/vertical-speed-fps,2.781803608,G 165 | 1570712150.103027,/controls/flight/elevator,-0.05,G 166 | 1570712150.502703,/velocities/vertical-speed-fps,2.768756151,G 167 | 1570712150.9029136,/controls/flight/elevator,-0.05,G 168 | 1570712151.3022475,/velocities/vertical-speed-fps,2.746729136,G 169 | -------------------------------------------------------------------------------- /logs/fglog191010160201.csv: -------------------------------------------------------------------------------- 1 | 1570719721.672548,/autopilot/locks/altitude,,S 2 | 1570719722.0998793,/velocities/vertical-speed-fps,0.01900465228,G 3 | 1570719722.1001005,/controls/flight/elevator,0.000387694906512,S 4 | 1570719722.4997883,/velocities/vertical-speed-fps,0.01885759644,G 5 | 1570719722.4999807,/controls/flight/elevator,0.000384694967376,S 6 | 1570719722.8988512,/velocities/vertical-speed-fps,0.01370437536,G 7 | 1570719722.8990493,/controls/flight/elevator,0.000279569257344,S 8 | 1570719723.4987462,/velocities/vertical-speed-fps,0.004752727225,G 9 | 1570719723.4989636,/controls/flight/elevator,9.695563539000001e-05,S 10 | 1570719723.898494,/velocities/vertical-speed-fps,0.0006758322124,G 11 | 1570719723.8987076,/controls/flight/elevator,1.3786977132959999e-05,S 12 | 1570719724.498559,/velocities/vertical-speed-fps,-0.001442401088,G 13 | 1570719724.4987862,/controls/flight/elevator,-2.94249821952e-05,S 14 | 1570719724.8981671,/velocities/vertical-speed-fps,-0.001032521366,G 15 | 1570719724.8983934,/controls/flight/elevator,-2.10634358664e-05,S 16 | 1570719725.4976466,/velocities/vertical-speed-fps,-0.00014079838,G 17 | 1570719725.4978616,/controls/flight/elevator,-2.872286952e-06,S 18 | 1570719725.8970683,/velocities/vertical-speed-fps,0.0006069974625,G 19 | 1570719725.8972902,/controls/flight/elevator,1.2382748235e-05,S 20 | 1570719726.4963598,/velocities/vertical-speed-fps,0.001827250002,G 21 | 1570719726.4966707,/controls/flight/elevator,3.7275900040800005e-05,S 22 | 1570719726.8962905,/velocities/vertical-speed-fps,0.0029098331,G 23 | 1570719726.8964913,/controls/flight/elevator,-0.10194063940476,S 24 | 1570719727.4953356,/velocities/vertical-speed-fps,0.2078715861,G 25 | 1570719727.495538,/controls/flight/elevator,-0.09775941964356001,S 26 | 1570719727.895871,/velocities/vertical-speed-fps,1.786803365,G 27 | 1570719727.8960717,/controls/flight/elevator,-0.065549211354,S 28 | 1570719728.4945953,/velocities/vertical-speed-fps,3.780896187,G 29 | 1570719728.4947937,/controls/flight/elevator,-0.0248697177852,S 30 | 1570719728.8946846,/velocities/vertical-speed-fps,4.583537579,G 31 | 1570719728.8949025,/controls/flight/elevator,-0.008495833388400006,S 32 | 1570719729.4933763,/velocities/vertical-speed-fps,4.995848656,G 33 | 1570719729.4936597,/controls/flight/elevator,-8.468741760000569e-05,S 34 | 1570719729.8932195,/velocities/vertical-speed-fps,4.864774704,G 35 | 1570719729.893449,/controls/flight/elevator,-0.0027585960383999957,S 36 | 1570719730.4937239,/velocities/vertical-speed-fps,4.468339443,G 37 | 1570719730.4939811,/controls/flight/elevator,-0.010845875362800008,S 38 | 1570719730.8927863,/velocities/vertical-speed-fps,4.16980648,G 39 | 1570719730.8930407,/controls/flight/elevator,-0.016935947808,S 40 | 1570719731.4929924,/velocities/vertical-speed-fps,3.805098057,G 41 | 1570719731.493252,/controls/flight/elevator,-0.024375999637200003,S 42 | 1570719731.8924408,/velocities/vertical-speed-fps,3.633427143,G 43 | 1570719731.8926961,/controls/flight/elevator,-0.027878086282800002,S 44 | 1570719732.4912748,/velocities/vertical-speed-fps,3.455849171,G 45 | 1570719732.4915953,/controls/flight/elevator,-0.0315006769116,S 46 | 1570719732.907588,/velocities/vertical-speed-fps,3.379198551,G 47 | 1570719732.9078465,/controls/flight/elevator,-0.033064349559600005,S 48 | 1570719733.5080025,/velocities/vertical-speed-fps,3.286030769,G 49 | 1570719733.5082612,/controls/flight/elevator,-0.034964972312400006,S 50 | 1570719733.9066114,/velocities/vertical-speed-fps,3.235562325,G 51 | 1570719733.9068608,/controls/flight/elevator,-0.03599452857,S 52 | 1570719734.5066662,/velocities/vertical-speed-fps,3.164484262,G 53 | 1570719734.5069213,/controls/flight/elevator,-0.0374445210552,S 54 | 1570719734.9064622,/velocities/vertical-speed-fps,3.119522572,G 55 | 1570719734.9067366,/controls/flight/elevator,-0.0383617395312,S 56 | 1570719735.5056148,/velocities/vertical-speed-fps,3.054044962,G 57 | 1570719735.5058277,/controls/flight/elevator,-0.03969748277520001,S 58 | 1570719735.9053428,/velocities/vertical-speed-fps,3.013707876,G 59 | 1570719735.905618,/controls/flight/elevator,-0.040520359329600006,S 60 | 1570719736.504654,/velocities/vertical-speed-fps,2.957917213,G 61 | 1570719736.5048726,/controls/flight/elevator,-0.0416584888548,S 62 | 1570719736.9041283,/velocities/vertical-speed-fps,2.925111294,G 63 | 1570719736.9043467,/controls/flight/elevator,-0.0423277296024,S 64 | 1570719737.5043645,/velocities/vertical-speed-fps,2.881057024,G 65 | 1570719737.504622,/controls/flight/elevator,-0.0432264367104,S 66 | 1570719737.90443,/velocities/vertical-speed-fps,2.855641365,G 67 | 1570719737.9046416,/controls/flight/elevator,-0.04374491615400001,S 68 | 1570719738.5034292,/velocities/vertical-speed-fps,2.821818352,G 69 | 1570719738.5036478,/controls/flight/elevator,-0.0444349056192,S 70 | 1570719738.9030592,/velocities/vertical-speed-fps,2.80201292,G 71 | 1570719738.9032857,/controls/flight/elevator,-0.044838936432,S 72 | 1570719739.502563,/velocities/vertical-speed-fps,2.775517702,G 73 | 1570719739.5027792,/controls/flight/elevator,-0.0453794388792,S 74 | 1570719739.9025776,/velocities/vertical-speed-fps,2.759782791,G 75 | 1570719739.9028504,/controls/flight/elevator,-0.0457004310636,S 76 | 1570719740.5017262,/velocities/vertical-speed-fps,2.738647223,G 77 | 1570719740.501941,/controls/flight/elevator,-0.0461315966508,S 78 | 1570719740.9015524,/velocities/vertical-speed-fps,2.726153851,G 79 | 1570719740.9017625,/controls/flight/elevator,-0.046386461439600006,S 80 | 1570719741.5012987,/velocities/vertical-speed-fps,2.709746122,G 81 | 1570719741.5016007,/controls/flight/elevator,-0.04672117911120001,S 82 | 1570719741.900287,/velocities/vertical-speed-fps,2.699739933,G 83 | 1570719741.9005177,/controls/flight/elevator,-0.0469253053668,S 84 | 1570719742.5001376,/velocities/vertical-speed-fps,2.686861753,G 85 | 1570719742.5003667,/controls/flight/elevator,-0.047188020238800005,S 86 | 1570719742.8991082,/velocities/vertical-speed-fps,2.678851843,G 87 | 1570719742.8993733,/controls/flight/elevator,-0.047351422402800006,S 88 | 1570719743.498418,/velocities/vertical-speed-fps,2.668582916,G 89 | 1570719743.4986458,/controls/flight/elevator,-0.0475609085136,S 90 | 1570719743.8991542,/velocities/vertical-speed-fps,2.662243843,G 91 | 1570719743.8994262,/controls/flight/elevator,-0.0476902256028,S 92 | 1570719744.4988322,/velocities/vertical-speed-fps,2.654243231,G 93 | 1570719744.4990966,/controls/flight/elevator,-0.0478534380876,S 94 | 1570719744.8983862,/velocities/vertical-speed-fps,2.648999453,G 95 | 1570719744.8986452,/controls/flight/elevator,-0.0479604111588,S 96 | 1570719745.4977362,/velocities/vertical-speed-fps,2.64253521,G 97 | 1570719745.497983,/controls/flight/elevator,-0.048092281716,S 98 | 1570719745.8976123,/velocities/vertical-speed-fps,2.638342619,G 99 | 1570719745.897861,/controls/flight/elevator,-0.048177810572400004,S 100 | 1570719746.496969,/velocities/vertical-speed-fps,2.633211136,G 101 | 1570719746.4972188,/controls/flight/elevator,-0.04828249282560001,S 102 | 1570719746.8964171,/velocities/vertical-speed-fps,2.629850864,G 103 | 1570719746.8966699,/controls/flight/elevator,-0.04835104237440001,S 104 | 1570719747.4958105,/velocities/vertical-speed-fps,2.62559557,G 105 | 1570719747.4960704,/controls/flight/elevator,-0.048437850372,S 106 | 1570719747.8952513,/velocities/vertical-speed-fps,2.622961044,G 107 | 1570719747.8955085,/controls/flight/elevator,-0.0484915947024,S 108 | 1570719748.4953218,/velocities/vertical-speed-fps,2.619660139,G 109 | 1570719748.4955833,/controls/flight/elevator,-0.0485589331644,S 110 | 1570719748.8945003,/velocities/vertical-speed-fps,2.617535591,G 111 | 1570719748.8947444,/controls/flight/elevator,-0.0486022739436,S 112 | 1570719749.4945326,/velocities/vertical-speed-fps,2.614791632,G 113 | 1570719749.4947834,/controls/flight/elevator,-0.0486582507072,S 114 | 1570719749.8939042,/velocities/vertical-speed-fps,2.612833023,G 115 | 1570719749.894154,/controls/flight/elevator,-0.048698206330800006,S 116 | 1570719750.4937365,/velocities/vertical-speed-fps,2.610502005,G 117 | 1570719750.4939888,/controls/flight/elevator,-0.048745759098000004,S 118 | 1570719750.893115,/velocities/vertical-speed-fps,2.608765364,G 119 | 1570719750.8933628,/controls/flight/elevator,-0.048781186574400004,S 120 | 1570719751.4927483,/velocities/vertical-speed-fps,2.606744289,G 121 | 1570719751.4929967,/controls/flight/elevator,-0.04882241650440001,S 122 | 1570719751.892474,/velocities/vertical-speed-fps,2.605389357,G 123 | 1570719751.8927221,/controls/flight/elevator,-0.0488500571172,S 124 | 1570719752.4919133,/velocities/vertical-speed-fps,2.603796959,G 125 | 1570719752.4921672,/controls/flight/elevator,-0.04888254203640001,S 126 | 1570719752.890964,/velocities/vertical-speed-fps,2.602736235,G 127 | 1570719752.8912108,/controls/flight/elevator,-0.048904180806,S 128 | 1570719753.4911852,/velocities/vertical-speed-fps,2.601237535,G 129 | 1570719753.491441,/controls/flight/elevator,-0.048934754286,S 130 | 1570719753.9068902,/velocities/vertical-speed-fps,2.600107908,G 131 | 1570719753.9071295,/controls/flight/elevator,-0.0489577986768,S 132 | 1570719754.5062082,/velocities/vertical-speed-fps,2.598871946,G 133 | 1570719754.5064383,/controls/flight/elevator,-0.0489830123016,S 134 | 1570719754.906579,/velocities/vertical-speed-fps,2.597999096,G 135 | 1570719754.9068065,/controls/flight/elevator,-0.0490008184416,S 136 | 1570719755.5062335,/velocities/vertical-speed-fps,2.597013474,G 137 | 1570719755.506488,/controls/flight/elevator,-0.0490209251304,S 138 | 1570719755.9057689,/velocities/vertical-speed-fps,2.596350193,G 139 | 1570719755.906022,/controls/flight/elevator,-0.0490344560628,S 140 | 1570719756.5050435,/velocities/vertical-speed-fps,2.595433474,G 141 | 1570719756.5052865,/controls/flight/elevator,-0.0490531571304,S 142 | 1570719756.9048767,/velocities/vertical-speed-fps,2.594838858,G 143 | 1570719756.9051096,/controls/flight/elevator,-0.0490652872968,S 144 | 1570719757.5047412,/velocities/vertical-speed-fps,2.594116211,G 145 | 1570719757.5050023,/controls/flight/elevator,-0.04908002929560001,S 146 | 1570719757.9046936,/velocities/vertical-speed-fps,2.593553066,G 147 | 1570719757.9049516,/controls/flight/elevator,-0.0490915174536,S 148 | 1570719758.5033348,/velocities/vertical-speed-fps,2.592723846,G 149 | 1570719758.5035992,/controls/flight/elevator,-0.0491084335416,S 150 | 1570719758.9029415,/velocities/vertical-speed-fps,2.5920856,G 151 | 1570719758.903194,/controls/flight/elevator,-0.04912145376,S 152 | 1570719759.5021758,/velocities/vertical-speed-fps,2.591231346,G 153 | 1570719759.5024035,/controls/flight/elevator,-0.049138880541600004,S 154 | 1570719759.9021096,/velocities/vertical-speed-fps,2.590574265,G 155 | 1570719759.9023402,/controls/flight/elevator,-0.049152284994000005,S 156 | 1570719760.5016222,/velocities/vertical-speed-fps,2.589685678,G 157 | 1570719760.501857,/controls/flight/elevator,-0.049170412168800005,S 158 | 1570719760.90122,/velocities/vertical-speed-fps,2.589022398,G 159 | 1570719760.901449,/controls/flight/elevator,-0.049183943080800006,S 160 | 1570719761.5010903,/velocities/vertical-speed-fps,2.588186979,G 161 | 1570719761.5013318,/controls/flight/elevator,-0.0492009856284,S 162 | 1570719761.9005096,/velocities/vertical-speed-fps,2.587558031,G 163 | 1570719761.900738,/controls/flight/elevator,-0.049213816167600004,S 164 | 1570719762.500624,/velocities/vertical-speed-fps,2.586754084,G 165 | 1570719762.5008845,/controls/flight/elevator,-0.04923021668640001,S 166 | -------------------------------------------------------------------------------- /logs/fglog201209163356.csv: -------------------------------------------------------------------------------- 1 | 1607531637.1194847,/velocities/vertical-speed-fps,-0.07526767999,G 2 | 1607531637.5184345,/controls/flight/elevator,0.0,G 3 | 1607531637.5203965,/autopilot/locks/altitude,,S 4 | 1607531637.9180198,/velocities/vertical-speed-fps,-0.07193858176,G 5 | 1607531637.9200218,/controls/flight/elevator,0.0,S 6 | 1607531638.3177865,/velocities/vertical-speed-fps,-0.07074961811,G 7 | 1607531638.3197887,/controls/flight/elevator,0.0,S 8 | 1607531638.9182644,/velocities/vertical-speed-fps,-0.06960132718,G 9 | 1607531638.919263,/controls/flight/elevator,0.0,S 10 | 1607531639.3170657,/velocities/vertical-speed-fps,-0.06960445642,G 11 | 1607531639.319095,/controls/flight/elevator,0.0,S 12 | 1607531639.917594,/velocities/vertical-speed-fps,-0.06982348114,G 13 | 1607531639.9185653,/controls/flight/elevator,0.0,S 14 | 1607531640.3172069,/velocities/vertical-speed-fps,-0.07013323158,G 15 | 1607531640.3182054,/controls/flight/elevator,0.0,S 16 | 1607531640.916752,/velocities/vertical-speed-fps,-0.07006753236,G 17 | 1607531640.918752,/controls/flight/elevator,0.0,S 18 | 1607531641.3166397,/velocities/vertical-speed-fps,-0.06990795583,G 19 | 1607531641.3186083,/controls/flight/elevator,0.0,S 20 | 1607531641.9161713,/velocities/vertical-speed-fps,-0.06940108538,G 21 | 1607531641.918171,/controls/flight/elevator,0.0,S 22 | 1607531642.316584,/velocities/vertical-speed-fps,-0.06924776733,G 23 | 1607531642.3175805,/controls/flight/elevator,0.0,S 24 | 1607531642.9159625,/velocities/vertical-speed-fps,-0.06895052642,G 25 | 1607531642.9179578,/controls/flight/elevator,-0.02,S 26 | 1607531643.3171647,/velocities/vertical-speed-fps,-0.06835604459,G 27 | 1607531643.3201528,/controls/flight/elevator,-0.02,S 28 | 1607531643.9164243,/velocities/vertical-speed-fps,0.6674155593,G 29 | 1607531643.9184237,/controls/flight/elevator,-0.02,S 30 | 1607531644.3178618,/velocities/vertical-speed-fps,1.252245069,G 31 | 1607531644.3188257,/controls/flight/elevator,-0.02,S 32 | 1607531644.9172466,/velocities/vertical-speed-fps,2.081018686,G 33 | 1607531644.9182465,/controls/flight/elevator,-0.02,S 34 | 1607531645.3152256,/velocities/vertical-speed-fps,2.61828351,G 35 | 1607531645.3172007,/controls/flight/elevator,-0.02,S 36 | 1607531645.9155192,/velocities/vertical-speed-fps,3.343930006,G 37 | 1607531645.9164848,/controls/flight/elevator,-0.02,S 38 | 1607531646.3182173,/velocities/vertical-speed-fps,3.780746222,G 39 | 1607531646.320184,/controls/flight/elevator,-0.02,S 40 | 1607531646.9177954,/velocities/vertical-speed-fps,4.358889103,G 41 | 1607531646.9197898,/controls/flight/elevator,-0.02,S 42 | 1607531647.3167794,/velocities/vertical-speed-fps,4.690206528,G 43 | 1607531647.3177516,/controls/flight/elevator,-0.02,S 44 | 1607531647.9177854,/velocities/vertical-speed-fps,5.105846405,G 45 | 1607531647.9197881,/controls/flight/elevator,-0.02,S 46 | 1607531648.316044,/velocities/vertical-speed-fps,5.328911781,G 47 | 1607531648.3190336,/controls/flight/elevator,-0.02,S 48 | 1607531648.91476,/velocities/vertical-speed-fps,5.583406448,G 49 | 1607531648.9167259,/controls/flight/elevator,-0.02,S 50 | 1607531649.3148963,/velocities/vertical-speed-fps,5.70172739,G 51 | 1607531649.3169239,/controls/flight/elevator,-0.02,S 52 | 1607531649.9143348,/velocities/vertical-speed-fps,5.807147503,G 53 | 1607531649.916299,/controls/flight/elevator,-0.02,S 54 | 1607531650.3149178,/velocities/vertical-speed-fps,5.8325634,G 55 | 1607531650.3159482,/controls/flight/elevator,-0.02,S 56 | 1607531650.91373,/velocities/vertical-speed-fps,5.807704449,G 57 | 1607531650.916737,/controls/flight/elevator,-0.02,S 58 | 1607531651.313701,/velocities/vertical-speed-fps,5.753128052,G 59 | 1607531651.31573,/controls/flight/elevator,-0.02,S 60 | 1607531651.9145515,/velocities/vertical-speed-fps,5.613177299,G 61 | 1607531651.9195561,/controls/flight/elevator,-0.02,S 62 | 1607531652.31285,/velocities/vertical-speed-fps,5.491358757,G 63 | 1607531652.314822,/controls/flight/elevator,-0.02,S 64 | 1607531652.912579,/velocities/vertical-speed-fps,5.260787487,G 65 | 1607531652.91458,/controls/flight/elevator,-0.02,S 66 | 1607531653.3138921,/velocities/vertical-speed-fps,5.090493202,G 67 | 1607531653.3168414,/controls/flight/elevator,-0.02,S 68 | 1607531653.9130626,/velocities/vertical-speed-fps,4.805630207,G 69 | 1607531653.9150326,/controls/flight/elevator,-0.02,S 70 | 1607531654.3171675,/velocities/vertical-speed-fps,4.603806496,G 71 | 1607531654.3191264,/controls/flight/elevator,-0.02,S 72 | 1607531654.915069,/velocities/vertical-speed-fps,4.292898655,G 73 | 1607531654.920069,/controls/flight/elevator,-0.02,S 74 | 1607531655.3149006,/velocities/vertical-speed-fps,4.084908009,G 75 | 1607531655.3178968,/controls/flight/elevator,-0.02,S 76 | 1607531655.9132931,/velocities/vertical-speed-fps,3.779547691,G 77 | 1607531655.916341,/controls/flight/elevator,-0.02,S 78 | 1607531656.3157358,/velocities/vertical-speed-fps,3.581040859,G 79 | 1607531656.317785,/controls/flight/elevator,-0.02,S 80 | 1607531656.91366,/velocities/vertical-speed-fps,3.308427095,G 81 | 1607531656.9156845,/controls/flight/elevator,-0.02,S 82 | 1607531657.3132746,/velocities/vertical-speed-fps,3.142954588,G 83 | 1607531657.3152814,/controls/flight/elevator,-0.02,S 84 | 1607531657.9157295,/velocities/vertical-speed-fps,2.92715764,G 85 | 1607531657.9187446,/controls/flight/elevator,-0.02,S 86 | 1607531658.3176804,/velocities/vertical-speed-fps,2.80006671,G 87 | 1607531658.320234,/controls/flight/elevator,-0.02,S 88 | 1607531658.9111772,/velocities/vertical-speed-fps,2.64892745,G 89 | 1607531658.9131773,/controls/flight/elevator,-0.02,S 90 | 1607531659.3118527,/velocities/vertical-speed-fps,2.57003665,G 91 | 1607531659.3148508,/controls/flight/elevator,-0.02,S 92 | 1607531659.9109445,/velocities/vertical-speed-fps,2.48691535,G 93 | 1607531659.912946,/controls/flight/elevator,-0.02,S 94 | 1607531660.3110518,/velocities/vertical-speed-fps,2.454353571,G 95 | 1607531660.3129935,/controls/flight/elevator,-0.02,S 96 | 1607531660.9114249,/velocities/vertical-speed-fps,2.437861204,G 97 | 1607531660.9124794,/controls/flight/elevator,-0.02,S 98 | 1607531661.3109264,/velocities/vertical-speed-fps,2.447807789,G 99 | 1607531661.3129125,/controls/flight/elevator,-0.02,S 100 | 1607531661.9110196,/velocities/vertical-speed-fps,2.488536119,G 101 | 1607531661.9130158,/controls/flight/elevator,-0.02,S 102 | 1607531662.3111644,/velocities/vertical-speed-fps,2.531492233,G 103 | 1607531662.313132,/controls/flight/elevator,-0.02,S 104 | 1607531662.9105575,/velocities/vertical-speed-fps,2.615479946,G 105 | 1607531662.912521,/controls/flight/elevator,-0.02,S 106 | 1607531663.3096805,/velocities/vertical-speed-fps,2.680822849,G 107 | 1607531663.311697,/controls/flight/elevator,-0.02,S 108 | 1607531663.91013,/velocities/vertical-speed-fps,2.786837816,G 109 | 1607531663.912159,/controls/flight/elevator,-0.02,S 110 | 1607531664.3115845,/velocities/vertical-speed-fps,2.859211445,G 111 | 1607531664.3135538,/controls/flight/elevator,-0.02,S 112 | 1607531664.9096935,/velocities/vertical-speed-fps,2.966421604,G 113 | 1607531664.9117208,/controls/flight/elevator,-0.02,S 114 | 1607531665.309437,/velocities/vertical-speed-fps,3.034955978,G 115 | 1607531665.311381,/controls/flight/elevator,-0.02,S 116 | 1607531665.9101963,/velocities/vertical-speed-fps,3.13065815,G 117 | 1607531665.9122167,/controls/flight/elevator,-0.02,S 118 | 1607531666.3089578,/velocities/vertical-speed-fps,3.188491821,G 119 | 1607531666.3109794,/controls/flight/elevator,-0.02,S 120 | 1607531666.9087484,/velocities/vertical-speed-fps,3.264910936,G 121 | 1607531666.9106934,/controls/flight/elevator,-0.02,S 122 | 1607531667.308856,/velocities/vertical-speed-fps,3.307979584,G 123 | 1607531667.3108516,/controls/flight/elevator,-0.02,S 124 | 1607531667.9099867,/velocities/vertical-speed-fps,3.36068511,G 125 | 1607531667.9129813,/controls/flight/elevator,-0.02,S 126 | 1607531668.3108447,/velocities/vertical-speed-fps,3.387902975,G 127 | 1607531668.3148422,/controls/flight/elevator,-0.02,S 128 | 1607531668.9079795,/velocities/vertical-speed-fps,3.416685343,G 129 | 1607531668.9100132,/controls/flight/elevator,-0.02,S 130 | 1607531669.3080788,/velocities/vertical-speed-fps,3.42828393,G 131 | 1607531669.310062,/controls/flight/elevator,-0.02,S 132 | 1607531669.9094226,/velocities/vertical-speed-fps,3.434000492,G 133 | 1607531669.9123926,/controls/flight/elevator,-0.02,S 134 | 1607531670.308754,/velocities/vertical-speed-fps,3.430542946,G 135 | 1607531670.310784,/controls/flight/elevator,-0.02,S 136 | 1607531670.9075806,/velocities/vertical-speed-fps,3.41881609,G 137 | 1607531670.909549,/controls/flight/elevator,-0.02,S 138 | 1607531671.3069909,/velocities/vertical-speed-fps,3.404995918,G 139 | 1607531671.3080158,/controls/flight/elevator,-0.02,S 140 | 1607531671.9066803,/velocities/vertical-speed-fps,3.377343178,G 141 | 1607531671.9096909,/controls/flight/elevator,-0.02,S 142 | 1607531672.3077588,/velocities/vertical-speed-fps,3.354971886,G 143 | 1607531672.3096876,/controls/flight/elevator,-0.02,S 144 | 1607531672.9065363,/velocities/vertical-speed-fps,3.316555738,G 145 | 1607531672.9085193,/controls/flight/elevator,-0.02,S 146 | 1607531673.3059423,/velocities/vertical-speed-fps,3.288258314,G 147 | 1607531673.3079424,/controls/flight/elevator,-0.02,S 148 | 1607531673.905911,/velocities/vertical-speed-fps,3.242896318,G 149 | 1607531673.9069114,/controls/flight/elevator,-0.02,S 150 | 1607531674.3055959,/velocities/vertical-speed-fps,3.211457491,G 151 | 1607531674.3065984,/controls/flight/elevator,-0.02,S 152 | 1607531674.9059007,/velocities/vertical-speed-fps,3.163316965,G 153 | 1607531674.9068794,/controls/flight/elevator,-0.02,S 154 | 1607531675.3056755,/velocities/vertical-speed-fps,3.131374598,G 155 | 1607531675.3076754,/controls/flight/elevator,-0.02,S 156 | 1607531675.906894,/velocities/vertical-speed-fps,3.084007025,G 157 | 1607531675.9078872,/controls/flight/elevator,-0.02,S 158 | 1607531676.3054452,/velocities/vertical-speed-fps,3.054245234,G 159 | 1607531676.3074448,/controls/flight/elevator,-0.02,S 160 | 1607531676.9054494,/velocities/vertical-speed-fps,3.010100365,G 161 | 1607531676.9074469,/controls/flight/elevator,-0.02,S 162 | 1607531677.3210084,/velocities/vertical-speed-fps,2.982604027,G 163 | 1607531677.3229783,/controls/flight/elevator,-0.02,S 164 | 1607531677.9232342,/velocities/vertical-speed-fps,2.94506073,G 165 | 1607531677.927229,/controls/flight/elevator,-0.02,S 166 | 1607531678.3214257,/velocities/vertical-speed-fps,2.922048092,G 167 | 1607531678.3234217,/controls/flight/elevator,-0.02,S 168 | 1607531678.9222724,/velocities/vertical-speed-fps,2.891507387,G 169 | 1607531678.9232705,/controls/flight/elevator,-0.02,S 170 | 1607531679.305989,/velocities/vertical-speed-fps,2.874386311,G 171 | 1607531679.3069801,/controls/flight/elevator,-0.02,S 172 | 1607531679.9213798,/velocities/vertical-speed-fps,2.849906206,G 173 | 1607531679.9224064,/controls/flight/elevator,-0.02,S 174 | 1607531680.320213,/velocities/vertical-speed-fps,2.837134123,G 175 | 1607531680.322218,/controls/flight/elevator,-0.02,S 176 | 1607531680.9208064,/velocities/vertical-speed-fps,2.821665049,G 177 | 1607531680.9228003,/controls/flight/elevator,-0.02,S 178 | 1607531681.3216617,/velocities/vertical-speed-fps,2.813774109,G 179 | 1607531681.3246696,/controls/flight/elevator,-0.02,S 180 | 1607531681.920922,/velocities/vertical-speed-fps,2.80579567,G 181 | 1607531681.9239178,/controls/flight/elevator,-0.02,S 182 | 1607531682.3204455,/velocities/vertical-speed-fps,2.803746223,G 183 | 1607531682.3214405,/controls/flight/elevator,-0.02,S 184 | 1607531682.9204268,/velocities/vertical-speed-fps,2.804847479,G 185 | 1607531682.9214225,/controls/flight/elevator,-0.02,S 186 | 1607531683.3207026,/velocities/vertical-speed-fps,2.806092739,G 187 | 1607531683.3237062,/controls/flight/elevator,-0.02,S 188 | 1607531683.920495,/velocities/vertical-speed-fps,2.808020115,G 189 | 1607531683.9224432,/controls/flight/elevator,-0.02,S 190 | 1607531684.319869,/velocities/vertical-speed-fps,2.809603453,G 191 | 1607531684.32086,/controls/flight/elevator,-0.02,S 192 | 1607531684.9192722,/velocities/vertical-speed-fps,2.814352989,G 193 | 1607531684.9212658,/controls/flight/elevator,-0.02,S 194 | 1607531685.3193629,/velocities/vertical-speed-fps,2.818773985,G 195 | 1607531685.3213153,/controls/flight/elevator,-0.02,S 196 | 1607531685.9184995,/velocities/vertical-speed-fps,2.827343941,G 197 | 1607531685.919459,/controls/flight/elevator,-0.02,S 198 | 1607531686.3222659,/velocities/vertical-speed-fps,2.834067822,G 199 | 1607531686.3242648,/controls/flight/elevator,-0.02,S 200 | 1607531686.9180357,/velocities/vertical-speed-fps,2.844367981,G 201 | 1607531686.9190032,/controls/flight/elevator,-0.02,S 202 | 1607531687.318698,/velocities/vertical-speed-fps,2.851323605,G 203 | 1607531687.3206599,/controls/flight/elevator,-0.02,S 204 | 1607531687.9178383,/velocities/vertical-speed-fps,2.862111807,G 205 | 1607531687.9198408,/controls/flight/elevator,-0.02,S 206 | 1607531688.3176599,/velocities/vertical-speed-fps,2.869351864,G 207 | 1607531688.319633,/controls/flight/elevator,-0.02,S 208 | 1607531688.917703,/velocities/vertical-speed-fps,2.879270554,G 209 | 1607531688.9187021,/controls/flight/elevator,-0.02,S 210 | 1607531689.3177528,/velocities/vertical-speed-fps,2.885496855,G 211 | 1607531689.3187551,/controls/flight/elevator,-0.02,S 212 | 1607531689.917803,/velocities/vertical-speed-fps,2.893581867,G 213 | 1607531689.9198134,/controls/flight/elevator,-0.02,S 214 | 1607531690.3165786,/velocities/vertical-speed-fps,2.898193836,G 215 | 1607531690.318579,/controls/flight/elevator,-0.02,S 216 | 1607531690.9177222,/velocities/vertical-speed-fps,2.903497219,G 217 | 1607531690.9207575,/controls/flight/elevator,-0.02,S 218 | 1607531691.5172157,/velocities/vertical-speed-fps,2.906791925,G 219 | 1607531691.519214,/controls/flight/elevator,-0.02,S 220 | 1607531691.9170487,/velocities/vertical-speed-fps,2.907977581,G 221 | 1607531691.9190767,/controls/flight/elevator,-0.02,S 222 | 1607531692.5172365,/velocities/vertical-speed-fps,2.908487558,G 223 | 1607531692.5192044,/controls/flight/elevator,-0.02,S 224 | 1607531692.9172351,/velocities/vertical-speed-fps,2.908715963,G 225 | 1607531692.9192615,/controls/flight/elevator,-0.02,S 226 | 1607531693.5165768,/velocities/vertical-speed-fps,2.908747435,G 227 | 1607531693.518536,/controls/flight/elevator,-0.02,S 228 | 1607531693.9178276,/velocities/vertical-speed-fps,2.908806801,G 229 | 1607531693.9197674,/controls/flight/elevator,-0.02,S 230 | 1607531694.5160797,/velocities/vertical-speed-fps,2.9088943,G 231 | 1607531694.5180511,/controls/flight/elevator,-0.02,S 232 | 1607531694.9162366,/velocities/vertical-speed-fps,2.908875704,G 233 | 1607531694.9182413,/controls/flight/elevator,-0.02,S 234 | 1607531695.5178509,/velocities/vertical-speed-fps,2.908750534,G 235 | 1607531695.5208447,/controls/flight/elevator,-0.02,S 236 | 1607531695.9175441,/velocities/vertical-speed-fps,2.908481359,G 237 | 1607531695.9205434,/controls/flight/elevator,-0.02,S 238 | 1607531696.5160415,/velocities/vertical-speed-fps,2.907799244,G 239 | 1607531696.5248308,/controls/flight/elevator,-0.02,S 240 | 1607531696.9153004,/velocities/vertical-speed-fps,2.907104731,G 241 | 1607531696.9172926,/controls/flight/elevator,-0.02,S 242 | 1607531697.5161614,/velocities/vertical-speed-fps,2.905646563,G 243 | 1607531697.5181544,/controls/flight/elevator,-0.02,S 244 | 1607531697.6299636,/controls/flight/elevator,0.0,S 245 | 1607531697.6319668,/autopilot/locks/altitude,vertical-speed-hold,S 246 | 1607531697.6339962,/autopilot/settings/vertical-speed-fpm,0.0,S 247 | -------------------------------------------------------------------------------- /logs/fglog201209171929.csv: -------------------------------------------------------------------------------- 1 | 1607534369.5536559,/autopilot/locks/altitude,,S 2 | 1607534370.1117477,/velocities/vertical-speed-fps,-0.0008510479238,G 3 | 1607534370.1137786,/controls/flight/elevator,-4.255239619e-06,S 4 | 1607534370.5125053,/velocities/vertical-speed-fps,-0.000741538126,G 5 | 1607534370.514475,/controls/flight/elevator,-3.7076906299999998e-06,S 6 | 1607534370.9115365,/velocities/vertical-speed-fps,-0.0005850954913,G 7 | 1607534370.9135275,/controls/flight/elevator,-2.9254774565000003e-06,S 8 | 1607534371.5116103,/velocities/vertical-speed-fps,-0.00028159676,G 9 | 1607534371.5136106,/controls/flight/elevator,-1.4079838e-06,S 10 | 1607534371.9115446,/velocities/vertical-speed-fps,-0.0001188964088,G 11 | 1607534371.9135191,/controls/flight/elevator,-5.944820440000001e-07,S 12 | 1607534372.511318,/velocities/vertical-speed-fps,-3.754623322e-05,G 13 | 1607534372.5133183,/controls/flight/elevator,-1.8773116610000002e-07,S 14 | 1607534372.9113245,/velocities/vertical-speed-fps,-0.0001032521395,G 15 | 1607534372.9133556,/controls/flight/elevator,-5.162606975e-07,S 16 | 1607534373.5113378,/velocities/vertical-speed-fps,-7.822131738e-05,G 17 | 1607534373.5123372,/controls/flight/elevator,-3.911065869e-07,S 18 | 1607534373.912218,/velocities/vertical-speed-fps,8.447902655e-05,G 19 | 1607534373.914233,/controls/flight/elevator,4.2239513274999997e-07,S 20 | 1607534374.5103674,/velocities/vertical-speed-fps,0.0004568125005,G 21 | 1607534374.5123725,/controls/flight/elevator,2.2840625025e-06,S 22 | 1607534374.9118416,/velocities/vertical-speed-fps,0.0005444203853,G 23 | 1607534374.9138632,/controls/flight/elevator,2.7221019265000003e-06,S 24 | 1607534375.5118332,/velocities/vertical-speed-fps,0.0006758322124,G 25 | 1607534375.5137963,/controls/flight/elevator,-0.024996620838938003,S 26 | 1607534375.9120557,/velocities/vertical-speed-fps,0.0007165072602,G 27 | 1607534375.9140127,/controls/flight/elevator,-0.024996417463699003,S 28 | 1607534376.5108597,/velocities/vertical-speed-fps,0.9145886898,G 29 | 1607534376.5128264,/controls/flight/elevator,-0.020427056550999998,S 30 | 1607534376.9125085,/velocities/vertical-speed-fps,1.640019417,G 31 | 1607534376.9154835,/controls/flight/elevator,-0.016799902915,S 32 | 1607534377.511271,/velocities/vertical-speed-fps,2.493548632,G 33 | 1607534377.5132973,/controls/flight/elevator,-0.01253225684,S 34 | 1607534377.9098995,/velocities/vertical-speed-fps,2.905311823,G 35 | 1607534377.9128788,/controls/flight/elevator,-0.010473440885000001,S 36 | 1607534378.5101616,/velocities/vertical-speed-fps,3.295755148,G 37 | 1607534378.5121272,/controls/flight/elevator,-0.00852122426,S 38 | 1607534378.9101613,/velocities/vertical-speed-fps,3.438405752,G 39 | 1607534378.9121945,/controls/flight/elevator,-0.00780797124,S 40 | 1607534379.509584,/velocities/vertical-speed-fps,3.521505117,G 41 | 1607534379.5115435,/controls/flight/elevator,-0.007392474415000001,S 42 | 1607534379.9097364,/velocities/vertical-speed-fps,3.512794256,G 43 | 1607534379.9117055,/controls/flight/elevator,-0.007436028720000001,S 44 | 1607534380.5102158,/velocities/vertical-speed-fps,3.439500809,G 45 | 1607534380.513243,/controls/flight/elevator,-0.007802495955,S 46 | 1607534380.9103296,/velocities/vertical-speed-fps,3.362815857,G 47 | 1607534380.9123538,/controls/flight/elevator,-0.008185920715,S 48 | 1607534381.5095878,/velocities/vertical-speed-fps,3.229507923,G 49 | 1607534381.5115583,/controls/flight/elevator,-0.008852460385,S 50 | 1607534381.9095469,/velocities/vertical-speed-fps,3.133668184,G 51 | 1607534381.91251,/controls/flight/elevator,-0.00933165908,S 52 | 1607534382.5091264,/velocities/vertical-speed-fps,2.993198156,G 53 | 1607534382.511128,/controls/flight/elevator,-0.010034009219999999,S 54 | 1607534382.9091852,/velocities/vertical-speed-fps,2.902915239,G 55 | 1607534382.912177,/controls/flight/elevator,-0.010485423805000001,S 56 | 1607534383.5084765,/velocities/vertical-speed-fps,2.779913664,G 57 | 1607534383.5105038,/controls/flight/elevator,-0.01110043168,S 58 | 1607534383.9083133,/velocities/vertical-speed-fps,2.705462694,G 59 | 1607534383.9102788,/controls/flight/elevator,-0.01147268653,S 60 | 1607534384.5095656,/velocities/vertical-speed-fps,2.608649731,G 61 | 1607534384.511529,/controls/flight/elevator,-0.011956751345,S 62 | 1607534384.9080517,/velocities/vertical-speed-fps,2.552292824,G 63 | 1607534384.910203,/controls/flight/elevator,-0.012238535880000002,S 64 | 1607534385.5098903,/velocities/vertical-speed-fps,2.481283426,G 65 | 1607534385.5118828,/controls/flight/elevator,-0.01259358287,S 66 | 1607534385.9085624,/velocities/vertical-speed-fps,2.441287279,G 67 | 1607534385.9105484,/controls/flight/elevator,-0.012793563605,S 68 | 1607534386.5090718,/velocities/vertical-speed-fps,2.391864061,G 69 | 1607534386.5120578,/controls/flight/elevator,-0.013040679695,S 70 | 1607534386.9074852,/velocities/vertical-speed-fps,2.364395857,G 71 | 1607534386.9094822,/controls/flight/elevator,-0.013178020715,S 72 | 1607534387.5077941,/velocities/vertical-speed-fps,2.331079721,G 73 | 1607534387.5097513,/controls/flight/elevator,-0.013344601395,S 74 | 1607534387.9071712,/velocities/vertical-speed-fps,2.313107729,G 75 | 1607534387.909202,/controls/flight/elevator,-0.013434461355,S 76 | 1607534388.506641,/velocities/vertical-speed-fps,2.291631222,G 77 | 1607534388.5085976,/controls/flight/elevator,-0.01354184389,S 78 | 1607534388.9064825,/velocities/vertical-speed-fps,2.280092001,G 79 | 1607534388.9085062,/controls/flight/elevator,-0.013599539995000002,S 80 | 1607534389.5069926,/velocities/vertical-speed-fps,2.266287565,G 81 | 1607534389.5079954,/controls/flight/elevator,-0.013668562175000001,S 82 | 1607534389.9058971,/velocities/vertical-speed-fps,2.258928537,G 83 | 1607534389.9078789,/controls/flight/elevator,-0.013705357315,S 84 | 1607534390.506072,/velocities/vertical-speed-fps,2.251090765,G 85 | 1607534390.5080383,/controls/flight/elevator,-0.013744546175,S 86 | 1607534390.906099,/velocities/vertical-speed-fps,2.246754169,G 87 | 1607534390.9080658,/controls/flight/elevator,-0.013766229155,S 88 | 1607534391.5056581,/velocities/vertical-speed-fps,2.242861748,G 89 | 1607534391.507648,/controls/flight/elevator,-0.01378569126,S 90 | 1607534391.9080212,/velocities/vertical-speed-fps,2.240549564,G 91 | 1607534391.9110231,/controls/flight/elevator,-0.013797252179999999,S 92 | 1607534392.5060964,/velocities/vertical-speed-fps,2.238090277,G 93 | 1607534392.5080981,/controls/flight/elevator,-0.013809548615,S 94 | 1607534392.90523,/velocities/vertical-speed-fps,2.236281872,G 95 | 1607534392.9071918,/controls/flight/elevator,-0.01381859064,S 96 | 1607534393.505327,/velocities/vertical-speed-fps,2.233872652,G 97 | 1607534393.5083592,/controls/flight/elevator,-0.013830636739999999,S 98 | 1607534393.9056637,/velocities/vertical-speed-fps,2.232082844,G 99 | 1607534393.9066837,/controls/flight/elevator,-0.013839585780000002,S 100 | 1607534394.5211117,/velocities/vertical-speed-fps,2.230036736,G 101 | 1607534394.523069,/controls/flight/elevator,-0.01384981632,S 102 | 1607534394.9216042,/velocities/vertical-speed-fps,2.228453398,G 103 | 1607534394.9236405,/controls/flight/elevator,-0.01385773301,S 104 | 1607534395.5217526,/velocities/vertical-speed-fps,2.226588726,G 105 | 1607534395.523691,/controls/flight/elevator,-0.01386705637,S 106 | 1607534395.9212477,/velocities/vertical-speed-fps,2.225236893,G 107 | 1607534395.9232635,/controls/flight/elevator,-0.013873815535,S 108 | 1607534396.5211298,/velocities/vertical-speed-fps,2.223572493,G 109 | 1607534396.523123,/controls/flight/elevator,-0.013882137535000002,S 110 | 1607534396.9212892,/velocities/vertical-speed-fps,2.222455502,G 111 | 1607534396.9232996,/controls/flight/elevator,-0.01388772249,S 112 | 1607534397.5201719,/velocities/vertical-speed-fps,2.220937967,G 113 | 1607534397.5222015,/controls/flight/elevator,-0.013895310165,S 114 | 1607534397.919848,/velocities/vertical-speed-fps,2.219949245,G 115 | 1607534397.9218168,/controls/flight/elevator,-0.013900253775,S 116 | 1607534398.520146,/velocities/vertical-speed-fps,2.218638182,G 117 | 1607534398.5221527,/controls/flight/elevator,-0.013906809090000001,S 118 | 1607534398.9200103,/velocities/vertical-speed-fps,2.21764636,G 119 | 1607534398.9220083,/controls/flight/elevator,-0.0139117682,S 120 | 1607534399.5197072,/velocities/vertical-speed-fps,2.216304064,G 121 | 1607534399.521732,/controls/flight/elevator,-0.01391847968,S 122 | 1607534399.919185,/velocities/vertical-speed-fps,2.215446711,G 123 | 1607534399.9211776,/controls/flight/elevator,-0.013922766445000002,S 124 | 1607534400.5188992,/velocities/vertical-speed-fps,2.214354753,G 125 | 1607534400.5211387,/controls/flight/elevator,-0.013928226235,S 126 | 1607534400.9187875,/velocities/vertical-speed-fps,2.213510036,G 127 | 1607534400.9207885,/controls/flight/elevator,-0.01393244982,S 128 | 1607534401.5187669,/velocities/vertical-speed-fps,2.212455511,G 129 | 1607534401.5207539,/controls/flight/elevator,-0.013937722445,S 130 | 1607534401.9186099,/velocities/vertical-speed-fps,2.21162653,G 131 | 1607534401.9205637,/controls/flight/elevator,-0.01394186735,S 132 | 1607534402.519194,/velocities/vertical-speed-fps,2.210512638,G 133 | 1607534402.5221622,/controls/flight/elevator,-0.01394743681,S 134 | 1607534402.9203322,/velocities/vertical-speed-fps,2.209630251,G 135 | 1607534402.9233258,/controls/flight/elevator,-0.013951848745,S 136 | 1607534403.5227118,/velocities/vertical-speed-fps,2.208403826,G 137 | 1607534403.5247102,/controls/flight/elevator,-0.01395798087,S 138 | 1607534403.9194531,/velocities/vertical-speed-fps,2.207458735,G 139 | 1607534403.9234087,/controls/flight/elevator,-0.013962706325000001,S 140 | 1607534404.5300167,/velocities/vertical-speed-fps,2.20622921,G 141 | 1607534404.5331573,/controls/flight/elevator,-0.01396885395,S 142 | 1607534404.906055,/velocities/vertical-speed-fps,2.205296755,G 143 | 1607534404.910054,/controls/flight/elevator,-0.013973516225,S 144 | 1607534405.5177174,/velocities/vertical-speed-fps,2.204026461,G 145 | 1607534405.519716,/controls/flight/elevator,-0.013979867694999999,S 146 | 1607534405.9184618,/velocities/vertical-speed-fps,2.203169107,G 147 | 1607534405.9194608,/controls/flight/elevator,-0.013984154465,S 148 | 1607534406.517833,/velocities/vertical-speed-fps,2.201923847,G 149 | 1607534406.5207639,/controls/flight/elevator,-0.013990380765,S 150 | 1607534406.9180145,/velocities/vertical-speed-fps,2.20095396,G 151 | 1607534406.9200125,/controls/flight/elevator,-0.0139952302,S 152 | 1607534407.518458,/velocities/vertical-speed-fps,2.199843168,G 153 | 1607534407.520456,/controls/flight/elevator,-0.01400078416,S 154 | 1607534407.9175453,/velocities/vertical-speed-fps,2.199145555,G 155 | 1607534407.9185073,/controls/flight/elevator,-0.014004272225000001,S 156 | 1607534408.5171232,/velocities/vertical-speed-fps,2.198040962,G 157 | 1607534408.5201006,/controls/flight/elevator,-0.01400979519,S 158 | 1607534408.9176755,/velocities/vertical-speed-fps,2.197096109,G 159 | 1607534408.9196556,/controls/flight/elevator,-0.014014519455,S 160 | 1607534409.5171952,/velocities/vertical-speed-fps,2.19592905,G 161 | 1607534409.519191,/controls/flight/elevator,-0.01402035475,S 162 | 1607534409.916981,/velocities/vertical-speed-fps,2.195024729,G 163 | 1607534409.919971,/controls/flight/elevator,-0.014024876355,S 164 | 1607534410.5174887,/velocities/vertical-speed-fps,2.193992138,G 165 | 1607534410.5194395,/controls/flight/elevator,-0.01403003931,S 166 | 1607534410.9160042,/velocities/vertical-speed-fps,2.193300724,G 167 | 1607534410.9189968,/controls/flight/elevator,-0.01403349638,S 168 | 1607534411.5177355,/velocities/vertical-speed-fps,2.192261934,G 169 | 1607534411.5207572,/controls/flight/elevator,-0.01403869033,S 170 | 1607534411.9159887,/velocities/vertical-speed-fps,2.191432953,G 171 | 1607534411.9179585,/controls/flight/elevator,-0.014042835235,S 172 | 1607534412.517029,/velocities/vertical-speed-fps,2.19032526,G 173 | 1607534412.5190027,/controls/flight/elevator,-0.014048373700000002,S 174 | 1607534412.915943,/velocities/vertical-speed-fps,2.189474106,G 175 | 1607534412.9179103,/controls/flight/elevator,-0.01405262947,S 176 | 1607534413.5157511,/velocities/vertical-speed-fps,2.188570023,G 177 | 1607534413.516774,/controls/flight/elevator,-0.014057149885,S 178 | 1607534413.915392,/velocities/vertical-speed-fps,2.187772036,G 179 | 1607534413.9173393,/controls/flight/elevator,-0.014061139819999999,S 180 | 1607534414.5156991,/velocities/vertical-speed-fps,2.186680079,G 181 | 1607534414.5176709,/controls/flight/elevator,-0.014066599605,S 182 | 1607534414.9152682,/velocities/vertical-speed-fps,2.18584156,G 183 | 1607534414.9172323,/controls/flight/elevator,-0.0140707922,S 184 | 1607534415.51516,/velocities/vertical-speed-fps,2.184652567,G 185 | 1607534415.516152,/controls/flight/elevator,-0.014076737165,S 186 | 1607534415.9140599,/velocities/vertical-speed-fps,2.183839083,G 187 | 1607534415.916058,/controls/flight/elevator,-0.014080804585,S 188 | 1607534416.513564,/velocities/vertical-speed-fps,2.18268466,G 189 | 1607534416.5155308,/controls/flight/elevator,-0.0140865767,S 190 | 1607534416.9136252,/velocities/vertical-speed-fps,2.181758404,G 191 | 1607534416.9156241,/controls/flight/elevator,-0.014091207980000001,S 192 | 1607534417.5133972,/velocities/vertical-speed-fps,2.180807352,G 193 | 1607534417.5153892,/controls/flight/elevator,-0.01409596324,S 194 | 1607534417.913607,/velocities/vertical-speed-fps,2.180122137,G 195 | 1607534417.9156349,/controls/flight/elevator,-0.014099389315,S 196 | 1607534418.5131469,/velocities/vertical-speed-fps,2.179036379,G 197 | 1607534418.5150828,/controls/flight/elevator,-0.014104818105000002,S 198 | 1607534418.9134135,/velocities/vertical-speed-fps,2.178222895,G 199 | 1607534418.9154108,/controls/flight/elevator,-0.014108885525,S 200 | 1607534419.5128622,/velocities/vertical-speed-fps,2.175719738,G 201 | 1607534419.5148478,/controls/flight/elevator,-0.01412140131,S 202 | 1607534420.1124532,/velocities/vertical-speed-fps,2.170428753,G 203 | 1607534420.1144085,/controls/flight/elevator,-0.014147856235,S 204 | 1607534420.5119832,/velocities/vertical-speed-fps,2.166589737,G 205 | 1607534420.5139847,/controls/flight/elevator,-0.014167051315000002,S 206 | 1607534421.1128778,/velocities/vertical-speed-fps,2.161298752,G 207 | 1607534421.114826,/controls/flight/elevator,-0.01419350624,S 208 | 1607534421.513059,/velocities/vertical-speed-fps,2.158163786,G 209 | 1607534421.5150518,/controls/flight/elevator,-0.014209181070000002,S 210 | 1607534422.1124604,/velocities/vertical-speed-fps,2.154490471,G 211 | 1607534422.114427,/controls/flight/elevator,-0.014227547645000001,S 212 | 1607534422.5120008,/velocities/vertical-speed-fps,2.152309656,G 213 | 1607534422.5139894,/controls/flight/elevator,-0.014238451720000002,S 214 | 1607534423.1119697,/velocities/vertical-speed-fps,2.149662733,G 215 | 1607534423.114998,/controls/flight/elevator,-0.014251686335,S 216 | 1607534423.5125215,/velocities/vertical-speed-fps,2.148113966,G 217 | 1607534423.514552,/controls/flight/elevator,-0.01425943017,S 218 | 1607534424.1120906,/velocities/vertical-speed-fps,2.146211624,G 219 | 1607534424.1141,/controls/flight/elevator,-0.014268941879999998,S 220 | 1607534424.5120213,/velocities/vertical-speed-fps,2.145072699,G 221 | 1607534424.5140483,/controls/flight/elevator,-0.014274636505,S 222 | 1607534425.111434,/velocities/vertical-speed-fps,2.143645763,G 223 | 1607534425.11245,/controls/flight/elevator,-0.014281771185,S 224 | 1607534425.510937,/velocities/vertical-speed-fps,2.142857313,G 225 | 1607534425.5129726,/controls/flight/elevator,-0.014285713435,S 226 | 1607534426.1110265,/velocities/vertical-speed-fps,2.141978264,G 227 | 1607534426.113107,/controls/flight/elevator,-0.01429010868,S 228 | 1607534426.5111785,/velocities/vertical-speed-fps,2.141471386,G 229 | 1607534426.5131755,/controls/flight/elevator,-0.01429264307,S 230 | 1607534427.110437,/velocities/vertical-speed-fps,2.140679598,G 231 | 1607534427.112434,/controls/flight/elevator,-0.01429660201,S 232 | 1607534427.5103934,/velocities/vertical-speed-fps,2.140050888,G 233 | 1607534427.5123887,/controls/flight/elevator,-0.014299745559999999,S 234 | 1607534428.109913,/velocities/vertical-speed-fps,2.139237404,G 235 | 1607534428.1118424,/controls/flight/elevator,-0.014303812979999999,S 236 | 1607534428.5097616,/velocities/vertical-speed-fps,2.138605356,G 237 | 1607534428.511761,/controls/flight/elevator,-0.014306973220000001,S 238 | 1607534429.1097915,/velocities/vertical-speed-fps,2.137607098,G 239 | 1607534429.112351,/controls/flight/elevator,-0.014311964509999999,S 240 | 1607534429.51027,/velocities/vertical-speed-fps,2.137050152,G 241 | 1607534429.5122247,/controls/flight/elevator,-0.01431474924,S 242 | 1607534429.7341669,/autopilot/locks/altitude,vertical-speed-hold,S 243 | 1607534429.735136,/autopilot/settings/vertical-speed-fpm,0.0,S 244 | -------------------------------------------------------------------------------- /logs/fglog201209172907.csv: -------------------------------------------------------------------------------- 1 | 1607534947.159329,/autopilot/locks/altitude,,S 2 | 1607534947.7168398,/velocities/vertical-speed-fps,-0.0005068741739,G 3 | 1607534947.7188435,/controls/flight/elevator,-2.5343708695e-06,S 4 | 1607534948.1175246,/velocities/vertical-speed-fps,-0.0005037452793,G 5 | 1607534948.1185203,/controls/flight/elevator,-2.6324884435058196e-06,S 6 | 1607534948.51849,/velocities/vertical-speed-fps,-0.3122188449,G 7 | 1607534948.5214412,/controls/flight/elevator,-0.0015613204789592236,S 8 | 1607534949.1172528,/velocities/vertical-speed-fps,-0.9377484918,G 9 | 1607534949.1192164,/controls/flight/elevator,-0.0047590414943522955,S 10 | 1607534949.5163941,/velocities/vertical-speed-fps,-1.29844892,G 11 | 1607534949.5184252,/controls/flight/elevator,-0.006772659822620489,S 12 | 1607534950.1165884,/velocities/vertical-speed-fps,-1.681010604,G 13 | 1607534950.1175933,/controls/flight/elevator,-0.008975491511121243,S 14 | 1607534950.515999,/velocities/vertical-speed-fps,-1.843473077,G 15 | 1607534950.5179944,/controls/flight/elevator,-0.010162242193692208,S 16 | 1607534951.1166685,/velocities/vertical-speed-fps,-1.965385795,G 17 | 1607534951.117696,/controls/flight/elevator,-0.011180839405765539,S 18 | 1607534951.5156722,/velocities/vertical-speed-fps,-1.981133223,G 19 | 1607534951.5176659,/controls/flight/elevator,-0.011693932003934463,S 20 | 1607534952.1162782,/velocities/vertical-speed-fps,-1.934916973,G 21 | 1607534952.1182768,/controls/flight/elevator,-0.011898574183334523,S 22 | 1607534952.5164008,/velocities/vertical-speed-fps,-1.867862582,G 23 | 1607534952.5183978,/controls/flight/elevator,-0.011986479775181214,S 24 | 1607534953.1163402,/velocities/vertical-speed-fps,-1.738985062,G 25 | 1607534953.118337,/controls/flight/elevator,-0.03674810953254276,S 26 | 1607534953.5160384,/velocities/vertical-speed-fps,-1.639046431,G 27 | 1607534953.5200512,/controls/flight/elevator,-0.03774567582746601,S 28 | 1607534954.1158354,/velocities/vertical-speed-fps,-0.5447927117,G 29 | 1607534954.1178675,/controls/flight/elevator,-0.0337417689981583,S 30 | 1607534954.515536,/velocities/vertical-speed-fps,0.3317491412,G 31 | 1607534954.517568,/controls/flight/elevator,-0.030573510409797642,S 32 | 1607534955.1163828,/velocities/vertical-speed-fps,1.431262374,G 33 | 1607534955.1183848,/controls/flight/elevator,-0.026087608141078213,S 34 | 1607534955.5161674,/velocities/vertical-speed-fps,2.017456055,G 35 | 1607534955.5181818,/controls/flight/elevator,-0.023916484905938066,S 36 | 1607534956.1153038,/velocities/vertical-speed-fps,2.647237778,G 37 | 1607534956.1173313,/controls/flight/elevator,-0.021392067324053143,S 38 | 1607534956.5173237,/velocities/vertical-speed-fps,2.936021566,G 39 | 1607534956.5193095,/controls/flight/elevator,-0.02042817753000769,S 40 | 1607534957.1145086,/velocities/vertical-speed-fps,3.198923349,G 41 | 1607534957.1175096,/controls/flight/elevator,-0.019526489423792696,S 42 | 1607534957.5145187,/velocities/vertical-speed-fps,3.289315939,G 43 | 1607534957.516451,/controls/flight/elevator,-0.01942628306511949,S 44 | 1607534958.1180875,/velocities/vertical-speed-fps,3.329186916,G 45 | 1607534958.120085,/controls/flight/elevator,-0.019556642806572575,S 46 | 1607534958.5144536,/velocities/vertical-speed-fps,3.310463905,G 47 | 1607534958.5164528,/controls/flight/elevator,-0.019969379449732944,S 48 | 1607534959.1160843,/velocities/vertical-speed-fps,3.239974022,G 49 | 1607534959.1180966,/controls/flight/elevator,-0.02064356099064452,S 50 | 1607534959.5144203,/velocities/vertical-speed-fps,3.175413132,G 51 | 1607534959.5164192,/controls/flight/elevator,-0.02130231356000128,S 52 | 1607534960.1132348,/velocities/vertical-speed-fps,3.069063425,G 53 | 1607534960.1152537,/controls/flight/elevator,-0.02218282461132221,S 54 | 1607534960.5136807,/velocities/vertical-speed-fps,2.997246981,G 55 | 1607534960.5157166,/controls/flight/elevator,-0.022912798849279322,S 56 | 1607534961.1139424,/velocities/vertical-speed-fps,2.897539854,G 57 | 1607534961.1159356,/controls/flight/elevator,-0.023796495040973697,S 58 | 1607534961.513046,/velocities/vertical-speed-fps,2.838764429,G 59 | 1607534961.5150583,/controls/flight/elevator,-0.02449598983805217,S 60 | 1607534962.1138783,/velocities/vertical-speed-fps,2.766365767,G 61 | 1607534962.114895,/controls/flight/elevator,-0.025274769258032927,S 62 | 1607534962.5128558,/velocities/vertical-speed-fps,2.728638172,G 63 | 1607534962.5148215,/controls/flight/elevator,-0.02589436365610956,S 64 | 1607534963.1135762,/velocities/vertical-speed-fps,2.687537432,G 65 | 1607534963.115531,/controls/flight/elevator,-0.02653714189748732,S 66 | 1607534963.5133874,/velocities/vertical-speed-fps,2.670732498,G 67 | 1607534963.5154152,/controls/flight/elevator,-0.027065484778809032,S 68 | 1607534964.11312,/velocities/vertical-speed-fps,2.657735109,G 69 | 1607534964.115113,/controls/flight/elevator,-0.02757634556191628,S 70 | 1607534964.5122695,/velocities/vertical-speed-fps,2.657096863,G 71 | 1607534964.5142255,/controls/flight/elevator,-0.02802610393864205,S 72 | 1607534965.1119192,/velocities/vertical-speed-fps,2.666471004,G 73 | 1607534965.1138957,/controls/flight/elevator,-0.028423716364365897,S 74 | 1607534965.5118306,/velocities/vertical-speed-fps,2.679618359,G 75 | 1607534965.5137956,/controls/flight/elevator,-0.028798141933678783,S 76 | 1607534966.111847,/velocities/vertical-speed-fps,2.703551054,G 77 | 1607534966.1138723,/controls/flight/elevator,-0.029113494712342747,S 78 | 1607534966.512653,/velocities/vertical-speed-fps,2.724144936,G 79 | 1607534966.5146387,/controls/flight/elevator,-0.0294380004867471,S 80 | 1607534967.1111467,/velocities/vertical-speed-fps,2.756994963,G 81 | 1607534967.1131167,/controls/flight/elevator,-0.029694471436100586,S 82 | 1607534967.5113962,/velocities/vertical-speed-fps,2.781572104,G 83 | 1607534967.513361,/controls/flight/elevator,-0.02998283565159853,S 84 | 1607534968.1141622,/velocities/vertical-speed-fps,2.81800127,G 85 | 1607534968.1170933,/controls/flight/elevator,-0.030204372569465496,S 86 | 1607534968.511648,/velocities/vertical-speed-fps,2.843585968,G 87 | 1607534968.512661,/controls/flight/elevator,-0.030469942346174096,S 88 | 1607534969.1110382,/velocities/vertical-speed-fps,2.880124569,G 89 | 1607534969.1130433,/controls/flight/elevator,-0.03067303786241438,S 90 | 1607534969.5136666,/velocities/vertical-speed-fps,2.905221224,G 91 | 1607534969.5166569,/controls/flight/elevator,-0.03092321831390365,S 92 | 1607534970.1112201,/velocities/vertical-speed-fps,2.940023422,G 93 | 1607534970.1132398,/controls/flight/elevator,-0.0311173647657352,S 94 | 1607534970.5112302,/velocities/vertical-speed-fps,2.96349597,G 95 | 1607534970.5131073,/controls/flight/elevator,-0.03135851232376531,S 96 | 1607534971.110373,/velocities/vertical-speed-fps,2.996073723,G 97 | 1607534971.1123714,/controls/flight/elevator,-0.031547077637254575,S 98 | 1607534971.510119,/velocities/vertical-speed-fps,3.017947435,G 99 | 1607534971.5120904,/controls/flight/elevator,-0.031780098571272106,S 100 | 1607534972.1103454,/velocities/vertical-speed-fps,3.048087597,G 101 | 1607534972.1123743,/controls/flight/elevator,-0.03196517027884603,S 102 | 1607534972.510064,/velocities/vertical-speed-fps,3.068243742,G 103 | 1607534972.5120926,/controls/flight/elevator,-0.032191722788172034,S 104 | 1607534973.1090152,/velocities/vertical-speed-fps,3.09598732,G 105 | 1607534973.1110485,/controls/flight/elevator,-0.03237418173751468,S 106 | 1607534973.5092087,/velocities/vertical-speed-fps,3.114603996,G 107 | 1607534973.512163,/controls/flight/elevator,-0.032594446595423786,S 108 | 1607534974.1099758,/velocities/vertical-speed-fps,3.140266895,G 109 | 1607534974.1119428,/controls/flight/elevator,-0.03277373920982528,S 110 | 1607534974.5105162,/velocities/vertical-speed-fps,3.157622576,G 111 | 1607534974.51249,/controls/flight/elevator,-0.03298727397644493,S 112 | 1607534975.1081922,/velocities/vertical-speed-fps,3.181636572,G 113 | 1607534975.1101696,/controls/flight/elevator,-0.03316212406796734,S 114 | 1607534975.5086749,/velocities/vertical-speed-fps,3.197878361,G 115 | 1607534975.5107024,/controls/flight/elevator,-0.03336897461078429,S 116 | 1607534976.1121602,/velocities/vertical-speed-fps,3.22046566,G 117 | 1607534976.1141598,/controls/flight/elevator,-0.03353901561918564,S 118 | 1607534976.5091488,/velocities/vertical-speed-fps,3.23587513,G 119 | 1607534976.5111349,/controls/flight/elevator,-0.03373846495833232,S 120 | 1607534977.1102445,/velocities/vertical-speed-fps,3.257351637,G 121 | 1607534977.1142764,/controls/flight/elevator,-0.033902741602137264,S 122 | 1607534977.5079827,/velocities/vertical-speed-fps,3.271932125,G 123 | 1607534977.5099747,/controls/flight/elevator,-0.034095323281486525,S 124 | 1607534978.107782,/velocities/vertical-speed-fps,3.292257071,G 125 | 1607534978.1098106,/controls/flight/elevator,-0.034254586141338875,S 126 | 1607534978.5074334,/velocities/vertical-speed-fps,3.306421518,G 127 | 1607534978.509397,/controls/flight/elevator,-0.03443878861480975,S 128 | 1607534979.1084247,/velocities/vertical-speed-fps,3.32601738,G 129 | 1607534979.1103923,/controls/flight/elevator,-0.03459138302590461,S 130 | 1607534979.5072877,/velocities/vertical-speed-fps,3.339405775,G 131 | 1607534979.509247,/controls/flight/elevator,-0.03476936696572592,S 132 | 1607534980.1074655,/velocities/vertical-speed-fps,3.358150721,G 133 | 1607534980.1094625,/controls/flight/elevator,-0.03491634170701206,S 134 | 1607534980.5073357,/velocities/vertical-speed-fps,3.370963335,G 135 | 1607534980.5093691,/controls/flight/elevator,-0.03508757052830752,S 136 | 1607534981.1091974,/velocities/vertical-speed-fps,3.388907433,G 137 | 1607534981.111201,/controls/flight/elevator,-0.03522909276334791,S 138 | 1607534981.5077581,/velocities/vertical-speed-fps,3.401150465,G 139 | 1607534981.5097697,/controls/flight/elevator,-0.03539393965518916,S 140 | 1607534982.107251,/velocities/vertical-speed-fps,3.41823101,G 141 | 1607534982.1091986,/controls/flight/elevator,-0.035530723685885106,S 142 | 1607534982.506775,/velocities/vertical-speed-fps,3.429917336,G 143 | 1607534982.5088053,/controls/flight/elevator,-0.035689537119702436,S 144 | 1607534983.106062,/velocities/vertical-speed-fps,3.446278095,G 145 | 1607534983.1080575,/controls/flight/elevator,-0.035821272013509826,S 146 | 1607534983.5059164,/velocities/vertical-speed-fps,3.457291603,G 147 | 1607534983.5078819,/controls/flight/elevator,-0.03597500615049651,S 148 | 1607534984.1058214,/velocities/vertical-speed-fps,3.472078562,G 149 | 1607534984.1088207,/controls/flight/elevator,-0.03610635977526058,S 150 | 1607534984.5057693,/velocities/vertical-speed-fps,3.481796741,G 151 | 1607534984.5097349,/controls/flight/elevator,-0.036258714657803566,S 152 | 1607534985.1050773,/velocities/vertical-speed-fps,3.494781494,G 153 | 1607534985.1071165,/controls/flight/elevator,-0.036391553316201176,S 154 | 1607534985.5051703,/velocities/vertical-speed-fps,3.503417015,G 155 | 1607534985.5071285,/controls/flight/elevator,-0.03654223751273775,S 156 | 1607534986.1064105,/velocities/vertical-speed-fps,3.515094042,G 157 | 1607534986.1083982,/controls/flight/elevator,-0.036674809146675286,S 158 | 1607534986.5055006,/velocities/vertical-speed-fps,3.523003817,G 159 | 1607534986.5085082,/controls/flight/elevator,-0.0368226438660736,S 160 | 1607534987.1076417,/velocities/vertical-speed-fps,3.534248829,G 161 | 1607534987.1105845,/controls/flight/elevator,-0.03695109256336317,S 162 | 1607534987.5217245,/velocities/vertical-speed-fps,3.541974068,G 163 | 1607534987.5237188,/controls/flight/elevator,-0.03709369524853592,S 164 | 1607534988.105274,/velocities/vertical-speed-fps,3.553115845,G 165 | 1607534988.1072464,/controls/flight/elevator,-0.03721657752033648,S 166 | 1607534988.5066702,/velocities/vertical-speed-fps,3.561128855,G 167 | 1607534988.5096672,/controls/flight/elevator,-0.03735171225701869,S 168 | 1607534989.1096864,/velocities/vertical-speed-fps,3.572821379,G 169 | 1607534989.1156766,/controls/flight/elevator,-0.0374657771836847,S 170 | 1607534989.5204413,/velocities/vertical-speed-fps,3.581269264,G 171 | 1607534989.5224016,/controls/flight/elevator,-0.03759258056881857,S 172 | 1607534990.1210701,/velocities/vertical-speed-fps,3.593800306,G 173 | 1607534990.1230662,/controls/flight/elevator,-0.03769622903431988,S 174 | 1607534990.52048,/velocities/vertical-speed-fps,3.602874041,G 175 | 1607534990.522481,/controls/flight/elevator,-0.03781352214430723,S 176 | 1607534991.1208065,/velocities/vertical-speed-fps,3.616362333,G 177 | 1607534991.1227105,/controls/flight/elevator,-0.03790589469536235,S 178 | 1607534991.5205405,/velocities/vertical-speed-fps,3.625939846,G 179 | 1607534991.5224738,/controls/flight/elevator,-0.03801399677454678,S 180 | 1607534992.1195438,/velocities/vertical-speed-fps,3.640157461,G 181 | 1607534992.1215053,/controls/flight/elevator,-0.03809597078009348,S 182 | 1607534992.519492,/velocities/vertical-speed-fps,3.650232315,G 183 | 1607534992.521457,/controls/flight/elevator,-0.03819470421104972,S 184 | 1607534993.11936,/velocities/vertical-speed-fps,3.665006638,G 185 | 1607534993.1213684,/controls/flight/elevator,-0.03826693543476689,S 186 | 1607534993.5188317,/velocities/vertical-speed-fps,3.675260067,G 187 | 1607534993.5208294,/controls/flight/elevator,-0.03835772651158402,S 188 | 1607534994.1185648,/velocities/vertical-speed-fps,3.690062523,G 189 | 1607534994.120594,/controls/flight/elevator,-0.03842276267149221,S 190 | 1607534994.5193853,/velocities/vertical-speed-fps,3.700353384,G 191 | 1607534994.5213888,/controls/flight/elevator,-0.03850634105933464,S 192 | 1607534995.1182575,/velocities/vertical-speed-fps,3.715290546,G 193 | 1607534995.1202781,/controls/flight/elevator,-0.03856370479906056,S 194 | 1607534995.5208986,/velocities/vertical-speed-fps,3.725534439,G 195 | 1607534995.5228546,/controls/flight/elevator,-0.038640523810627124,S 196 | 1607534996.1186132,/velocities/vertical-speed-fps,3.740199327,G 197 | 1607534996.120621,/controls/flight/elevator,-0.03869230012930084,S 198 | 1607534996.518412,/velocities/vertical-speed-fps,3.750180244,G 199 | 1607534996.5214002,/controls/flight/elevator,-0.03876358099580599,S 200 | 1607534997.1186433,/velocities/vertical-speed-fps,3.764391661,G 201 | 1607534997.1206355,/controls/flight/elevator,-0.0388108648459456,S 202 | 1607534997.518837,/velocities/vertical-speed-fps,3.774012804,G 203 | 1607534997.5208695,/controls/flight/elevator,-0.03887732024999934,S 204 | 1607534998.1180232,/velocities/vertical-speed-fps,3.787563801,G 205 | 1607534998.119989,/controls/flight/elevator,-0.03892139565379747,S 206 | 1607534998.517871,/velocities/vertical-speed-fps,3.796653271,G 207 | 1607534998.5208306,/controls/flight/elevator,-0.0389841795716272,S 208 | 1607534999.1199856,/velocities/vertical-speed-fps,3.809525251,G 209 | 1607534999.1229756,/controls/flight/elevator,-0.039025471107322754,S 210 | 1607534999.7191541,/velocities/vertical-speed-fps,3.822328568,G 211 | 1607534999.7221458,/controls/flight/elevator,-0.0390636900522208,S 212 | 1607535000.1174603,/velocities/vertical-speed-fps,3.83025074,G 213 | 1607535000.1194608,/controls/flight/elevator,-0.039122931263838936,S 214 | 1607535000.7165139,/velocities/vertical-speed-fps,3.841320753,G 215 | 1607535000.7185204,/controls/flight/elevator,-0.039164162203797,S 216 | 1607535001.1177447,/velocities/vertical-speed-fps,3.848823786,G 217 | 1607535001.1197875,/controls/flight/elevator,-0.039220261807575395,S 218 | 1607535001.7166295,/velocities/vertical-speed-fps,3.859527588,G 219 | 1607535001.7186267,/controls/flight/elevator,-0.03925820669175238,S 220 | 1607535002.116602,/velocities/vertical-speed-fps,3.866711378,G 221 | 1607535002.118632,/controls/flight/elevator,-0.03931089311327037,S 222 | 1607535002.71609,/velocities/vertical-speed-fps,3.877052307,G 223 | 1607535002.7180507,/controls/flight/elevator,-0.03934573960005977,S 224 | 1607535003.1157749,/velocities/vertical-speed-fps,3.88418293,G 225 | 1607535003.1177535,/controls/flight/elevator,-0.039393885039343525,S 226 | 1607535003.7164674,/velocities/vertical-speed-fps,3.89423275,G 227 | 1607535003.7185018,/controls/flight/elevator,-0.03942541616071798,S 228 | 1607535004.1160672,/velocities/vertical-speed-fps,3.900906563,G 229 | 1607535004.1180623,/controls/flight/elevator,-0.039471163870650514,S 230 | 1607535004.7156014,/velocities/vertical-speed-fps,3.910537243,G 231 | 1607535004.7175984,/controls/flight/elevator,-0.03950023478886779,S 232 | 1607535005.1173797,/velocities/vertical-speed-fps,3.917060852,G 233 | 1607535005.1203306,/controls/flight/elevator,-0.03954229440943114,S 234 | 1607535005.7153354,/velocities/vertical-speed-fps,3.926059484,G 235 | 1607535005.7173693,/controls/flight/elevator,-0.03957014230998047,S 236 | 1607535006.1158943,/velocities/vertical-speed-fps,3.931932211,G 237 | 1607535006.117896,/controls/flight/elevator,-0.03961123680032949,S 238 | 1607535006.714449,/velocities/vertical-speed-fps,3.940254927,G 239 | 1607535006.7174478,/controls/flight/elevator,-0.03963841186864743,S 240 | 1607535007.1150613,/velocities/vertical-speed-fps,3.945696115,G 241 | 1607535007.116123,/controls/flight/elevator,-0.03967778355478552,S 242 | 1607535007.3351996,/autopilot/locks/altitude,vertical-speed-hold,S 243 | 1607535007.3361652,/autopilot/settings/vertical-speed-fpm,0.0,S 244 | -------------------------------------------------------------------------------- /model.py: -------------------------------------------------------------------------------- 1 | """ 2 | Fit linear system model to step response data 3 | then design simple lag compensator 4 | """ 5 | from fgplot import import_log, last_log_filename 6 | import matplotlib.pyplot as plt 7 | import numpy as np 8 | import scipy.optimize 9 | import scipy.signal 10 | from math import log, sqrt, pi 11 | 12 | # import last log data 13 | file_name = last_log_filename() 14 | # file_name = 'logs/fglog201209163356.csv' 15 | step_data = import_log(file_name) 16 | 17 | # plot the step response 18 | plt.figure() 19 | ax = plt.subplot(2, 1, 1) 20 | (tv, v) = step_data['/velocities/vertical-speed-fps'] 21 | plt.plot(tv, v) 22 | plt.subplot(2, 1, 2, sharex=ax) 23 | (te, e) = step_data['/controls/flight/elevator'] 24 | plt.plot(te, e) 25 | plt.show() 26 | 27 | # extract peak information 28 | y_max = max(v) # first peak in output 29 | k_ymax = np.argmax(v) # and its index in the data 30 | y_tr1 = min(v[k_ymax:-1]) # first trough after max 31 | k_ytr1 = k_ymax+np.argmin(v[k_ymax:-1]) # and its index in the data 32 | y_pk2 = max(v[k_ytr1:-1]) # second peak 33 | k_ypk2 = k_ytr1+np.argmax(v[k_ytr1:-1]) # and its index in the data 34 | 35 | # extract steady state values 36 | u_ss = min(e) # the size of the input step 37 | y_ss = sum(v[-21:-1])/20 38 | 39 | # another step plot, this time with the extracted 40 | # values added for sanity checking 41 | plt.figure() 42 | ax = plt.subplot(2, 1, 1) 43 | plt.plot(tv, v) 44 | plt.plot(tv[k_ymax], y_max, 'rs') 45 | plt.plot(tv[k_ytr1], y_tr1, 'bs') 46 | plt.plot(tv[k_ypk2], y_pk2, 'rs') 47 | plt.plot([tv[0], tv[-1]], [y_ss, y_ss], 'k:') 48 | plt.subplot(2, 1, 2, sharex=ax) 49 | plt.plot(te, e) 50 | plt.plot([te[0], te[-1]], [u_ss, u_ss], 'k:') 51 | plt.show() 52 | 53 | # %% now use the log decrement method to find the system model 54 | # https://en.wikipedia.org/wiki/Logarithmic_decrement 55 | logdec = log((y_max-y_ss)/(y_pk2-y_ss)) # log ratio of peak heights 56 | zeta = 1/sqrt(1+(2*pi/logdec)**2) # gives us damping ratio 57 | wd = 2*pi/(tv[k_ypk2] - tv[k_ymax]) # time between peaks gives damped natural freq 58 | wn = wd/sqrt(1-zeta**2) # undamped natural freq 59 | k_ss = y_ss/u_ss # scalar gain 60 | 61 | A = np.array([[0, 1], [-wn*wn, -2*zeta*wn]]) 62 | B = np.array([[0.0], [wn*wn]])*k_ss 63 | C = np.array([[1.0, 0]]) 64 | D = np.array([0.0]) 65 | 66 | # make data set comparable - remove offset and time before step 67 | t_data = [t - tv[0] - 5.0 for t in tv if t >= tv[0]+5] 68 | y_data = np.array([v[k] for k in range(len(v)) if tv[k] >= tv[0]+5]) 69 | 70 | (t_mdl, y_mdl) = scipy.signal.step((A, B, C, D), 71 | T=t_data) 72 | plt.figure() 73 | plt.plot(t_mdl, u_ss*y_mdl, 'k') 74 | plt.plot(t_data, y_data) # compare with real data 75 | plt.show() 76 | 77 | # %% use more formal approach - optimize the fit 78 | # first define mismatch cost 79 | def sys_id_cost(p_in): 80 | A2 = A + np.array([[0,0], [p_in[0], p_in[1]]]) 81 | B2 = B + np.array([[p_in[2]], [p_in[3]]]) 82 | (_, y_eval) = scipy.signal.step((A2, B2, C, D), 83 | T=t_data) 84 | errors = u_ss*y_eval - y_data 85 | #print(errors) 86 | return sum(errors*errors) 87 | 88 | # test it with initial guess 89 | p0 = [0.0, 0.0, 0.0, 0.0] 90 | print('Initial error cost:', 91 | sys_id_cost(p0), 92 | 'Starting optimizer.') 93 | 94 | # now minimize this cost 95 | res = scipy.optimize.minimize(sys_id_cost, 96 | p0, 97 | method='BFGS') 98 | print(res) 99 | 100 | # let's see what it gave us 101 | p = res.x 102 | A3 = A + np.array([[0, 0], [p[0], p[1]]]) 103 | B3 = B + np.array([[p[2]], [p[3]]]) 104 | C = np.array([[1.0, 0]]) 105 | D = np.array([0.0]) 106 | (t_mdl, y_mdl) = scipy.signal.step((A3, B3, C, D), 107 | T=t_data) 108 | plt.figure() 109 | plt.plot(t_mdl,u_ss*y_mdl,'k') 110 | plt.plot(t_data,y_data) # compare with real data 111 | plt.show() 112 | 113 | # %% draw the Bode diagram 114 | w, mag, phase = scipy.signal.bode((A3,-B3,C,D)) 115 | plt.figure() 116 | plt.subplot(2,1,1) 117 | plt.grid() 118 | plt.semilogx(w, mag) # Bode magnitude plot 119 | plt.subplot(2,1,2) 120 | plt.grid() 121 | plt.semilogx(w, phase) # Bode phase plot 122 | plt.show() 123 | 124 | # %% add a scalar gain of x0.005 125 | w, mag, phase = scipy.signal.bode((A3,-0.005*B3,C,D)) 126 | kk_cross = max([kk for (kk,wk) in enumerate(w) if mag[kk]>0]) 127 | 128 | plt.figure() 129 | plt.subplot(2,1,1) 130 | plt.grid() 131 | plt.semilogx(w, mag) # Bode magnitude plot 132 | plt.semilogx(w[kk_cross+1], mag[kk_cross+1], 'rs') 133 | plt.subplot(2,1,2) 134 | plt.grid() 135 | plt.semilogx(w, phase) # Bode phase plot 136 | plt.semilogx(w[kk_cross+1], phase[kk_cross+1], 'rs') 137 | plt.show() 138 | 139 | print('Phase margin',180+phase[kk_cross+1]) 140 | 141 | # %% now add lag compensator - boost gain at low frequencies 142 | lag_comp = scipy.signal.TransferFunction([1,0.1],[1,0.01]) 143 | openloop_sys = lag_comp.to_ss()*scipy.signal.StateSpace(A3,-0.005*B3,C,D) 144 | w, mag, phase = scipy.signal.bode(openloop_sys) 145 | plt.figure() 146 | plt.subplot(2,1,1) 147 | plt.grid() 148 | plt.semilogx(w, mag) # Bode magnitude plot 149 | plt.subplot(2,1,2) 150 | plt.grid() 151 | plt.semilogx(w, phase) # Bode phase plot 152 | plt.show() 153 | 154 | # %% get discrete form of compensator 155 | lag_comp_ss = lag_comp.to_ss() 156 | lag_comp_disc = lag_comp_ss.to_discrete(dt=0.5) 157 | print('comp_a =',lag_comp_disc.A[0,0]) 158 | print('comp_b =',lag_comp_disc.B[0,0]) 159 | print('comp_c =',lag_comp_disc.C[0,0]) 160 | print('comp_d =',lag_comp_disc.D[0,0]) -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | Package Version 2 | ------------------ ------- 3 | attrs 19.2.0 4 | backcall 0.1.0 5 | bleach 3.1.0 6 | cycler 0.10.0 7 | decorator 4.4.0 8 | defusedxml 0.6.0 9 | entrypoints 0.3 10 | importlib-metadata 0.23 11 | ipykernel 5.1.2 12 | ipython 7.8.0 13 | ipython-genutils 0.2.0 14 | ipywidgets 7.5.1 15 | jedi 0.15.1 16 | Jinja2 2.10.3 17 | jsonschema 3.1.1 18 | jupyter 1.0.0 19 | jupyter-client 5.3.4 20 | jupyter-console 6.0.0 21 | jupyter-core 4.6.0 22 | kiwisolver 1.1.0 23 | MarkupSafe 1.1.1 24 | matplotlib 3.0.3 25 | mistune 0.8.4 26 | more-itertools 7.2.0 27 | nbconvert 5.6.0 28 | nbformat 4.4.0 29 | notebook 6.0.1 30 | numpy 1.17.2 31 | pandocfilters 1.4.2 32 | parso 0.5.1 33 | pexpect 4.7.0 34 | pickleshare 0.7.5 35 | pip 19.2.3 36 | pkg-resources 0.0.0 37 | prometheus-client 0.7.1 38 | prompt-toolkit 2.0.10 39 | ptyprocess 0.6.0 40 | Pygments 2.4.2 41 | pyparsing 2.4.2 42 | pyrsistent 0.15.4 43 | python-dateutil 2.8.0 44 | pyzmq 18.1.0 45 | qtconsole 4.5.5 46 | scipy 1.3.1 47 | Send2Trash 1.5.0 48 | setuptools 20.7.0 49 | six 1.12.0 50 | terminado 0.8.2 51 | testpath 0.4.2 52 | tornado 6.0.3 53 | traitlets 4.3.3 54 | wcwidth 0.1.7 55 | webencodings 0.5.1 56 | widgetsnbextension 3.5.1 57 | zipp 0.6.0 58 | -------------------------------------------------------------------------------- /runfg.sh: -------------------------------------------------------------------------------- 1 | fgfs --aircraft=allegroW --fg-aircraft=. --telnet=5051 --timeofday=morning 2 | -------------------------------------------------------------------------------- /takeoff.py: -------------------------------------------------------------------------------- 1 | """ 2 | Start up and take off from simulator reset 3 | """ 4 | from fgclient import FgClient 5 | c = FgClient() 6 | 7 | c.set_prop('/controls/engines/engine/magnetos',3) 8 | c.set_prop('/controls/engines/engine/throttle',0.75) 9 | c.set_prop('/controls/gear/brake-parking',0) 10 | c.set_prop('/sim/hud/visibility[0]',1) 11 | c.set_aileron(0.0) 12 | c.set_elevator(0.0) 13 | 14 | c.set_prop('/controls/engines/engine/starter',1) 15 | 16 | for kk in range(30): 17 | c.tic() 18 | sp = c.get_prop_float('/velocities/airspeed-kt') 19 | print(sp) 20 | if sp>50: 21 | c.set_elevator(-0.1) 22 | c.toc(1.0) 23 | 24 | for kk in range(30): 25 | c.tic() 26 | alt = c.altitude_ft() 27 | print(alt) 28 | if alt>200: 29 | c.set_elevator(0.0) 30 | c.ap_roll_hdg(180) 31 | c.ap_pitch_vs(10) 32 | c.toc(1.0) -------------------------------------------------------------------------------- /test_interface.py: -------------------------------------------------------------------------------- 1 | from fgclient import FgClient 2 | c = FgClient() 3 | c.ap_pitch_off() 4 | from math import sin 5 | 6 | kk = 0 7 | while True: 8 | kk += 1 9 | c.tic() 10 | vs = c.vertical_speed_fps() 11 | print(vs) 12 | c.set_elevator(0.75*sin(0.5*kk)) 13 | c.toc(0.5) 14 | -------------------------------------------------------------------------------- /vs_comp.py: -------------------------------------------------------------------------------- 1 | """ 2 | Execute step in vertical speed using (optional) state 3 | space compensator in the control loop 4 | """ 5 | from fgclient import FgClient 6 | c = FgClient() 7 | 8 | # check zero elevator 9 | el = c.get_elevator() 10 | if el != 0.0: 11 | raise ValueError('Elevator not central: ', el) 12 | 13 | c.ap_pitch_off() 14 | 15 | # compensator definition 16 | comp_a = 0.9950124791926824 17 | comp_b = 0.4987520807317687 18 | comp_c = 0.09000000000000001 19 | comp_d = 1.0 20 | x_comp = 0.0 # initial internal state 21 | 22 | kk = 0 23 | dt = 0.5 24 | for kk in range(120): 25 | c.tic() 26 | if kk > 10: 27 | vs_des = 5.0 28 | else: 29 | vs_des = 0.0 30 | vs = c.vertical_speed_fps() 31 | err = vs_des - vs 32 | # update compensator 33 | y_comp = comp_c*x_comp + comp_d*err 34 | x_comp = comp_a*x_comp + comp_b*err 35 | # apply feedback 36 | c.set_elevator(-0.005*y_comp) # with compensator 37 | #c.set_elevator(-0.005*err) # without compensator 38 | print(vs) 39 | c.toc(dt) 40 | 41 | c.ap_pitch_vs(0.0) 42 | -------------------------------------------------------------------------------- /vs_p.py: -------------------------------------------------------------------------------- 1 | """ 2 | Initial skeleton example: run a proportional controller 3 | on the vertical speed, and look at a step response 4 | """ 5 | from fgclient import FgClient 6 | c = FgClient() 7 | 8 | # check zero elevator 9 | el = c.get_elevator() 10 | if el > 0.01 or el < -0.01: 11 | raise ValueError('Elevator not central: ', el) 12 | 13 | c.ap_pitch_off() 14 | 15 | kk = 0 16 | dt = 0.5 17 | while True: 18 | kk += 1 19 | c.tic() 20 | if kk > 10: 21 | vs_des = 5.0 22 | else: 23 | vs_des = 0.0 24 | vs = c.vertical_speed_fps() 25 | c.set_elevator(-0.01*(vs_des - vs)) 26 | print(vs) 27 | c.toc(dt) 28 | -------------------------------------------------------------------------------- /vs_record.py: -------------------------------------------------------------------------------- 1 | """ 2 | Execute step input on elevator and record step response in log 3 | """ 4 | from fgclient import FgClient 5 | c = FgClient() 6 | 7 | # require level flight to begin 8 | vs = c.vertical_speed_fps() 9 | if abs(vs) > 0.2: 10 | raise ValueError('Vertical speed too large: ', vs) 11 | # and require zero elevator 12 | el = c.get_elevator() 13 | if el != 0.0: 14 | raise ValueError('Elevator not central: ', el) 15 | 16 | c.ap_pitch_off() 17 | 18 | time_step = 0.5 19 | for kk in range(120): 20 | c.tic() 21 | vs = c.vertical_speed_fps() 22 | if kk < 10: 23 | el = 0.0 24 | else: 25 | el = -0.02 26 | c.set_elevator(el) 27 | print(kk, el, vs) 28 | c.toc(0.5) 29 | 30 | c.set_elevator(0.0) 31 | c.ap_pitch_vs(0.0) 32 | --------------------------------------------------------------------------------