[RSP-03] SatNOGS decoder support for GMSK beacon (MR submitted, CI pipeline issue)

Correct me if I’m wrong RSP-03 will be launched with a cargo payload for ISS, usually satellites launched in such missions are deployed later from ISS, is this your case (launch from ISS) or you are going to be deployed from the rocket body?

As soon as you have any TLE or any orbital data that you can share, please let us know in order to update them in SatNOGS DB. If you are not able to share or find TLE, we may be able to produce some sets until space-track publish objects from your launch/deployment (this may take from less than a day to 4 weeks depending on how many other satellites are in the same launch/deployment). After that comes the identification process when we are going to match NORAD ID with the satellite based on the satellite’s transmissions.


In order to be ready even before the first transmissions, I suggest you upload (or we can help you with that) some test data in DB, this way we will test that decoder works and you (with our help) will be able to create a dashboard for the satellite in dashboard.satnogs.org.

Dear @fredy, All

Thank you for your support.

  1. Deployment: RSP-03 will be deployed from the ISS after arrival.
  2. TLE/orbital info: After deployment, we will synchronize with our RymanSat ground station team and share the TLE or any orbital information with you as soon as possible.
  3. Test data: We will prepare a ZIP file containing the following files and post it here in the community, and also attach it to the related Merge Request:
    • rsp03.ksy (latest in MR !472)
    • rsp03.yml (aligned with rsp03.ksy)
    • RSP-03_GMSK_HKBeaconSample.wav (official GMSK beacon sample)
    • README.md

For the decode_rsp03_gmsk.py script referenced in rsp03.yml, we would like to first ask:

  • Is there an existing minimal skeleton/template in the SatNOGS decoders repository that we should follow?
  • Alternatively, would it be possible for you or the SatNOGS team to create an initial version based on our rsp03.ksy, so that it integrates properly with your existing AX.25/GMSK handling utilities?

Once we know your preferred approach, we can prepare and send decode_rsp03_gmsk.py accordingly.

At this stage, could you also please let us know the step-by-step procedure you recommend we follow before launch?
We would like to ensure that we prepare and submit everything in the correct way for decoder validation, DB updates, and dashboard creation.

Thank you again for your guidance.

— czh00361 (RSP-03 / RymanSat)
250809SatNOGS_fredy_send.zip (289.7 KB)

-Algorithm SHA256

\rsp03.ksy DB038080D8A0B80CF849C6BEE99A47D64F182E1560A4693BE764B518FE993F05
\rsp03.yml AD799A421883995E78C895625CF90DF706159E4EC4310210260990AB19DE2622
\README.md 446C6FF1098586CF89CC5CFAF0E71F6271E739B046D11F639303F2C8287A46D0
\RSP-03_GMSK_HKBeaconSample.wav EB3F406D628BC45963DD24C28D3C6B3947F0CCD344B1E42B286A516729FF4B19

Hello @estima5633 ,

Your MR has been reviewed, tested and merged :slight_smile: I also linked it to the satellite entry in SatNOGS DB, so this part is ready :slight_smile:

5 Likes

Dear SatNOGS member. @sa2kng,@deckbsd,@fredy,@dl7ndr

This MR updates the RSP-03 Kaitai Struct decoder with the following improvements:
Adjusted :fields alignment for better readability and SatNOGS compatibility
Added instances for bitfield identification (No011, No081–No085) from DL7NDR advaice.thanks
Introduced enum: definitions for relevant u1 fields (packet2, packet3)
Verified compilation and JSON output for packet1/2/3 without errors
Minor documentation updates for maintainability

Validation steps performed:
Kaitai Struct syntax checked on Kaitai Web IDE
Compiled rsp03.ksy to Python using kaitai-struct-compiler-0.10
Tested decoding from .wav → .bin files
Verified .bin to JSON output for packet1, packet2, and packet3

I would like to express my sincere thanks to the SatNOGS and Libre Space community members for their previous guidance and valuable feedback, which greatly helped in refining this decoder.

I also apologize for the extra work caused by submitting this MR again, and I appreciate your time in reviewing these updates.

Best. Regard,
czh00361 Rymasat RSP03 Project

1 Like

Hello @estima5633 ,

No need to apologize updates on decoder can happen of course :wink:
Reviewed, tested and merged :slight_smile:

1 Like

Regarding your question about the GMSK AX25 demodulation for RSP-03 :

Here is how things works at high level regarding the demodulation/decoding in the SatNOGS network. Each station are running the satNOGS-client application which include a gnu radio flowgraph for demodulation (the parameters for the demodulation are taken from the transmitter entry of the sat on SatNOGS DB), also some stations are running gr_satellites for the same purpose. These demodulated frames are saved on SatNOGS networks. If there is a decoder (aka kaitai file) linked to a satellite, these previous raw frame are decoded/interpreted and saved in SatNOGS DB (influx database).

gr_satnogs and gr_satellites already support AX25 GMSK 9600 demodulation, so there is no need for extra decoder/code.

The only extra file that might be useful i thing if you want gr_satellites being able to handle demodulation of RSP-03 is a yaml file for RSP-03.

And so speaking of that, i already created one (
RSP-03.zip (363 Bytes)
) based on the information you provided :

name: RSP-03
norad: 98654
data:
  &tlm Telemetry:
    telemetry: ax25
transmitters:
  9k6 GMSK downlink:
    frequency: 437.050e+6
    modulation: FSK
    baudrate: 9600
    framing: AX.25 G3RUH
    data:
    - *tlm

One point i want to mention regarding this file is that i had to specify the AX25 G3RUH variant to decode the GMSK beacon sample wav file you provided (using simple AX.25 didn’t get me anything) :

deckbsd@radio1:~/rsp03$ gr_satellites ./RSP-03.yml --wavfile ./RSP-03_GMSK_HKBeaconSample.wav --samp_rate 48e3 --hexdump
***** VERBOSE PDU DEBUG PRINT ******
((transmitter . 9k6 GMSK downlink))
pdu length =        200 bytes
pdu vector contents = 
0000: 94 a6 62 b2 a0 82 60 94 a6 62 b2 9e b2 e1 03 f0 
0010: 00 18 ad 80 01 29 4e 7e 68 78 c0 01 11 00 54 00 
0020: 00 00 ae 67 2f 03 00 00 00 00 ad 51 61 2d 98 01 
0030: 00 00 00 04 0f 08 00 00 00 00 00 00 00 00 00 00 
0040: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
0050: 00 00 00 00 00 fe ff 00 00 00 00 01 00 2f 00 00 
0060: 00 18 00 25 00 24 13 24 0c 64 00 00 00 e1 ff 00 
0070: 00 e1 ff 00 00 1b 00 00 00 e1 ff 00 00 e1 ff 00 
0080: 00 01 00 00 00 00 00 00 00 ca 1d 00 00 f0 ff 1a 
0090: 00 d1 1e 04 00 04 ae 17 00 85 1d 00 00 4a 00 1b 
00a0: 00 5f 03 fb ff 70 ca 28 00 7f 30 8c b0 00 3d 0e 
00b0: 00 7c 08 00 01 01 00 21 0e 00 24 00 00 00 00 00 
00c0: 00 00 00 00 00 00 00 00 
************************************
***** VERBOSE PDU DEBUG PRINT ******
((transmitter . 9k6 GMSK downlink))
pdu length =        101 bytes
pdu vector contents = 
0000: 94 a6 62 b2 a0 82 60 94 a6 62 b2 9e b2 e1 03 f0 
0010: 00 18 4a 80 01 29 4e 7e 68 78 c0 02 11 00 0c 68 
0020: 2f 03 00 00 00 00 0b 52 61 2d 98 01 00 00 00 00 
0030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
0040: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
0050: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
0060: 00 00 00 00 00 
************************************
***** VERBOSE PDU DEBUG PRINT ******
((transmitter . 9k6 GMSK downlink))
pdu length =        250 bytes
pdu vector contents = 
0000: 94 a6 62 b2 a0 82 60 94 a6 62 b2 9e b2 e1 03 f0 
0010: 00 18 df 80 01 29 4e 7e 68 78 c0 03 11 00 0c 68 
0020: 2f 03 00 00 00 00 0b 52 61 2d 98 01 00 00 01 01 
0030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
0040: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
0050: 00 00 00 00 00 00 00 00 d0 ba 00 40 a3 3d 00 68 
0060: 80 3f 90 c1 79 3b 2c 51 3b 3c 2c 51 3b 3c 34 33 
0070: a3 40 67 e6 0d 43 34 33 88 c2 00 00 ee 41 00 00 
0080: 00 04 bc 00 40 aa 3d 00 00 7d 3f fa 18 9c 3c 90 
0090: c1 79 3c 90 c1 79 3b cd cc 85 c2 9a 59 8b 43 9a 
00a0: 99 ae c2 00 00 ee 41 00 00 00 2a 3c 00 00 ab 3d 
00b0: 00 80 7e 3f e1 7c 0c 3d 90 c1 f9 bc 2c 51 bb 3c 
00c0: cd cc 2c 40 9a 19 51 43 34 33 4d c2 00 00 ee 41 
00d0: 00 9a 99 99 3e 9a 99 19 3f 9a 99 99 3e 9a 99 19 
00e0: 3f 9a 99 99 3e 9a 99 19 3f 78 00 00 00 00 00 20 
00f0: 41 00 c4 09 00 00 00 00 a0 41 
************************************

and then a decode sample using the kaitai file :

(.vdecoder) (base) deckbsd@deckbsd:~/repos/satnogs-decoders$ decode_frame rsp03 /home/deckbsd/data/rsp03/gr_sat_dump2.bin
WARNING: Import of decoder class Ssamusatpacket failed.
 Did you compile modified Kaitai structs to Python code yet? 
AttributeError: module 'satnogsdecoders.decoder.ssamusat_packet' has no attribute 'Ssamusatpacket'
{
    "dest_callsign": "JS1YPA",
    "src_callsign": "JS1YOY",
    "src_ssid": 0,
    "dest_ssid": 0,
    "ctl": 3,
    "pid": 240,
    "no001_header": 2158827520,
    "no002_time": 1753108009,
    "no003_time": 49272,
    "packet_type": 1,
    "no005_telemetry_id": 17,
    "no006_cobc_boot_count": 84,
    "no007_cobc_elapsed_time": 53438382,
    "no008_satellite_system_time": 1753108009389,
    "no009_cobc_temperature": 0,
    "no010_satellite_operation_mode": 4,
    "no011_antenna_deployment_status": 15,
    "no011_flag_0": true,
    "no011_flag_1": true,
    "no011_flag_2": true,
    "no011_flag_3": true,
    "no011_flag_4": false,
    "no011_flag_5": false,
    "no011_flag_6": false,
    "no011_flag_7": false,
    "no012_uplink_command_reception_count": 8,
    "no013_cobc_temperature_upper_limit_exceed_count": 0,
    "no014_cobc_temperature_lower_limit_exceed_count": 0,
    "no015_cobc_voltage_upper_limit_exceed_count": 0,
    "no016_cobc_voltage_lower_limit_exceed_count": 0,
    "no017_cobc_current_upper_limit_exceed_count": 0,
    "no018_cobc_current_lower_limit_exceed_count": 0,
    "no019_main_radio_temperature_upper_limit_exceed_count": 0,
    "no020_main_radio_temperature_lower_limit_exceed_count": 0,
    "no021_main_radio_voltage_upper_limit_exceed_count": 0,
    "no022_main_radio_voltage_lower_limit_exceed_count": 0,
    "no023_main_radio_current_upper_limit_exceed_count": 0,
    "no024_main_radio_current_lower_limit_exceed_count": 0,
    "no025_sub_radio_temperature_upper_limit_exceed_count": 0,
    "no026_sub_radio_temperature_lower_limit_exceed_count": 0,
    "no027_sub_radio_voltage_upper_limit_exceed_count": 0,
    "no028_sub_radio_voltage_lower_limit_exceed_count": 0,
    "no029_sub_radio_current_upper_limit_exceed_count": 0,
    "no030_sub_radio_current_lower_limit_exceed_count": 0,
    "no031_aobc_temperature_upper_limit_exceed_count": 0,
    "no032_aobc_temperature_lower_limit_exceed_count": 0,
    "no033_aobc_voltage_upper_limit_exceed_count": 0,
    "no034_aobc_voltage_lower_limit_exceed_count": 0,
    "no035_aobc_current_upper_limit_exceed_count": 0,
    "no036_aobc_current_lower_limit_exceed_count": 0,
    "no037_mobc_temperature_upper_limit_exceed_count": 0,
    "no038_mobc_temperature_lower_limit_exceed_count": 0,
    "no039_mobc_voltage_upper_limit_exceed_count": 0,
    "no040_mobc_voltage_lower_limit_exceed_count": 0,
    "no041_mobc_current_upper_limit_exceed_count": 0,
    "no042_mobc_current_lower_limit_exceed_count": 0,
    "no043_magnetic_torque_consumption_current": 65024,
    "no044_reaction_wheel_consumption_current": 255,
    "no045_antenna_deployment_heater_consumption_current": 0,
    "no046_main_radio_consumption_current": 256,
    "no047_sub_radio_consumption_current": 12032,
    "no048_mobc_consumption_current": 0,
    "no049_cobc_consumption_current": 6144,
    "no050_aobc_consumption_current": 9472,
    "no051_5v_bus_voltage": 9216,
    "no052_33v_line_voltage": 9235,
    "no053_bus_current": 25612,
    "no054_sap_z_face_voltage": 0,
    "no055_sap_z_face_temperature": 57600,
    "no056_sap__z_face_voltage": 255,
    "no057_sap__z_face_temperature": 57600,
    "no058_sap_y_face_voltage": 255,
    "no059_sap_y_face_temperature": 6912,
    "no060_sap__x_face_voltage": 0,
    "no061_sap__x_face_temperature": 57600,
    "no062_sap__y_face_voltage": 255,
    "no063_sap__y_face_temperature": 57600,
    "no064_sap_z_face_current": 255,
    "no065_sap__z_face_current": 256,
    "no066_sap_y_face_current": 0,
    "no067_sap__x_face_current": 0,
    "no068_sap__y_face_current": 0,
    "no069_battery_1_output_voltage": 51712,
    "no070_battery_1_charging_current": 29,
    "no071_battery_1_discharging_current": 61440,
    "no072_battery_1_temperature": 6911,
    "no073_battery_1_cumulative_charge": 69128448,
    "no074_battery_1_cumulative_discharge": 397280256,
    "no075_battery_2_output_voltage": 34048,
    "no076_battery_2_charging_current": 29,
    "no077_battery_2_discharging_current": 18944,
    "no078_battery_2_temperature": 6912,
    "no079_battery_2_cumulative_charge": 4211302144,
    "no080_battery_2_cumulative_discharge": 684355839,
    "no081_equipment_power_anomaly_status": 0,
    "no081_flag_0": false,
    "no081_flag_1": false,
    "no081_flag_2": false,
    "no081_flag_3": false,
    "no081_flag_4": false,
    "no081_flag_5": false,
    "no081_flag_6": false,
    "no081_flag_7": false,
    "no082_equipment_power_status": 127,
    "no082_flag_0": true,
    "no082_flag_1": true,
    "no082_flag_2": true,
    "no082_flag_3": true,
    "no082_flag_4": true,
    "no082_flag_5": true,
    "no082_flag_6": true,
    "no082_flag_7": false,
    "no083_mppt_status": 48,
    "no083_flag_0": false,
    "no083_flag_1": false,
    "no083_flag_2": false,
    "no083_flag_3": false,
    "no083_flag_4": true,
    "no083_flag_5": true,
    "no083_flag_6": false,
    "no083_flag_7": false,
    "no084_battery_chargedischarge_controller_status": 140,
    "no084_flag_0": false,
    "no084_flag_1": false,
    "no084_flag_2": true,
    "no084_flag_3": true,
    "no084_flag_4": false,
    "no084_flag_5": false,
    "no084_flag_6": false,
    "no084_flag_7": true,
    "no085_internal_equipment_communication_error_status": 176,
    "no085_flag_0": false,
    "no085_flag_1": false,
    "no085_flag_2": false,
    "no085_flag_3": false,
    "no085_flag_4": true,
    "no085_flag_5": true,
    "no085_flag_6": false,
    "no085_flag_7": true,
    "no086_main_radio_boot_count": 0,
    "no087_main_radio_elapsed_time": 61,
    "no088_main_radio_no_reception_time": 14,
    "no089_main_radio_rssi": 0,
    "no090_main_radio_uplink_reception_counter": 124,
    "no091_main_radio_uplink_modulation": 8,
    "no092_main_radio_downlink_modulation": 0,
    "no093_main_radio_downlink_protocol": 1,
    "no094_main_radio_frequency_lock": 1,
    "no095_main_radio_pa_temperature": 0,
    "no096_main_radio_pa_current": 3617,
    "no097_main_radio_mcu_temperature_": 0,
    "no098_sub_radio_boot_count": 36,
    "no099_sub_radio_elapsed_time": 0,
    "no100_sub_radio_no_reception_time": 0,
    "no101_sub_radio_rssi": 0,
    "no102_sub_radio_uplink_reception_counter": 0,
    "no103_sub_radio_uplink_modulation": 0,
    "no104_sub_radio_downlink_modulation": 0,
    "no105_sub_radio_downlink_protocol": 0,
    "no106_sub_radio_frequency_lock": 0,
    "no107_sub_radio_pa_temperature": 0,
    "no108_sub_radio_pa_current": 0,
    "no109_sub_radio_mcu_temperature": 0
}

So do you confirm it is AX25 G3RUH ? if so we might need to change the information of this tx in DB.

I also ping @fredy @PE0SAT @pe2bz @SA2KNG in case i forgot something :slight_smile:

4 Likes

It’s a regular/common 9k6 transmission, so it’s (like almost every 9k6) G3RUH scrambled.

Do you mean changing it on transmitter page of the satellite? If so, where exactly?

2 Likes

Hello @deckbsd, and @dl7ndr,

Our RymanSat ground station team has confirmed through ground testing that the RSP-03 GMSK beacon is indeed AX.25 with G3RUH scrambling (baudrate 9600).
We used GNU Radio (AX.25 Deframer block with G3RUH scrambling enabled) to successfully decode the beacon.

Therefore, the SatNOGS DB transmitter entry should be updated from “AX.25” to “AX.25 G3RUH”.

I have attached the updated RSP-03.yml (zipped) reflecting this framing change for your review. rsp03.zip (2.9 KB)
Could you please confirm the correct merge request workflow for this file?
Should I fork and submit an MR to satnogs-db directly, and request your review?

Could you please clarify exactly which field on the transmitter page needs to be updated to reflect that it’s AX.25 G3RUH instead of plain GMSK?

Thank you for your support and guidance as we proceed.

Best regards,
Isamu Furukawa (czh00361)
RymanSat Project - Ground Station Team
P.S.
The launch date has been postponed by one day to August 22.
We are excited to see if we can receive the first pass and whether the .ksy and .yml files will work correctly.
We have added fields: entries to the YAML file so that the data can be passed to JSON and Grafana.
Is this the appropriate place to include them?

Regarding the DB transmitter update, the downlink mode should read: FSK AX.25 G3RUH

2 Likes

@estima5633 @SA2KNG @dl7ndr ,

Perfect, thanks for confirming my thoughts, i introduced a suggestion for the transmitter : SatNOGS DB - Transmitter Suggestion ( @fredy )

@estima5633 Once the suggestion accepted, you will be good to go for RX on SatNOGS side of things for the GMSK 9k6 Telemetry beacon, no need for further changes :slight_smile:

Now, if you want like @fredy suggested in a previous message, you can try upload some testing frames :

In order to be ready even before the first transmissions, I suggest you upload (or we can help you with that) some test data in DB, this way we will test that decoder works and you (with our help) will be able to create a dashboard for the satellite in dashboard.satnogs.org.

Hello @deckbsd,@SA2KNG, @dl7ndr, @fredy san

Thank you very much for taking care of the transmitter suggestion for RSP-03.
I really appreciate your quick action and guidance.

Now I will just wait for the acceptance, and I’m looking forward to testing reception after launch.

Best regards,
czh00361(estima5633
RymanSat Project – Ground Station Team

This value for mode is deprecated and is kept for compatibility reasons.

I’ve changed the mode to FSK and add in description the rest (AX.25 and G3RUH). By default satnogs-client uses AX.25 G3RUH for FSK, so it should be fine.

By the way we are looking on improve this situation with adding all the necessary details in DB and use them in stations in this milestone.

1 Like

Oops I missed that, so I’m going to change the transmitter back to GMSK from FSK, again the default for GMSK is AX.25 G3RUH, so it will be ok.

2 Likes

Thank you, I have confirmed that it will be finally registered as GMSK.

Best Regaed,
czh00361 (estima5633)
Rymansat Project

Any possible date? Keep us updated on this :wink:

For deployments from ISS, if we don’t have any TLE, we start with the ISS TLE at the time of deployment, which is pretty accurate for a day or two. After that based on our observations, if the satellite transmits we generate our own TLEs until space-track.org publishes ones.

Here are the main steps, some of them are already covered:

  1. Add satellite in DB and get temporary NORAD ID [done]
  2. Add transmitters in DB [done]
  3. Add .ksy in satnogs-decoders [done]
  4. New release of satnogs-decoders that includes the new decoder [done]
  5. Use of the new decoder in DB [done]
  6. Send through SiDS some sample frames to verify that decoding works [to do]*
  7. Login and request access for building dashboard in Scratchpad folder in dashboard.satnogs.org by using the test data [to do]*
  8. Publish the official dashboard to Telemetry folder [to do]
  9. Share pre-launch/pre-deployment TLE (in your case we can use the ISS one) [to do]*
  10. Schedule observations of the satellite close to deployment [to do]

More or less these are the steps for preparing before launch. Some of them need your actions (noted above with *) some other are done by the SatNOGS community people.

The main thing is to keep us as updated as possible in order to be able to support you. :wink:

Sorry for the unnecessary change, i didn’t know that :slight_smile:

1 Like

No problem, it’s hidden so it can be confusing.

This is why we need and we are going to improve that, step by step by defining the modes and their parameters and step by step by changing the current transmitter entries. This may take months but it will help us to go to the next level! :slight_smile:

1 Like

Dear @fredy

Any possible date? Keep us updated on this
The launch is scheduled here: Falcon 9 Block 5 | CRS SpX-33

According to the official Japanese announcement: リーマンサット・プロジェクト、超小型人工衛星「RSP-03」が8月21日に宇宙へ | 一般社団法人リーマンサットスペーシズのプレスリリース @Japanese only.sorry.

I heard that It is planned to be deployed RSP-03 from the “Kibo” Japanese Experiment Module about one month after launch, which is a normal timeframe for ISS deployments.

Regarding step 6, “Send through SiDS some sample frames to verify that decoding works”,
could you please clarify the procedure?

  • How can I submit the sample frames through SiDS?
  • Is there a specific web form or email address for submitting them?
  • What format and size should the sample frames be in (e.g., .wav, .bin, KISS)?
  • I would especially like to try testing with a .wav file in advance.

I would like to prepare the files so that we can confirm the decoding of RSP-03 works correctly.

Thank you for your guidance.

Best regards,
czh00361
RymanSat Project – Ground Station Team

1 Like

Insert the following into a command line.

curl --data "noradID=98654&source=[contributor's callsign or station name]&timestamp=2020-01-01T00:00:00Z&frame=94A662B2A0826094A662B29EB2E103F00018AD8001294E7E6878C001110054000000AE672F0300000000AD51612D0001000000040F0800000000000000000000000000000000000000000000000000000000000000FEFF0000000001002F000000180025002413240C6400000000FF000000FF00001B00000000FF000000FF00000100000000000000CA1D000000FF1A00D11E040004AE1700001D00004A001B005F0300FF70CA28007F3000B0003D0E007C0800010100210E002400000000000000000000000000&locator=longLat&longitude=[ab.cd]E&latitude=[ef.gh]N" https://db.satnogs.org/api/telemetry/

Please adjust [contributor's callsign or station name] as well as [ab.cd] and [ef.gh].

I’ve selected a timestamp outside (way before) the launch so it cannot interfere with later values.

I would just add, @estima5633 feel free also to upload different frames, at least the 3 types contained in your GMSK beacon sample (to do that just replace the hex value of the frame parameter of the command by the one you want to upload and the timestamp).

Thanks you @dl7ndr i will set a reminder to ask @fredy to delete these test frames before the launch :slight_smile:

1 Like