Skip to content

Commit abc0a1e

Browse files
committed
add waypoint position constraints(temp)
1 parent 9ba15c0 commit abc0a1e

File tree

3 files changed

+127
-0
lines changed

3 files changed

+127
-0
lines changed

Trajectory_Optimization.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,7 @@ def objfunc(xdict):
209209
xdict, pdict, unitdict, condition
210210
)
211211
funcs["eqcon_rate"] = equality_6DoF_rate(xdict, pdict, unitdict, condition)
212+
funcs["eqcon_pos"] = equality_posLLH(xdict, pdict, unitdict, condition)
212213
funcs["eqcon_iip"] = equality_IIP(xdict, pdict, unitdict, condition)
213214
funcs["eqcon_user"] = equality_user(xdict, pdict, unitdict, condition)
214215

@@ -218,6 +219,7 @@ def objfunc(xdict):
218219
funcs["ineqcon_mass"] = inequality_mass(xdict, pdict, unitdict, condition)
219220
funcs["ineqcon_kick"] = inequality_kickturn(xdict, pdict, unitdict, condition)
220221
funcs["ineqcon_time"] = inequality_time(xdict, pdict, unitdict, condition)
222+
funcs["ineqcon_pos"] = inequality_posLLH(xdict, pdict, unitdict, condition)
221223
funcs["ineqcon_iip"] = inequality_IIP(xdict, pdict, unitdict, condition)
222224
funcs["ineqcon_antenna"] = inequality_antenna(xdict, pdict, unitdict, condition)
223225
funcs["ineqcon_user"] = inequality_user(xdict, pdict, unitdict, condition)
@@ -250,6 +252,7 @@ def sens(xdict, funcs):
250252
xdict, pdict, unitdict, condition
251253
)
252254
funcsSens["eqcon_rate"] = equality_jac_6DoF_rate(xdict, pdict, unitdict, condition)
255+
funcsSens["eqcon_pos"] = equality_jac_posLLH(xdict, pdict, unitdict, condition)
253256
funcsSens["eqcon_iip"] = equality_jac_IIP(xdict, pdict, unitdict, condition)
254257
funcsSens["eqcon_user"] = equality_jac_user(xdict, pdict, unitdict, condition)
255258

@@ -265,6 +268,7 @@ def sens(xdict, funcs):
265268
xdict, pdict, unitdict, condition
266269
)
267270
funcsSens["ineqcon_time"] = inequality_jac_time(xdict, pdict, unitdict, condition)
271+
funcsSens["ineqcon_pos"] = inequality_jac_posLLH(xdict, pdict, unitdict, condition)
268272
funcsSens["ineqcon_iip"] = inequality_jac_IIP(xdict, pdict, unitdict, condition)
269273
funcsSens["ineqcon_antenna"] = inequality_jac_antenna(
270274
xdict, pdict, unitdict, condition
@@ -328,6 +332,7 @@ def sens(xdict, funcs):
328332
"eqcon_knot": ["mass", "position", "velocity", "quaternion"],
329333
"eqcon_terminal": ["position", "velocity"],
330334
"eqcon_rate": ["position", "quaternion", "u"],
335+
"eqcon_pos": ["position", "t"],
331336
"eqcon_iip": ["position", "velocity", "t"],
332337
"eqcon_user": ["mass", "position", "velocity", "quaternion", "u", "t"],
333338
"ineqcon_alpha": ["position", "velocity", "quaternion", "t"],
@@ -336,6 +341,7 @@ def sens(xdict, funcs):
336341
"ineqcon_mass": ["mass"],
337342
"ineqcon_kick": ["u"],
338343
"ineqcon_time": ["t"],
344+
"ineqcon_pos": ["position", "t"],
339345
"ineqcon_iip": ["position", "velocity", "t"],
340346
"ineqcon_antenna": ["position", "t"],
341347
"ineqcon_user": ["mass", "position", "velocity", "quaternion", "u", "t"],

constraints.py

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2293,6 +2293,124 @@ def inequality_jac_IIP(xdict, pdict, unitdict, condition):
22932293
return None
22942294

22952295

2296+
def equality_posLLH(xdict, pdict, unitdict, condition):
2297+
"""Equality constraint about IIP position."""
2298+
con = []
2299+
unit_pos = unitdict["position"]
2300+
unit_t = unitdict["t"]
2301+
2302+
pos_ = xdict["position"].reshape(-1, 3)
2303+
2304+
t = xdict["t"]
2305+
2306+
num_sections = pdict["num_sections"]
2307+
2308+
if "waypoint" not in condition:
2309+
return None
2310+
2311+
for i in range(num_sections - 1):
2312+
2313+
section_name = pdict["params"][i]["name"]
2314+
if section_name in condition["waypoint"]:
2315+
2316+
waypoint = condition["waypoint"][section_name]
2317+
a = pdict["ps_params"][i]["index_start"]
2318+
pos = pos_[a + i] * unit_pos
2319+
to = t[i] * unit_t
2320+
posLLH = eci2geodetic(pos, to)
2321+
lon_origin = pdict["LaunchCondition"]["lon"]
2322+
lat_origin = pdict["LaunchCondition"]["lat"]
2323+
downrange = haversine(
2324+
lon_origin, lat_origin, posLLH[1], posLLH[0], 6378137.0
2325+
)
2326+
2327+
# altitude
2328+
if "altitude" in waypoint:
2329+
if "exact" in waypoint["altitude"]:
2330+
con.append((posLLH[2] / waypoint["altitude"]["exact"]) - 1.0)
2331+
2332+
# downrange
2333+
if "downrange" in waypoint:
2334+
if "exact" in waypoint["downrange"]:
2335+
con.append((downrange / waypoint["downrange"]["exact"]) - 1.0)
2336+
2337+
if len(con) == 0:
2338+
return None
2339+
else:
2340+
return np.concatenate(con, axis=None)
2341+
2342+
2343+
def equality_jac_posLLH(xdict, pdict, unitdict, condition):
2344+
"""Jacobian of equality_posLLH."""
2345+
if equality_posLLH(xdict, pdict, unitdict, condition) is not None:
2346+
return jac_fd(equality_posLLH, xdict, pdict, unitdict, condition)
2347+
else:
2348+
return None
2349+
2350+
2351+
def inequality_posLLH(xdict, pdict, unitdict, condition):
2352+
"""Inequality constraint about IIP position."""
2353+
con = []
2354+
unit_pos = unitdict["position"]
2355+
unit_t = unitdict["t"]
2356+
2357+
pos_ = xdict["position"].reshape(-1, 3)
2358+
2359+
t = xdict["t"]
2360+
2361+
num_sections = pdict["num_sections"]
2362+
2363+
if "waypoint" not in condition:
2364+
return None
2365+
2366+
for i in range(num_sections - 1):
2367+
2368+
section_name = pdict["params"][i]["name"]
2369+
if section_name in condition["waypoint"]:
2370+
2371+
waypoint = condition["waypoint"][section_name]
2372+
a = pdict["ps_params"][i]["index_start"]
2373+
pos = pos_[a + i] * unit_pos
2374+
to = t[i] * unit_t
2375+
posLLH = eci2geodetic(pos, to)
2376+
lon_origin = pdict["LaunchCondition"]["lon"]
2377+
lat_origin = pdict["LaunchCondition"]["lat"]
2378+
downrange = haversine(
2379+
lon_origin, lat_origin, posLLH[1], posLLH[0], 6378137.0
2380+
)
2381+
2382+
# altitude
2383+
if "altitude" in waypoint:
2384+
# min
2385+
if "min" in waypoint["altitude"]:
2386+
con.append((posLLH[2] / waypoint["altitude"]["min"]) - 1.0)
2387+
# max
2388+
if "max" in waypoint["altitude"]:
2389+
con.append(-(posLLH[2] / waypoint["altitude"]["max"]) + 1.0)
2390+
2391+
# downrange
2392+
if "downrange" in waypoint:
2393+
# min
2394+
if "min" in waypoint["downrange"]:
2395+
con.append((downrange / waypoint["downrange"]["min"]) - 1.0)
2396+
# max
2397+
if "max" in waypoint["downrange"]:
2398+
con.append(-(downrange / waypoint["downrange"]["min"]) + 1.0)
2399+
2400+
if len(con) == 0:
2401+
return None
2402+
else:
2403+
return np.concatenate(con, axis=None)
2404+
2405+
2406+
def inequality_jac_posLLH(xdict, pdict, unitdict, condition):
2407+
"""Jacobian of inequality_posLLH."""
2408+
if inequality_posLLH(xdict, pdict, unitdict, condition) is not None:
2409+
return jac_fd(inequality_posLLH, xdict, pdict, unitdict, condition)
2410+
else:
2411+
return None
2412+
2413+
22962414
def equality_jac_user(xdict, pdict, unitdict, condition):
22972415
"""Jacobian of user-defined equality constraint."""
22982416
if equality_user(xdict, pdict, unitdict, condition) is not None:

example/example-settings.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,9 @@
6969
},
7070
"waypoint": {
7171
"FAIRING": {
72+
"altitude": {
73+
"exact": 100000.0
74+
},
7275
"lon_IIP" : {
7376
"min": 145.0
7477
}

0 commit comments

Comments
 (0)