In [2]:
from PIL import Image, ImageDraw, ImageFont
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import os

Launch Video Analysis¶

Since the IMU saturated during launch, let's see if we can get more information from the video. We have high-speed video from the launch, which we will use to estimate the apogee and time of flight of the rocket.

In [3]:
# Read the timestamps of each frame from the previously stored export file

timestamps = pd.read_csv("cansat-slowmo-full/snippet.csv")
timestamps
Out[3]:
frame_index timestamp
0 1 28.560000
1 2 28.564167
2 3 28.576667
3 4 28.580833
4 5 28.585000
... ... ...
301 302 30.397917
302 303 30.402083
303 304 30.414583
304 305 30.418750
305 306 30.443750

306 rows × 2 columns

In [4]:
# The first sign of movement was in frame 268 - so we use the mean of timestamp from frame 267 and 268 as the launch time
launch_time = (timestamps.loc[timestamps['frame_index'] == 267, 'timestamp'].values[0] + 
               timestamps.loc[timestamps['frame_index'] == 268, 'timestamp'].values[0]) / 2
timestamps['mission_time'] = timestamps['timestamp'] - launch_time
timestamps['dt'] = timestamps['mission_time'].diff().fillna(0)
timestamps
Out[4]:
frame_index timestamp mission_time dt
0 1 28.560000 -1.631667 0.000000
1 2 28.564167 -1.627500 0.004167
2 3 28.576667 -1.615000 0.012500
3 4 28.580833 -1.610834 0.004166
4 5 28.585000 -1.606667 0.004167
... ... ... ... ...
301 302 30.397917 0.206250 0.004167
302 303 30.402083 0.210416 0.004166
303 304 30.414583 0.222916 0.012500
304 305 30.418750 0.227083 0.004167
305 306 30.443750 0.252083 0.025000

306 rows × 4 columns

In [5]:
ts_records = timestamps.set_index('frame_index').to_dict(orient="records")
ts_records
Out[5]:
[{'timestamp': 28.56, 'mission_time': -1.6316670000000038, 'dt': 0.0},
 {'timestamp': 28.564167,
  'mission_time': -1.6275000000000013,
  'dt': 0.004167000000002474},
 {'timestamp': 28.576667,
  'mission_time': -1.615000000000002,
  'dt': 0.01249999999999929},
 {'timestamp': 28.580833,
  'mission_time': -1.610834000000004,
  'dt': 0.004165999999997894},
 {'timestamp': 28.585,
  'mission_time': -1.6066670000000016,
  'dt': 0.004167000000002474},
 {'timestamp': 28.589167,
  'mission_time': -1.6025000000000027,
  'dt': 0.004166999999998922},
 {'timestamp': 28.593333,
  'mission_time': -1.5983340000000013,
  'dt': 0.004166000000001446},
 {'timestamp': 28.5975,
  'mission_time': -1.5941670000000023,
  'dt': 0.004166999999998922},
 {'timestamp': 28.601667,
  'mission_time': -1.5900000000000034,
  'dt': 0.004166999999998922},
 {'timestamp': 28.605833,
  'mission_time': -1.585834000000002,
  'dt': 0.004166000000001446},
 {'timestamp': 28.61,
  'mission_time': -1.581667000000003,
  'dt': 0.004166999999998922},
 {'timestamp': 28.614167,
  'mission_time': -1.5775000000000041,
  'dt': 0.004166999999998922},
 {'timestamp': 28.618333,
  'mission_time': -1.5733340000000027,
  'dt': 0.004166000000001446},
 {'timestamp': 28.630833,
  'mission_time': -1.5608340000000034,
  'dt': 0.01249999999999929},
 {'timestamp': 28.635,
  'mission_time': -1.556667000000001,
  'dt': 0.004167000000002474},
 {'timestamp': 28.6475,
  'mission_time': -1.5441670000000016,
  'dt': 0.01249999999999929},
 {'timestamp': 28.651667,
  'mission_time': -1.5400000000000027,
  'dt': 0.004166999999998922},
 {'timestamp': 28.664167,
  'mission_time': -1.5275000000000034,
  'dt': 0.01249999999999929},
 {'timestamp': 28.668333,
  'mission_time': -1.523334000000002,
  'dt': 0.004166000000001446},
 {'timestamp': 28.6725,
  'mission_time': -1.519167000000003,
  'dt': 0.004166999999998922},
 {'timestamp': 28.685,
  'mission_time': -1.5066670000000038,
  'dt': 0.01249999999999929},
 {'timestamp': 28.689167,
  'mission_time': -1.5025000000000013,
  'dt': 0.004167000000002474},
 {'timestamp': 28.701667,
  'mission_time': -1.490000000000002,
  'dt': 0.01249999999999929},
 {'timestamp': 28.705833,
  'mission_time': -1.485834000000004,
  'dt': 0.004165999999997894},
 {'timestamp': 28.71,
  'mission_time': -1.4816670000000016,
  'dt': 0.004167000000002474},
 {'timestamp': 28.714167,
  'mission_time': -1.4775000000000027,
  'dt': 0.004166999999998922},
 {'timestamp': 28.718333,
  'mission_time': -1.4733340000000013,
  'dt': 0.004166000000001446},
 {'timestamp': 28.7225,
  'mission_time': -1.4691670000000023,
  'dt': 0.004166999999998922},
 {'timestamp': 28.726667,
  'mission_time': -1.4650000000000034,
  'dt': 0.004166999999998922},
 {'timestamp': 28.730833,
  'mission_time': -1.460834000000002,
  'dt': 0.004166000000001446},
 {'timestamp': 28.735,
  'mission_time': -1.456667000000003,
  'dt': 0.004166999999998922},
 {'timestamp': 28.739167,
  'mission_time': -1.4525000000000041,
  'dt': 0.004166999999998922},
 {'timestamp': 28.743333,
  'mission_time': -1.4483340000000027,
  'dt': 0.004166000000001446},
 {'timestamp': 28.7475,
  'mission_time': -1.4441670000000038,
  'dt': 0.004166999999998922},
 {'timestamp': 28.76,
  'mission_time': -1.431667000000001,
  'dt': 0.012500000000002842},
 {'timestamp': 28.764167,
  'mission_time': -1.427500000000002,
  'dt': 0.004166999999998922},
 {'timestamp': 28.776667,
  'mission_time': -1.4150000000000027,
  'dt': 0.01249999999999929},
 {'timestamp': 28.780833,
  'mission_time': -1.4108340000000013,
  'dt': 0.004166000000001446},
 {'timestamp': 28.785,
  'mission_time': -1.4066670000000023,
  'dt': 0.004166999999998922},
 {'timestamp': 28.801667,
  'mission_time': -1.3900000000000041,
  'dt': 0.01666699999999821},
 {'timestamp': 28.80625,
  'mission_time': -1.385417000000004,
  'dt': 0.004583000000000226},
 {'timestamp': 28.810417,
  'mission_time': -1.3812500000000014,
  'dt': 0.004167000000002474},
 {'timestamp': 28.822917,
  'mission_time': -1.3687500000000021,
  'dt': 0.01249999999999929},
 {'timestamp': 28.827083,
  'mission_time': -1.3645840000000042,
  'dt': 0.004165999999997894},
 {'timestamp': 28.830833,
  'mission_time': -1.360834000000004,
  'dt': 0.003750000000000142},
 {'timestamp': 28.835,
  'mission_time': -1.3566670000000016,
  'dt': 0.004167000000002474},
 {'timestamp': 28.839167,
  'mission_time': -1.3525000000000027,
  'dt': 0.004166999999998922},
 {'timestamp': 28.843333,
  'mission_time': -1.3483340000000013,
  'dt': 0.004166000000001446},
 {'timestamp': 28.8475,
  'mission_time': -1.3441670000000023,
  'dt': 0.004166999999998922},
 {'timestamp': 28.851667,
  'mission_time': -1.3400000000000034,
  'dt': 0.004166999999998922},
 {'timestamp': 28.855833,
  'mission_time': -1.335834000000002,
  'dt': 0.004166000000001446},
 {'timestamp': 28.86,
  'mission_time': -1.331667000000003,
  'dt': 0.004166999999998922},
 {'timestamp': 28.864583,
  'mission_time': -1.3270840000000028,
  'dt': 0.004583000000000226},
 {'timestamp': 28.86875,
  'mission_time': -1.322917000000004,
  'dt': 0.004166999999998922},
 {'timestamp': 28.88125,
  'mission_time': -1.310417000000001,
  'dt': 0.012500000000002842},
 {'timestamp': 28.885,
  'mission_time': -1.306667000000001,
  'dt': 0.003750000000000142},
 {'timestamp': 28.8975,
  'mission_time': -1.2941670000000016,
  'dt': 0.01249999999999929},
 {'timestamp': 28.901667,
  'mission_time': -1.2900000000000027,
  'dt': 0.004166999999998922},
 {'timestamp': 28.905833,
  'mission_time': -1.2858340000000013,
  'dt': 0.004166000000001446},
 {'timestamp': 28.918333,
  'mission_time': -1.273334000000002,
  'dt': 0.01249999999999929},
 {'timestamp': 28.9225,
  'mission_time': -1.269167000000003,
  'dt': 0.004166999999998922},
 {'timestamp': 28.935417,
  'mission_time': -1.2562500000000014,
  'dt': 0.012917000000001622},
 {'timestamp': 28.939583,
  'mission_time': -1.2520840000000035,
  'dt': 0.004165999999997894},
 {'timestamp': 28.94375,
  'mission_time': -1.247917000000001,
  'dt': 0.004167000000002474},
 {'timestamp': 28.95625,
  'mission_time': -1.2354170000000018,
  'dt': 0.01249999999999929},
 {'timestamp': 28.960417,
  'mission_time': -1.2312500000000028,
  'dt': 0.004166999999998922},
 {'timestamp': 28.964583,
  'mission_time': -1.2270840000000014,
  'dt': 0.004166000000001446},
 {'timestamp': 28.96875,
  'mission_time': -1.2229170000000025,
  'dt': 0.004166999999998922},
 {'timestamp': 28.972917,
  'mission_time': -1.2187500000000036,
  'dt': 0.004166999999998922},
 {'timestamp': 28.977083,
  'mission_time': -1.214584000000002,
  'dt': 0.004166000000001446},
 {'timestamp': 28.98125,
  'mission_time': -1.2104170000000032,
  'dt': 0.004166999999998922},
 {'timestamp': 28.985417,
  'mission_time': -1.2062500000000007,
  'dt': 0.004167000000002474},
 {'timestamp': 28.989583,
  'mission_time': -1.2020840000000028,
  'dt': 0.004165999999997894},
 {'timestamp': 28.99375,
  'mission_time': -1.197917000000004,
  'dt': 0.004166999999998922},
 {'timestamp': 28.997917,
  'mission_time': -1.1937500000000014,
  'dt': 0.004167000000002474},
 {'timestamp': 29.002083,
  'mission_time': -1.1895840000000035,
  'dt': 0.004165999999997894},
 {'timestamp': 29.014583,
  'mission_time': -1.1770840000000042,
  'dt': 0.01249999999999929},
 {'timestamp': 29.01875,
  'mission_time': -1.1729170000000018,
  'dt': 0.004167000000002474},
 {'timestamp': 29.03125,
  'mission_time': -1.1604170000000025,
  'dt': 0.01249999999999929},
 {'timestamp': 29.035417,
  'mission_time': -1.1562500000000036,
  'dt': 0.004166999999998922},
 {'timestamp': 29.039583,
  'mission_time': -1.152084000000002,
  'dt': 0.004166000000001446},
 {'timestamp': 29.052083,
  'mission_time': -1.1395840000000028,
  'dt': 0.01249999999999929},
 {'timestamp': 29.05625,
  'mission_time': -1.135417000000004,
  'dt': 0.004166999999998922},
 {'timestamp': 29.06875,
  'mission_time': -1.122917000000001,
  'dt': 0.012500000000002842},
 {'timestamp': 29.072917,
  'mission_time': -1.1187500000000021,
  'dt': 0.004166999999998922},
 {'timestamp': 29.077083,
  'mission_time': -1.1145840000000042,
  'dt': 0.004165999999997894},
 {'timestamp': 29.089583,
  'mission_time': -1.1020840000000014,
  'dt': 0.012500000000002842},
 {'timestamp': 29.09375,
  'mission_time': -1.0979170000000025,
  'dt': 0.004166999999998922},
 {'timestamp': 29.097917,
  'mission_time': -1.0937500000000036,
  'dt': 0.004166999999998922},
 {'timestamp': 29.102083,
  'mission_time': -1.089584000000002,
  'dt': 0.004166000000001446},
 {'timestamp': 29.10625,
  'mission_time': -1.0854170000000032,
  'dt': 0.004166999999998922},
 {'timestamp': 29.110417,
  'mission_time': -1.0812500000000007,
  'dt': 0.004167000000002474},
 {'timestamp': 29.114583,
  'mission_time': -1.0770840000000028,
  'dt': 0.004165999999997894},
 {'timestamp': 29.11875,
  'mission_time': -1.072917000000004,
  'dt': 0.004166999999998922},
 {'timestamp': 29.122917,
  'mission_time': -1.0687500000000014,
  'dt': 0.004167000000002474},
 {'timestamp': 29.127083,
  'mission_time': -1.0645840000000035,
  'dt': 0.004165999999997894},
 {'timestamp': 29.139583,
  'mission_time': -1.0520840000000042,
  'dt': 0.01249999999999929},
 {'timestamp': 29.14375,
  'mission_time': -1.0479170000000018,
  'dt': 0.004167000000002474},
 {'timestamp': 29.15625,
  'mission_time': -1.0354170000000025,
  'dt': 0.01249999999999929},
 {'timestamp': 29.160417,
  'mission_time': -1.0312500000000036,
  'dt': 0.004166999999998922},
 {'timestamp': 29.172917,
  'mission_time': -1.0187500000000007,
  'dt': 0.012500000000002842},
 {'timestamp': 29.177083,
  'mission_time': -1.0145840000000028,
  'dt': 0.004165999999997894},
 {'timestamp': 29.18125,
  'mission_time': -1.010417000000004,
  'dt': 0.004166999999998922},
 {'timestamp': 29.19375,
  'mission_time': -0.997917000000001,
  'dt': 0.012500000000002842},
 {'timestamp': 29.197917,
  'mission_time': -0.9937500000000021,
  'dt': 0.004166999999998922},
 {'timestamp': 29.210417,
  'mission_time': -0.9812500000000028,
  'dt': 0.01249999999999929},
 {'timestamp': 29.214583,
  'mission_time': -0.9770840000000014,
  'dt': 0.004166000000001446},
 {'timestamp': 29.21875,
  'mission_time': -0.9729170000000025,
  'dt': 0.004166999999998922},
 {'timestamp': 29.222917,
  'mission_time': -0.9687500000000036,
  'dt': 0.004166999999998922},
 {'timestamp': 29.227083,
  'mission_time': -0.9645840000000021,
  'dt': 0.004166000000001446},
 {'timestamp': 29.23125,
  'mission_time': -0.9604170000000032,
  'dt': 0.004166999999998922},
 {'timestamp': 29.235417,
  'mission_time': -0.9562500000000007,
  'dt': 0.004167000000002474},
 {'timestamp': 29.239583,
  'mission_time': -0.9520840000000028,
  'dt': 0.004165999999997894},
 {'timestamp': 29.24375,
  'mission_time': -0.9479170000000039,
  'dt': 0.004166999999998922},
 {'timestamp': 29.247917,
  'mission_time': -0.9437500000000014,
  'dt': 0.004167000000002474},
 {'timestamp': 29.252083,
  'mission_time': -0.9395840000000035,
  'dt': 0.004165999999997894},
 {'timestamp': 29.264583,
  'mission_time': -0.9270840000000042,
  'dt': 0.01249999999999929},
 {'timestamp': 29.26875,
  'mission_time': -0.9229170000000018,
  'dt': 0.004167000000002474},
 {'timestamp': 29.272917,
  'mission_time': -0.9187500000000028,
  'dt': 0.004166999999998922},
 {'timestamp': 29.285417,
  'mission_time': -0.9062500000000036,
  'dt': 0.01249999999999929},
 {'timestamp': 29.289583,
  'mission_time': -0.9020840000000021,
  'dt': 0.004166000000001446},
 {'timestamp': 29.302083,
  'mission_time': -0.8895840000000028,
  'dt': 0.01249999999999929},
 {'timestamp': 29.30625,
  'mission_time': -0.8854170000000039,
  'dt': 0.004166999999998922},
 {'timestamp': 29.31875,
  'mission_time': -0.872917000000001,
  'dt': 0.012500000000002842},
 {'timestamp': 29.322917,
  'mission_time': -0.8687500000000021,
  'dt': 0.004166999999998922},
 {'timestamp': 29.327083,
  'mission_time': -0.8645840000000042,
  'dt': 0.004165999999997894},
 {'timestamp': 29.339583,
  'mission_time': -0.8520840000000014,
  'dt': 0.012500000000002842},
 {'timestamp': 29.34375,
  'mission_time': -0.8479170000000025,
  'dt': 0.004166999999998922},
 {'timestamp': 29.347917,
  'mission_time': -0.8437500000000036,
  'dt': 0.004166999999998922},
 {'timestamp': 29.352083,
  'mission_time': -0.8395840000000021,
  'dt': 0.004166000000001446},
 {'timestamp': 29.35625,
  'mission_time': -0.8354170000000032,
  'dt': 0.004166999999998922},
 {'timestamp': 29.360417,
  'mission_time': -0.8312500000000007,
  'dt': 0.004167000000002474},
 {'timestamp': 29.364583,
  'mission_time': -0.8270840000000028,
  'dt': 0.004165999999997894},
 {'timestamp': 29.36875,
  'mission_time': -0.8229170000000039,
  'dt': 0.004166999999998922},
 {'timestamp': 29.372917,
  'mission_time': -0.8187500000000014,
  'dt': 0.004167000000002474},
 {'timestamp': 29.377083,
  'mission_time': -0.8145840000000035,
  'dt': 0.004165999999997894},
 {'timestamp': 29.38125,
  'mission_time': -0.810417000000001,
  'dt': 0.004167000000002474},
 {'timestamp': 29.385417,
  'mission_time': -0.8062500000000021,
  'dt': 0.004166999999998922},
 {'timestamp': 29.397917,
  'mission_time': -0.7937500000000028,
  'dt': 0.01249999999999929},
 {'timestamp': 29.402083,
  'mission_time': -0.7895840000000014,
  'dt': 0.004166000000001446},
 {'timestamp': 29.414583,
  'mission_time': -0.7770840000000021,
  'dt': 0.01249999999999929},
 {'timestamp': 29.41875,
  'mission_time': -0.7729170000000032,
  'dt': 0.004166999999998922},
 {'timestamp': 29.422917,
  'mission_time': -0.7687500000000007,
  'dt': 0.004167000000002474},
 {'timestamp': 29.435417,
  'mission_time': -0.7562500000000014,
  'dt': 0.01249999999999929},
 {'timestamp': 29.439583,
  'mission_time': -0.7520840000000035,
  'dt': 0.004165999999997894},
 {'timestamp': 29.452083,
  'mission_time': -0.7395840000000042,
  'dt': 0.01249999999999929},
 {'timestamp': 29.45625,
  'mission_time': -0.7354170000000018,
  'dt': 0.004167000000002474},
 {'timestamp': 29.460417,
  'mission_time': -0.7312500000000028,
  'dt': 0.004166999999998922},
 {'timestamp': 29.464583,
  'mission_time': -0.7270840000000014,
  'dt': 0.004166000000001446},
 {'timestamp': 29.46875,
  'mission_time': -0.7229170000000025,
  'dt': 0.004166999999998922},
 {'timestamp': 29.472917,
  'mission_time': -0.7187500000000036,
  'dt': 0.004166999999998922},
 {'timestamp': 29.477083,
  'mission_time': -0.7145840000000021,
  'dt': 0.004166000000001446},
 {'timestamp': 29.48125,
  'mission_time': -0.7104170000000032,
  'dt': 0.004166999999998922},
 {'timestamp': 29.485417,
  'mission_time': -0.7062500000000007,
  'dt': 0.004167000000002474},
 {'timestamp': 29.489583,
  'mission_time': -0.7020840000000028,
  'dt': 0.004165999999997894},
 {'timestamp': 29.49375,
  'mission_time': -0.6979170000000039,
  'dt': 0.004166999999998922},
 {'timestamp': 29.50625,
  'mission_time': -0.685417000000001,
  'dt': 0.012500000000002842},
 {'timestamp': 29.510417,
  'mission_time': -0.6812500000000021,
  'dt': 0.004166999999998922},
 {'timestamp': 29.522917,
  'mission_time': -0.6687500000000028,
  'dt': 0.01249999999999929},
 {'timestamp': 29.527083,
  'mission_time': -0.6645840000000014,
  'dt': 0.004166000000001446},
 {'timestamp': 29.53125,
  'mission_time': -0.6604170000000025,
  'dt': 0.004166999999998922},
 {'timestamp': 29.54375,
  'mission_time': -0.6479170000000032,
  'dt': 0.01249999999999929},
 {'timestamp': 29.547917,
  'mission_time': -0.6437500000000007,
  'dt': 0.004167000000002474},
 {'timestamp': 29.560417,
  'mission_time': -0.6312500000000014,
  'dt': 0.01249999999999929},
 {'timestamp': 29.564583,
  'mission_time': -0.6270840000000035,
  'dt': 0.004165999999997894},
 {'timestamp': 29.56875,
  'mission_time': -0.622917000000001,
  'dt': 0.004167000000002474},
 {'timestamp': 29.585417,
  'mission_time': -0.6062500000000028,
  'dt': 0.01666699999999821},
 {'timestamp': 29.589583,
  'mission_time': -0.6020840000000014,
  'dt': 0.004166000000001446},
 {'timestamp': 29.59375,
  'mission_time': -0.5979170000000025,
  'dt': 0.004166999999998922},
 {'timestamp': 29.597917,
  'mission_time': -0.5937500000000036,
  'dt': 0.004166999999998922},
 {'timestamp': 29.602083,
  'mission_time': -0.5895840000000021,
  'dt': 0.004166000000001446},
 {'timestamp': 29.60625,
  'mission_time': -0.5854170000000032,
  'dt': 0.004166999999998922},
 {'timestamp': 29.610417,
  'mission_time': -0.5812500000000007,
  'dt': 0.004167000000002474},
 {'timestamp': 29.614583,
  'mission_time': -0.5770840000000028,
  'dt': 0.004165999999997894},
 {'timestamp': 29.61875,
  'mission_time': -0.5729170000000039,
  'dt': 0.004166999999998922},
 {'timestamp': 29.622917,
  'mission_time': -0.5687500000000014,
  'dt': 0.004167000000002474},
 {'timestamp': 29.627083,
  'mission_time': -0.5645840000000035,
  'dt': 0.004165999999997894},
 {'timestamp': 29.639583,
  'mission_time': -0.5520840000000042,
  'dt': 0.01249999999999929},
 {'timestamp': 29.64375,
  'mission_time': -0.5479170000000018,
  'dt': 0.004167000000002474},
 {'timestamp': 29.65625,
  'mission_time': -0.5354170000000025,
  'dt': 0.01249999999999929},
 {'timestamp': 29.660417,
  'mission_time': -0.5312500000000036,
  'dt': 0.004166999999998922},
 {'timestamp': 29.664583,
  'mission_time': -0.5270840000000021,
  'dt': 0.004166000000001446},
 {'timestamp': 29.677083,
  'mission_time': -0.5145840000000028,
  'dt': 0.01249999999999929},
 {'timestamp': 29.68125,
  'mission_time': -0.5104170000000039,
  'dt': 0.004166999999998922},
 {'timestamp': 29.69375,
  'mission_time': -0.49791700000000105,
  'dt': 0.012500000000002842},
 {'timestamp': 29.697917,
  'mission_time': -0.49375000000000213,
  'dt': 0.004166999999998922},
 {'timestamp': 29.702083,
  'mission_time': -0.48958400000000424,
  'dt': 0.004165999999997894},
 {'timestamp': 29.71875,
  'mission_time': -0.4729170000000025,
  'dt': 0.016667000000001764},
 {'timestamp': 29.722917,
  'mission_time': -0.46875000000000355,
  'dt': 0.004166999999998922},
 {'timestamp': 29.727083,
  'mission_time': -0.4645840000000021,
  'dt': 0.004166000000001446},
 {'timestamp': 29.73125,
  'mission_time': -0.4604170000000032,
  'dt': 0.004166999999998922},
 {'timestamp': 29.735417,
  'mission_time': -0.4562500000000007,
  'dt': 0.004167000000002474},
 {'timestamp': 29.739583,
  'mission_time': -0.4520840000000028,
  'dt': 0.004165999999997894},
 {'timestamp': 29.74375,
  'mission_time': -0.4479170000000039,
  'dt': 0.004166999999998922},
 {'timestamp': 29.747917,
  'mission_time': -0.4437500000000014,
  'dt': 0.004167000000002474},
 {'timestamp': 29.752083,
  'mission_time': -0.4395840000000035,
  'dt': 0.004165999999997894},
 {'timestamp': 29.75625,
  'mission_time': -0.43541700000000105,
  'dt': 0.004167000000002474},
 {'timestamp': 29.760417,
  'mission_time': -0.43125000000000213,
  'dt': 0.004166999999998922},
 {'timestamp': 29.772917,
  'mission_time': -0.41875000000000284,
  'dt': 0.01249999999999929},
 {'timestamp': 29.777083,
  'mission_time': -0.4145840000000014,
  'dt': 0.004166000000001446},
 {'timestamp': 29.78125,
  'mission_time': -0.4104170000000025,
  'dt': 0.004166999999998922},
 {'timestamp': 29.79375,
  'mission_time': -0.3979170000000032,
  'dt': 0.01249999999999929},
 {'timestamp': 29.797917,
  'mission_time': -0.3937500000000007,
  'dt': 0.004167000000002474},
 {'timestamp': 29.810417,
  'mission_time': -0.3812500000000014,
  'dt': 0.01249999999999929},
 {'timestamp': 29.814583,
  'mission_time': -0.3770840000000035,
  'dt': 0.004165999999997894},
 {'timestamp': 29.81875,
  'mission_time': -0.37291700000000105,
  'dt': 0.004167000000002474},
 {'timestamp': 29.83125,
  'mission_time': -0.36041700000000176,
  'dt': 0.01249999999999929},
 {'timestamp': 29.835417,
  'mission_time': -0.35625000000000284,
  'dt': 0.004166999999998922},
 {'timestamp': 29.847917,
  'mission_time': -0.34375000000000355,
  'dt': 0.01249999999999929},
 {'timestamp': 29.852083,
  'mission_time': -0.3395840000000021,
  'dt': 0.004166000000001446},
 {'timestamp': 29.85625,
  'mission_time': -0.3354170000000032,
  'dt': 0.004166999999998922},
 {'timestamp': 29.860417,
  'mission_time': -0.3312500000000007,
  'dt': 0.004167000000002474},
 {'timestamp': 29.864583,
  'mission_time': -0.3270840000000028,
  'dt': 0.004165999999997894},
 {'timestamp': 29.86875,
  'mission_time': -0.3229170000000039,
  'dt': 0.004166999999998922},
 {'timestamp': 29.872917,
  'mission_time': -0.3187500000000014,
  'dt': 0.004167000000002474},
 {'timestamp': 29.877083,
  'mission_time': -0.3145840000000035,
  'dt': 0.004165999999997894},
 {'timestamp': 29.88125,
  'mission_time': -0.31041700000000105,
  'dt': 0.004167000000002474},
 {'timestamp': 29.885417,
  'mission_time': -0.30625000000000213,
  'dt': 0.004166999999998922},
 {'timestamp': 29.889583,
  'mission_time': -0.30208400000000424,
  'dt': 0.004165999999997894},
 {'timestamp': 29.89375,
  'mission_time': -0.29791700000000176,
  'dt': 0.004167000000002474},
 {'timestamp': 29.90625,
  'mission_time': -0.2854170000000025,
  'dt': 0.01249999999999929},
 {'timestamp': 29.910417,
  'mission_time': -0.28125000000000355,
  'dt': 0.004166999999998922},
 {'timestamp': 29.922917,
  'mission_time': -0.2687500000000007,
  'dt': 0.012500000000002842},
 {'timestamp': 29.927083,
  'mission_time': -0.2645840000000028,
  'dt': 0.004165999999997894},
 {'timestamp': 29.93125,
  'mission_time': -0.2604170000000039,
  'dt': 0.004166999999998922},
 {'timestamp': 29.94375,
  'mission_time': -0.24791700000000105,
  'dt': 0.012500000000002842},
 {'timestamp': 29.947917,
  'mission_time': -0.24375000000000213,
  'dt': 0.004166999999998922},
 {'timestamp': 29.960417,
  'mission_time': -0.23125000000000284,
  'dt': 0.01249999999999929},
 {'timestamp': 29.964583,
  'mission_time': -0.2270840000000014,
  'dt': 0.004166000000001446},
 {'timestamp': 29.96875,
  'mission_time': -0.22291700000000247,
  'dt': 0.004166999999998922},
 {'timestamp': 29.972917,
  'mission_time': -0.21875000000000355,
  'dt': 0.004166999999998922},
 {'timestamp': 29.985417,
  'mission_time': -0.2062500000000007,
  'dt': 0.012500000000002842},
 {'timestamp': 29.989583,
  'mission_time': -0.20208400000000282,
  'dt': 0.004165999999997894},
 {'timestamp': 29.99375,
  'mission_time': -0.1979170000000039,
  'dt': 0.004166999999998922},
 {'timestamp': 29.997917,
  'mission_time': -0.19375000000000142,
  'dt': 0.004167000000002474},
 {'timestamp': 30.002083,
  'mission_time': -0.18958400000000353,
  'dt': 0.004165999999997894},
 {'timestamp': 30.00625,
  'mission_time': -0.18541700000000105,
  'dt': 0.004167000000002474},
 {'timestamp': 30.010417,
  'mission_time': -0.18125000000000213,
  'dt': 0.004166999999998922},
 {'timestamp': 30.014583,
  'mission_time': -0.17708400000000424,
  'dt': 0.004165999999997894},
 {'timestamp': 30.01875,
  'mission_time': -0.17291700000000176,
  'dt': 0.004167000000002474},
 {'timestamp': 30.022917,
  'mission_time': -0.16875000000000284,
  'dt': 0.004166999999998922},
 {'timestamp': 30.035417,
  'mission_time': -0.15625000000000355,
  'dt': 0.01249999999999929},
 {'timestamp': 30.039583,
  'mission_time': -0.1520840000000021,
  'dt': 0.004166000000001446},
 {'timestamp': 30.04375,
  'mission_time': -0.14791700000000318,
  'dt': 0.004166999999998922},
 {'timestamp': 30.060417,
  'mission_time': -0.13125000000000142,
  'dt': 0.016667000000001764},
 {'timestamp': 30.064583,
  'mission_time': -0.12708400000000353,
  'dt': 0.004165999999997894},
 {'timestamp': 30.06875,
  'mission_time': -0.12291700000000105,
  'dt': 0.004167000000002474},
 {'timestamp': 30.08125,
  'mission_time': -0.11041700000000176,
  'dt': 0.01249999999999929},
 {'timestamp': 30.085417,
  'mission_time': -0.10625000000000284,
  'dt': 0.004166999999998922},
 {'timestamp': 30.089583,
  'mission_time': -0.1020840000000014,
  'dt': 0.004166000000001446},
 {'timestamp': 30.102083,
  'mission_time': -0.0895840000000021,
  'dt': 0.01249999999999929},
 {'timestamp': 30.10625,
  'mission_time': -0.08541700000000318,
  'dt': 0.004166999999998922},
 {'timestamp': 30.110417,
  'mission_time': -0.08125000000000071,
  'dt': 0.004167000000002474},
 {'timestamp': 30.114583,
  'mission_time': -0.07708400000000282,
  'dt': 0.004165999999997894},
 {'timestamp': 30.11875,
  'mission_time': -0.0729170000000039,
  'dt': 0.004166999999998922},
 {'timestamp': 30.122917,
  'mission_time': -0.06875000000000142,
  'dt': 0.004167000000002474},
 {'timestamp': 30.127083,
  'mission_time': -0.06458400000000353,
  'dt': 0.004165999999997894},
 {'timestamp': 30.13125,
  'mission_time': -0.06041700000000105,
  'dt': 0.004167000000002474},
 {'timestamp': 30.135417,
  'mission_time': -0.05625000000000213,
  'dt': 0.004166999999998922},
 {'timestamp': 30.139583,
  'mission_time': -0.05208400000000424,
  'dt': 0.004165999999997894},
 {'timestamp': 30.14375,
  'mission_time': -0.047917000000001764,
  'dt': 0.004167000000002474},
 {'timestamp': 30.147917,
  'mission_time': -0.04375000000000284,
  'dt': 0.004166999999998922},
 {'timestamp': 30.160417,
  'mission_time': -0.03125000000000355,
  'dt': 0.01249999999999929},
 {'timestamp': 30.164583,
  'mission_time': -0.027084000000002106,
  'dt': 0.004166000000001446},
 {'timestamp': 30.16875,
  'mission_time': -0.022917000000003185,
  'dt': 0.004166999999998922},
 {'timestamp': 30.18125,
  'mission_time': -0.010417000000003895,
  'dt': 0.01249999999999929},
 {'timestamp': 30.185417,
  'mission_time': -0.006250000000001421,
  'dt': 0.004167000000002474},
 {'timestamp': 30.197917,
  'mission_time': 0.006249999999997868,
  'dt': 0.01249999999999929},
 {'timestamp': 30.202083,
  'mission_time': 0.010415999999995762,
  'dt': 0.004165999999997894},
 {'timestamp': 30.214583,
  'mission_time': 0.022915999999998604,
  'dt': 0.012500000000002842},
 {'timestamp': 30.21875,
  'mission_time': 0.027082999999997526,
  'dt': 0.004166999999998922},
 {'timestamp': 30.222917,
  'mission_time': 0.031249999999996447,
  'dt': 0.004166999999998922},
 {'timestamp': 30.235417,
  'mission_time': 0.04374999999999929,
  'dt': 0.012500000000002842},
 {'timestamp': 30.239583,
  'mission_time': 0.04791599999999718,
  'dt': 0.004165999999997894},
 {'timestamp': 30.24375,
  'mission_time': 0.052082999999996105,
  'dt': 0.004166999999998922},
 {'timestamp': 30.247917,
  'mission_time': 0.05624999999999858,
  'dt': 0.004167000000002474},
 {'timestamp': 30.252083,
  'mission_time': 0.06041599999999647,
  'dt': 0.004165999999997894},
 {'timestamp': 30.25625,
  'mission_time': 0.06458299999999895,
  'dt': 0.004167000000002474},
 {'timestamp': 30.260417,
  'mission_time': 0.06874999999999787,
  'dt': 0.004166999999998922},
 {'timestamp': 30.264583,
  'mission_time': 0.07291599999999576,
  'dt': 0.004165999999997894},
 {'timestamp': 30.26875,
  'mission_time': 0.07708299999999824,
  'dt': 0.004167000000002474},
 {'timestamp': 30.272917,
  'mission_time': 0.08124999999999716,
  'dt': 0.004166999999998922},
 {'timestamp': 30.277083,
  'mission_time': 0.0854159999999986,
  'dt': 0.004166000000001446},
 {'timestamp': 30.28125,
  'mission_time': 0.08958299999999753,
  'dt': 0.004166999999998922},
 {'timestamp': 30.29375,
  'mission_time': 0.10208299999999682,
  'dt': 0.01249999999999929},
 {'timestamp': 30.297917,
  'mission_time': 0.10624999999999929,
  'dt': 0.004167000000002474},
 {'timestamp': 30.302083,
  'mission_time': 0.11041599999999718,
  'dt': 0.004165999999997894},
 {'timestamp': 30.314583,
  'mission_time': 0.12291599999999647,
  'dt': 0.01249999999999929},
 {'timestamp': 30.31875,
  'mission_time': 0.12708299999999895,
  'dt': 0.004167000000002474},
 {'timestamp': 30.33125,
  'mission_time': 0.13958299999999824,
  'dt': 0.01249999999999929},
 {'timestamp': 30.335417,
  'mission_time': 0.14374999999999716,
  'dt': 0.004166999999998922},
 {'timestamp': 30.339583,
  'mission_time': 0.1479159999999986,
  'dt': 0.004166000000001446},
 {'timestamp': 30.352083,
  'mission_time': 0.1604159999999979,
  'dt': 0.01249999999999929},
 {'timestamp': 30.35625,
  'mission_time': 0.16458299999999682,
  'dt': 0.004166999999998922},
 {'timestamp': 30.36875,
  'mission_time': 0.1770829999999961,
  'dt': 0.01249999999999929},
 {'timestamp': 30.372917,
  'mission_time': 0.18124999999999858,
  'dt': 0.004167000000002474},
 {'timestamp': 30.377083,
  'mission_time': 0.18541599999999647,
  'dt': 0.004165999999997894},
 {'timestamp': 30.38125,
  'mission_time': 0.18958299999999895,
  'dt': 0.004167000000002474},
 {'timestamp': 30.385417,
  'mission_time': 0.19374999999999787,
  'dt': 0.004166999999998922},
 {'timestamp': 30.389583,
  'mission_time': 0.19791599999999576,
  'dt': 0.004165999999997894},
 {'timestamp': 30.39375,
  'mission_time': 0.20208299999999824,
  'dt': 0.004167000000002474},
 {'timestamp': 30.397917,
  'mission_time': 0.20624999999999716,
  'dt': 0.004166999999998922},
 {'timestamp': 30.402083,
  'mission_time': 0.2104159999999986,
  'dt': 0.004166000000001446},
 {'timestamp': 30.414583,
  'mission_time': 0.2229159999999979,
  'dt': 0.01249999999999929},
 {'timestamp': 30.41875,
  'mission_time': 0.22708299999999682,
  'dt': 0.004166999999998922},
 {'timestamp': 30.44375,
  'mission_time': 0.25208299999999895,
  'dt': 0.02500000000000213}]
In [6]:
start_image = 268
end_image = 288

images = [
    Image.open(f'cansat-slowmo-full/frame_{i:04d}.png')
    for i in range(start_image, end_image+1)
] 

cropped_images = []
for i in range(len(images)):
    row = ts_records[start_image + i - 1]
    ts = row['mission_time']
    left = 850 + ts * 350
    right = left + 100
    image = images[i]
    image = image.crop((left, 0, right, image.height))
    cropped_images.append(dict(image=image, row=row, left=left, right=right, frame_index=start_image + i - 1))

scaling = 20_000
num_images = len(cropped_images)
max_time = timestamps[timestamps['frame_index'] <= end_image]['mission_time'].max()
total_width = scaling * max_time
total_height = cropped_images[0]['image'].height

combined_image = Image.new('RGB', (int(total_width), total_height))

for i, img in enumerate(cropped_images):
    row = img['row']
    ts = row['mission_time']
    left = ts*scaling - 125
    img['paste_left'] = left
    combined_image.paste(img['image'], (int(left), 0))

combined_image.save("060-launch-analysis-no-labels.png")

font = ImageFont.truetype("freefont/FreeSansBold.ttf", size=24)  
draw = ImageDraw.Draw(combined_image)

# Add labels
for i, img in enumerate(cropped_images):
    row = img['row']
    ts = row['mission_time']
    dt = row['dt']
    frame_index = img['frame_index']
    draw.text((20+img['paste_left'], 930), f"{ts:.3f}", fill="white", font=font)
    draw.text((20+img['paste_left'], 960), f"{dt:.3f}", fill="white", font=font)
    draw.text((20+img['paste_left'], 990), f"{frame_index}", fill="white", font=font)


# Add lines
line_spacing = 50  # Adjust the spacing as needed
for y in range(0, combined_image.height-150, line_spacing):
    draw.line([(0, y), (combined_image.width, y)], fill="white", width=1)


combined_image.save("060-launch-analysis.png")
combined_image
Out[6]:
No description has been provided for this image

Correcting for perspective distortion¶

In the image above we see that the bottle towards the top of the image is smaller than the bottle towards the bottom of the image. This is due to perspective distortion.

We can use the above image to measure the height of the bottle in each slice and then use this to correct for perspective distortion.

To do this I use a tool called Napari to manually measure the height of the bottle in each slice and save these as a csv file.

In [7]:
from collections import defaultdict

measurements = pd.read_csv("060-launch-analysis-measurements.csv").to_dict(orient="records")
mission_times = timestamps['mission_time'].to_dict()

lines = defaultdict(dict)
for m in measurements:
    lines[m['index']][m['vertex-index']] = m

def to_line_data(l, ix):
    p0 = l[0]
    p1 = l[1]
    # length = np.sqrt((p0['axis-1'] - p1['axis-1'])**2 + (p0['axis-0'] - p1['axis-0'])**2)
    length = p1['axis-0'] - p0['axis-0'] # We really only consider the vertical length here
    centre = (p0['axis-1'] + p1['axis-1']) / 2, (p0['axis-0'] + p1['axis-0']) / 2

    frame_id = ix + 267
    return {
        'line_id': ix,
        'y0': p0['axis-0'],
        'x0': p0['axis-1'],
        'y1': p1['axis-0'],
        'x1': p1['axis-1'],
        'yc': centre[1],
        'length': length,
        'centre': centre,
        'frame_id': frame_id,
        'time': mission_times[frame_id],
    }

lines =[to_line_data(l, ix) for ix, l in lines.items()]

line_df = pd.DataFrame(lines)
line_df
Out[7]:
line_id y0 x0 y1 x1 yc length centre frame_id time
0 0 735.359000 50.431026 924.83594 42.816807 830.097470 189.476940 (46.6239165, 830.09747) 267 0.006250
1 1 733.309100 131.258880 927.47144 124.688470 830.390270 194.162340 (127.973675, 830.39027) 268 0.010416
2 2 719.544860 377.842400 913.12180 370.813960 816.333330 193.576940 (374.32818, 816.3333299999999) 269 0.022916
3 3 712.809270 461.013100 906.38600 454.277200 809.597635 193.576730 (457.64515, 809.597635) 270 0.027083
4 4 702.391850 543.625900 893.36615 535.544560 797.879000 190.974300 (539.58523, 797.8789999999999) 271 0.031250
5 5 651.679500 791.860350 839.42633 781.480040 745.552915 187.746830 (786.670195, 745.552915) 272 0.043750
6 6 629.113830 876.256160 815.95776 864.973300 722.535795 186.843930 (870.61473, 722.535795) 273 0.047916
7 7 602.486270 959.749300 787.07400 950.722800 694.780135 184.587730 (955.23605, 694.780135) 274 0.052083
8 8 572.699500 1040.985800 754.12790 1031.508200 663.413700 181.428400 (1036.2469999999998, 663.4137) 275 0.056250
9 9 537.948300 1127.186900 718.02280 1117.709700 627.985550 180.074500 (1122.4483, 627.98555) 276 0.060416
10 10 500.489230 1210.680000 677.85596 1200.299800 589.172595 177.366730 (1205.4899, 589.172595) 277 0.064583
11 11 461.022400 1296.229000 638.00410 1285.119000 549.513250 176.981700 (1290.674, 549.51325) 278 0.068750
12 12 420.033100 1381.272200 589.73650 1370.163100 504.884800 169.703400 (1375.71765, 504.8848) 279 0.072916
13 13 375.213070 1466.698500 544.15020 1454.440600 459.681635 168.937130 (1460.56955, 459.681635) 280 0.077083
14 14 328.477630 1552.124800 498.18090 1540.248500 413.329265 169.703270 (1546.18665, 413.32926499999996) 281 0.081250
15 15 282.508330 1638.700200 448.76404 1628.357200 365.636185 166.255710 (1633.5286999999998, 365.636185) 282 0.085416
16 16 232.708270 1723.360400 397.04846 1712.634400 314.878365 164.340190 (1717.9974, 314.878365) 283 0.089583
17 17 86.901470 1978.973000 249.60226 1972.849900 168.251865 162.700790 (1975.91145, 168.251865) 284 0.102083
18 18 39.228405 2065.571800 197.55544 2058.095700 118.391923 158.327035 (2061.83375, 118.3919225) 285 0.106250
19 19 -2.321506 2149.546400 149.00763 2145.081500 73.343062 151.329136 (2147.3139499999997, 73.343062) 286 0.110416
In [8]:
lines
Out[8]:
[{'line_id': 0,
  'y0': 735.359,
  'x0': 50.431026,
  'y1': 924.83594,
  'x1': 42.816807,
  'yc': 830.09747,
  'length': 189.47694,
  'centre': (46.6239165, 830.09747),
  'frame_id': 267,
  'time': 0.006249999999997868},
 {'line_id': 1,
  'y0': 733.3091,
  'x0': 131.25888,
  'y1': 927.47144,
  'x1': 124.68847,
  'yc': 830.39027,
  'length': 194.16234000000009,
  'centre': (127.973675, 830.39027),
  'frame_id': 268,
  'time': 0.010415999999995762},
 {'line_id': 2,
  'y0': 719.54486,
  'x0': 377.8424,
  'y1': 913.1218,
  'x1': 370.81396,
  'yc': 816.3333299999999,
  'length': 193.57694000000004,
  'centre': (374.32818, 816.3333299999999),
  'frame_id': 269,
  'time': 0.022915999999998604},
 {'line_id': 3,
  'y0': 712.80927,
  'x0': 461.0131,
  'y1': 906.386,
  'x1': 454.2772,
  'yc': 809.597635,
  'length': 193.57673,
  'centre': (457.64515, 809.597635),
  'frame_id': 270,
  'time': 0.027082999999997526},
 {'line_id': 4,
  'y0': 702.39185,
  'x0': 543.6259,
  'y1': 893.36615,
  'x1': 535.54456,
  'yc': 797.8789999999999,
  'length': 190.97429999999997,
  'centre': (539.58523, 797.8789999999999),
  'frame_id': 271,
  'time': 0.031249999999996447},
 {'line_id': 5,
  'y0': 651.6795,
  'x0': 791.86035,
  'y1': 839.42633,
  'x1': 781.48004,
  'yc': 745.552915,
  'length': 187.74683000000005,
  'centre': (786.670195, 745.552915),
  'frame_id': 272,
  'time': 0.04374999999999929},
 {'line_id': 6,
  'y0': 629.11383,
  'x0': 876.25616,
  'y1': 815.95776,
  'x1': 864.9733,
  'yc': 722.535795,
  'length': 186.84393,
  'centre': (870.61473, 722.535795),
  'frame_id': 273,
  'time': 0.04791599999999718},
 {'line_id': 7,
  'y0': 602.48627,
  'x0': 959.7493,
  'y1': 787.074,
  'x1': 950.7228,
  'yc': 694.780135,
  'length': 184.58772999999997,
  'centre': (955.23605, 694.780135),
  'frame_id': 274,
  'time': 0.052082999999996105},
 {'line_id': 8,
  'y0': 572.6995,
  'x0': 1040.9858,
  'y1': 754.1279,
  'x1': 1031.5082,
  'yc': 663.4137,
  'length': 181.4284,
  'centre': (1036.2469999999998, 663.4137),
  'frame_id': 275,
  'time': 0.05624999999999858},
 {'line_id': 9,
  'y0': 537.9483,
  'x0': 1127.1869,
  'y1': 718.0228,
  'x1': 1117.7097,
  'yc': 627.98555,
  'length': 180.07449999999994,
  'centre': (1122.4483, 627.98555),
  'frame_id': 276,
  'time': 0.06041599999999647},
 {'line_id': 10,
  'y0': 500.48923,
  'x0': 1210.68,
  'y1': 677.85596,
  'x1': 1200.2998,
  'yc': 589.172595,
  'length': 177.36672999999996,
  'centre': (1205.4899, 589.172595),
  'frame_id': 277,
  'time': 0.06458299999999895},
 {'line_id': 11,
  'y0': 461.0224,
  'x0': 1296.229,
  'y1': 638.0041,
  'x1': 1285.119,
  'yc': 549.51325,
  'length': 176.9817,
  'centre': (1290.674, 549.51325),
  'frame_id': 278,
  'time': 0.06874999999999787},
 {'line_id': 12,
  'y0': 420.0331,
  'x0': 1381.2722,
  'y1': 589.7365,
  'x1': 1370.1631,
  'yc': 504.8848,
  'length': 169.7034,
  'centre': (1375.71765, 504.8848),
  'frame_id': 279,
  'time': 0.07291599999999576},
 {'line_id': 13,
  'y0': 375.21307,
  'x0': 1466.6985,
  'y1': 544.1502,
  'x1': 1454.4406,
  'yc': 459.681635,
  'length': 168.93713000000002,
  'centre': (1460.56955, 459.681635),
  'frame_id': 280,
  'time': 0.07708299999999824},
 {'line_id': 14,
  'y0': 328.47763,
  'x0': 1552.1248,
  'y1': 498.1809,
  'x1': 1540.2485,
  'yc': 413.32926499999996,
  'length': 169.70327000000003,
  'centre': (1546.18665, 413.32926499999996),
  'frame_id': 281,
  'time': 0.08124999999999716},
 {'line_id': 15,
  'y0': 282.50833,
  'x0': 1638.7002,
  'y1': 448.76404,
  'x1': 1628.3572,
  'yc': 365.636185,
  'length': 166.25571000000002,
  'centre': (1633.5286999999998, 365.636185),
  'frame_id': 282,
  'time': 0.0854159999999986},
 {'line_id': 16,
  'y0': 232.70827,
  'x0': 1723.3604,
  'y1': 397.04846,
  'x1': 1712.6344,
  'yc': 314.878365,
  'length': 164.34018999999998,
  'centre': (1717.9974, 314.878365),
  'frame_id': 283,
  'time': 0.08958299999999753},
 {'line_id': 17,
  'y0': 86.90147,
  'x0': 1978.973,
  'y1': 249.60226,
  'x1': 1972.8499,
  'yc': 168.251865,
  'length': 162.70078999999998,
  'centre': (1975.91145, 168.251865),
  'frame_id': 284,
  'time': 0.10208299999999682},
 {'line_id': 18,
  'y0': 39.228405,
  'x0': 2065.5718,
  'y1': 197.55544,
  'x1': 2058.0957,
  'yc': 118.3919225,
  'length': 158.327035,
  'centre': (2061.83375, 118.3919225),
  'frame_id': 285,
  'time': 0.10624999999999929},
 {'line_id': 19,
  'y0': -2.321506,
  'x0': 2149.5464,
  'y1': 149.00763,
  'x1': 2145.0815,
  'yc': 73.343062,
  'length': 151.329136,
  'centre': (2147.3139499999997, 73.343062),
  'frame_id': 286,
  'time': 0.11041599999999718}]
In [9]:
annotated_image = Image.open("060-launch-analysis.png")
draw = ImageDraw.Draw(annotated_image)

for m in lines:
    draw.line([(m['x0'], m['y0']), (m['x1'], m['y1'])], fill="red", width=2)
    draw.circle([m['centre'][0], m['centre'][1]], 5, fill="blue")

annotated_image
Out[9]: