Table of Contents
|
Introduction
The description of the Open Tracking Protocol follows.
Please note it is by no mean a complete specification (in its current state).
If you have particular doubt, questions or comments feel free to send us a message and we add the appropriate description here.
Same if you spot a mistake.
Modulation
Data is sent on a GFSK (BT=0.5) modulated carrier. Bitrate is 100kbps and Manchester encoding is used thus effective bit rate is 50 kbps.
The modulation is as used by the nRF905 chip, so that the already existing demodulator can be used. However, the existing Open Tracker hardware does not use nRF905 but other RF chips and modules: SPIRIT1, CC1101 and RFM69(H)W
Preamble and SYNC pattern
SYNC pattern is used to mark the start of a packet. It should be a sequence of bits with good autocorrelation properties. It should as well be sufficiently different from other protocols to avoid misreception and/or misinterpretations of other systems.
Preamble is the bit sequence sent by the RF chip before the SYNC pattern to allow for bit-level synchronization. Different chips send possibly different preambles, thus some care needs to be taken for the reception between different RF chips to work correctly.
Radio frame
The list of fields in the typical position frame. The actual layout of the elements is defined in the packet format.
|
The header is 4 bytes and the data portion of the radio frame takes 16 bytes.
Note: several fields have variable resolution coding, so that a greater range can be accommodated within a limited bit width while keeping relative resolution relatively constant.
Forward Error Correcting (FEC) code
For best reception range, with limited power, technique known as Forward Error Correction (FEC) can help.
By introducing additional, redundant information, transmission errors can be recovered by the receiver and the reception S/N threshold is effectively lower thus increasing the range.
Code chosen for the Open Tracker is Gallager code or Low Density Parity Check (LDPC) code. It is simple and decoding can be done by successive iterations and it accepts soft bit information from the demodulator.
The redundant information in this case is 48 bits = 6 bytes.
Packet relay
One particular feature of the Open Tracker is the capability to relay packets of other trackers.
The main goal is to relay packets of lower flying aircraft (or those on the ground) by the high flying aircraft, so the positions of those below have a chance to be caught by the ground receivers as the radio range heavily depends on the altitude.
Implementations
The protocol described here was implemented on SPIRIT1 RF chip (see the main OGN Tracker page). Then It was done as well on the CC1101 and RFM69(H)W RF chips/modules. In all cases the signals could be properly received on the DVB-T receiver, reception on SPIRIT1 and RFM69(H)W was tested as well. Some but not all combinations or reception between different RF chips have been positively tested, others are awaiting tests.
For all those implementations the Manchester encoding was done in software, not by the RF chip hardware. This gave more flexibility in programming the chip and on reception allowed for detections of transmission errors which made the error correction logic more efficient.
More complete list of implementations of the OGN-Tracker on various platformsPlatform | CPU | RF chip | OS/dev-env | Available industrial modules | Software |
---|---|---|---|---|---|
1st Prototype | STM32F4 | SPIRIT1 | g++ | ||
DIY-Tracker | STM32F1 | RFM69 | FreeRTOS/g++ | separate CPU,RF and GPS modules | |
ATmega32 | CC1101 | ||||
Adafruit Feather M0 | SAMD21 | RFM69 | FreeRTOS/Arduino | Adafruit Feather with RFM69 or RFM95 but needs a GPS | |
ESP32-OGN | ESP32 | SX1276/SX1262 | FreeRTOS/ESP-IDF | TTGO T-Beam (complete) and many other ESP32 modules but without GPS | |
HELTEC CubeCell | STM32 | SX1262 | PlatformIO/Arduino | HELTEC CubeCell ASR6502 with GPS (complete) |
Probably the TTG T-Beam is the module to use if you want to construct an OGN-Tracker: it is well available, it has good GPS and ISM antenna, options like Bluetooth and WiFi.
Just insert the 18650 battery and there you go.
If 18650 is too heavy for your application, you can easily cut off the battery basket and solder a flar Li-Ion battery or not use the battery at all and run on external 5V supply.
Be very carefull with the battery polarity - do not connect it in reverse !
Encoding the packets
For exact packet format and encoding please refer to the source - see the [https://github.com/pjalocha/esp32-ogn-tracker/tree/master/main] in our GIT repository.
See here a demo code how to use the code to produce proper OGN packets which can then be transmitted through the radio chip.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
#include <sys/time.h>
#include "ogn.h" // OGN packet format
#include "ldpc.h" // Low Density Parity Code encoder and decoder
int main(int argc, char *argv[])
{
OGN_TxPacket<OGN1_Packet> TxPacket; // OGN packet to be transmitted
TxPacket.Packet.HeaderWord = 0; // start with clean header
TxPacket.Packet.Header.Address = 0x123456; // set address: 24-bit number
TxPacket.Packet.Header.AddrType = 3; // set address-type: 3 is OGN-type
TxPacket.Packet.calcAddrParity(); // set the address-parity bit
TxPacket.Packet.Position.AcftType = 0xD; // set the aircraft-type: drone
TxPacket.Packet.Position.Time = 15; // [sec] time corresponding to the position
TxPacket.Packet.Position.FixQuality = 1; // 0 = none, 1 = GPS, 2 = Differential GPS (can be WAAS)
TxPacket.Packet.Position.FixMode = 1; // 0 = 2-D, 1 = 3-D
TxPacket.Packet.EncodeDOP(15-10); // [0.1] setDilution-Of-Precision to 1.5
TxPacket.Packet.EncodeLatitude(5012345*6); // set Latitude to 50.12345 deg north
TxPacket.Packet.EncodeLongitude(2012345*6); // set Longitude to 20.12345 deg east
TxPacket.Packet.EncodeAltitude(1200); // [m] set GPS altitude to 1200 m AMSL
TxPacket.Packet.EncodeStdAltitude(1250); // [m] set standard pressure altitude to 1250m
// TxPacket.Packet.clrBaro(); // or signal the pressure altitude is not available
TxPacket.Packet.EncodeSpeed(355); // [0.1m/s] set the ground speed 35.5 m/s
TxPacket.Packet.EncodeHeading(1305); // [0.1deg] set track-over-ground to 130.5 deg
TxPacket.Packet.EncodeClimbRate(+45); // [0.1m/s] set climb rate to +4.5 m/s
// TxPacket.Packet.clrClimbRate(); // or signal climb rate is not available
TxPacket.Packet.EncodeTurnRate(+15); // [0.1deg/s] set the ground turn rate to 1.5deg/sec
// TxPacket.Packet.clrTurnRate(); // or signal the turn rate is not available
TxPacket.Packet.Print(); // print the encoded information
// Note: we decode before whitenning the data part
TxPacket.Packet.Whiten(); // whiten the data portion of the packet
TxPacket.calcFEC(); // calculate the redundancy part of the packet
printf("Header: Data [FEC] => ");
TxPacket.Dump(); // dump as 32-bit words
printf("Bytes:");
TxPacket.DumpBytes(); // dump as bytes, to be transmitted on the air after the SYNC
return 0; }
When you run the code you get the printout of the 26 bytes you need to transmit in the OGN packet
D:3:123456 R0 1/3D/ 1.5 15s: [+50.123447,+020.123453]deg 1200m[+50m] 35.5m/s 130.4deg +4.5m/s +1.5deg/s
Header: Data [FEC] => 0B123456: E9B75B48 4D917BCF D63A3178 0700C5B9 [2F0E3A3B 39A1] (0)
Bytes: 56 34 12 0B 48 5B B7 E9 CF 7B 91 4D 78 31 3A D6 B9 C5 00 07 3B 3A 0E 2F A1 39
Transmitting the packets on the air
Radio/modem parametersParameter | Value | Unit | Comments |
---|---|---|---|
Frequency | 868.2/868.4 | MHz | the two given frequencies are for Europe and Africa |
Modulation | GFSK | BT=0.5 | |
Freq. deviation | +/-50 | kHz | |
Chip rate | 100 | kbps | |
Bit rate | 50 | kbps | Manchester encoded thus the chip rate twice as high |
Packet size | 26 | bytes | |
SYNC size | 4 | bytes | |
SYNC pattern | |||
Output power | 14 | dBm | |
Antenna | dipol | ||
Polarization | vertical |
Various aspects of the radio protocol for position reporting of drones and possibly other aircraft
Refer to the document