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