Receiving Images from Geostationary Weather Satellite GK-2A
GEO-KOMPSAT-2A (GK-2A) is a geostationary weather satellite operated by the National Meteorological Satellite Center of the Korea Meteorological Administration. It is positioned over the equator at 128.2°E longitude which is visible from Australia, New Zealand, Southeast Asia, Japan, Korea, China, India and Eastern Russia.
Near real-time meteorological data from GK-2A is broadcast to users via two L-band downlinks and one X-band downlink.
|LRIT||1692.14 MHz||64 kbps|
|HRIT||1695.4 MHz||3 Mbps|
|UHRIT||8070 MHz||31 Mbps|
This guide walks through setting up the hardware and software required to receive images using the Low Rate Information Transmission (LRIT) downlink. It also covers the types of images that can be received, image post-processing and data decryption.
Every 10 minutes the Advanced Meteorological Imager (AMI) instrument on-board GK-2A carries out a full disk observation. This process captures Earth in 16 different wavelengths of light, four of which are visible light. The remaining 12 wavelengths are various combinations of near-infrared and medium/long wave infrared.
Shortly after the observation completes, the resulting thermal infrared full disk image is transmitted via the LRIT downlink. A total of 144 full disk images are transmitted each day which is more than enough to create smooth animations such as the ones below.
Images not directly derived from GK-2A sensor data are also transmitted between full disk images. These include synoptic charts (surface pressure), sea temperature charts, swell forecasts and sea ice maps.
Colour weather satellite imagery requires multiple channels (wavelengths) of data to be combined into one image which is called a false-colour image. Since only one infrared channel is transmitted via GK-2A LRIT we have to compromise by using artificial images in place of the missing wavelengths.
Matt Painter (@nullpainter) has created Sanchez, a cross-platform tool for applying colour underlays and colour lookup tables to imagery from geostationary weather satellites. Sanchez also creates reprojected maps and can blend images from multiple satellites such as GK-2A, Himawari-8 and GOES-16/17.
John Bell (@eswnl) has written some plugins for the GNU Image Manipulation Program (GIMP) to apply colour underlays to thermal infrared images. Options for image timestamps, coastline border overlays and latitude/longitude grid overlays are also available.
Another post-processing technique called Infrared Colour Enhancement replaces a portion of the grayscale image with a colour gradient. This reveals hidden details in the brighter and washed-out areas of an image, such as swirling cloud around the eye of a typhoon. I have written another blog post covering this topic:
A basic GK-2A LRIT receiver is made up of some cheap hardware components and free open-source software. Some familiarity with Linux and RTL-SDRs is required.
The RTL-SDR Blog has written a thorough guide for setting up the hardware required for receiving images from GOES-16/17 and GK-2A. An outline of the hardware setup is included in this guide but for full details I recommend following the RTL-SDR Blog guide linked above.
The main hardware components which make up a GK-2A receiver are a parabolic dish antenna with reasonable gain at 1.7 GHz, a low-noise amplifier and a software defined radio (SDR). The Airspy Mini, Airspy R2 and RTL-SDR (also available at NooElec) are all compatible with GK-2A receiver software. NooElec offers an excellent low-noise amplifier solution which also includes a SAW filter centered on 1688 MHz.
Some 2.4 GHz Wi-Fi grid dishes have sufficient gain at 1.7 GHz to be used for a GK-2A receiver. These dishes are available online for around $100 AUD from Access Antennas (AU), Wireless Professional Solutions (AU), Go Wireless (NZ) and Excel Wireless (US).
Another option is to purchase a small Ku-Band satellite TV dish and attach a DIY feedhorn such as a cantenna. This was the type of antenna used during the development and testing of xrit-rx.
Further tips on setting up hardware can be found in the RTL-SDR blog guide.
A GK-2A LRIT receiver is made up of two open-source applications: goesrecv and xrit-rx. Demodulation and decoding of the LRIT downlink is handled by goesrecv, while xrit-rx takes care of demultiplexing and decrypting the packets from goesrecv into image files.
The first software component is goesrecv which was originally written by Pieter Noordhuis as part of the goestools software suite. This software was designed for receiving images from the American GOES weather satellites and has since been modified to support GK-2A LRIT.
Some packages are required to install goesrecv from source on Debian systems. To install these dependencies, run the following
# Update package index and install dependencies sudo apt-get update sudo apt-get install -y build-essential pkg-config cmake git zlib1g-dev libairspy-dev libusb-1.0-0-dev
librtlsdr is built from source
# Download, compile, and install librtlsdr git clone https://github.com/steve-m/librtlsdr.git cd librtlsdr mkdir build cd build cmake -DCMAKE_INSTALL_PREFIX:PATH=/usr -DINSTALL_UDEV_RULES=ON .. sudo make -j2 install # Load udev rules and blacklist the DVB driver shipped with the OS sudo cp ../rtl-sdr.rules /etc/udev/rules.d/ sudo ldconfig echo 'blacklist dvb_usb_rtl28xxu' | sudo tee --append /etc/modprobe.d/blacklist-dvb_usb_rtl28xxu.conf sudo reboot
goesrecv can be built from source
# Download, compile, and install goesrecv git clone --recursive https://github.com/sam210723/goestools cd goestools mkdir build cd build cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local make sudo make install cd ../.. # Copy configuration file and test run goesrecv cp goestools/etc/goesrecv.conf goesrecv.conf goesrecv --version
After this process, the terminal should show something similar to the following:
goesrecv for GK-2A Originally part of goestools written by Pieter Noordhuis and contributors (https://github.com/pietern/goestools) Modified by sam210723 for compatibility with GEO-KOMPSAT-2A (https://github.com/sam210723/goestools)
Finally, the configuration file for goesrecv is edited based on the SDR being used. By default, goesrecv is configured for use with an Airspy Mini or R2.
If an RTL-SDR is being used, the source setting must be changed to
rtlsdr and the corresponding source settings (
frequency) must be un-commented (remove
If a bias-tee powered low-noise amplifier is being used in this system (such as the NooElec SAWbird), the
bias_tee setting should be changed to
true, otherwise this should be left as
false to not damage the SDR or other RF devices.
Configuration for Airspy SDRs:
[demodulator] satellite = "GK-2A" downlink = "lrit" source = "airspy" [airspy] frequency = 1692140000 ## 2500000 for the R2, 3000000 for the Mini # sample_rate = 3000000 # gain = 18 # bias_tee = false # [rtlsdr] # frequency = 1692140000 # sample_rate = 1024000 # gain = 30 # bias_tee = false # device_index = 0
Configuration for RTL-SDRs:
[demodulator] satellite = "GK-2A" downlink = "lrit" source = "rtlsdr" # [airspy] # frequency = 1692140000 ## 2500000 for the R2, 3000000 for the Mini # sample_rate = 3000000 # gain = 18 # bias_tee = false [rtlsdr] frequency = 1692140000 # sample_rate = 1024000 # gain = 30 # bias_tee = false # device_index = 0
The second software component, xrit-rx, was written specifically to support imagery from GK-2A and COMS-1 (predecessor to GK-2A). It is written in Python 3 so does not need to be compiled, however some packages need to be installed before use.
xrit-rx requires Python 3.6 or newer to run correctly. To check which version of Python 3 is installed on your system run
python3 --version. Instructions for installing or upgrading Python 3 on Windows or Linux can be found in this tutorial.
The Python package manager
pip also needs to be installed. On Windows, the Python installer will include
pip by default. For Ubuntu or Raspbian,
pip can be installed by running the following commands:
sudo apt-get update sudo apt-get install python3-pip
xrit-rx.zip is downloaded from the Releases page of the GitHub repo then unzipped into a new folder.
# Download and unzip latest xrit-rx release from GitHub wget https://github.com/sam210723/xrit-rx/releases/latest/download/xrit-rx.zip mkdir xrit-rx unzip xrit-rx.zip -d xrit-rx cd xrit-rx
colorama are now installed using
# Install dependencies using pip pip3 install -r requirements.txt
Some extra packages are required by
pillow on Ubuntu or Raspbian systems. Install these packages by running:
sudo apt-get install libatlas-base-dev libopenjp2-7-dev libtiff-dev
Next, the GK-2A decryption key list needs to be downloaded so xrit-rx can decrypt received data into normal image files. Users normally have to apply for decryption keys through the Korea Meteorological Administration website. Applications from government departments, research institutes, and large organisations seem to be prefered rather than from individual users.
During the development of software for COMS-1 (predecessor to GK-2A), valid decryption keys were found in code samples provided publicly on the Korea Meteorological Administration website. These keys have continued to work with all GK-2A data to date and are still publicly available on the KMA NMSC website.
To obtain these keys:
- Open the COMS Operation page
- Click the "HRIT/LRIT Data Decryption samples C code" link to download
- Extract the key file called
- ZIP file can now be deleted
- Copy the key file to your xrit-rx folder
This Encryption Key Message file itself is encrypted and needs to be decrypted before use. The second part of the file name is the decryption key for this file:
keymsg-decrypt.py script in the xrit-rx "tools" folder can decrypt this file and will output the plain-text keys to a new file called
python3 tools/keymsg-decrypt.py EncryptionKeyMessage_001F2904C905.bin 001F2904C905
Once the script has output the decrypted keys to
EncryptionKeyMessage.bin, the original encrypted key file can be deleted. For those interested, I have covered the key decryption process in-depth in a previous post:
Finally, xrit-rx can be configured using the options in the
xrit-rx.ini file. A full list of options can be found in the readme on GitHub.
Typically, goesrecv and xrit-rx will be running on the same device but this is not required. The packets output by goesrecv can be received by xrit-rx over a local network connection. If this is the case, the
ip option in
xrit-rx.ini will need to be updated with the IP address of the device running goesrecv. If goesrecv and xrit-rx are running on the same device, this option should be left as the default value of
By default, a folder called
received will be created inside the xrit-rx folder to store images received from GK-2A. This folder location can be changed using the
path option in
xrit-rx.ini, however this is typically not necessary.
[output] path = received images = true xrit = false # List of VCIDs to ignore (e.g. '4,5') # - VCID 0: Full Disk # - VCID 4: Alpha-numeric Text # - VCID 5: Additional (non-sensor) data channel_blacklist = [goesrecv] ip = 127.0.0.1 vchan = 5004
With all the hardware and software components ready we can finally begin receiving images from GK-2A.
Run goesrecv by opening a new terminal window in a folder which contains the
goesrecv.conf configuration file and run the following command:
goesrecv -v -i 1 -c goesrecv.conf
Once running, goesrecv will print information to the console similar to the following:
2020-02-10T10:12:57Z [monitor] gain: 61.04, freq: 1200.1, omega: 8.000, vit(avg): 98, rs(sum): 0, packets: 8, drops: 0 2020-02-10T10:12:58Z [monitor] gain: 61.04, freq: 1187.5, omega: 8.000, vit(avg): 104, rs(sum): 0, packets: 8, drops: 0 2020-02-10T10:12:59Z [monitor] gain: 61.04, freq: 1195.7, omega: 8.000, vit(avg): 108, rs(sum): 0, packets: 7, drops: 0 2020-02-10T10:13:00Z [monitor] gain: 61.04, freq: 1180.5, omega: 8.000, vit(avg): 99, rs(sum): 0, packets: 8, drops: 0
packets counter shows 7 or 8 and and
drops shows zero, goesrecv has locked on to the LRIT downlink from GK-2A. If not, the LRIT signal may be too weak and adjustment of the antenna using goesrecv monitor is required.
An optional but recommended step is to use goesrecv monitor to fine tune the azimuth and elevation of the receiving antenna to get the best signal possible from GK-2A. The signal quality meter and constellation plot give a real-time indication of the signal strength, making it quick and easy to fine tune antenna alignment.
Microsoft .NET Framework Runtime v4.8 (direct download) is required to run goesrecv monitor. Once .NET is installed, download the latest release of goesrecv monitor and extract all files inside the ZIP to a new folder.
goesrecv-monitor.exe and enter the IP address of a device running goesrecv, then click Connect (or hit enter). The constellation plot and statistics list will start showing data.
The large statistics window is intended to improve visibility of the Viterbi error count and Signal Quality percentage from a distance. This is useful while while fine tuning the alignment of an antenna. The window background colour changes between red and green to indicate the Signal Lock state.
goesrecv monitor can plot the Viterbi and Reed-Solomon error counts in real-time using the Statistics Plot window. The plot has selectable time ranges from 1 minute up to 24 hours. Plot data can be exported to a CSV file using the "Export CSV" button on the lower right of the window.
Run xrit-rx by opening a new terminal window in the xrit-rx folder which was created earlier and run the following command:
Ensure a message saying
DECRYPTION KEYS LOADED appears in the startup information printed by xrit-rx. If not, return to the decryption key configuration steps above and confirm the processed key file is present in the xrit-rx folder.
xrit-rx will connect to goesrecv at the IP address specified in the configuration file and begin receiving packets. Within a few minutes an image will be received from GK-2A and saved to the
received folder inside the
Initially xrit-rx may appear to be doing nothing, but if the console output includes "
[VCID 63] GK-2A: IDLE" then the LRIT downlink is successfully being received and xrit-rx is waiting for an image transmission to start. For precise image transmission times see the LRIT Schedule on the xrit-rx dashboard (see below).
Dashboard for xrit-rx
Included in xrit-rx is a web-based monitoring dashboard for convenient monitoring of the decoder and viewing of received data. It also displays the LRIT transmission schedule which is downloaded from the KMA website when the dashboard is loaded.
By default the dashboard is accessible via HTTP on port 1692 and will update with new data every second. These settings can be changed in the
xrit-rx.ini configuration file (list of options).
Setting up Linux services
Optionally, goesrecv and xrit-rx can be configured as Linux
systemd services which start automatically when the system boots up.
For goesrecv, download
goesrecv.service and edit the
-c option to match the location of
goesrecv.conf on your system.
[Unit] Description=goesrecv reception chain for GEO-KOMPSAT-2A Documentation=https://github.com/sam210723/goestools Wants=network.target After=network.target [Service] ExecStart=/usr/local/bin/goesrecv -i 10 -c /home/pi/goesrecv.conf StandardOutput=null Type=simple Restart=on-failure RestartSec=30 Nice=-5 [Install] WantedBy=default.target
For xrit-rx, download
xrit-rx.service and edit the
WorkingDirectory option to match the location of the
xrit-rx folder on your system.
[Unit] Description=xrit-rx - LRIT/HRIT Downlink Processor Documentation=https://github.com/sam210723/xrit-rx Wants=network.target After=network.target [Service] WorkingDirectory=/home/pi/xrit-rx ExecStart=/usr/bin/python3 xrit-rx.py StandardOutput=journal Type=simple Restart=on-failure RestartSec=30 Nice=-5 [Install] WantedBy=default.target
/etc/systemd/system by running the following command:
sudo cp *.service /etc/systemd/system && sudo systemctl daemon-reload
With the services now installed, run the following commands to start goesrecv and xrit-rx as services:
sudo systemctl start goesrecv.service sudo systemctl start xrit-rx.service
The status of these services can be checked with the following commands:
systemctl status goesrecv.service systemctl status xrit-rx.service
To check the xrit-rx has started properly, run the following command to view the console output of xrit-rx and look for any error messages:
sudo journalctl -u xrit-rx.service
Finally, run the following commands to have goesrecv and xrit-rx start automatically when the system boots.
sudo systemctl enable goesrecv.service sudo systemctl enable xrit-rx.service
To stay updated on future developments of xrit-rx follow me on Twitter. Feel free to open a new issue in the xrit-rx, goesrecv, or goesrecv monitor repos on GitHub if you come across bugs or have a feature request!