From 79d51cfe37be22db0343b33945405c49c8354181 Mon Sep 17 00:00:00 2001 From: Sidi Liang <1467329765@qq.com> Date: Tue, 20 Apr 2021 23:31:33 +0800 Subject: [PATCH] Radar: Optimazation and improvements --- Nasal/radar.nas | 83 ++++++++++++++++++++++++++++--------------------- 1 file changed, 47 insertions(+), 36 deletions(-) diff --git a/Nasal/radar.nas b/Nasal/radar.nas index 98ecca7..f5a514b 100644 --- a/Nasal/radar.nas +++ b/Nasal/radar.nas @@ -60,7 +60,7 @@ var MultiplayerCoordManager = { if (me.nxtupdatetime != 0) { if (_tm<me.nxtupdatetime) return; } - me.nxtupdatetime = _tm + 0.5; # refresh rate at 500ms + me.nxtupdatetime = _tm + 0.1; # refresh rate at 100ms if (size(me.updateKeys) == 0) { me.updateKeys = keys(me.items); @@ -98,7 +98,7 @@ var MultiplayerCoordManager = { var Radar = { - #//Class for any Parking Radar (currently only support terrain detection) which scans in a sector + #//Class for any Parking Radar (currently supports terrain detection and multiplayer(and ai) model detection) which scans in a sector #//height: height of installation above ground;installCoordX: X coord of installation; installCoordY: Y coord of installation; maxRange: max radar range; maxWidth: width of the sector #//orientationMode 0:towards back, 180:towards front, 90: towards left, 270:towards right, custom values are accepted(in degrees) #//updateInterval: update interval of the radar timer, defaults to 0.25 @@ -110,6 +110,9 @@ var Radar = { #//For follow me EV: height 0.3m; installCoordX:0m; installCoordY:3.8m; maxRange:3m;maxWidth:3m #//To start scanning: myRadar.init(); #//To Stop: myRadar.stop(); + + #//Todo: Add the tilt angle into consideratoin + new: func(height, installCoordX, installCoordY, maxRange, maxWidth, orientationMode=0, warnEnabled=1, updateInterval=0.25, debug=0) { return { parents:[Radar, Appliance.new()], height: height, installCoordX:installCoordX, installCoordY:installCoordY, maxRange:maxRange, maxWidth:maxWidth, orientationMode:orientationMode, warnEnabled:warnEnabled, debug:debug, radarOutput:10000}; @@ -131,7 +134,9 @@ var Radar = { vehiclePosition: nil, coord: nil, + vehicleHeadingProp: props.getNode("/orientation/heading-deg",1), vehicleHeading: nil, + vehicleElevProp: props.getNode("/position/altitude-ft",1), backLonRange: nil, backLatRange: nil, @@ -148,6 +153,12 @@ var Radar = { multiplayerManager: MultiplayerCoordManager.new(), #//Experimental new multiplayer coordinate manager + calculateVehicleElevation: func(){ + #//Return the elevation in METERS + var elev_ft = me.vehicleElevProp.getValue(); + return elev_ft * FT2M; + }, + init: func(){ me.searchAngle = math.acos(me.maxRange / math.sqrt((2/me.maxWidth)*(2/me.maxWidth) + me.maxRange*me.maxRange)); me.tanSearchAngle = math.tan(me.searchAngle); @@ -188,7 +199,7 @@ var Radar = { }, getCoord: func(){ - me.vehicleHeading = geo.normdeg(props.getNode("/orientation/heading-deg",1).getValue() + me.orientationMode); + me.vehicleHeading = geo.normdeg(me.vehicleHeadingProp.getValue() + me.orientationMode); me.vehiclePosition = geo.aircraft_position(); me.coord = geo.Coord.new(me.vehiclePosition); me.coord.apply_course_distance(geo.normdeg(me.vehicleHeading-90), me.installCoordX); @@ -220,7 +231,10 @@ var Radar = { return position_val; }, judgeElev: func(targetElev){ - myElev = me.getElevByCoord(me.coord); + #//myElev = me.getElevByCoord(me.coord); + myElev = me.calculateVehicleElevation(); + print("elevgeo: "~me.getElevByCoord(me.coord)); + print("elevprop: "~me.calculateVehicleElevation()); if((myElev + me.height) < targetElev){ return 1; }else{ @@ -258,6 +272,23 @@ var Radar = { if(me.debug) var model = geo.put_model(getprop("sim/aircraft-dir")~"/Nasal/waypoint.ac", sampleCoord.lat(), sampleCoord.lon(), me.coord.alt()); return sampleCoord; }, + multiplayerModelDetection: func(targetCoord){ + foreach(var itemPath; keys(me.multiplayerManager.items)){ + var item = me.multiplayerManager.items[itemPath]; + if(item.data != nil){ + if(math.abs(item.data['alt'] - me.height - me.calculateVehicleElevation()) > 2) continue; + var itemCoord = geo.Coord.new(); + itemCoord.set_latlon(item.data['lat'], item.data['lon']); + var multiplayerModelDistanceInMeters = itemCoord.distance_to(targetCoord); + if(multiplayerModelDistanceInMeters <= 0.3){#//Value based on guessing + var meters = me.coord.distance_to(targetCoord); + if(me.debug) var model = geo.put_model(getprop("sim/aircraft-dir")~"/Nasal/waypoint.ac", targetCoord.lat(), targetCoord.lon(), me.coord.alt()); + return meters; + } + } + } + return nil; + }, update: func(){ me.getCoord(); me.multiplayerManager.update(); #//Updates the multiplayer coordinates manager at it's own refresh rate @@ -276,25 +307,15 @@ var Radar = { var stepLon = 0 - searchWidthLon * percentage; var targetCoord = me.sample(i, stepLon, searchCoord.lat(), searchCoord.lon()); #//Multiplayer model detection - foreach(var itemPath; keys(me.multiplayerManager.items)){ - var item = me.multiplayerManager.items[itemPath]; - if(item.data != nil){ - var itemCoord = geo.Coord.new(); - itemCoord.set_latlon(item.data['lat'], item.data['lon']); - var multiplayerModelDistanceInMeters = itemCoord.distance_to(targetCoord); - if(multiplayerModelDistanceInMeters <= 0.3){#//Value based on guessing - var meters = me.coord.distance_to(targetCoord); - if(me.debug) var model = geo.put_model(getprop("sim/aircraft-dir")~"/Nasal/waypoint.ac", targetCoord.lat(), targetCoord.lon(), me.coord.alt()); - if(me.warnEnabled) me.warnControl(meters); - else me.radarOutput = meters; - return; - } - } + meters = me.multiplayerModelDetection(targetCoord); + if(meters != nil){ + if(me.warnEnabled) me.warnControl(meters); + else me.radarOutput = meters; + return; } - #//Terrain detection - targetElev = me.getElevByCoord(targetCoord); + var targetElev = me.getElevByCoord(targetCoord); if(me.judgeElev(targetElev)){ var meters = me.coord.distance_to(targetCoord); if(me.debug) var model = geo.put_model(getprop("sim/aircraft-dir")~"/Nasal/waypoint.ac", targetCoord.lat(), targetCoord.lon(), me.coord.alt()); @@ -308,25 +329,15 @@ var Radar = { var stepLon = searchWidthLon * percentage; var targetCoord = me.sample(i, stepLon, searchCoord.lat(), searchCoord.lon()); #//Multiplayer model detection - foreach(var itemPath; keys(me.multiplayerManager.items)){ - var item = me.multiplayerManager.items[itemPath]; - if(item.data != nil){ - var itemCoord = geo.Coord.new(); - itemCoord.set_latlon(item.data['lat'], item.data['lon']); - var multiplayerModelDistanceInMeters = itemCoord.distance_to(targetCoord); - if(multiplayerModelDistanceInMeters <= 0.3){#//Value based on guessing - var meters = me.coord.distance_to(targetCoord); - if(me.debug) var model = geo.put_model(getprop("sim/aircraft-dir")~"/Nasal/waypoint.ac", targetCoord.lat(), targetCoord.lon(), me.coord.alt()); - if(me.warnEnabled) me.warnControl(meters); - else me.radarOutput = meters; - return; - } - } + meters = me.multiplayerModelDetection(targetCoord); + if(meters != nil){ + if(me.warnEnabled) me.warnControl(meters); + else me.radarOutput = meters; + return } - #//Terrain detection - targetElev = me.getElevByCoord(targetCoord); + var targetElev = me.getElevByCoord(targetCoord); if(me.judgeElev(targetElev)){ var meters = me.coord.distance_to(targetCoord); if(me.debug) var model = geo.put_model(getprop("sim/aircraft-dir")~"/Nasal/waypoint.ac", targetCoord.lat(), targetCoord.lon(), me.coord.alt());