mirror of
https://github.com/30hours/3lips.git
synced 2024-11-08 12:25:42 +00:00
Update readme and minor fixes
This commit is contained in:
parent
f737d5602d
commit
2ac180714e
6 changed files with 31 additions and 14 deletions
|
@ -2,6 +2,10 @@
|
||||||
|
|
||||||
Target localisation for multi-static radar using ellipse intersections. Not a dating app.
|
Target localisation for multi-static radar using ellipse intersections. Not a dating app.
|
||||||
|
|
||||||
|
See a live instance at [http://3lips.30hours.dev](http://3lips.30hours.dev).
|
||||||
|
|
||||||
|
![3lips example display](./example.png "3lips")
|
||||||
|
|
||||||
## Features
|
## Features
|
||||||
|
|
||||||
- Provides a JSON API for geolocation of targets given [blah2](http://github.com/30hours/blah2) radar nodes.
|
- Provides a JSON API for geolocation of targets given [blah2](http://github.com/30hours/blah2) radar nodes.
|
||||||
|
@ -12,6 +16,7 @@ Target localisation for multi-static radar using ellipse intersections. Not a da
|
||||||
|
|
||||||
- Install docker and docker-compose on the host machine.
|
- Install docker and docker-compose on the host machine.
|
||||||
- Clone this repository to some directory.
|
- Clone this repository to some directory.
|
||||||
|
- Edit the [./config/config.yml](./config./config.yml) file for scenario.
|
||||||
- Run the docker compose command.
|
- Run the docker compose command.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
|
@ -46,6 +51,7 @@ The system architecture is as follows:
|
||||||
- Implement an association algorithm that is not reliant on ADS-B truth.
|
- Implement an association algorithm that is not reliant on ADS-B truth.
|
||||||
- Choose to use detection or track data from each radar.
|
- Choose to use detection or track data from each radar.
|
||||||
- Long term plots to show metrics such as 2D location accuracy to ADS-B, number of aircraft tracked, etc.
|
- Long term plots to show metrics such as 2D location accuracy to ADS-B, number of aircraft tracked, etc.
|
||||||
|
- Scale number of samples in ellipse/ellipsoid to size of shape.
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
|
|
|
@ -20,7 +20,7 @@ function event_ellipsoid() {
|
||||||
removeEntitiesByType("ellipsoids");
|
removeEntitiesByType("ellipsoids");
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
removeEntitiesOlderThanAndFade("ellipsoids", 5, 0.5);
|
removeEntitiesOlderThanAndFade("ellipsoids", 10, 0.5);
|
||||||
}
|
}
|
||||||
for (const key in data["ellipsoids"]) {
|
for (const key in data["ellipsoids"]) {
|
||||||
if (data["ellipsoids"].hasOwnProperty(key)) {
|
if (data["ellipsoids"].hasOwnProperty(key)) {
|
||||||
|
@ -54,7 +54,7 @@ function event_ellipsoid() {
|
||||||
}
|
}
|
||||||
|
|
||||||
var style_ellipsoid = {};
|
var style_ellipsoid = {};
|
||||||
style_ellipsoid.color = 'rgba(0, 0, 255, 0.5)';
|
style_ellipsoid.color = 'rgba(0, 255, 255, 0.5)';
|
||||||
style_ellipsoid.pointSize = 16;
|
style_ellipsoid.pointSize = 16;
|
||||||
style_ellipsoid.type = "ellipsoids";
|
style_ellipsoid.type = "ellipsoids";
|
||||||
style_ellipsoid.timestamp = Date.now();
|
style_ellipsoid.timestamp = Date.now();
|
|
@ -16,7 +16,7 @@ function event_radar() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
removeEntitiesOlderThanAndFade("detection", 90, 0.5);
|
removeEntitiesOlderThanAndFade("detection", 10, 0.5);
|
||||||
|
|
||||||
for (const key in data["detections_localised"]) {
|
for (const key in data["detections_localised"]) {
|
||||||
if (data["detections_localised"].hasOwnProperty(key)) {
|
if (data["detections_localised"].hasOwnProperty(key)) {
|
||||||
|
|
|
@ -31,8 +31,8 @@ tDelete = 60
|
||||||
adsbAssociator = AdsbAssociator()
|
adsbAssociator = AdsbAssociator()
|
||||||
ellipseParametricMean = EllipseParametric("mean", 150, 500)
|
ellipseParametricMean = EllipseParametric("mean", 150, 500)
|
||||||
ellipseParametricMin = EllipseParametric("min", 150, 500)
|
ellipseParametricMin = EllipseParametric("min", 150, 500)
|
||||||
ellipsoidParametricMean = EllipsoidParametric("mean", 120, 1000)
|
ellipsoidParametricMean = EllipsoidParametric("mean", 60, 800)
|
||||||
ellipsoidParametricMin = EllipsoidParametric("min", 120, 1000)
|
ellipsoidParametricMin = EllipsoidParametric("min", 60, 800)
|
||||||
sphericalIntersection = SphericalIntersection()
|
sphericalIntersection = SphericalIntersection()
|
||||||
adsbTruth = AdsbTruth(5)
|
adsbTruth = AdsbTruth(5)
|
||||||
save = True
|
save = True
|
||||||
|
@ -40,7 +40,7 @@ saveFile = '/app/save/' + str(int(time.time())) + '.ndjson'
|
||||||
|
|
||||||
async def event():
|
async def event():
|
||||||
|
|
||||||
start_time = time.time()
|
print('Start event', flush=True)
|
||||||
|
|
||||||
global api, save
|
global api, save
|
||||||
timestamp = int(time.time()*1000)
|
timestamp = int(time.time()*1000)
|
||||||
|
@ -101,6 +101,8 @@ async def event():
|
||||||
# main processing
|
# main processing
|
||||||
for item in api_event:
|
for item in api_event:
|
||||||
|
|
||||||
|
start_time = time.time()
|
||||||
|
|
||||||
# extract dict for item
|
# extract dict for item
|
||||||
radar_dict_item = {
|
radar_dict_item = {
|
||||||
key: radar_dict[key]
|
key: radar_dict[key]
|
||||||
|
@ -196,6 +198,9 @@ async def event():
|
||||||
item["ellipsoids"] = ellipsoids
|
item["ellipsoids"] = ellipsoids
|
||||||
item["time"] = stop_time - start_time
|
item["time"] = stop_time - start_time
|
||||||
|
|
||||||
|
print('Method: ' + item["localisation"], flush=True)
|
||||||
|
print(item["time"], flush=True)
|
||||||
|
|
||||||
# delete old API requests
|
# delete old API requests
|
||||||
api_event = [
|
api_event = [
|
||||||
item for item in api_event if timestamp - item["timestamp"] <= tDelete*1000]
|
item for item in api_event if timestamp - item["timestamp"] <= tDelete*1000]
|
||||||
|
@ -234,7 +239,7 @@ def short_hash(input_string, length=10):
|
||||||
# message received callback
|
# message received callback
|
||||||
async def callback_message_received(msg):
|
async def callback_message_received(msg):
|
||||||
|
|
||||||
print(f"Callback: Received message in event.py: {msg}", flush=True)
|
#print(f"Callback: Received message in event.py: {msg}", flush=True)
|
||||||
|
|
||||||
timestamp = int(time.time()*1000)
|
timestamp = int(time.time()*1000)
|
||||||
|
|
||||||
|
|
BIN
example.png
Normal file
BIN
example.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.1 MiB |
|
@ -164,20 +164,26 @@ def main():
|
||||||
|
|
||||||
# plot x, y, z
|
# plot x, y, z
|
||||||
#plt.figure(figsize=(5,7))
|
#plt.figure(figsize=(5,7))
|
||||||
|
position2 = {}
|
||||||
|
position2["ellipse-parametric-mean"] = position["ellipse-parametric-mean"]
|
||||||
|
position2["ellipsoid-parametric-mean"] = position["ellipsoid-parametric-mean"]
|
||||||
|
position2["spherical-intersection"] = position["spherical-intersection"]
|
||||||
|
mark = ['x', 'o', 's']
|
||||||
|
position_reord = ["ellipse-parametric-mean", "ellipsoid-parametric-mean", "spherical-intersection"]
|
||||||
fig, axes = plt.subplots(3, 1, figsize=(5, 7), sharex=True)
|
fig, axes = plt.subplots(3, 1, figsize=(5, 7), sharex=True)
|
||||||
for i in range(3):
|
for i in range(3):
|
||||||
yaxis_truth = [pos[i] for pos in truth_position_resampled_enu]
|
yaxis_truth = [pos[i] for pos in truth_position_resampled_enu]
|
||||||
plt.subplot(3, 1, i+1)
|
plt.subplot(3, 1, i+1)
|
||||||
plt.plot(timestamp, yaxis_truth, label="ADS-B Truth")
|
plt.plot(timestamp, yaxis_truth, label="ADS-B Truth")
|
||||||
for method in position:
|
for method in position_reord:
|
||||||
print(position[method])
|
print(position[method])
|
||||||
if "detections_enu" not in position[method]:
|
if "detections_enu" not in position[method]:
|
||||||
continue
|
continue
|
||||||
for i in range(3):
|
for i in range(3):
|
||||||
print(position)
|
#print(position)
|
||||||
yaxis_target = [pos[i] for pos in position[method]["detections_enu"]]
|
yaxis_target = [pos[i] for pos in position[method]["detections_enu"]]
|
||||||
plt.subplot(3, 1, i+1)
|
plt.subplot(3, 1, i+1)
|
||||||
plt.plot(position[method]["timestamp"], yaxis_target, 'x', label=method)
|
plt.plot(position[method]["timestamp"], yaxis_target, marker=mark[i], label=method)
|
||||||
plt.xlabel('Timestamp')
|
plt.xlabel('Timestamp')
|
||||||
if i == 0:
|
if i == 0:
|
||||||
plt.ylabel('ENU X (m)')
|
plt.ylabel('ENU X (m)')
|
||||||
|
@ -187,7 +193,7 @@ def main():
|
||||||
plt.ylabel('ENU Z (m)')
|
plt.ylabel('ENU Z (m)')
|
||||||
|
|
||||||
plt.subplot(3, 1, 1)
|
plt.subplot(3, 1, 1)
|
||||||
plt.legend()
|
plt.legend(prop = {"size": 8})
|
||||||
plt.tight_layout()
|
plt.tight_layout()
|
||||||
filename = 'plot_accuracy_' + args.target_name + '.png'
|
filename = 'plot_accuracy_' + args.target_name + '.png'
|
||||||
plt.savefig('save/' + filename, bbox_inches='tight', pad_inches=0.01)
|
plt.savefig('save/' + filename, bbox_inches='tight', pad_inches=0.01)
|
||||||
|
@ -206,9 +212,9 @@ def main():
|
||||||
|
|
||||||
yaxis_target = [pos[i] for pos in position[method]["detections_enu"]]
|
yaxis_target = [pos[i] for pos in position[method]["detections_enu"]]
|
||||||
table[method][str(i)] = calculate_rmse(yaxis_target, yaxis_truth_target)
|
table[method][str(i)] = calculate_rmse(yaxis_target, yaxis_truth_target)
|
||||||
print('test')
|
#print('test')
|
||||||
print(yaxis_target)
|
#print(yaxis_target)
|
||||||
print(yaxis_truth_target)
|
#print(yaxis_truth_target)
|
||||||
|
|
||||||
print(table)
|
print(table)
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue