Skip to content

Instantly share code, notes, and snippets.

@ammarkarachi
Created October 6, 2022 22:08
Show Gist options
  • Save ammarkarachi/69c9c7759a855dbf4970e0b3c2cc61cb to your computer and use it in GitHub Desktop.
Save ammarkarachi/69c9c7759a855dbf4970e0b3c2cc61cb to your computer and use it in GitHub Desktop.
Python code to generate random drone paths for testing purposes of drone viewer application
from math import radians, sin, asin, cos, sqrt, floor, pi
import random
import datetime
import uuid
import csv
# bounding box
p1 = [25.837377,-106.645646] # upper left corner
p2 = [36.500704,-93.508292] # lower right corner
# number of flights
number_of_flights = 10
# number of years
end_year = 2021
# file path and name
file_name = './test-data.csv'
def distance(lat1, lat2, lon1, lon2):
lon1 = radians(lon1)
lon2 = radians(lon2)
lat1 = radians(lat1)
lat2 = radians(lat2)
# Haversine formula
dlon = lon2 - lon1
dlat = lat2 - lat1
a = sin(dlat / 2)**2 + cos(lat1) * cos(lat2) * sin(dlon / 2)**2
c = 2 * asin(sqrt(a))
r = 3956 # earth circumference in miles
return(c * r)
def random_date(start, end):
"""
This function will return a random datetime between two datetime
objects.
"""
delta = end - start
int_delta = (delta.days * 24 * 60 * 60) + delta.seconds
random_second = random.randrange(int_delta)
return start + datetime.timedelta(seconds=random_second)
def new_lat_long(dx, dy, lon, lat):
new_lat = lat + (dy / 3956) * (180 / pi)
new_lon = lon + (dx / 3956) * (180 / pi) * cos(lat * pi / 180)
return [new_lat, new_lon]
# lat lon
l1_dist = distance(p2[0], p1[0], p2[1], p2[1])
l1 = floor(l1_dist)
l2_dist = distance(p2[0], p2[0], p2[1], p1[1])
l2 = floor(l2_dist)
print(l1)
print(l2)
# average distance covered in 30 seconds assuming speed of 50 mph
dist = (50/60)/2
random.seed()
drone_names = ['Nova', 'V-BAT', 'Intrepid', 'Sky Scanner', 'Wind Razer', 'Wind Scribe']
generation = 26
header = ['Name', 'Generation', 'FlightIdenitifier', 'DroneIdentifier', 'Latitude', 'Longitude', 'Timestamp', 'Checksum']
rows = []
for count in range(number_of_flights):
result = []
start_point = [
random.randrange(1, l2, 1),
random.randrange(1, l1, 1)
]
result.append(start_point)
duration = random.randrange(0, 59, 1)
for j in range(duration):
angle = random.randrange(-90, 90)
addx = sin(radians(angle)) * dist
addy = sin(radians(90 - angle)) * dist
start_point = [ start_point[0] + addx , start_point[1] + addy]
result.append(start_point)
lat_lon_result = [ new_lat_long(point[0], point[1], p1[1], p1[0]) for point in result ]
end_date = datetime.datetime(end_year, 12, 31, 23, 59, 59)
start_date = datetime.datetime(year=end_date.year, month=1, day=1, hour=1, microsecond=0, minute=0)
start_ts = random.uniform(start_date.timestamp(), end_date.timestamp())
name = drone_names[random.randint(0, len(drone_names) - 1)]
gen = random.randint(1, generation)
flight_id = str(uuid.uuid4())
rows.extend([ [name, gen, flight_id, f'{name}-{gen}', lat_lon[0], lat_lon[1], start_ts + idx*15, ] for idx, lat_lon in enumerate(lat_lon_result) ])
with open(file_name, 'w', encoding='UTF8') as f:
csv_writer = csv.writer(f)
csv_writer.writerow(header)
csv_writer.writerows(rows)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment