aggiunto il calcolo dei waypoint dinamici sulla tipologia duration
This commit is contained in:
parent
638e4a648f
commit
77a1d87366
@ -1,100 +1,101 @@
|
|||||||
x_nm,y_nm
|
x_nm,y_nm
|
||||||
1.7364817766693033,9.84807753012208
|
0.17452406437283513,9.998476951563912
|
||||||
1.8196915585801245,9.997286852043835
|
0.2859422147817867,10.279638104623308
|
||||||
1.909698355298528,10.164705993254746
|
0.4421393353133215,10.609933583832394
|
||||||
2.006314644389864,10.349354914685591
|
0.636432547474389,10.985187585712282
|
||||||
2.1093529034194827,10.550253577267155
|
0.8621389727719386,11.401224306784082
|
||||||
2.218625609952734,10.766421941930222
|
1.1125757327129193,11.853867943568899
|
||||||
2.3339452415549684,10.99687996960557
|
1.3810599488042814,12.338942692587844
|
||||||
2.4551242757915364,11.240647621223985
|
1.6609087425529734,12.852272750362022
|
||||||
2.581975190227787,11.496744857716246
|
1.9454392354659444,13.389682313412546
|
||||||
2.714310462429072,11.764191640013136
|
2.227968549050145,13.946995578260525
|
||||||
2.851942569960741,12.04200792904544
|
2.5018138048125236,14.520036741427065
|
||||||
2.9946839903881437,12.329213685743936
|
2.7602921242600305,15.104629999433275
|
||||||
3.14234720127663,12.624828871039403
|
2.996720628899614,15.696599548800267
|
||||||
3.2947446801915516,12.927873445862636
|
3.2044164402382243,16.291769586049142
|
||||||
3.4516889046982575,13.237367371144403
|
3.3766966797828104,16.885964307701016
|
||||||
3.612992352362098,13.552330607815493
|
3.5068784690403216,17.475007910277
|
||||||
3.7784675007484245,13.871783116806688
|
3.588278929517707,18.054724590298196
|
||||||
3.947926827422586,14.19474485904877
|
3.6142151827219164,18.620938544285714
|
||||||
4.121182809949932,14.520235795472518
|
3.578004350159902,19.169473968760666
|
||||||
4.298047925895815,14.847275887008719
|
3.472963553338606,19.696155060244156
|
||||||
4.478334652825583,15.17488509458815
|
3.4729635533386065,19.69615506024416
|
||||||
4.661855468304586,15.502083379141595
|
3.272762644392875,20.217383756990923
|
||||||
4.848422849898178,15.827890701599843
|
2.964843068011936,20.750866222507394
|
||||||
5.037849275171705,16.151327022893664
|
2.5631793345343286,21.294382991192247
|
||||||
5.2299472216905185,16.471412303953848
|
2.081745954298589,21.845714597444157
|
||||||
5.424529167019969,16.787166505711173
|
1.5345174376432555,22.402641575661793
|
||||||
5.621407588725407,17.09760958909643
|
0.9354682949068648,22.962944460243826
|
||||||
5.8203949643721815,17.401761515040384
|
0.2985730364279542,23.52440378558893
|
||||||
6.021303771525644,17.698642244473834
|
-0.36219382745493856,24.084800086095772
|
||||||
6.223946487751144,17.987271738327554
|
-1.032857786403277,24.641913896163032
|
||||||
6.4281355906140325,18.26666995753233
|
-1.699444330078522,25.193525750189377
|
||||||
6.6336835576796584,18.535856863018942
|
-2.347978948142139,25.737416182573483
|
||||||
6.840402866513372,18.79385241571817
|
-2.964487130255587,26.271365727714013
|
||||||
6.840402866513374,18.79385241571817
|
-3.5349943660803307,26.793154920009652
|
||||||
7.064412663195302,19.043619595904882
|
-4.045526145277833,27.30056429385906
|
||||||
7.319986102939524,19.28896147814137
|
-4.482107957509558,27.79137438366092
|
||||||
7.604166677012322,19.530158164789555
|
-4.830765292436963,28.263365723813894
|
||||||
7.913997876679983,19.767489758211376
|
-5.077523639721516,28.714318848716662
|
||||||
8.246523193208787,20.001236360768743
|
-5.208408489024677,29.14201429276789
|
||||||
8.598786117865023,20.231678074823588
|
-5.2094453300079095,29.544232590366253
|
||||||
8.96783014191497,20.459095002737843
|
-5.2094453300079095,29.544232590366242
|
||||||
9.350698756624908,20.683767246873423
|
-5.087215806911271,29.93160758132983
|
||||||
9.744435453261131,20.90597490959226
|
-4.8634013589893685,30.31504050771131
|
||||||
10.146083723089918,21.12599809325628
|
-4.54667716842549,30.69271300726126
|
||||||
10.552687057377549,21.3441169002274
|
-4.145718417402923,31.062806717730222
|
||||||
10.961288947390312,21.560611432867567
|
-3.6692002881049564,31.42350327686877
|
||||||
11.368932884394491,21.775761793538678
|
-3.1257979627148766,31.772984322427458
|
||||||
11.772662359656369,21.989848084602684
|
-2.5241866234159707,32.10943149215684
|
||||||
12.169520864442228,22.203150408421493
|
-1.873041452391528,32.43102642380748
|
||||||
12.556551890018351,22.41594886735704
|
-1.1810376318248348,32.735950755129934
|
||||||
12.930798927651024,22.62852356377125
|
-0.4568503438991798,33.02238612387475
|
||||||
13.289305468606532,22.84115460002604
|
0.29084522920215017,33.28851416779252
|
||||||
13.629115004151155,23.054122078483353
|
1.0533739052958677,33.53251652463377
|
||||||
13.947271025551181,23.267706101505095
|
1.822060502198683,33.75257483214907
|
||||||
14.24081702407289,23.482186771453204
|
2.5882298377273103,33.94687072808898
|
||||||
14.506796490982568,23.6978441906896
|
3.343206729698462,34.113585850204075
|
||||||
14.742252917546494,23.91495846157622
|
4.078315995928851,34.25090183624488
|
||||||
14.944229795030958,24.133809686474972
|
4.784882454235189,34.35700032396197
|
||||||
15.109770614702246,24.354677967747794
|
5.454230922434187,34.430062951105924
|
||||||
15.23591886782663,24.57784340775661
|
6.077686218342558,34.46827135542727
|
||||||
15.319718045670406,24.80358610886334
|
6.077686218342562,34.468271355427284
|
||||||
15.358211639499848,25.032186173429917
|
6.6950615437258465,34.47971290071672
|
||||||
15.348443140581244,25.26392370381826
|
7.3476044195818755,34.472832854810775
|
||||||
15.28745604018088,25.499078802390304
|
8.028791142575807,34.44634971152879
|
||||||
15.172293829565035,25.737931571507964
|
8.732098009372796,34.3989819646901
|
||||||
15.0,25.980762113533167
|
9.451001316637997,34.32944810811404
|
||||||
14.999999999999998,25.98076211353316
|
10.178977361036566,34.23646663561996
|
||||||
14.76007873005941,26.230939963143115
|
10.909502439233654,34.11875604102719
|
||||||
14.447076186168827,26.491050501357915
|
11.636052847894423,33.97503481815507
|
||||||
14.065598841372388,26.760197600053854
|
12.352104883684024,33.80402146082294
|
||||||
13.62025316871424,27.037485131107207
|
13.051134843267612,33.60443446285013
|
||||||
13.11564564123853,27.322016966394273
|
13.726619023310347,33.37499231805599
|
||||||
12.556382731989396,27.612896977791323
|
14.372033720477376,33.114413520259845
|
||||||
11.947070914010986,27.909229037174644
|
14.98085523143386,32.82141656328105
|
||||||
11.292316660347446,28.210117016420522
|
15.546559852844958,32.49471994093893
|
||||||
10.596726444042913,28.514664787405238
|
16.062623881375814,32.13304214705283
|
||||||
9.86490673814154,28.82197622200508
|
16.522523613691593,31.735101675442085
|
||||||
9.101464015687464,29.13115519209633
|
16.919735346457447,31.29961701992603
|
||||||
8.311004749724834,29.441305569555276
|
17.247735376338525,30.825306674324008
|
||||||
7.498135413297791,29.751531226258194
|
17.499999999999996,30.310889132455358
|
||||||
6.66746247945048,30.060936034081376
|
17.499999999999996,30.310889132455355
|
||||||
5.823592421227048,30.368623864901103
|
17.667951456825268,29.722378176057024
|
||||||
4.971131711671633,30.67369859059366
|
17.752649951768674,29.034858901953363
|
||||||
4.114686823828384,30.97526408303533
|
17.76202872985173,28.26065677659477
|
||||||
3.2588642307414455,31.272424214102394
|
17.704021036095945,27.412097266431687
|
||||||
2.4082704054549575,31.564282855671145
|
17.586560115522854,26.501505837914515
|
||||||
1.5675118210130687,31.84994387961786
|
17.417579213153953,25.541207957493693
|
||||||
0.7411949504599216,32.12851115781883
|
17.205011574010783,24.54352909161962
|
||||||
-0.06607373316034426,32.39908856215034
|
16.956790443114837,23.52079470674273
|
||||||
-0.8496877568035757,32.660779964488654
|
16.68084906548765,22.485330269313444
|
||||||
-1.6050406474256338,32.91268923671007
|
16.385120686150735,21.449461245782175
|
||||||
-2.3275259319823753,33.15392025069089
|
16.0775385501256,20.425513102599343
|
||||||
-3.0125371374296517,33.38357687830738
|
15.766035902433776,19.42581130621538
|
||||||
-3.6554677907233284,33.600762991435815
|
15.45854598809677,18.462681323080695
|
||||||
-4.2517114188192515,33.80458246195249
|
15.1630020521361,17.5484486196457
|
||||||
-4.796661548673278,33.99413916173369
|
14.88733733957329,16.69543866236083
|
||||||
-5.285711707241269,34.1685369626557
|
14.639485095429851,15.9159769176765
|
||||||
-5.714255421479081,34.326879736594805
|
14.427378564727302,15.222388852043133
|
||||||
-6.077686218342556,34.46827135542728
|
14.258950992487165,14.626999931911136
|
||||||
|
14.142135623730947,14.142135623730947
|
||||||
|
|||||||
|
@ -114,7 +114,7 @@
|
|||||||
"target_azimuth_deg": 45.0
|
"target_azimuth_deg": 45.0
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"use_spline": true
|
"use_spline": false
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"target_id": 1,
|
"target_id": 1,
|
||||||
@ -170,6 +170,20 @@
|
|||||||
"target_altitude_ft": 10000.0,
|
"target_altitude_ft": 10000.0,
|
||||||
"target_range_nm": 20.0,
|
"target_range_nm": 20.0,
|
||||||
"target_azimuth_deg": 0.0
|
"target_azimuth_deg": 0.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"maneuver_type": "Fly for Duration",
|
||||||
|
"target_velocity_fps": 506.343,
|
||||||
|
"target_heading_deg": 90.0,
|
||||||
|
"duration_s": 20.0,
|
||||||
|
"target_altitude_ft": 10000.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"maneuver_type": "Fly for Duration",
|
||||||
|
"target_velocity_fps": 506.343,
|
||||||
|
"target_heading_deg": 180.0,
|
||||||
|
"duration_s": 10.0,
|
||||||
|
"target_altitude_ft": 10000.0
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"use_spline": false
|
"use_spline": false
|
||||||
|
|||||||
@ -195,21 +195,18 @@ class PPIDisplay(ttk.Frame):
|
|||||||
# (la preview spline cancella la classica)
|
# (la preview spline cancella la classica)
|
||||||
# Costruisci la lista dei punti da visualizzare
|
# Costruisci la lista dei punti da visualizzare
|
||||||
points = []
|
points = []
|
||||||
|
# Stato corrente: range/azimuth
|
||||||
|
curr_r = None
|
||||||
|
curr_theta = None
|
||||||
for i, wp in enumerate(waypoints):
|
for i, wp in enumerate(waypoints):
|
||||||
if getattr(wp, 'maneuver_type', None) == ManeuverType.FLY_TO_POINT:
|
if getattr(wp, 'maneuver_type', None) == ManeuverType.FLY_TO_POINT:
|
||||||
# Usa range/azimuth
|
curr_r = getattr(wp, 'target_range_nm', 0)
|
||||||
r = getattr(wp, 'target_range_nm', 0)
|
curr_theta = math.radians(getattr(wp, 'target_azimuth_deg', 0))
|
||||||
theta = math.radians(getattr(wp, 'target_azimuth_deg', 0))
|
points.append((curr_theta, curr_r, wp))
|
||||||
points.append((theta, r, wp))
|
|
||||||
elif getattr(wp, 'maneuver_type', None) == ManeuverType.FLY_FOR_DURATION:
|
elif getattr(wp, 'maneuver_type', None) == ManeuverType.FLY_FOR_DURATION:
|
||||||
# Calcola punto terminale
|
|
||||||
# Serve punto di partenza
|
|
||||||
if i == 0:
|
|
||||||
# Se non c'è punto iniziale, ignora
|
# Se non c'è punto iniziale, ignora
|
||||||
|
if curr_r is None or curr_theta is None:
|
||||||
continue
|
continue
|
||||||
prev_wp = waypoints[i-1]
|
|
||||||
r0 = getattr(prev_wp, 'target_range_nm', 0)
|
|
||||||
theta0 = math.radians(getattr(prev_wp, 'target_azimuth_deg', 0))
|
|
||||||
vel_fps = getattr(wp, 'target_velocity_fps', 0)
|
vel_fps = getattr(wp, 'target_velocity_fps', 0)
|
||||||
vel_nmps = vel_fps / NM_TO_FT if vel_fps else 0
|
vel_nmps = vel_fps / NM_TO_FT if vel_fps else 0
|
||||||
duration = getattr(wp, 'duration_s', 0)
|
duration = getattr(wp, 'duration_s', 0)
|
||||||
@ -217,9 +214,11 @@ class PPIDisplay(ttk.Frame):
|
|||||||
heading_rad = math.radians(heading_deg)
|
heading_rad = math.radians(heading_deg)
|
||||||
# Calcola delta x/y in coordinate polari
|
# Calcola delta x/y in coordinate polari
|
||||||
dr = vel_nmps * duration
|
dr = vel_nmps * duration
|
||||||
theta1 = theta0 + heading_rad
|
theta1 = curr_theta + heading_rad
|
||||||
r1 = r0 + dr
|
r1 = curr_r + dr
|
||||||
points.append((theta1, r1, wp))
|
curr_r = r1
|
||||||
|
curr_theta = theta1
|
||||||
|
points.append((curr_theta, curr_r, wp))
|
||||||
thetas = [p[0] for p in points]
|
thetas = [p[0] for p in points]
|
||||||
rs = [p[1] for p in points]
|
rs = [p[1] for p in points]
|
||||||
if len(thetas) == 1:
|
if len(thetas) == 1:
|
||||||
@ -259,13 +258,33 @@ class PPIDisplay(ttk.Frame):
|
|||||||
start_theta = thetas[0]
|
start_theta = thetas[0]
|
||||||
start_r = rs[0]
|
start_r = rs[0]
|
||||||
self._start_plot.set_data([start_theta], [start_r])
|
self._start_plot.set_data([start_theta], [start_r])
|
||||||
heading_len = 3
|
# Heading dal primo waypoint
|
||||||
heading_theta = start_theta
|
wp0 = points[0][2]
|
||||||
heading_r2 = start_r + heading_len
|
heading_deg = getattr(wp0, 'target_heading_deg', None)
|
||||||
# Cancella eventuali frecce precedenti
|
if heading_deg is not None:
|
||||||
|
h_rad = math.radians(heading_deg)
|
||||||
|
vector_len = self.max_range / 25
|
||||||
|
x1, y1 = start_r * math.sin(start_theta), start_r * math.cos(start_theta)
|
||||||
|
dx, dy = vector_len * math.sin(h_rad), vector_len * math.cos(h_rad)
|
||||||
|
x2, y2 = x1 + dx, y1 + dy
|
||||||
|
r2, th2 = math.sqrt(x2**2 + y2**2), math.atan2(x2, y2)
|
||||||
if hasattr(self, '_heading_artist'):
|
if hasattr(self, '_heading_artist'):
|
||||||
self._heading_artist.remove()
|
self._heading_artist.remove()
|
||||||
self._heading_artist, = self.ax.plot([start_theta, heading_theta], [start_r, heading_r2], color='red', linewidth=1, alpha=0.8)
|
self._heading_artist, = self.ax.plot([start_theta, th2], [start_r, r2], color='red', linewidth=1.2)
|
||||||
|
# Heading per ogni punto finale FLY_FOR_DURATION
|
||||||
|
for i, (theta, r, wp) in enumerate(points):
|
||||||
|
if i == 0:
|
||||||
|
continue
|
||||||
|
if getattr(wp, 'maneuver_type', None) == ManeuverType.FLY_FOR_DURATION:
|
||||||
|
heading_deg = getattr(wp, 'target_heading_deg', None)
|
||||||
|
if heading_deg is not None:
|
||||||
|
h_rad = math.radians(heading_deg)
|
||||||
|
vector_len = self.max_range / 25
|
||||||
|
x1, y1 = r * math.sin(theta), r * math.cos(theta)
|
||||||
|
dx, dy = vector_len * math.sin(h_rad), vector_len * math.cos(h_rad)
|
||||||
|
x2, y2 = x1 + dx, y1 + dy
|
||||||
|
r2, th2 = math.sqrt(x2**2 + y2**2), math.atan2(x2, y2)
|
||||||
|
self.ax.plot([theta, th2], [r, r2], color='red', linewidth=1.2)
|
||||||
else:
|
else:
|
||||||
# Assume Target object with trajectory and use_spline
|
# Assume Target object with trajectory and use_spline
|
||||||
waypoints = getattr(trajectory, "trajectory", [])
|
waypoints = getattr(trajectory, "trajectory", [])
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user