add subtype 3/4 velocity decoding
This commit is contained in:
parent
e194e90eaf
commit
2e3ceed0b0
69
decoder.py
69
decoder.py
@ -214,45 +214,64 @@ def cpr2position(cprlat0, cprlat1, cprlon0, cprlon1, t0, t1):
|
|||||||
# compute ni, longitude index m, and longitude
|
# compute ni, longitude index m, and longitude
|
||||||
if (t0 > t1):
|
if (t0 > t1):
|
||||||
ni = cprN(lat_even, 0)
|
ni = cprN(lat_even, 0)
|
||||||
m = math.floor(cprlon_even * (cprNL(lat_even)-1)
|
m = math.floor(cprlon_even * (cprNL(lat_even)-1) -
|
||||||
- cprlon_odd * cprNL(lat_even) + 0.5)
|
cprlon_odd * cprNL(lat_even) + 0.5)
|
||||||
lon = (360.0 / ni) * (m % ni + cprlon_even)
|
lon = (360.0 / ni) * (m % ni + cprlon_even)
|
||||||
lat = lat_even
|
lat = lat_even
|
||||||
else:
|
else:
|
||||||
ni = cprN(lat_odd, 1)
|
ni = cprN(lat_odd, 1)
|
||||||
m = math.floor(cprlon_even * (cprNL(lat_odd)-1)
|
m = math.floor(cprlon_even * (cprNL(lat_odd)-1) -
|
||||||
- cprlon_odd * cprNL(lat_odd) + 0.5)
|
cprlon_odd * cprNL(lat_odd) + 0.5)
|
||||||
lon = (360.0 / ni) * (m % ni + cprlon_odd)
|
lon = (360.0 / ni) * (m % ni + cprlon_odd)
|
||||||
lat = lat_odd
|
lat = lat_odd
|
||||||
|
|
||||||
if lon > 180:
|
if lon > 180:
|
||||||
lon = lon - 360
|
lon = lon - 360
|
||||||
|
|
||||||
return [lat, lon]
|
return lat, lon
|
||||||
|
|
||||||
|
def get_velocity(msg):
|
||||||
|
"""Calculate the speed, heading, and vertical rate"""
|
||||||
|
|
||||||
|
msgbin = hex2bin(msg)
|
||||||
|
|
||||||
|
subtype = bin2int(msgbin[37:40])
|
||||||
|
|
||||||
|
if subtype in (1, 2):
|
||||||
|
v_ew_sign = bin2int(msgbin[45])
|
||||||
|
v_ew = bin2int(msgbin[46:56]) - 1 # east-west velocity
|
||||||
|
|
||||||
|
v_ns_sign = bin2int(msgbin[56])
|
||||||
|
v_ns = bin2int(msgbin[57:67]) - 1 # north-south velocity
|
||||||
|
|
||||||
|
v_we = -1*v_ew if v_ew_sign else v_ew
|
||||||
|
v_sn = -1*v_ns if v_ns_sign else v_ns
|
||||||
|
|
||||||
|
spd = math.sqrt(v_sn*v_sn + v_we*v_we) # unit in kts
|
||||||
|
|
||||||
|
hdg = math.atan2(v_we, v_sn)
|
||||||
|
hdg = math.degrees(hdg) # convert to degrees
|
||||||
|
hdg = hdg if hdg >= 0 else hdg + 360 # no negative val
|
||||||
|
|
||||||
|
tag = 'GS'
|
||||||
|
|
||||||
|
else:
|
||||||
|
hdg = bin2int(msgbin[46:56]) / 1024.0 * 360.0
|
||||||
|
spd = bin2int(msgbin[57:67])
|
||||||
|
|
||||||
|
tag = 'AS'
|
||||||
|
|
||||||
|
vr_sign = bin2int(msgbin[68])
|
||||||
|
vr = bin2int(msgbin[68:77]) # vertical rate
|
||||||
|
rocd = -1*vr if vr_sign else vr # rate of climb/descend
|
||||||
|
|
||||||
|
return int(spd), hdg, int(rocd), tag
|
||||||
|
|
||||||
|
|
||||||
def get_speed_heading(msg):
|
def get_speed_heading(msg):
|
||||||
"""Calculate the speed and heading."""
|
"""Calculate the speed and heading."""
|
||||||
msgbin = hex2bin(msg)
|
spd, hdg, rocd, tag = get_velocity(msg)
|
||||||
|
return spd, hdg
|
||||||
v_ew_dir = bin2int(msgbin[45])
|
|
||||||
v_ew = bin2int(msgbin[46:56]) # east-west velocity
|
|
||||||
|
|
||||||
v_ns_dir = bin2int(msgbin[56])
|
|
||||||
v_ns = bin2int(msgbin[57:67]) # north-south velocity
|
|
||||||
|
|
||||||
v_ew = -1*v_ew if v_ew_dir else v_ew
|
|
||||||
v_ns = -1*v_ns if v_ns_dir else v_ns
|
|
||||||
|
|
||||||
# vr = bin2int(msgbin[68:77]) # vertical rate
|
|
||||||
# vr_dir = bin2int(msgbin[77])
|
|
||||||
|
|
||||||
speed = math.sqrt(v_ns*v_ns + v_ew*v_ew) # unit in kts
|
|
||||||
|
|
||||||
heading = math.atan2(v_ew, v_ns)
|
|
||||||
heading = heading * 360.0 / (2 * math.pi) # convert to degrees
|
|
||||||
heading = heading if heading >= 0 else heading + 360 # no negative val
|
|
||||||
return [speed, heading]
|
|
||||||
|
|
||||||
|
|
||||||
def get_callsign(msg):
|
def get_callsign(msg):
|
||||||
|
42
run_test.py
42
run_test.py
@ -1,38 +1,46 @@
|
|||||||
import decoder
|
import decoder
|
||||||
|
|
||||||
|
print '*************************'
|
||||||
print 'Testing the ADS-B decoder'
|
print 'Testing the ADS-B decoder'
|
||||||
print '---------------------------'
|
print '*************************'
|
||||||
print
|
print
|
||||||
|
|
||||||
# decode call sign test
|
# decode call sign test
|
||||||
msg = '8D51004E20092578DB782072C825'
|
print "------- Test Callsign -------"
|
||||||
cs = decoder.get_callsign(msg)
|
msg_cs = '8D51004E20092578DB782072C825'
|
||||||
print 'Message:', msg
|
cs = decoder.get_callsign(msg_cs)
|
||||||
|
print 'Message:', msg_cs
|
||||||
print 'Call sign:', cs
|
print 'Call sign:', cs
|
||||||
print
|
print
|
||||||
|
|
||||||
# decode position
|
# decode position
|
||||||
msg0 = '8D40058B58C901375147EFD09357'
|
print "------- Test Postiions -------"
|
||||||
msg1 = '8D40058B58C904A87F402D3B8C59'
|
msg_pos_0 = '8D40058B58C901375147EFD09357'
|
||||||
|
msg_pos_1 = '8D40058B58C904A87F402D3B8C59'
|
||||||
t0 = 1446332400
|
t0 = 1446332400
|
||||||
t1 = 1446332405
|
t1 = 1446332405
|
||||||
pos = decoder.get_position(msg0, msg1, t0, t1)
|
pos = decoder.get_position(msg_pos_0, msg_pos_1, t0, t1)
|
||||||
print 'Message E:', msg0
|
print 'Message E:', msg_pos_0
|
||||||
print 'Message O:', msg1
|
print 'Message O:', msg_pos_1
|
||||||
print 'Position:', pos
|
print 'Position:', pos
|
||||||
print
|
print
|
||||||
|
|
||||||
# decode velocity
|
# decode velocity
|
||||||
msg = '8D51004E99850702685C00E582E4'
|
print "------- Test Velocity -------"
|
||||||
sh = decoder.get_speed_heading(msg)
|
msg_v_s1 = '8D485020994409940838175B284F' # subtype 1
|
||||||
print 'Message:', msg
|
msg_v_s3 = '8DA05F219B06B6AF189400CBC33F' # subtype 3
|
||||||
print 'Speed and heading:', sh
|
v1 = decoder.get_velocity(msg_v_s1)
|
||||||
|
v2 = decoder.get_velocity(msg_v_s3)
|
||||||
|
print 'Message:', msg_v_s1
|
||||||
|
print 'velocity:', v1
|
||||||
|
print 'Message:', msg_v_s3
|
||||||
|
print 'velocity:', v2
|
||||||
print
|
print
|
||||||
|
|
||||||
# test NIC
|
# test NIC
|
||||||
# decode position
|
print "------- Test NIC -------"
|
||||||
msg = '8D40058B58C901375147EFD09357'
|
msg_nic = '8D40621D58C382D690C8AC2863A7'
|
||||||
nic = decoder.get_nic(msg1)
|
nic = decoder.get_nic(msg_nic)
|
||||||
print 'Message:', msg
|
print 'Message:', msg_nic
|
||||||
print 'NIC:', nic
|
print 'NIC:', nic
|
||||||
print
|
print
|
||||||
|
Loading…
Reference in New Issue
Block a user