Tweaks to playback and logging

pull/40/head
Mark Jessop 2021-09-11 13:58:38 +09:30
rodzic f443a8fb9c
commit 64d289a893
2 zmienionych plików z 25 dodań i 14 usunięć

Wyświetl plik

@ -85,6 +85,7 @@ car_track = GenericTrack()
# Bearing store # Bearing store
bearing_store = None bearing_store = None
bearing_mode = False # Flag to indicate if we are receiving bearings
# Habitat/Sondehub Chase-Car uploader object # Habitat/Sondehub Chase-Car uploader object
online_uploader = None online_uploader = None
@ -881,17 +882,19 @@ def udp_listener_car_callback(data):
bearing_store.update_car_position(_state) bearing_store.update_car_position(_state)
# Add the car position to the logger, but only if we are moving (>10kph = ~3m/s) # Add the car position to the logger, but only if we are moving (>10kph = ~3m/s)
if (_speed > 3.0) and chase_logger: # .. or if are receving bearing data, in which case we want to store high resolution position data.
if ( (_speed > 3.0) or bearing_mode) and chase_logger:
_car_position_update["speed"] = _speed _car_position_update["speed"] = _speed
_car_position_update["heading"] = _heading _car_position_update["heading"] = _heading
chase_logger.add_car_position(_car_position_update) chase_logger.add_car_position(_car_position_update)
def udp_listener_bearing_callback(data): def udp_listener_bearing_callback(data):
global bearing_store, chase_logger global bearing_store, bearing_mode, chase_logger
if bearing_store != None: if bearing_store != None:
bearing_store.add_bearing(data) bearing_store.add_bearing(data)
bearing_mode = True
if chase_logger: if chase_logger:
chase_logger.add_bearing(data) chase_logger.add_bearing(data)

Wyświetl plik

@ -20,7 +20,7 @@ import traceback
from dateutil.parser import * from dateutil.parser import *
def send_bearing(json_data, udp_port=55672): def send_bearing(json_data, udp_port=55672, hostname='<broadcast>'):
""" """
Grab bearing data out of a json log entry and send it via UDP. Grab bearing data out of a json log entry and send it via UDP.
@ -38,11 +38,11 @@ def send_bearing(json_data, udp_port=55672):
""" """
packet = { packet = {
'type' : 'BEARING', 'type' : 'BEARING',
'bearing' : json_data['bearing'], 'bearing' : int(json_data['bearing']),
'confidence': json_data['confidence'], 'confidence': int(json_data['confidence']),
'power': json_data['power'], 'power': int(json_data['power']),
'raw_bearing_angles': json_data['raw_bearing_angles'], 'raw_bearing_angles': [int(x) for x in json_data['raw_bearing_angles']],
'raw_doa': json_data['raw_doa'], 'raw_doa': [round(x,2) for x in json_data['raw_doa']],
'bearing_type': 'relative', 'bearing_type': 'relative',
'source': 'playback' 'source': 'playback'
} }
@ -59,8 +59,11 @@ def send_bearing(json_data, udp_port=55672):
pass pass
s.bind(('',udp_port)) s.bind(('',udp_port))
try: try:
s.sendto(json.dumps(packet).encode('ascii'), ('<broadcast>', udp_port)) s.sendto(json.dumps(packet).encode('ascii'), (hostname, udp_port))
except socket.error: except socket.error as e:
s.sendto(json.dumps(packet).encode('ascii'), ('127.0.0.1', udp_port))
if hostname != '<broadcast>':
s.sendto(json.dumps(packet).encode('ascii'), ('127.0.0.1', udp_port)) s.sendto(json.dumps(packet).encode('ascii'), ('127.0.0.1', udp_port))
@ -88,6 +91,9 @@ def send_car_position(json_data, udp_port=55672):
'valid': True 'valid': True
} }
if 'heading' in json_data:
packet['heading'] = json_data['heading']
# Set up our UDP socket # Set up our UDP socket
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.settimeout(1) s.settimeout(1)
@ -147,7 +153,7 @@ def send_balloon_telemetry(json_data, udp_port=55672):
s.sendto(json.dumps(packet).encode('ascii'), ('127.0.0.1', udp_port)) s.sendto(json.dumps(packet).encode('ascii'), ('127.0.0.1', udp_port))
def playback_json(filename, udp_port=55672, speed=1.0, start_time = 0): def playback_json(filename, udp_port=55672, speed=1.0, start_time = 0, hostname='<broadcast>'):
""" Read in a JSON log file and play it back in real-time, or with a speed factor """ """ Read in a JSON log file and play it back in real-time, or with a speed factor """
with open(filename, 'r') as _log_file: with open(filename, 'r') as _log_file:
@ -173,12 +179,14 @@ def playback_json(filename, udp_port=55672, speed=1.0, start_time = 0):
# Running timer # Running timer
_run_time = (_new_time - _first_time).total_seconds() _run_time = (_new_time - _first_time).total_seconds()
if _run_time < start_time: if _run_time < start_time:
continue continue
_time_min = int(_run_time)//60 _time_min = int(_run_time)//60
_time_sec = _run_time%60.0 _time_sec = _run_time%60.0
if (_time_delta < 100):
time.sleep(_time_delta/speed) time.sleep(_time_delta/speed)
if _log_data['log_type'] == 'CAR POSITION': if _log_data['log_type'] == 'CAR POSITION':
@ -186,7 +194,7 @@ def playback_json(filename, udp_port=55672, speed=1.0, start_time = 0):
print("%02d:%.2f - Car Position" % (_time_min, _time_sec)) print("%02d:%.2f - Car Position" % (_time_min, _time_sec))
elif _log_data['log_type'] == 'BEARING': elif _log_data['log_type'] == 'BEARING':
send_bearing(_log_data, udp_port) send_bearing(_log_data, udp_port, hostname=hostname)
print("%02d:%.2f - Bearing Data" % (_time_min, _time_sec)) print("%02d:%.2f - Bearing Data" % (_time_min, _time_sec))
elif _log_data['log_type'] == 'BALLOON TELEMETRY': elif _log_data['log_type'] == 'BALLOON TELEMETRY':
@ -226,5 +234,5 @@ if __name__ == '__main__':
else: else:
print("USAGE: python log_playback.py filename.log <speed_multiplier> <start_time>") print("USAGE: python log_playback.py filename.log <speed_multiplier> <start_time>")
playback_json(filename, udp_port, speed, start_time) playback_json(filename, udp_port, speed, start_time, hostname=hostname)