Coder Social home page Coder Social logo

junzis / pymodes Goto Github PK

View Code? Open in Web Editor NEW
531.0 38.0 152.0 1004 KB

Python decoder for Mode S and ADS-B signals

License: GNU General Public License v3.0

Python 90.24% Makefile 0.24% Cython 7.97% C 1.54%
python ads-b mode-s aircraft tracking ehs adsb

pymodes's Issues

MRAR capability

Hello guys,

First of all, my name is Antonio and I'm developing a project in which we want to receive Mode-S MRAR (BDS 4,4), so when I discovered pyModeS I thought I had found the perfect solution.

I have downloaded it and, after reading the book and playing with the programme, two problems/doubts came up:

  • I had never used python. That's why it is a new and complex world for me, so there are steps I don't understand.
  • I don't know if it is possible to process with pyModeS live messages. And in case it would be, how could it be done??

Thank you so much for your help.

Note: I'm using a SBS-3 receiver.

altitude_diff missing - enhancment: add decoded value and calculate GNSS Alt

- pyModeS.decoder.bds.bds09: ``airborne_velocity()``, ``altitude_diff()``

altitude_diff missing to provide the GNSS altitude (height above ellipsoid (HAE) WGS84) difference from the barometric altitude "alt" (which is standard pressure, and not even MSL).

Request enhancement to decode this value and present to live-modes streamer and display.
Also request enhancement to automatically calculate the HAE feet (GNSS altitude) from decoded altitude (barometric)

def altitude(msg):

and provide a "calculated" GNSS Altitude in HAE feet or meters.

modeslive --hex2bin bug

modeslive --source rtlsdr
Traceback (most recent call last):
File "/home/lal/.local/bin/modeslive", line 10, in
from pyModeS.streamer.decode import Decode
File "/home/lal/.local/lib/python2.7/site-packages/pyModeS/init.py", line 8, in
from . import py_common as common
File "/home/lal/.local/lib/python2.7/site-packages/pyModeS/py_common.py", line 7
def hex2bin(hexstr: str) -> str:
^
SyntaxError: invalid syntax

I am getting this while I try to run the "modeslive".

Online decoder ?

Hello,

First, thanks for the great documentation and decoder !

I saw there is not any online decoder for ADS-B / Mode-S messages, I think it would be great to make either a website or a REST API (flask ...) to decode already received messages !

Not receiving squawk

I receive all the other ADS-B messages but not the squawk ones. Are commercial planes actually emiting them or maybe in emergency cases only?

Multiprocessing

Just a quick note (in the open-source spirit) to anyone who may be interested; I have written an alternative client-side implementation with similar core modules that utilises multiprocessing in an attempt to multilat mode-AC messages as well. The source code can be found here: https://github.com/kelvinxuande/dso_internship_mlat-client. I would really appreciate any comments on it as well!

Decoding temperatue in ehs.py

when I was decoding temperature in df20 and df21 I got wrong results. When I changed function "def temp44(msg, rev=False)", results was OK. see attached file for details.

weather.txt

Decoding Raw Data Stream

Hi,

Thank you for the great job done so far. I am using Radarcape for one of my school projects and am tasked to extract some key information such as the squawk code and timestamp from the data received.

I have wrote afew lines of code:
client.txt
and printed the data acquried onto .txt for reference:
sample_output.txt

However, from the readings of your library and more documentations found online, I am clueless as to what to do next; so as to obtain the information in hexadecimal form (I pressume).
Any tips, or have I done something wrong?

Best regards.

pms.adsb.position function decodes surface position reports as airborne position reports

The function position(msg0, msg1, t0, t1) uses the following check:
if typecode(msg0) < 5 or typecode(msg0) > 18:
This should be:
if typecode(msg0) < 9 or typecode(msg0) > 18:

Either that, or the position function needs to support the decoding of the surface positions.

5 - 8 (inclusive) are Surface Position Messages
9 - 18 (inclusive) are Airborne Position Messages

The position decoder you have does not work for surface position messages as they need to be decoded differently and rely on either knowing the last position of the aircraft within 180NM or knowing the receiver location to work out which lat/long to use.

Also I saw some differences in output of _cprNL vs what I believe the lat->NL should be:

If lat is 0, then NL is 59
If abs(lat) = 87 then NL is 2
If abs(lat) > 87 then NL is 1

bds05.py: Arguments

In the file bds05.py is the following description of the arguments:
'''
airborne_position(msg0, msg1, t0, t1):
# msg0 (string): even message (28 bytes hexadecimal string)
# msg1 (string): odd message (28 bytes hexadecimal string)
# t0 (int): timestamps for the even message
# t1 (int): timestamps for the odd message
'''
In the manual you are describing the following example:
'''
Example: Globally unambiguous position (decoding with two messages)
8D40621D58C382D690C8AC2863A7 (newest message, which is even)
8D40621D58C386435CC412692AD6 (older message, which is odd)
'''

So I would assume the params would be as follows:
msg0 = 8D40621D58C382D690C8AC2863A7 (newset & even)
msg1 = 8D40621D58C386435CC412692AD6 (older & odd)
t0 = 10 (or similar)
t1 = 20 (higher than t0)
The result is not matching the value stated in the manual....

But, if I use:
msg0 = 8D40621D58C382D690C8AC2863A7
msg1 = 8D40621D58C386435CC412692AD6
t0 = 20
t1 = 10

So I needed to exchange the timestamps to get the result from the example in the manual.
Therefore I would assume there might be a small mistake in the argument description?

Whether ADS-B include time information?

Dear researcher:
Thanks for your job first. It's a great job for me to learn about ADS-B. After I read the guide book, I find all the time stamp seems like a local time. So I want to know whether ADS-B broadcast it's own clock in ADS-B frame. If so, how can I capture it.

Need Help for setup

I found your work on ADS-B decoding and I found it very interesting.
I installed pyModeS-2.1 on my Pi3B+. Would you help me for next steps ?

I have a very little experience in the world of flight trucking.
I have a DVB-T + PI3B+, I run dump1090 and I launch h=localhost:8080.
That's basically what I know. I never used ModeSMixer neither PlanePlotter.

What should I do with pyModeS, how to launch it ? How can I display the A/C ?
should I install PlanePlotter on my PC?

I will be very grateful if you can help me.

calculate surface position using even/odd message pair

It would be great if pyModeS allowed to calculate surface positions using even/odd message pairs.

At the moment it is possible to calculate surface position with a known position of receiver or an airport. But it is not possible to use that position to verify the surface position (see reasonableness tests in ICAO document 9871), because known position has no time information and might be quite far away from the surface positions (i.e. a receiver more than 2.5 nautical miles from an airport or multiple airports, etc).

Being able to use even/odd message pairs to calculate surface positions, we can verify them using distance and time information as described in the document.

Cannot import c_common

Hi!
I was using an old version of pyModeS to make some tests. Recently I've updated to latest version, installation is ok, but I can't run anything, even modeslive. It's a bug in pyModeS or am I missing something?
I've setup python3 as default for my system.

pi@rasp3_dev:~ $ sudo pip3 install git+https://github.com/junzis/pyModeS
Collecting git+https://github.com/junzis/pyModeS
  Cloning https://github.com/junzis/pyModeS to /tmp/pip-cm6ej86e-build
  Requirement already satisfied (use --upgrade to upgrade): pyModeS==2.8 from git+https://github.com/junzis/pyModeS in /usr/local/lib/python3.5/dist-packages
Requirement already satisfied: numpy in /usr/local/lib/python3.5/dist-packages (from pyModeS==2.8)
Requirement already satisfied: pyrtlsdr in /usr/local/lib/python3.5/dist-packages (from pyModeS==2.8)
Requirement already satisfied: pyzmq in /usr/local/lib/python3.5/dist-packages (from pyModeS==2.8)
pi@rasp3_dev:~ $ sudo pip install pyModeS
Requirement already satisfied: pyModeS in /usr/local/lib/python3.5/dist-packages
Requirement already satisfied: numpy in /usr/local/lib/python3.5/dist-packages (from pyModeS)
Requirement already satisfied: pyrtlsdr in /usr/local/lib/python3.5/dist-packages (from pyModeS)
Requirement already satisfied: pyzmq in /usr/local/lib/python3.5/dist-packages (from pyModeS)
pi@rasp3_dev:~ $ modeslive --help
Traceback (most recent call last):
  File "/home/pi/.local/lib/python3.5/site-packages/pyModeS/__init__.py", line 5, in <module>
    from . import c_common as common
ImportError: cannot import name 'c_common'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/local/bin/modeslive", line 10, in <module>
    from pyModeS.streamer.decode import Decode
  File "/home/pi/.local/lib/python3.5/site-packages/pyModeS/__init__.py", line 8, in <module>
    from . import py_common as common
  File "/home/pi/.local/lib/python3.5/site-packages/pyModeS/py_common.py", line 130
    addr: Optional[str]
        ^
SyntaxError: invalid syntax
pi@rasp3_dev:~/pyModeS $ python -V
Python 3.5.3

also, I'm trying to use this script, but got the same import error:

#!/usr/bin/python3 -O

import pyModeS as pms
import sys

for msg in sys.stdin:
    msg = msg.replace("*", "").replace(";", "")
    #if len(msg) > 20 and msg[0:4] == "A000" and pms.bds.bds44.is44(msg) and not pms.bds.bds40.is40(msg) :
    if len(msg) > 20 and msg[0:4] == "A000" and pms.bds.bds44.is44(msg, rev=False)  :
        #print hex(pms.bin2int(pms.crc(msg, encode=False)))
        print ("*" + msg.replace("\n","").lower() + ";")
        #sys.stdout.write('Wind speed/dir: ')
        print (pms.commb.wind44(msg, rev=False))  # Wind speed (kt) and direction (true) (deg)
        #sys.stdout.write('Temp: ')
        print (pms.commb.temp44(msg, rev=False))  # Static air temperature (C)
        #sys.stdout.write('hPa: ')
        print (pms.commb.p44(msg, rev=False))     # Average static pressure (hPa)
        #sys.stdout.write('Hum: ')
        print (pms.commb.hum44(msg, rev=False))   # Humidity (%)
        print

Not exporting RSSI (signal strength) info

I was thinking of using this library to write some scripts for gain tweaking, but it looks like the library is ignoring signal strength info from Beast streams? :-(

Msg 14bytes or 28bytes

In your pymodes documentation each message argument is noted as being 28 bytes. I thought that ADSB messages were 14 bytes long (112 bits)
Please explain. Thanks.

Possibly incorrect decoding of airborne position

I haven't tracked it all the way down, but I think pyModeS may be incorrectly decoding this position. At least the position it returns disagrees with the position returned by two other libraries.

import pyModeS as pms

msg_even = "8DA46D4F58B9834BD7AE086205AE"
msg_odd = "8DA46D4F5827864A548FA927F541"

print(pms.adsb.airborne_position(msg_odd, msg_even, 0, 1))
(88.94435, -57.63428)

The position I get from adsb and antirez dump1090 is this:

(88.91747426178496, 101.01104736328125)

Those two libraries use basically the same CPR NL function implementation, so maybe that's not a big surprise.

Note that those two messages are not actually valid for use in position decoding, because they were broadcast hours and many miles apart. But It still seems like there may be a potential issue.

README correction

The signature of the function adsb.position in the README file should change from pms.adsb.position(msg_odd, msg_even, t_odd, t_even) to pms.adsb.position(msg_even, msg_odd, t_even, t_odd). The 'even' arguments come first.

Heading and velocity decoding on surface messages

I've modified some files to add the heading and the velocity decoding on the surface with refference function. This could be done also on the surface position decoding, but I haven't done it yet.

velocity = util.DecodeMovement(util.bin2int(msgbin[37:44]))
heading=0
if msgbin[44] == '1':
    heading = util.bin2int(msgbin[45:52]) / 128.0 * 360

On the utils file, this function needs also to be added:

def DecodeMovement(movement):
    """
    Decodes velocity parameter on surface movement messages
    """
    if (movement == 0):  # no movmement information available
        return None
    elif (movement == 1):  # aircraft stopped (G / S = 0 knots)
        return 0
    elif (movement == 2):  # G / S < 0.125 kt
        return 0.125
    elif (movement >= 3 and movement <= 8):
        return 0.125 + (movement - 3) * 0.1458333152116899
    elif (movement >= 9 and movement <= 12):
        return 1 + (movement - 9) * 0.25
    elif (movement >= 13 and movement <= 38):
        return 2 + (movement - 13) * 0.5
    elif (movement >= 39 and movement <= 93):
        return 15 + (movement - 39) * 1
    elif (movement >= 94 and movement <= 108):
        return 70 + (movement - 94) * 2
    elif (movement >= 109 and movement <= 123):
        return 100 + (movement - 109) * 5
    elif (movement == 124):  # max value!
        return 175
    elif (movement == 125):  # reserved for aircraft decelerating
        return None
    elif (movement == 126):  # reserved for aircraft accelerating
        return None
    elif (movement == 127):  # reserved for aircraft backing up
        return None

quality of surface positions

I have tried to map surface positions (type code 5-8). My reference point is Dublin airport.

As you can see on the map below, I have many positions outside the airport.

Is that normal? Or is there a possible bug in calculations?

map

Equipment Class

I need to get Equipment Class(A1S,A1,A2,B1). Couldnt find any function supporting it

Anomalous Short Message Decoding Interferance

The following messages have come from dump1090-fa beast feed on localhost:30005 are clearly incorrect.
The options --modeac and --no-crc-check are not enabled.

8DA993F1588D03
8DAA703060A1E3
8DACDDBE5839D6
8DAA70306045F6
8DA6B1A3583BC6

These messages are decoded as DF-17 Airborne position messages.

short_msg = ['8DA993F1588D03', '8DAA703060A1E3', '8DACDDBE5839D6',\
    '8DAA70306045F6', '8DA6B1A3583BC6']

# Check the downlink format on the messages
print(list(map(pyModeS.df, short_msg)))

# Check the DF-17 typecodes
print(list(map(pyModeS.adsb.typecode, short_msg)))

# Check CRC
print(list(map(pyModeS.crc, short_msg)))

outputs

[17, 17, 17, 17, 17]
[11, 12, 11, 12, 11]
[4234818, 3962231, 11421160, 3969378, 3049442]

This caused problems in my repository when the messages were sent to pyModeS.adsb.airborne_position() or pyModeS.adsb.airborne_position_with_ref()

I currently see two possible solutions:

  • run pyModeS.crc() on each message, which is costly on a Raspberry Pi
  • verify len(msg) == 28 for the DF-17 Messages

Has anyone else had similar experiences with dump1090?

Programming ADS-B Out

This is all great, you've done a really good job explaining how everything works.

I'm tasked with the job of creating an ADS-B Out for a school project. Any tips or advice for doing what you've done here in reverse?

HackRF is not supported ?

When I ran modeslive --source rtlsdr
It results by IOError: Error code -1 when opening SDR (device index = 0)

Issue with ADSB_Encode

I am totally new to python. I am trying to run the ADSB_Encode program. I resolved the first issue which appeared to be missing parentheses around a pair of print statements.

I am using the following on the latest Windows 10 build having used pip to load numpy:
Python 3.8.0 (tags/v3.8.0:fa919fd, Oct 14 2019, 19:21:23) [MSC v.1916 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.

I get the following error:

C:\ADSB-Out-master>ADSB_Encoder.py 0xABCDEF 12.34 56.78 9999.0
Traceback (most recent call last):
File "C:\ADSB-Out-master\ADSB_Encoder.py", line 419, in
(df17_even, df17_odd) = df17_pos_rep_encode(ca, icao, tc, ss, nicsb, alt, time, lat, lon, surface)
File "C:\ADSB-Out-master\ADSB_Encoder.py", line 273, in df17_pos_rep_encode
enc_alt = encode_alt_modes(alt, surface)
File "C:\ADSB-Out-master\ADSB_Encoder.py", line 38, in encode_alt_modes
tmp1 = (encalt & 0xff8) << 1
TypeError: unsupported operand type(s) for &: 'float' and 'int'

Any ideas as to what has happened?

BDS09 local variable trk referenced before assignment

trk_or_hdg = round(trk, 2)

Message 8DAE041599080000000000E25EA8 can cause an issue where the variable trk is referenced before assignment

Traceback

    return airborne_velocity(msg, source)
  File "/Library/Python/3.8/site-packages/pyModeS/decoder/bds/bds09.py", line 69, in airborne_velocity
    trk_or_hdg = round(trk, 2)
UnboundLocalError: local variable 'trk' referenced before assignment```

TypeError: cannot pickle '_curses.window' object

Dear Junzis,

Very appreciate with pyModeS that could give me interesting use case as a noob on python.
I tried to run modeslive on windows environment but found error like this:

Traceback (most recent call last):
File "C:\Users*\AppData\Local\Programs\Python\Python39\Lib\site-packages\pyModeS\streamer\modeslive.py", line 140, in
screen_process.start()
File "C:\Users*
\AppData\Local\Programs\Python\Python39\lib\multiprocessing\process.py", line 121, in start
self._popen = self._Popen(self)
File "C:\Users*\AppData\Local\Programs\Python\Python39\lib\multiprocessing\context.py", line 224, in _Popen
return _default_context.get_context().Process._Popen(process_obj)
File "C:\Users*
\AppData\Local\Programs\Python\Python39\lib\multiprocessing\context.py", line 327, in _Popen
return Popen(process_obj)
File "C:\Users**\AppData\Local\Programs\Python\Python39\lib\multiprocessing\popen_spawn_win32.py", line 93, in init
reduction.dump(process_obj, to_child)
File "C:\Users\r**\AppData\Local\Programs\Python\Python39\lib\multiprocessing\reduction.py", line 60, in dump
ForkingPickler(file, protocol).dump(obj)
TypeError: cannot pickle '_curses.window' object

but otherwise on linux, the script can run well.

I've add pip install windows-curses but still can't work.

Is there any concern for windows environment?

The postition out of range

Hi~I have transformed my data as the same format as 'sample_data_adsb.csv',and I run the progress 'sample_run_adsb.py' successfully,but why i got much wrong location ?
image
image

document emitter category function

The following section mentions emitter category for aircraft category, i.e. heavy, large, glider

https://mode-s.org/decode/adsb/identification.html

Grepping through pyModeS source code for emitter or ec yields nothing. Finally, I was able to find category function.

IMHO, it would be great to mention the function in the above section.

BTW. Page 12 of the following document lists emitter categories

https://www.eurocontrol.int/sites/default/files/content/documents/nm/asterix/20140807-asterix-adsbm-part12-v2.2.pdf

Timestamp format not clear

Several position functions require timestamps to be provided and the documentation says these have type int, but I cannot find instructions on how to correctly turn the time the message was received into an int.

nuc_p calculation and vertical containment radius

In nuc_p function in pyModeS/decoder/adsb.py:

    if tc in [20, 21]:
        RCv = uncertainty.NA

But in the ICAO document, it says that vertical position error should be 4 and 15 for typecode 20 and 21, it seems?

Missing zmq package

Hi, since 2.3, the pyzmq is not "extras" anymore, since pyModeS can't be imported without it:

>>> from pyModeS import *
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "blah\env\lib\site-packages\pyModeS\__init__.py", line 13, in <module>
    from .extra import tcpclient
  File "blah\env\lib\site-packages\pyModeS\extra\tcpclient.py", line 9, in <module>
    import zmq
ModuleNotFoundError: No module named 'zmq'

It should probably be either moved to install_requires or the imports should be moved to function-level.

Thanks.

pyModeS 2.3 on Python 3.7.4, 64-bit, Windows.

Error in importing / Traceback (most recent calls last)

calling modeslive --help gives the following erors

modeslive --help

/usr/lib/python3/dist-packages/apport/report.py:13: DeprecationWarning: the imp module is deprecated in favour of importlib; see the module's documentation for alternative uses
import fnmatch, glob, traceback, errno, sys, atexit, locale, imp
Traceback (most recent call last):
File "/usr/local/bin/modeslive", line 12, in
from pyModeS.streamer.source import NetSource,RtlSdrSource
File "/usr/local/lib/python3.6/dist-packages/pyModeS/streamer/source.py", line 3, in
from pyModeS.extra.rtlreader import RtlReader
File "/usr/local/lib/python3.6/dist-packages/pyModeS/extra/rtlreader.py", line 4, in
from rtlsdr import RtlSdr
File "/usr/local/lib/python3.6/dist-packages/rtlsdr/init.py", line 56, in
from .librtlsdr import librtlsdr
File "/usr/local/lib/python3.6/dist-packages/rtlsdr/librtlsdr.py", line 61, in
f = librtlsdr.rtlsdr_get_device_count
File "/usr/lib/python3.6/ctypes/init.py", line 361, in getattr
func = self.getitem(name)
File "/usr/lib/python3.6/ctypes/init.py", line 366, in getitem
func = self._FuncPtr((name_or_ordinal, self))
AttributeError: /usr/bin/python3: undefined symbol: rtlsdr_get_device_count

Decoding position problem

Hi,

I found out some problems with the position function. It gives me non continuous positions, sometimes jumping over several hundred km. I have a unit test reproducing the (possible) bug. It contains a set of real world ads-b messages. It seems to be coming from the calculation of the latitude index (j). At a certain moment, it goes from 7 to 8, and the tracks start jumping far from their actual position. When I force j=7, the result is correct.

 from pyModeS import adsb

 def test_adsb_icao():

# msg1 : odd msg
msg1 = "8D40093F5893F696E3FE74F04E96"
t1 = 1

# msg2 : even msg
msg2 = "8D40093F5897A3226409EFF5ACB6"
t2 = 2

# msg3 : even msg
msg3 = "8D40093F589B132BFC05D0C78026"
t3 = 3

pos = adsb.position(msg2, msg1, t2, t1)
assert pos == (46.70151, 8.95084)

pos = adsb.position(msg3, msg1, t3, t1)
# Found (52.75772, 10.11353), expected (46.7375, 8.9127)
assert pos == (46.7375, 8.9127)

Thanks.

Uncertainty & Accuracy parameters

Hello everyone,

First of all, my name is José Andrés and I am member of a robotics research group focused on UAVs. We are recently introducing our research on ADS-B for UTM utilities and this project fits perfect with our first requirements. So thank you so much for such a great job of code and manual book.

I am implementing NACp, NACv and SIL myself as well as version 2 for NIC. Here comes the point that nic_sup_b (NICs) is defined as a bit (40) part of the incoming msg whatever TC it is. In contrast, regarding to the book, NICs should be defined by bit 76 of TC=31 "operation and status messages". It is also the same definition for NICa in version 2.

Maybe I did misunderstand something.

By the way, I know it is a ten-minutes-issue, but I would share accuracy & integrity parameters implementation if you find it useful.

Thanks in advance for your help

Mode-A/C codes

Hello!

My Mode-S Beast can receive both Mode-S and Mode-A/C at the same time. The received data is sent to Planeplotter using the AVR formet. What I don't understand is how Planeplotter knows which squawk code that belongs to which aircraft. From what I can see by the raw output, the Mode-A/C message only contains the SSR code:

// 6-byte timestamp followed by SSR code
@01EA3CC23DBD0225;
@01EA3CC36A4B3420;

// 6-byte timestamp followed by short Mode-S message:
@01EA3CC42EF00261942AF05326;
@01EA3CC543CA0221;
@01EA3CC586996010;

// 6-byte timestamp followed by long Mode-S message:
@01EA3CC62FB08D4780BF5811D02937CA0CE8656C;
@01EA3CC652C35344;
@01EA3CC7BCE85357;

How can I extract which Mode-A/C-code an aircraft is transmitting? And shouldn't the A/C include the altitude as well?

Btw, I really love this project - keep up the good work! 👍

Best regards,
Even

Latitude/Longitude return values too small

Hello,
just a simple question:
"cprlat_even = util.bin2int(msgbin0[54:71]) / 131072.0"
is returning a value which is sometimes too small because bin2int is returning an 16 bit integer. CPR information is 17 bit and can't be returned as integer. In my opinion the return value must be a long value or is there something I do not understand?
Cheers Christian

No way to read and decode from a raw IQ data file

In rtlreader.py, the decoder decodes only data from a rtl, there is no way to pass raw iq data to it from outside, and whenever object of rtlreader is created, it is necessary to have a rtl device connected, as in the constructor RtlSdr() is called.

quality of airbone positions

Please consider the script below. Its output is as follows (columns are timestamp, typecode, oe flag and message)

2019-03-23 20:08:47.011677+00:00 11 1 8d4ca5415809670448d60d2fc835
2019-03-23 20:08:47.124150+00:00 19 1 8d4ca541990c9f02183c1e845693
2019-03-23 20:08:47.730598+00:00 29 0 8d4ca541ea05f9271b1c0891d457
2019-03-23 20:08:47.978328+00:00 11 0 8d4ca541580953cf23c531144f9b
message pair: (71.71367, 177.70279)
even message with ref: (53.71367, -1.18142)
odd message with ref: (53.41534, -6.16163)

I have received sequence of above messages. If I calculate the position using message pairs, then the position is far, far away from the airport near by I am getting the messages. When calculating the positions using reference location (Dublin airport) the result looks more plausible.

Is that normal?

The script

from dateutil.parser import isoparse
import pyModeS as pms

data = [
    (isoparse('2019-03-23 20:08:47.011677+00'), '8d4ca5415809670448d60d2fc835'),
    (isoparse('2019-03-23 20:08:47.124150+00'), '8d4ca541990c9f02183c1e845693'),
    (isoparse('2019-03-23 20:08:47.730598+00'), '8d4ca541ea05f9271b1c0891d457'),
    (isoparse('2019-03-23 20:08:47.978328+00'), '8d4ca541580953cf23c531144f9b'),
]

for ts, msg in data:
    print(ts, pms.adsb.typecode(msg), pms.adsb.oe_flag(msg), msg)

ts_even, msg_even = data[-1]
ts_odd, msg_odd = data[0]
pos = pms.adsb.position(msg_even, msg_odd, ts_even, ts_odd)
print('message pair:', pos)

pos = pms.adsb.position_with_ref(msg_even, 53.421389, -6.27)
print('even message with ref:', pos)

pos = pms.adsb.position_with_ref(msg_odd, 53.421389, -6.27)
print('odd message with ref:', pos)

AttributeError: 'NoneType' object has no attribute 'put'

I have copied the code to customize the streaming module shown in the README file but I get this error:

Traceback (most recent call last):
  File "/usr/local/lib/python3.7/site-packages/pyModeS/extra/tcpclient.py", line 263, in run
    received = [i for i in self.socket.recv(4096)]
  File "zmq/backend/cython/socket.pyx", line 791, in zmq.backend.cython.socket.Socket.recv
  File "zmq/backend/cython/socket.pyx", line 827, in zmq.backend.cython.socket.Socket.recv
  File "zmq/backend/cython/socket.pyx", line 191, in zmq.backend.cython.socket._recv_copy
  File "zmq/backend/cython/socket.pyx", line 186, in zmq.backend.cython.socket._recv_copy
  File "zmq/backend/cython/checkrc.pxd", line 20, in zmq.backend.cython.checkrc._check_rc
zmq.error.Again: Resource temporarily unavailable

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/projectPath/main.py", line 33, in <module>
    client.run()
  File "/usr/local/lib/python3.7/site-packages/pyModeS/extra/tcpclient.py", line 287, in run
    exception_queue.put(tb)
AttributeError: 'NoneType' object has no attribute 'put'

Hoping it was a python error I have launched modeslive --source rtlsdr in terminal and I get this output befor exiting

Found Rafael Micro R820T tuner
[R82XX] PLL not locked!
Exact sample rate is: 2000000.052982 Hz

I have used the module pyrtlsdr with no problem and I am able to use the dongle with Gqrx app

Performance improvement and numpy vectorization

When I receive ADS-B message from dump1090 I am converting it to binary form with binascii.unhexlify. This is much more efficient to store than saving string version of messages.

To decode the messages, I am reading them from a database in binary form, convert to string using binascii.hexlify and then use pyModeS. But, internally, pyModeS converts a message to binary form again (this or other way).

It would be great if pyModeS API allowed to pass binary version of a message.

Taking a quick look at the API, it seems that single dispatch with separate type registration for str and bytes could do the trick?

Exception thrown from pyModeS/decoder/common.py", line 8, in hex2bin -- ValueError: invalid literal for int() with base 16: '8DB5AEC399146B0A40080A1A45C2L'

I downloaded pyModes-master on 2019-9-9 and installed it in-place and then encountered an exception.
The same error occurs if I use a traditional "pip install ." command instead of in-place installation.

I'm running off-the-shelf 64-bit ubuntu 19.04 (fully updated) on a Toshiba laptop, although I could reproduce the
the same issue on a similarly configured ubuntu 19.04 skylake desktop system.

I'm using an RTL-SDR v3 dongle, which is known-good and works well with a variety of applications.
After observing the failure, I checked the hardware with gqrx and all is well.

It's very likely I have some local configuration issue or have the dependencies wrong.

Thanks again for providing pyModeS. It looks promising.

Installation

mkdir run; pip install --target run .
Processing /home/dice/Downloads/pyModeS-master
Collecting argparse (from pyModeS==2.2)
Using cached https://files.pythonhosted.org/packages/f2/94/3af39d34be01a24a6e65433d19e107099374224905f1e0cc6bbe1fd22a2f/argparse-1.4.0-py2.py3-none-any.whl
Collecting numpy (from pyModeS==2.2)
Using cached https://files.pythonhosted.org/packages/d7/b1/3367ea1f372957f97a6752ec725b87886e12af1415216feec9067e31df70/numpy-1.16.5-cp27-cp27mu-manylinux1_x86_64.whl
Collecting pyrtlsdr (from pyModeS==2.2)
Using cached https://files.pythonhosted.org/packages/50/21/8c58fbe41f3b08e6a147e892156151430c30eb863f5e9e7ba12acb9b14a3/pyrtlsdr-0.2.91-py2.py3-none-any.whl
Collecting pyzmq (from pyModeS==2.2)
Using cached https://files.pythonhosted.org/packages/27/d7/d8aa6dde15f077f20efdf657367e26cbd2fcb96d182d0e690be9b3f2b76c/pyzmq-18.1.0-cp27-cp27mu-manylinux1_x86_64.whl
Building wheels for collected packages: pyModeS
Running setup.py bdist_wheel for pyModeS ... done
Stored in directory: /home/dice/.cache/pip/wheels/cf/6e/62/d368ad6d2ca558906f55d91c334075b9bf3afa4fd734431052
Successfully built pyModeS
Installing collected packages: argparse, numpy, pyrtlsdr, pyzmq, pyModeS
Successfully installed argparse-1.4.0 numpy-1.16.5 pyModeS-2.2 pyrtlsdr-0.2.91 pyzmq-18.1.0

Execution

append ./run and ./run/bin to PATH and PYTHONPATH
./run/bin/modeslive --source rtlsdr

The following is stderr/stdout :

Found Rafael Micro R820T tuner
[R82XX] PLL not locked!
Exact sample rate is: 2000000.052982 Hz
Allocating 15 zero-copy buffers

File "_ctypes/callbacks.c", line 315, in 'calling callback function'
File "/home/dice/Downloads/pyModeS-master/run/rtlsdr/rtlsdr.py", line 628, in _bytes_converter_callback
self._callback_bytes(values, context)
File "/home/dice/Downloads/pyModeS-master/run/rtlsdr/rtlsdr.py", line 675, in _samples_converter_callback
self._callback_samples(iq, context)
File "/home/dice/Downloads/pyModeS-master/run/pyModeS/extra/rtlreader.py", line 131, in _read_callback
messages = self._process_buffer()
File "/home/dice/Downloads/pyModeS-master/run/pyModeS/extra/rtlreader.py", line 75, in _process_buffer
if self._check_msg(msghex):
File "/home/dice/Downloads/pyModeS-master/run/pyModeS/extra/rtlreader.py", line 101, in _check_msg
df = pms.df(msg)
File "/home/dice/Downloads/pyModeS-master/run/pyModeS/decoder/common.py", line 44, in df
msgbin = hex2bin(msg)
File "/home/dice/Downloads/pyModeS-master/run/pyModeS/decoder/common.py", line 8, in hex2bin
binstr = bin(int(hexstr, 16))[2:].zfill(int(num_of_bits))
ValueError: invalid literal for int() with base 16: '8DB5AEC399146B0A40080A1A45C2L'

On the odd chance that the trailing long "L" was causing the problem, I modified common.py to discard any
trailing non-hex characters. That inhibited the error, but I didn't see any aircraft, although running dump1090
a minute later showed over 60.

Shutdown

I also observed the following warnings after ctrl-c :

Traceback (most recent call last):
File "_ctypes/callbacks.c", line 315, in 'calling callback function'
File "/home/dice/Downloads/pyModeS-master/run/rtlsdr/rtlsdr.py", line 628, in _bytes_converter_callback
Process Process-3:
Exception KeyError: KeyError(140077307160384,) in <module 'threading' from '/usr/lib/python2.7/threading.pyc'> ignored
Segmentation fault (core dumped)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.