Emlid RS3 / GIS Centimeter-accurate surveying for the Brownsville property

Centimeter-accurate GPS workflow for capturing infrastructure, plantings, and underground utilities across the 93-acre Brownsville property. The system combines an Emlid Reach RS3 RTK receiver with Ohio CORS corrections, voice-narrated field capture via Apple Watch, and a custom processing pipeline on the Mac Studio.

System Overview
Component Detail
Receiver Emlid Reach RS3 (multi-band RTK, tilt compensation, LoRa)
Corrections ODOT VRS via NTRIP (free, statewide, centimeter-level)
Field capture iPhone running Emlid Flow + Apple Watch running Just Press Record
Voice alignment Custom emlid-merge.py script aligns GPS timestamps with voice descriptions
Transcription Qwen3-ASR via MLX on Apple Silicon (~130x realtime)
Desktop GIS QGIS 4.0.2 / ArcGIS Pro (planned)
Data store CSV pipeline β†’ PostGIS on CT100 farmdb (planned)
Architecture
Emlid Flow (iPhone)
   └─ Export CSV β†’ ~/Sync/farm/emlid-exports/sessions/

Just Press Record (Apple Watch)
   └─ Auto-sync via iCloud β†’ Mac Studio
   └─ Copy to voice-memos/YYYY-MM-DD/

Mac Studio: processing pipeline
   β”œβ”€ whisper-transcribe.py (Whisper large-v3 via mlx-whisper) β†’ .json
   β”œβ”€ emlid-merge.py aligns voice to GPS points
   └─ Output: processed/session-N-YYYY-MM-DD.csv

Future: PostGIS on CT100 farmdb
   └─ Queryable via Farm MCP tools, QGIS, or ArcGIS Pro
What's Built vs. Planned (May 2026)
Component Status
Drop zone (~/Sync/farm/emlid-exports/) Done
Voice β†’ point alignment script (emlid-merge.py) Done
Whisper large-v3 (mlx-whisper) transcription Done β€” switched from Qwen3-ASR 2026-05-18 for better accuracy + anti-hallucination params. Script: whisper-transcribe.py, venv ~/venvs/whisper-asr/
JPR on Apple Watch for voice capture Done
QGIS project with categorized symbology Done β€” brownsville-property.qgz; connects directly to PostGIS
GeoPackage export Retired β€” PostGIS is single source of truth; .gpkg kept as backup snapshot only
PostGIS extension on farmdb Done
Geometry tables (plants, plant_locations, plant_observations, plant_status_history, gis_features) Done β€” auto-trigger on status changes; 158+ GPS points loaded across multiple projects
Python ingestion to PostGIS Done β€” sessions load via Python scripts, points joined to species
Farm MCP (farm-data) Done β€” 19+ tools including farm_sql, farm_recent_observations, farm_list_plantings, farm_log_harvest, etc.
Spatial-specific MCP tools (nearest_features, query_in_radius) Planned β€” current pattern is farm_sql with raw PostGIS queries
ArcGIS Pro project Planned β€” QGIS covers current needs
Bee Hub map view Planned
Caveats & Gotchas

Hard-won lessons from the first week of Emlid RS3 field sessions (May 5-11, 2026). This page documents things that tripped us up, weren’t obvious from the docs, or required workarounds.

Hardware

Battery life is finite β€” charge between sessions. The RS3 battery died mid-session on May 7 while collecting points around the property. There’s no low-battery warning that’s obvious in the field. Before each session, verify the battery indicator in Emlid Flow. Consider carrying a USB-C power bank for long days.

Fix acquisition can be slow under canopy. On May 11, the RS3 took noticeably longer to get a FIX near the hilltop woodlot β€” it went through SINGLE β†’ FLOAT β†’ 43 satellites acquired β†’ FIX. If you’re in a wooded area, find a clearing first to let it lock on, then move under canopy. The multi-constellation tracking (GPS + GLONASS + Galileo + BeiDou) helps, but dense hardwood canopy in full leaf-out still degrades the signal.

Not MFi-certified β€” iOS app lock-in. The RS3 is not Apple MFi-certified, which means only Emlid Flow can use it as a position source on iOS. You cannot pipe RS3 corrections to ArcGIS Field Maps, SW Maps, or any other iOS app that expects a Bluetooth GPS. This is an Emlid design choice, not an Apple limitation. On Android, third-party apps can connect via mock location.

NTRIP / ODOT VRS

“Position to provider” must be ON. This is the toggle in Emlid Flow’s correction settings that sends your approximate position to the ODOT VRS so it can generate a virtual base station near you. If this is off, ODOT doesn’t know where you are and can’t send relevant corrections. FIX will never acquire.

ODOT account can go dormant. If you haven’t used the account in a while, log into ortn.dot.state.oh.us via a web browser to verify it’s still active before heading to the field. The credentials for the Emlid Flow profile must match exactly.

Mount point matters. Use ODOT_G_R_E_C_RTX_RTCM3 β€” this is the multi-constellation mount point (GPS + GLONASS + Galileo + BeiDou) in RTCM3 format. Other mount points may only provide GPS or GPS+GLONASS corrections, which means fewer satellites and slower/less reliable FIX.

Cellular required. NTRIP corrections stream over the internet. If you’re in a cellular dead zone on the property, corrections won’t flow and you’ll be stuck in SINGLE or FLOAT. The Starlink dish at the barn provides Wi-Fi coverage in the immediate area; the buggy has a portable Wi-Fi access point (SSID: “Z”) for extended range. In the future, using the RS3 as a local base station with LoRa radio eliminates the internet dependency entirely.

Field Workflow

Say “dash” not “colon” as the delimiter. Early sessions used spoken “colon” to separate feature name from description (e.g. “Corner drain colon northwest side”). Problem: Whisper (mlx-whisper) transcribes the word “colon” literally as “colon”, not as :. Saying “dash” reliably transcribes as β€” or -, which the emlid-merge.py parser handles correctly. The code was updated to support both NAME_COLON_RE and CODE_RE patterns, but dash is the preferred convention.

Narrate BEFORE you tap Collect. The merge script aligns voice segments to GPS points by timestamp. If you tap Collect first and then describe the point, the voice segment will be timestamped after the GPS point and may fall outside the Β±20s alignment window. Describe-then-collect is the correct order.

Don’t forget to start recording before narrating. On May 7, Ed started narrating points before starting the Emlid/JPR recording and had to re-do the descriptions. The merge script can only align voice that was actually recorded. Start JPR on the Apple Watch first, confirm it’s recording (red dot), then begin capturing.

One continuous recording per session. Don’t stop and restart JPR between points. The merge script uses the recording start time (from the filename) and relative segment offsets to compute absolute timestamps. Multiple recordings per session create gaps and complicate alignment.

Pause between features. A brief pause (2-3 seconds) between narrating one point and moving to the next helps Whisper (mlx-whisper) segment the audio cleanly. Without pauses, adjacent descriptions can bleed into each other and get assigned to the wrong GPS point.

One project, not daily projects. Use a single master project in Emlid Flow (Brownsville-Property-Master) rather than creating a new project each session. The processing pipeline groups points into sessions by timestamp gaps, so daily projects just add export overhead. Ed was initially unsure about this (May 7 dictation) β€” one project is the answer.

Processing Pipeline

JPR creation_time is the END of recording, not the start. This is the most insidious timestamp bug. If you use the file’s metadata creation_time to determine when the recording started, every voice segment will be offset by the entire recording duration (10-60+ minutes). The emlid-merge.py script uses the filename (HH-MM-SS.m4a) as the authoritative start time. The parent folder (YYYY-MM-DD/) provides the date. Both are in local time (America/New_York).

Transcription history. Original pipeline used OpenAI Whisper; switched to Qwen3-ASR via MLX (March 2026, ~130x realtime, hallucination-free on silence); then switched back to Whisper large-v3 via mlx-whisper on 2026-05-18 β€” better accuracy on noisy field audio plus the anti-hallucination params Ed tuned (condition_on_previous_text=False, compression_ratio_threshold=2.0, no_speech_threshold=0.5, plus a unique-word-ratio post-filter). The merge script consumes Whisper-compatible JSON either way; the actual script is now whisper-transcribe.py and the venv is ~/venvs/whisper-asr/.

Transcription produces “colon” artifacts. When Ed says punctuation-like words (“colon”, “dash”, “period”), the ASR transcribes them literally. The merge script’s parser handles common patterns, but unusual dictation styles may need manual cleanup in the output CSV.

GIS / Coordinate System

Emlid Flow exports in WGS84 with ellipsoidal heights. The CSV uses latitude/longitude (EPSG:4326) with ellipsoidal heights (not orthometric/MSL). Ellipsoidal heights in central Ohio are roughly 35 meters higher than what a topographic map would show. If you need orthometric heights, apply a geoid model (GEOID18 for CONUS) in QGIS or ArcGIS Pro.

Elevation values are in meters. Even though the antenna height is configured in feet (6.345 ft) in Emlid Flow, the exported CSV has elevations in meters. The processed pipeline preserves meters. Convert to feet (Γ— 3.28084) if needed for construction or grading work.

Lateral RMS varies with solution quality. FIX solutions typically show 0.014-0.038 m lateral RMS. FLOAT solutions are 0.05-0.11 m. If a point has high RMS, consider re-capturing it with better sky view.

Quick Troubleshooting
Problem Likely Cause Fix
No FIX, shows SINGLE Indoors, NTRIP not flowing, or position toggle off Go outside, check ODOT account, toggle position-to-provider on
FIX dropping to FLOAT Heavy canopy, buildings, or NTRIP latency Move to clearer sky, check cellular/Wi-Fi signal
RS3 not connecting to Flow Bluetooth issue Toggle Bluetooth on iPhone, restart Flow, restart RS3
Tilt comp not working Not calibrated this session Re-calibrate in Flow β†’ Survey β†’ Tilt calibration
ODOT login fails Account dormant or password expired Log into ORTN web portal, reset if needed
Voice not aligning to points Started narrating before recording, or window too narrow Verify JPR was recording; try --window 30
“No usable recordings” from merge Filename doesn’t match JPR HH-MM-SS format Rename file to match or copy from iCloud source
Battery died mid-session No warning in the field Charge before every session; carry USB-C power bank
Field Workflow

The capture workflow is designed to be hands-light and voice-driven. The phone does GPS capture; the Apple Watch records voice descriptions; the office side aligns timestamps later.

Pre-Session Checklist
  • RS3 powered on, attached to pole, battery charged (battery died mid-session May 7)
  • iPhone connected to RS3 via Bluetooth in Emlid Flow
  • Project: Brownsville-Property-Master open in Flow
  • Outdoors with clear sky view
  • FIX status confirmed in Flow status bar (not SINGLE or FLOAT)
  • Optional: Tilt compensation enabled and calibrated
  • Wi-Fi access point on buggy powered on if needed (SSID: “Z”)
The 4-Code Scheme

Every captured point uses one of four single-letter codes as its name:

Code Meaning Examples
p Plant Asparagus crown, raspberry cane, fruit tree, native shrub, hive
i Infrastructure (above ground) Fence post, gate, hose bib, building corner, raised bed, manifold
u Underground Water line, electrical run, drain tile, drip irrigation lateral, septic
n Note Anything that doesn’t fit above β€” observations, problem spots, future-action markers

The u code is critical: once buried, you can’t see it. The GPS record IS the only way to relocate it later. Capture before backfill for any underground run.

Capture Sequence
  1. Start a recording on Apple Watch (Just Press Record complication tap)

    • JPR saves files as HH-MM-SS.m4a inside a YYYY-MM-DD/ folder β€” the filename IS the recording start time
    • One continuous recording per session β€” don’t stop/start between points
  2. At each feature:

    • Speak the description FIRST (before tapping Collect):
      • “Corner drain dash northwest side of barn”
      • “Asparagus bed dash southeast corner, raised bed 2”
      • “Drip lateral dash 12 inches deep, runs from manifold A to bed 3”
    • Tap + in Emlid Flow on iPhone
    • Pick the code (p, i, u, or n)
    • Tap Collect (point captures with timestamp)
    • Pause briefly before moving to the next feature (helps ASR segment cleanly)
  3. Stop the recording on Apple Watch when the session is done

    • Recording auto-syncs to iCloud Drive on the Mac Studio
Dictation Conventions

Speak descriptions using dash format so the merge script can split feature name from details. Say “dash” between the name and description β€” Whisper (mlx-whisper) transcribes it as β€” or - which the parser handles:

feature name β€” description with details

Examples:

  • “Corner drain dash northwest side of barn”
  • “Elderberry 1 dash first plant in hedgerow, 6 foot spacing”
  • “Drip lateral dash 18 inches deep, between barn and pump house”
  • “Swarm trap dash lower lot, hung in oak tree”

Rules:

  • Narrate before the capture tap (describe-then-collect)
  • One continuous recording per session β€” don’t stop/start between points
  • Pause briefly between features for clean segmentation
  • Use dash as the delimiter β€” spoken “colon” transcribes literally and confuses the parser
  • If you forget to start recording before narrating, stop and re-narrate after starting β€” the merge script only sees audio that was recorded
Field Cheat Sheet

Print this and tape it to the pole or keep on phone lock screen.

4 codes, that’s it:

p  β†’  plant
i  β†’  infrastructure (above ground)
u  β†’  underground (capture BEFORE backfill)
n  β†’  note

Every capture:

  1. Speak description: “feature name dash details”
  2. Tap + in Flow
  3. Pick code (p / i / u / n)
  4. Tap Collect
  5. Pause briefly before next feature

Before session: FIX confirmed. Battery charged. Tilt comp on (optional).

Start session: Tap JPR complication on Apple Watch. Open Emlid Flow on iPhone.

End session: Tap JPR on Watch to stop. Recording auto-syncs via iCloud.

Office Workflow

The post-session pipeline merges Emlid CSV exports with Qwen3-ASR-transcribed voice descriptions, aligning by timestamp.

Directory Structure
~/Sync/farm/emlid-exports/
β”œβ”€β”€ emlid-merge.py          # Main voice↔GPS alignment script
β”œβ”€β”€ whisper-transcribe.py      # MLX-based ASR (Apple Silicon GPU)
β”œβ”€β”€ brownsville-property.py # Standalone QGIS project generator
β”œβ”€β”€ setup-project.py        # QGIS Python Console version
β”œβ”€β”€ brownsville-property.qgz # QGIS project file (QGIS now connects to PostGIS directly; GPKG retired)
β”œβ”€β”€ sessions/               # CSV exports from Emlid Flow
β”œβ”€β”€ voice-memos/            # JPR .m4a files + transcripts
β”‚   └── YYYY-MM-DD/
β”‚       β”œβ”€β”€ HH-MM-SS.m4a
β”‚       └── transcripts/
β”‚           └── HH-MM-SS.json   # Whisper large-v3 (MLX) output
└── processed/              # Merged output CSVs
    β”œβ”€β”€ all-points.csv      # Combined master file
    └── session-N-YYYY-MM-DD.csv
Processing Steps

1. Export CSV from Emlid Flow β†’ copy to sessions/

From Emlid Flow on iPhone: tap the project β†’ Export β†’ CSV. AirDrop or share to the Mac Studio, then move to sessions/.

2. Copy JPR recordings from iCloud:

cp ~/Library/Mobile\ Documents/iCloud~com~openplanetsoftware~just-press-record/Documents/YYYY-MM-DD/*.m4a \
   ~/Sync/farm/emlid-exports/voice-memos/YYYY-MM-DD/

3. Transcribe each .m4a with Whisper large-v3 (MLX):

source ~/venvs/whisper-asr/bin/activate
cd ~/Sync/farm/emlid-exports
python3 whisper-transcribe.py voice-memos/YYYY-MM-DD/*.m4a

Outputs Whisper-compatible JSON to voice-memos/YYYY-MM-DD/transcripts/. Processes ~2 hours of audio in under 60 seconds on Apple Silicon.

(Switched from Qwen3-ASR to Whisper large-v3 via mlx-whisper on 2026-05-18 β€” better accuracy, anti-hallucination params, venv was renamed qwen-asr β†’ whisper-asr across scripts/skills/memory.)

4. Run the merge:

cd ~/Sync/farm/emlid-exports
python3 emlid-merge.py sessions/<csv> voice-memos/YYYY-MM-DD/*.m4a --out processed

5. Review output in processed/session-N-YYYY-MM-DD.csv

emlid-merge.py Details

The merge script (~/Sync/farm/emlid-exports/emlid-merge.py) does the following:

  • Reads Emlid Flow CSV (columns: Name, Latitude, Longitude, Ellipsoidal height, Averaging start, etc.)
  • Groups points into sessions by 10-minute gaps in timestamps
  • For each JPR recording: parses start time from the filename (HH-MM-SS) + parent folder date (YYYY-MM-DD), converts to UTC
  • Loads transcript JSON, converts each segment’s relative offset to absolute UTC time
  • For each GPS point, finds the nearest voice segment within a configurable symmetric window (default Β±20s)
  • Parses “feature name β€” description” from the segment text
  • Writes per-session CSVs with columns: point_id, timestamp_utc, lat, lon, elev_m, h_rms_m, solution, samples, feature_name, description, voice_offset_s, source_recording

CLI flags: --out OUTDIR, --window SEC (match window, default 20), --tz IANA_NAME (default: America/New_York)

JPR Timestamp Handling

Critical: JPR’s creation_time metadata = end of recording, NOT start. The script uses the filename (HH-MM-SS) as the authoritative recording start time and the parent folder name (YYYY-MM-DD) for the date. These are in local time (America/New_York) and get converted to UTC internally.

If your file isn’t from JPR or doesn’t follow the HH-MM-SS.m4a naming convention, the script will skip it with a warning.

all-points.csv Master File

The processed/all-points.csv file combines all sessions into a single CSV for loading into QGIS or ArcGIS Pro. Columns:

point_id, timestamp_utc, lat, lon, elev_m, h_rms_m, solution, samples,
code, feature_name, description, session

This file is the primary input for the QGIS project (brownsville-property.qgz) and for future PostGIS ingestion.

QGIS & ArcGIS Pro

Desktop GIS for visualizing, analyzing, and managing captured GPS data. QGIS is the current primary tool; ArcGIS Pro integration is planned.

QGIS Setup

Version: QGIS 4.0.2 (Final) on macOS

Project file: ~/Sync/farm/emlid-exports/brownsville-property.qgz

Primary data source: PostGIS on CT100 (farmdb). QGIS connects directly via the PostGIS connector β€” host 192.168.8.100, port 5432, database farmdb, user farmuser, SSL disabled. All points and geometries live there; GIS state stays single-source-of-truth instead of drifting between a GeoPackage copy and the DB.

GeoPackage (brownsville-points.gpkg) is retired as the primary format (May 2026). It still exists as a backup snapshot of points but isn’t kept in sync β€” for live data use the PostGIS connection. ArcGIS Pro instructions further down still cover the GPKG path for portability.

The QGIS project is generated by a Python script (brownsville-property.py or setup-project.py for the console version) and includes:

  • ESRI World Imagery satellite basemap
  • All GPS points from all-points.csv, loaded as a delimited text layer (EPSG:4326)
  • Categorized symbology by feature code:
Code Symbol Color Label
p Circle Green (#22c55e) Plant
i Square Gray (#94a3b8) Infrastructure
u Diamond Orange (#f97316) Underground
n Triangle Blue (#3b82f6) Note
  • White labels with black buffer showing feature names
  • Zoomed to point extent with ~100m padding

Regenerating the project:

From the QGIS Python Console (Plugins β†’ Python Console β†’ Show Editor):

exec(open(os.path.expanduser('~/Sync/farm/emlid-exports/setup-project.py')).read())

Or standalone from Terminal:

/Applications/QGIS-final-4_0_2.app/Contents/MacOS/bin/python3 \
  ~/Sync/farm/emlid-exports/brownsville-property.py

Adding new sessions: After running the processing pipeline, update all-points.csv with the new session data, then reload the layer in QGIS (right-click layer β†’ Reload). The symbology and labels persist.

ArcGIS Pro

ArcGIS Pro can work with the same data sources. The key consideration is coordinate system alignment and data format.

Importing GPS Data

From CSV (all-points.csv):

  1. Open ArcGIS Pro β†’ Insert β†’ New Map
  2. Map tab β†’ Add Data β†’ XY Table to Point
  3. Browse to ~/Sync/farm/emlid-exports/processed/all-points.csv
  4. Set X Field = lon, Y Field = lat, Z Field = elev_m
  5. Coordinate System = GCS_WGS_1984 (EPSG:4326)
  6. Click Run

From GeoPackage:

  1. Catalog pane β†’ right-click Databases β†’ Add Database
  2. Browse to brownsville-points.gpkg
  3. Drag the points layer onto the map

Coordinate System Notes

  • Emlid data is in WGS84 geographic (lat/lon, EPSG:4326). ArcGIS Pro will project on-the-fly for display.
  • For measurement accuracy, project to Ohio State Plane South (EPSG:3735, US feet) or UTM Zone 17N (EPSG:32617, meters).
  • Heights are ellipsoidal, not orthometric. Apply GEOID18 via the Transformation tool if you need MSL elevations.
  • To convert: Geoprocessing β†’ Project β†’ set output coordinate system and check “Geographic Transformations” to include the geoid.

Symbology

To replicate the QGIS categorized symbology:

  1. Right-click the points layer β†’ Symbology
  2. Change from Single Symbol to Unique Values
  3. Field = code
  4. Add values: p (green circle), i (gray square), u (orange diamond), n (blue triangle)
  5. Apply

Labeling

  1. Right-click layer β†’ Label Properties
  2. Label Field = feature_name
  3. Set halo (white text, 1.5pt black buffer) for readability over satellite imagery

Basemap

ArcGIS Pro includes built-in satellite imagery:

  • Map tab β†’ Basemap β†’ Imagery (or Imagery Hybrid for labels)
  • This is higher resolution than the ESRI XYZ tile service used in QGIS

Future: ArcGIS Field Maps

ArcGIS Field Maps on iOS cannot directly connect to the RS3 (not MFi-certified). Two potential workarounds:

  1. Bluetooth GPS forwarding β€” third-party apps that relay NMEA from the RS3 to the iOS location stack (unreliable, not recommended)
  2. Post-process in ArcGIS Pro β€” continue using Emlid Flow for field capture, import to ArcGIS Pro for analysis. This is the recommended approach.
  3. Android tablet β€” Field Maps on Android can connect to the RS3 via mock location. QField is another option.
PostGIS Integration (Planned)

Future pipeline: all-points.csv β†’ PostGIS on CT100 farmdb β†’ queryable via Farm MCP tools, QGIS, and ArcGIS Pro.

Planned tables:

  • gis_points β€” all raw GPS captures with geometry
  • plantings β€” plants with species FK, planting date, zone
  • infrastructure β€” above-ground features
  • underground β€” buried utilities (critical for future excavation)

Planned Farm MCP spatial tools:

  • nearest_features(lat, lon, radius_m) β€” find what’s nearby
  • query_in_radius(lat, lon, radius_m, code) β€” filter by feature type
  • underground_near(lat, lon, radius_m) β€” specifically for avoiding buried lines
Reference & Docs

External documentation, accounts, and resources for the Emlid RS3 / GIS workflow.

Emlid Documentation
Resource URL
Emlid Reach RS3 Manual docs.emlid.com/reachrs3
Emlid Flow App Docs docs.emlid.com/flow
Emlid Flow Survey Guide docs.emlid.com/flow/survey
Emlid Flow NTRIP Setup docs.emlid.com/flow/ntrip
Emlid Flow CSV Export docs.emlid.com/flow/export
Emlid Community Forum community.emlid.com
Emlid Firmware Updates docs.emlid.com/reachrs3/firmware
Tilt Compensation Guide docs.emlid.com/reachrs3/tilt-compensation
Ohio CORS / NTRIP
Resource URL
ODOT VRS Login Portal ortn.dot.state.oh.us/TrimblePivotWeb/Login.aspx
ODOT VRS Network Info transportation.ohio.gov/programs/real-time-network
Account username BeeDifferent1
Mount point ODOT_G_R_E_C_RTX_RTCM3
GIS Software
Resource URL
QGIS Downloads qgis.org/download
QGIS Documentation docs.qgis.org
ArcGIS Pro Help pro.arcgis.com/en/pro-app/latest/help
ArcGIS Field Maps doc.arcgis.com/en/field-maps
QField (Android) qfield.org
EPSG:4326 (WGS84) epsg.io/4326
EPSG:3735 (OH State Plane S) epsg.io/3735
GEOID18 Model geodesy.noaa.gov/GEOID/GEOID18
Processing Tools
Tool Location Purpose
emlid-merge.py ~/Sync/farm/emlid-exports/ Aligns GPS timestamps with voice descriptions
whisper-transcribe.py ~/Sync/farm/emlid-exports/ Whisper large-v3 via mlx-whisper (switched from Qwen3 2026-05-18); outputs Whisper-compatible JSON
brownsville-property.py ~/Sync/farm/emlid-exports/ Generates QGIS project (standalone)
setup-project.py ~/Sync/farm/emlid-exports/ Generates QGIS project (Python Console version)
all-points.csv ~/Sync/farm/emlid-exports/processed/ Master point file for all sessions
Session History
Date Session Points Notes
May 5, 2026 session-1 Initial First test β€” Foundation Rock reference point
May 6, 2026 session-2 12 Walk test around barn area, duplicate Foundation Rock
May 7, 2026 session-3 6 Corner drain, iris, dogwood, elderberries. Battery died.
May 7, 2026 session-4 ~6 Evening re-capture: Foundation Rock, garden fence, spring conduit, swarm trap, asparagus bed
May 9, 2026 upper-pond ~9 Upper pond perimeter survey. Used “dash pond perimeter” delimiter.
May 11, 2026 emwood 2+ Sugar maple, red maple near hilltop. GPS slow to acquire FIX initially.
Setup & Configuration
Hardware
Component Detail
Receiver Emlid Reach RS3 (multi-band RTK, tilt compensation, LoRa radio)
Serial 8243579DFF625F56
Firmware 32.2 (current as of April 2026)
Pole Survey pole with bubble level
Field device iPhone running Emlid Flow + iOS Shortcuts
Voice capture Apple Watch running Just Press Record (JPR) β€” auto-syncs via iCloud
Corrections ODOT VRS via NTRIP over cellular/Starlink
Antenna height 6.345 ft (configured in Flow)

RS3 capabilities:

  • Built-in GNSS antenna (no separate antenna needed)
  • Tilt compensation β€” capture while leaning, no need to perfectly plumb the pole
  • LoRa radio for base/rover work without internet (future option)
  • Full RTK rover and base capabilities
  • Not MFi-certified β€” only Emlid Flow can use it as position source on iOS. Third-party apps (ArcGIS Field Maps, SW Maps, etc.) cannot connect directly.
NTRIP Configuration β€” ODOT VRS

Provider: Ohio Department of Transportation (ODOT) Virtual Reference Station network β€” free centimeter-level corrections across Ohio.

Setting Value
Account login BeeDifferent1
Login URL ortn.dot.state.oh.us/TrimblePivotWeb/Login.aspx
Mount point ODOT_G_R_E_C_RTX_RTCM3 (GPS+GLONASS+Galileo+BeiDou, RTCM3 format)
Coordinate system Global CS (WGS84)
Typical satellites 25-43 (multi-constellation)
Typical baseline 4-46 m (virtual base, auto-generated near your position)

Setting up NTRIP in Emlid Flow:

  1. Open Emlid Flow β†’ Correction input
  2. Select NTRIP as source
  3. Enter ODOT server address, port, and credentials
  4. Select mount point ODOT_G_R_E_C_RTX_RTCM3
  5. Toggle Position to provider ON β€” this sends your approximate position to ODOT so it creates a virtual base station near you
  6. Wait for FIX status in the top bar (usually 10-30 seconds with clear sky)
Emlid Flow App Setup

Project: Brownsville-Property-Master β€” single ongoing project for all property captures.

Key settings in Flow:

Setting Location Value
Coordinate system Project settings Global CS (WGS84 / EPSG:4326)
Antenna height Survey settings 6.345 ft
Tilt compensation Survey settings Optional (enable per-session)
Auto-collect Survey settings Manual (tap + to collect each point)
Point naming Automatic Auto-incremented numbers (1, 2, 3…)

One project vs. daily projects: Use one master project (Brownsville-Property-Master) rather than creating a new project each day. Emlid Flow timestamps each point, and the processing pipeline groups by session using 10-minute gaps. Starting a new project per day adds export overhead for no benefit.

Tilt Compensation

The RS3 supports tilt compensation, which lets you capture a point at the base of the pole even when the pole is leaning. Useful for getting close to obstacles (trees, fences, raised bed corners).

To use tilt compensation:

  1. In Emlid Flow β†’ Survey β†’ Settings β†’ enable Tilt compensation
  2. Calibrate before each session (motion-based calibration takes ~10 seconds)
  3. Lean the pole as needed; the receiver corrects for the lean

For initial sessions or simple captures, tilt compensation is not required β€” just hold the pole vertical using the bubble level. Add it once the basic workflow is comfortable.

iOS Shortcuts

Two Shortcuts on the iPhone Home Screen handle session bookkeeping:

Start GIS Session:

  • Opens Emlid Flow
  • (Planned: auto-launch JPR on Apple Watch)

End GIS Session:

  • (Planned: stop JPR recording on Apple Watch)

Status: Shortcuts need updating to integrate with Just Press Record instead of Voice Memos. Currently, JPR is started/stopped manually via the Watch complication.