Radar: Optimazation and improvements

This commit is contained in:
Sidi Liang 2021-04-20 23:31:33 +08:00
parent 26da9e9231
commit 79d51cfe37
1 changed files with 47 additions and 36 deletions

View File

@ -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());