Sylphase SDGPS
The software-defined GPS(/GNSS) toolkit
Getting started with the Infix-1

NOTE: This page is out-of-date. Please refer to Getting started with the Infix-2

Congratulations on your purchase of an Infix-1!

Infix-1 PCB

Included in the kit are the following:

  • Sylphase Infix-1 PCB
  • Low-PCV GPS Antenna - datasheet
  • 6 ft micro USB cable
  • 3D printed mounting bracket that also acts as a strain relief
  • Zip ties for strain relief

Mechanical considerations


Mechanical drawing of the 3D-printed mounting bracket supplied with the Infix-1 (units: mm)

The Infix-1 is mounted on a provided carrier bracket that adapts its M2.5 hole pattern to a larger M5 hole pattern. The bracket also provides strain relief for the USB and antenna cables.

When you first receive your Infix-1, connect a micro-USB cable and the antenna to the Infix-1 PCB, then use the provided zip ties to fasten them to the strain relief standoffs.

The Infix-1 and antenna need to both be mounted rigidly to the vehicle whose position is to be measured. The antenna needs an open view of the sky, and so should be mounted on the highest point on the vehicle. The Infix-1 is sensitive to changing magnetic fields, and so should be mounted at least 1 meter from any metal that can move (e.g. a car door) or anything that generates a changing magnetic field (e.g. an electric motor). The antenna comes with an embedded magnet for mounting, so the antenna should not be located close to the Infix-1.

The Infix-1 has an axes reference on the top, which defines its local coordinate system. We recommend mounting the Infix-1 so that the X axis points in the "forward" direction of the vehicle, the Y axis points in the "left" direction of the vehicle, and the Z axis points in the "up" direction of the vehicle.

The position of the center of the antenna in the local coordinate system of the Infix-1 must be known and supplied to the SDGPS software. Measure it with error not exceeding 5 centimeters.

Install SDGPS


Install SDGPS

Setup complete


At this point, you should have the Infix-1 hardware connected and fastened and the SDGPS software installed.

A simple test


Try running the following command to make sure that everything is working:

sdgps sylphase-usbgpsimu2 ! tracker ! decoder

You should get output similar to the following:

sylphase-usbgpsimu2: Programming...
sylphase-usbgpsimu2: ...done. Waiting for device to reconnect...
sylphase-usbgpsimu2: ...done!
sylphase-usbgpsimu2: Opened device with ID 76e6
sylphase-usbgpsimu2: DONE=0, INIT_B=1
sylphase-usbgpsimu2: Resetting...
sylphase-usbgpsimu2: DONE=0, INIT_B=0
sylphase-usbgpsimu2: DONE=0, INIT_B=0
sylphase-usbgpsimu2: DONE=0, INIT_B=0
sylphase-usbgpsimu2: DONE=0, INIT_B=0
sylphase-usbgpsimu2: DONE=0, INIT_B=0
sylphase-usbgpsimu2: DONE=0, INIT_B=0
sylphase-usbgpsimu2: DONE=0, INIT_B=0
sylphase-usbgpsimu2: DONE=0, INIT_B=0
sylphase-usbgpsimu2: DONE=0, INIT_B=1
sylphase-usbgpsimu2: Starting load...
sylphase-usbgpsimu2: ...load finished.
sylphase-usbgpsimu2: DONE=1, INIT_B=1
sylphase-usbgpsimu2: Success!
sylphase-usbgpsimu2: ACQUIRED GPS_L1 Signal# 20 [Doppler: 3439.83] [C/N_0: 36.565]
sylphase-usbgpsimu2: ACQUIRED GPS_L1 Signal# 24 [Doppler: 4539.83] [C/N_0: 32.8479]
sylphase-usbgpsimu2: ACQUIRED GPS_L1 Signal# 13 [Doppler: -355.172] [C/N_0: 33.8424]
sylphase-usbgpsimu2: ACQUIRED GPS_L1 Signal# 21 [Doppler: 3724.83] [C/N_0: 34.9116]
sylphase-usbgpsimu2: ACQUIRED GPS_L1 Signal# 29 [Doppler: -210.172] [C/N_0: 36.029]
sylphase-usbgpsimu2: ACQUIRED GPS_L1 Signal# 10 [Doppler: 4049.83] [C/N_0: 31.9935]
sylphase-usbgpsimu2: ACQUIRED GPS_L1 Signal# 5 [Doppler: -875.172] [C/N_0: 34.2943]
sylphase-usbgpsimu2: ACQUIRED GPS_L1 Signal# 15 [Doppler: 1194.83] [C/N_0: 33.2932]
tracker: GPS_L1 Signal#: 29 alignment check failed (reason: z test failed)
decoder: SV#: 20 PREAMBLED!
decoder: SV#: 13 PREAMBLED!
decoder: SV#: 24 PREAMBLED!
decoder: SV#: 21 PREAMBLED!
decoder: SV#: 10 PREAMBLED!
decoder: SV#: 15 PREAMBLED!
decoder: SV#: 5 PREAMBLED!
decoder: SV#: 29 PREAMBLED!
decoder: 70 seconds elapsed, only confirmed ephemerides will be used from this time on
[GPS_L1 8/8/32] [GPS_L1 7/8/32]

If you output appears similar to this, you are successfully tracking GPS satellites. The status bar at the bottom displays the number of satellites being successfully tracked (8) and decoded (7).

A simple test (no antenna)


If you do not yet have an antenna but have your Infix-1, you can still use simulated data to operate:

With your Infix-1 plugged in, run the following command:

sdgps generate-simple-trajectory --angular-velocity-enu '[0,0,1]' ! simulate-raw ugi2: ! sylphase-usbgpsimu2-offline ! tracker ! decoder

This will produce an output similar to the following:

sylphase-usbgpsimu2-offline: Programming...
sylphase-usbgpsimu2-offline: ...done. Waiting for device to reconnect...
sylphase-usbgpsimu2-offline: ...done!
sylphase-usbgpsimu2-offline: Opened device with ID 73b9
sylphase-usbgpsimu2-offline: DONE=0, INIT_B=1
sylphase-usbgpsimu2-offline: Resetting...
sylphase-usbgpsimu2-offline: DONE=0, INIT_B=0
sylphase-usbgpsimu2-offline: DONE=0, INIT_B=0
sylphase-usbgpsimu2-offline: DONE=0, INIT_B=0
sylphase-usbgpsimu2-offline: DONE=0, INIT_B=1
sylphase-usbgpsimu2-offline: Starting load...
sylphase-usbgpsimu2-offline: ...load finished.
sylphase-usbgpsimu2-offline: DONE=1, INIT_B=1
sylphase-usbgpsimu2-offline: Success!
simulate-raw: GPS_L1 SV 12 came into view
simulate-raw: GPS_L1 SV 16 came into view
simulate-raw: GPS_L1 SV 15 came into view
simulate-raw: GPS_L1 SV 21 came into view
simulate-raw: GPS_L1 SV 8 came into view
simulate-raw: GPS_L1 SV 22 came into view
simulate-raw: GPS_L1 SV 25 came into view
simulate-raw: GPS_L1 SV 1 came into view
simulate-raw: GPS_L1 SV 26 came into view
simulate-raw: GPS_L1 SV 29 came into view
simulate-raw: GPS_L1 SV 4 came into view
simulate-raw: GPS_L1 SV 5 came into view
sylphase-usbgpsimu2-offline: ACQUIRED GPS_L1 Signal# 26 [Doppler: -3615.17] [C/N_0: 31.6224]
sylphase-usbgpsimu2-offline: ACQUIRED GPS_L1 Signal# 4 [Doppler: 2379.83] [C/N_0: 32.3237]
sylphase-usbgpsimu2-offline: ACQUIRED GPS_L1 Signal# 21 [Doppler: 424.828] [C/N_0: 31.7132]
sylphase-usbgpsimu2-offline: ACQUIRED GPS_L1 Signal# 22 [Doppler: -2465.17] [C/N_0: 35.014]
sylphase-usbgpsimu2-offline: ACQUIRED GPS_L1 Signal# 25 [Doppler: 1659.83] [C/N_0: 38.3606]
sylphase-usbgpsimu2-offline: ACQUIRED GPS_L1 Signal# 16 [Doppler: 84.8276] [C/N_0: 32.2037]
sylphase-usbgpsimu2-offline: ACQUIRED GPS_L1 Signal# 12 [Doppler: 84.8276] [C/N_0: 37.186]
sylphase-usbgpsimu2-offline: ACQUIRED GPS_L1 Signal# 1 [Doppler: -945.172] [C/N_0: 36.172]
sylphase-usbgpsimu2-offline: ACQUIRED GPS_L1 Signal# 8 [Doppler: 1194.83] [C/N_0: 34.8892]
sylphase-usbgpsimu2-offline: ACQUIRED GPS_L1 Signal# 29 [Doppler: 1194.83] [C/N_0: 34.4229]
sylphase-usbgpsimu2-offline: ACQUIRED GPS_L1 Signal# 5 [Doppler: -2815.17] [C/N_0: 35.2329]
decoder: SV#: 25 PREAMBLED!
decoder: SV#: 26 PREAMBLED!
decoder: SV#: 22 PREAMBLED!
decoder: SV#: 4 PREAMBLED!
decoder: SV#: 21 PREAMBLED!
tracker: GPS_L1 Signal#: 1 alignment check failed (reason: z test failed)
sylphase-usbgpsimu2-offline: ACQUIRED GPS_L1 Signal# 15 [Doppler: 3269.83] [C/N_0: 36.5048]
tracker: GPS_L1 Signal#: 8 alignment check failed (reason: z test failed)
decoder: SV#: 12 PREAMBLED!
decoder: SV#: 16 PREAMBLED!
tracker: GPS_L1 Signal#: 5 alignment check failed (reason: z test failed)
decoder: SV#: 29 PREAMBLED!
decoder: SV#: 1 PREAMBLED!
decoder: SV#: 15 PREAMBLED!
tracker: GPS_L1 Signal#: 5 alignment check failed (reason: z test failed)
decoder: SV#: 8 PREAMBLED!
decoder: SV#: 5 PREAMBLED!
decoder: 70 seconds elapsed, only confirmed ephemerides will be used from this time on

If your output appears similar to this, you are successfully simulating raw signals and tracking GPS satellites.

Tutorial


Try following the SDGPS Tutorial to familiarize yourself with SDGPS. Email suppo.nosp@m.rt@s.nosp@m.ylpha.nosp@m.se.c.nosp@m.om if you have any trouble or questions.

Make sure you read the kf2 page to learn the initialization procedure required at startup.

Normal operation


Normal operation of the Infix-1, integrated into your system, will have SDGPS being run in a GNU screen session at startup. See doc/run_on_system_startup.md.

The simplest possible operation is one SDGPS instance running with a command similar to:

sdgps sylphase-usbgpsimu2 --antenna-position '[1,2,3]' ! tracker ! decoder ! kf2 --output-rate 100 ! listen-solution-tcp 1234

Then, your custom software would connect to localhost on port 1234 and parse the solution stream that is produced. The solution stream format is newline-delimited JSON. You can look directly it at while running the above command by using netcat:

nc localhost 1234

You might want to run kf2 in a different SDGPS process (as recommended in doc/run_on_system_startup.md) e.g. so that the Kalman filter can easily be restarted without having to reacquire satellites.

A representative snippet of output is included here to get an idea of how the solution stream is formatted and what data it contains:

{
"sample_rate" : 1000,
"type" : "solution_v3"
}
{
"angular_velocity_body" : [
-0.519243822610625,
-0.0442340982976671,
-0.157179187050008
],
"index" : 92220,
"orientation_ecef" : {
"w" : 0.882942866282288,
"x" : 0.0732757319006891,
"y" : -0.271609677516783,
"z" : -0.375860007283231
},
"orientation_enu" : {
"w" : 0.821067942167978,
"x" : -0.377675387617315,
"y" : -0.399334849902386,
"z" : -0.154079244499958
},
"position_ecef" : [
-521831.289674395,
-5521412.13399561,
3139399.5115138
],
"relative_position_ecef" : [
-0.0594357675872743,
0.194225303828716,
-0.15716576710282
],
"relative_position_enu" : [
-0.0774469753810697,
-0.0435791838428065,
-0.2409563823703
],
"running" : true,
"time" : {
"fs" : 407009887661362,
"sec" : 639415236
},
"velocity_body" : [
-0.00564292372758972,
0.00456121382630568,
-0.00471871823273231
],
"velocity_ecef" : [
0.00215301805177938,
0.00684061429632733,
-0.00484603661172572
],
"velocity_enu" : [
0.00149982483881051,
-0.000738120158004104,
-0.00849230625977578
]
}

ROS bridge


SDGPS includes a rospy bridge script in scripts/solution_ros_bridge. It takes parameters:

  • _host: the IP/hostname to connect to SDGPS (default: localhost)
  • _port: the TCP port to connect to SDGPS
  • _child_frame_id: the TF frame for the INS (e.g. /ins)
  • _decimation: only pass through one of every N solutions; useful if ROS nodes are being overwhelmed by the update rate (default: 1)
  • _force_z_to_zero: always output a Z coordinate of 0; useful for vehicles that will not move vertically (e.g. land or water vehicles) (default: False)

It publishes:

Run it with a command like:

scripts/solution_ros_bridge _port:=1234 _child_frame_id:=/ins

and then look at the output with:

rostopic echo odom