Skip to content

Commit 8333d1a

Browse files
committed
Implement impulsive maneuvers
1 parent 72a37ef commit 8333d1a

File tree

4 files changed

+172
-14
lines changed

4 files changed

+172
-14
lines changed

command_panel.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -554,6 +554,41 @@ def generate_s2():
554554
cm_s2_button = tk.Button(entry_panel, text="Create Const. Thrust Mnv.", command=generate_s2)
555555
cm_s2_button.grid(row=4, column=0)
556556

557+
# option 3
558+
cm_s3t1_label = tk.Label(entry_panel, text="Maneuver Name")
559+
cm_s3t2_label = tk.Label(entry_panel, text="Vessel Name")
560+
cm_s3t3_label = tk.Label(entry_panel, text="Frame of Ref.")
561+
cm_s3t4_label = tk.Label(entry_panel, text="Orientation")
562+
cm_s3t5_label = tk.Label(entry_panel, text="Delta-v")
563+
cm_s3t6_label = tk.Label(entry_panel, text="Perform Time")
564+
cm_s3t1_label.grid(row=5, column=1)
565+
cm_s3t2_label.grid(row=5, column=2)
566+
cm_s3t3_label.grid(row=5, column=3)
567+
cm_s3t4_label.grid(row=5, column=4)
568+
cm_s3t5_label.grid(row=5, column=5)
569+
cm_s3t6_label.grid(row=5, column=6)
570+
571+
cm_s3t1 = tk.Text(entry_panel, width=15, height=1)
572+
cm_s3t2 = tk.Text(entry_panel, width=15, height=1)
573+
cm_s3t3 = tk.Text(entry_panel, width=15, height=1)
574+
cm_s3t4 = tk.Text(entry_panel, width=15, height=1)
575+
cm_s3t5 = tk.Text(entry_panel, width=15, height=1)
576+
cm_s3t6 = tk.Text(entry_panel, width=15, height=1)
577+
cm_s3t1.grid(row=6, column=1)
578+
cm_s3t2.grid(row=6, column=2)
579+
cm_s3t3.grid(row=6, column=3)
580+
cm_s3t4.grid(row=6, column=4)
581+
cm_s3t5.grid(row=6, column=5)
582+
cm_s3t6.grid(row=6, column=6)
583+
584+
def generate_s3():
585+
if cm_s3t1.get("1.0","end-1c") and cm_s3t2.get("1.0","end-1c") and cm_s3t3.get("1.0","end-1c") and cm_s3t4.get("1.0","end-1c") and cm_s3t5.get("1.0","end-1c") and cm_s3t6.get("1.0","end-1c"):
586+
command = "create_maneuver " + cm_s3t1.get("1.0", "end-1c") + " impulsive " + cm_s3t2.get("1.0","end-1c") + " " + cm_s3t3.get("1.0","end-1c") + " " + cm_s3t4.get("1.0","end-1c") + " " + cm_s3t5.get("1.0","end-1c") + " " + cm_s3t6.get("1.0","end-1c")
587+
add_to_buffer(command)
588+
589+
cm_s3_button = tk.Button(entry_panel, text="Create Impulsive Mnv.", command=generate_s3)
590+
cm_s3_button.grid(row=6, column=0)
591+
557592
elif cmd_a == "delete_maneuver":
558593
dm_help = tk.Label(entry_panel, text="'delete_maneuver' command removes a maneuver from the simulation.")
559594
dm_help.grid(row=0, column=0, columnspan=10)

graphics.py

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -134,20 +134,36 @@ def drawTrajectories(vessels, scene_lock):
134134
glVertex3f(vertices[i].x, vertices[i].y, vertices[i].z)
135135
glEnd()
136136

137-
def drawManeuvers(maneuvers):
138-
139-
# change color to maneuver color
140-
glColor(1.0, 1.0, 0.0)
137+
def drawManeuvers(maneuvers, point_size, cam):
141138

142139
for m in maneuvers:
143-
144-
vertices = m.get_draw_vertices()
145140

146-
if len(vertices) > 3:
147-
glBegin(GL_LINE_STRIP)
148-
for i in range(1, len(vertices)):
149-
glVertex3f(vertices[i].x, vertices[i].y, vertices[i].z)
150-
glEnd()
141+
if m.type != "impulsive":
142+
143+
if m.type == "const_accel":
144+
glColor(0.0, 1.0, 1.0)
145+
else: # const_thrust
146+
glColor(1.0, 1.0, 0.0)
147+
148+
vertices = m.get_draw_vertices()
149+
150+
if len(vertices) > 3:
151+
glBegin(GL_LINE_STRIP)
152+
for i in range(1, len(vertices)):
153+
glVertex3f(vertices[i].x, vertices[i].y, vertices[i].z)
154+
glEnd()
155+
156+
else:
157+
if m.get_draw_point():
158+
glColor(1.0, 0.0, 1.0)
159+
vertex = m.get_draw_point()
160+
cam_dist = (cam.get_pos() - vertex).mag()
161+
mnv_point_size = max(int(60000/cam_dist), 1)
162+
glPointSize(mnv_point_size)
163+
glBegin(GL_POINTS)
164+
glVertex3f(vertex.x, vertex.y, vertex.z)
165+
glEnd()
166+
glPointSize(point_size)
151167

152168
def drawProjections(projections):
153169

@@ -337,7 +353,7 @@ def drawRapidCompute(cam, size=0.2):
337353
render_AN("RAPID COMPUTE ACTIVE", (1,0,0), [-5, 0.5], cam, size)
338354
render_AN("PLEASE BE PATIENT", (1,0,0), [-3, -0.5], cam, size/1.5)
339355

340-
def drawScene(bodies, vessels, surface_points, barycenters, projections, maneuvers, active_cam, show_trajectories=True, draw_mode=1, labels_visible=True, scene_lock=None):
356+
def drawScene(bodies, vessels, surface_points, barycenters, projections, maneuvers, active_cam, show_trajectories=True, draw_mode=1, labels_visible=True, scene_lock=None, point_size=2):
341357

342358
# sort the objects by their distance to the camera so we can draw the ones in the front last
343359
# and it won't look like a ridiculous mess on screen
@@ -370,6 +386,6 @@ def drawScene(bodies, vessels, surface_points, barycenters, projections, maneuve
370386
drawProjectionLabels(projections, active_cam)
371387

372388
drawTrajectories(vessels, scene_lock)
373-
drawManeuvers(maneuvers)
389+
drawManeuvers(maneuvers, point_size, active_cam)
374390
glDisable(GL_LINE_SMOOTH)
375391

main.py

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,15 @@ def import_scenario(scn_filename):
226226
float(line[6]), float(line[7]), float(line[8]),
227227
float(line[9]), float(line[10]))
228228

229+
elif line[2] == "impulsive":
230+
if (line[5] in preset_orientations):
231+
new_maneuver = maneuver_impulsive(line[1], find_obj_by_name(line[3]), find_obj_by_name(line[4]),
232+
line[5], float(line[6]), float(line[7]))
233+
else:
234+
line[5] = eval(line[5])
235+
new_maneuver = maneuver_impulsive(line[1], find_obj_by_name(line[3]), find_obj_by_name(line[4]),
236+
vec3(lst=line[5]), float(line[6]), float(line[7]))
237+
229238
maneuvers.append(new_maneuver)
230239
print("Loading maneuver:", new_maneuver.get_name())
231240

@@ -318,6 +327,8 @@ def export_scenario(scn_filename):
318327
time_save_string = "T|" + str(sim_time) + "\n"
319328
scn_file.write(time_save_string)
320329

330+
scn_file.write("\n")
331+
321332
print("Writing bodies...")
322333
for b in bodies:
323334
body_save_string = "B|" + b.get_name() + "|" + b.get_model_path() + "|" + str(b.get_mass()) + "|" +\
@@ -327,12 +338,16 @@ def export_scenario(scn_filename):
327338
str(b.atmos_scale_height) + "\n"
328339
scn_file.write(body_save_string)
329340

341+
scn_file.write("\n")
342+
330343
print("Writing vessels...")
331344
for v in vessels:
332345
vessel_save_string = "V|" + v.get_name() + "|" + v.get_model_path() + "|" + str(v.get_color()) + "|" +\
333346
str(v.get_pos().tolist()) + "|" + str(v.get_vel().tolist()) + "\n"
334347
scn_file.write(vessel_save_string)
335348

349+
scn_file.write("\n")
350+
336351
print("Writing maneuvers...")
337352
for m in maneuvers:
338353
maneuver_save_string = "M|" + m.get_name() + "|"
@@ -343,13 +358,21 @@ def export_scenario(scn_filename):
343358
maneuver_save_string += "const_thrust|" + m.get_vessel().get_name() + "|" + m.frame_body.get_name() + "|" +\
344359
str(m.orientation_input) + "|" + str(m.thrust) + "|" + str(m.mass_init) + "|" + str(m.mass_flow) + "|" +\
345360
str(m.t_start) + "|" + str(m.duration) + "\n"
361+
362+
elif m.get_type() == "impulsive":
363+
maneuver_save_string += "impulsive|" + m.get_vessel().get_name() + "|" + m.frame_body.get_name() + "|" +\
364+
str(m.orientation_input) + "|" + str(m.delta_v) + "|" + str(m.t_perform) + "\n"
346365
scn_file.write(maneuver_save_string)
347366

367+
scn_file.write("\n")
368+
348369
print("Writing surface points...")
349370
for s in surface_points:
350371
sp_save_string = "S|" + s.get_name() + "|" + s.get_body().get_name() + "|" + str(s.get_color()) + "|" + str(s.get_gpos()) + "\n"
351372
scn_file.write(sp_save_string)
352373

374+
scn_file.write("\n")
375+
353376
print("Writing barycenters...")
354377
for bc in barycenters:
355378
bc_save_string = "C|" + bc.get_name() + "|"
@@ -358,18 +381,24 @@ def export_scenario(scn_filename):
358381
bc_save_string = bc_save_string[:-1]+"\n"
359382
scn_file.write(bc_save_string)
360383

384+
scn_file.write("\n")
385+
361386
print("Writing radiation pressures...")
362387
for rp in radiation_pressures:
363388
rp_save_string = "R|" + rp.get_name() + "|" + rp.vessel.get_name() + "|" + rp.body.get_name() + "|" + str(rp.get_area()) +\
364389
"|" + rp.orientation_frame.get_name() + "|" + str(rp.direction_input) + "|" + str(rp.mass) + "|" + str(rp.mass_auto_update) + "\n"
365390
scn_file.write(rp_save_string)
366391

392+
scn_file.write("\n")
393+
367394
print("Writing atmospheric drags...")
368395
for ad in atmospheric_drags:
369396
ad_save_string = "A|" + ad.get_name() + "|" + ad.vessel.get_name() + "|" + ad.body.get_name() + "|" + str(ad.get_area()) +\
370397
"|" + str(ad.get_drag_coeff()) + "|" + str(ad.get_mass()) + "|" + str(ad.mass_auto_update) + "\n"
371398
scn_file.write(ad_save_string)
372399

400+
scn_file.write("\n")
401+
373402
print("Scenario export complete!")
374403
time.sleep(2)
375404

@@ -402,6 +431,17 @@ def create_maneuver_const_thrust(mnv_name, mnv_vessel, mnv_frame, mnv_orientatio
402431

403432
maneuvers.append(new_maneuver)
404433

434+
def create_maneuver_impulsive(mnv_name, mnv_vessel, mnv_frame, mnv_orientation, mnv_deltav, mnv_t_perform):
435+
global maneuvers
436+
437+
if find_maneuver_by_name(mnv_name):
438+
print("A maneuver with this name already exists. Please pick another name for the new maneuver.\n")
439+
input("Press Enter to continue...")
440+
return
441+
442+
new_maneuver = maneuver_impulsive(mnv_name, mnv_vessel, mnv_frame, mnv_orientation, mnv_deltav, mnv_t_perform)
443+
maneuvers.append(new_maneuver)
444+
405445
def delete_maneuver(mnv_name):
406446
global maneuvers
407447

@@ -1199,6 +1239,15 @@ def main(scn_filename=None, start_time=0):
11991239

12001240
float(command[6]), float(command[7]), float(command[8]),
12011241
float(command[9]), float(command[10]))
1242+
1243+
elif len(command) == 8 and command[2] == "impulsive":
1244+
# name, type, vessel, frame, orientation, delta_v, perform_time
1245+
if (not command[5] in preset_orientations):
1246+
create_maneuver_impulsive(command[1], find_obj_by_name(command[3]), find_obj_by_name(command[4]),
1247+
eval(command[5]), float(command[6]), float(command[7]))
1248+
else:
1249+
create_maneuver_impulsive(command[1], find_obj_by_name(command[3]), find_obj_by_name(command[4]),
1250+
command[5], float(command[6]), float(command[7]))
12021251
else:
12031252
print("Wrong syntax for command 'create_maneuver'.\n")
12041253
time.sleep(2)
@@ -1544,6 +1593,7 @@ def main(scn_filename=None, start_time=0):
15441593
print("Maneuver types: const_accel, const_thrust")
15451594
print("const_accel params: <vessel> <frame_of_reference> <orientation> <acceleration> <start_time> <duration>")
15461595
print("const_thrust params: <vessel> <frame_of_reference> <orientation> <thrust> <initial_mass> <mass_flow> <start_time> <duration>")
1596+
print("impulsive params: <vessel> <frame_of_reference> <orientation> <delta_v> <perform_time>")
15471597
input("Press Enter to continue...")
15481598
elif command[1] == "delete_maneuver":
15491599
print("\n'delete_maneuver' command removes a maneuver from the simulation.\n")
@@ -1952,7 +2002,7 @@ def main(scn_filename=None, start_time=0):
19522002
# do the actual drawing
19532003

19542004
# drawOrigin() -- maybe it'll be useful for debugging one day
1955-
drawScene(bodies, vessels, surface_points, barycenters, projections, maneuvers, get_active_cam(), show_trajectories, draw_mode, labels_visible, scene_lock)
2005+
drawScene(bodies, vessels, surface_points, barycenters, projections, maneuvers, get_active_cam(), show_trajectories, draw_mode, labels_visible, scene_lock, point_size)
19562006
glfw.swap_buffers(window)
19572007

19582008
cycle_dt = time.perf_counter() - cycle_start

maneuver.py

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,63 @@ def get_vessel(self):
1313
def get_type(self):
1414
return self.type
1515

16+
class maneuver_impulsive(maneuver):
17+
def __init__(self, name, vessel, frame_body, orientation, delta_v, t_perform):
18+
super().__init__(name, vessel, "impulsive")
19+
self.frame_body = frame_body
20+
self.orientation = orientation
21+
self.orientation_input = orientation
22+
self.delta_v = delta_v
23+
self.t_perform = t_perform
24+
self.done = False
25+
26+
self.draw_point = None
27+
28+
def set_orientation(self):
29+
if not type(self.orientation) == type(vec3()):
30+
self.orientation = self.vessel.get_orientation_rel_to(self.frame_body, self.orientation)
31+
32+
def perform_maneuver(self, current_time, delta_t):
33+
if (not self.done) and current_time >= self.t_perform:
34+
self.set_orientation()
35+
self.vessel.set_vel(self.vessel.get_vel() + self.orientation * self.delta_v)
36+
self.done = True
37+
self.draw_point = self.vessel.get_draw_pos()
38+
39+
def is_performing(self, current_time):
40+
return False
41+
42+
def get_state(self, current_time):
43+
if self.done:
44+
return "Completed"
45+
else:
46+
return "Pending"
47+
48+
def get_duration(self):
49+
return 0
50+
51+
def get_name(self):
52+
return self.name
53+
54+
def get_draw_point(self):
55+
return self.draw_point
56+
57+
def clear_draw_vertices(self):
58+
self.draw_point = None
59+
60+
def get_params_str(self):
61+
output = "Vessel: " + self.vessel.get_name() + "\n"
62+
63+
if type(self.orientation_input) == str:
64+
output += "Orientation: " + self.orientation_input + " rel to " + self.frame_body.get_name()
65+
else:
66+
output += "Orientation: " + str(self.orientation) + " rel to global frame"
67+
68+
output += "\nDv: " + str(self.delta_v) + " m/s\n"
69+
output += "Perform Time: " + str(self.t_perform) + " s\n"
70+
71+
return output
72+
1673
class maneuver_const_accel(maneuver):
1774
def __init__(self, name, vessel, frame_body, orientation, accel, t_start, duration):
1875
super().__init__(name, vessel, "const_accel")

0 commit comments

Comments
 (0)