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.
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.
“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.
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.
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.
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.
| 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 |