feat: UWB integration — follow mode selector, range presets, UWB status badge #4
Loading…
x
Reference in New Issue
Block a user
No description provided.
Delete Branch "sl-ios/uwb-integration"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
Adds full UWB integration to the SAUL-T-MOTE map view: live UWB anchor ranges, follow mode switching (GPS/UWB), follow distance presets, and a range circle on the map.
MQTT topics
saltybot/uwb/range{"anchor_id":"A1","range_m":2.34,"ts":...}saltybot/uwb/position{"x":1.2,"y":3.4,"z":0.0,"ts":...}saltybot/follow/mode{"mode":"gps"}or{"mode":"uwb"}saltybot/follow/range{"range_m":3.0,"preset":"medium"}UWB status badge (map, top-left)
saltybot/uwb/positionreceived within 3sA1 2.34m A2 4.10mFollow mode segmented control
saltybot/follow/modeon change and on connectFollow range presets
saltybot/follow/rangeon change and on connectMap additions
MapCirclefollow-range ring around robot: green (user inside), orange (user outside)(x, y)local coordinate shown in stats bar when UWB mode is activeTest plan
saltybot/follow/mode+saltybot/follow/rangepublished on connectmosquitto_pub … -t saltybot/uwb/position -m '{"x":1.2,"y":3.4,"z":0}'→ green UWB badgemosquitto_pub … -t saltybot/uwb/range -m '{"anchor_id":"A1","range_m":2.1}'→ A1 range shownsaltybot/follow/range🤖 Generated with Claude Code
- SulTee SwiftUI app targeting iOS 17+, iPhone 15 Pro - CoreLocation: dual-frequency GPS (L1+L5) continuous updates, background mode enabled - CoreMotion: 100 Hz IMU (accel + gyro + attitude + gravity), magnetometer via device motion - CMAltimeter: barometer relative altitude + pressure streaming - CLLocationManager heading updates for magnetometer heading - URLSessionWebSocketTask client connecting to ws://192.168.86.158:9090 - JSON protocol: {type, timestamp, data} for gps/imu/heading/baro messages - Auto-reconnect on disconnect (2s backoff) - Haptic feedback on incoming "haptic" messages from bot - Background streaming: UIBackgroundModes location + external-accessory in Info.plist - SwiftUI status UI: connection banner, sensor rate counters (Hz), start/stop follow-me button - Dev team Z37N597UWY (vayrette@gmail.com), bundle ID com.saltylab.sultee Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>Adds minimal MQTT 3.1.1 client (MQTTClient.swift) using Network.framework — no external dependency. Implements CONNECT + PUBLISH (QoS 0) + PINGREQ keepalive. - Broker: 192.168.87.29:1883 (user: mqtt_seb) - Topic: saltybot/ios/gps - Rate: 1 Hz Timer, decoupled from GPS update rate - Payload matches sensor_dashboard.py format: {ts, lat, lon, alt_m, accuracy_m, speed_ms, bearing_deg, provider: "gps"} - lastKnownLocation cached from CLLocationManagerDelegate, published on timer - MQTT connect/disconnect tied to startStreaming()/stopStreaming() - ATS NSExceptionDomains extended to include 192.168.87.29 (MQTT broker LAN IP) - MQTTClient.swift registered in project.pbxproj Sources build phase Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>UWBModels.swift (new): - FollowMode enum: .gps / .uwb — publishes {"mode":"gps|uwb"} to saltybot/follow/mode - FollowPreset enum: .close(1.5m) / .medium(3m) / .far(5m) — publishes {"range_m":N,"preset":"..."} to saltybot/follow/range - UWBPosition struct: x/y/z + timestamp - UWBRange struct: anchorID + rangeMetres + timestamp SensorManager: - Subscribes to saltybot/uwb/range + saltybot/uwb/position on startStreaming - handleUWBRange: updates uwbRanges[anchorID] (keyed dict) - handleUWBPosition: updates uwbPosition + sets uwbActive=true - UWB staleness watchdog (1Hz timer): clears uwbActive and prunes stale ranges >3s - setFollowMode(_:) / setFollowPreset(_:): update state + publish to MQTT immediately - Publishes current follow mode+range on connect MapContentView: - UWB status badge (top-left): green/gray dot, "UWB Active|Out of Range", per-anchor range readouts (e.g. A1 2.34m) - Follow mode segmented control: GPS | UWB - Follow range segmented control: Close | Medium | Far (shows metres) - MapCircle follow-range ring around robot: green inside, orange outside range - Stats bar: distance turns green + checkmark when user is inside follow range; UWB (x,y) coord shown when UWB mode active and position known Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>Checkout
From your project repository, check out a new branch and test the changes.