Field validation: test iPhone LiDAR capabilities and RuView NLOS client
Nobody has claimed this yet.
- Dominant language
- Rust
- Stars
- 94.5k
- Forks
- 12.5k
- Avg merge
- 21h 27m
- Merged PRs (30d)
- 43
Description
Open the interactive RuView NLOS explainer
Goal
Create a repeatable field test for the RuView native iOS client and the LiDAR capabilities that Apple exposes publicly.
This issue must answer four separate questions:
- Does the RuView application install and run correctly on a physical iPhone?
- Which ARKit depth, mesh, and pose capabilities are available on that device?
- Can the iPhone receive and safely display RuView NLOS track hypotheses?
- Which measurements remain unavailable without an external transient time of flight sensor?
Important evidence boundary
The current native application is a secure viewer and transport adapter. It performs static ARKit capability checks, but it does not start an ARSession and does not capture live depth frames.
Apple scene depth is a derived visible surface product. It is not a raw photon timing histogram. A successful iPhone LiDAR test must never be described as an around the corner reconstruction or as a reproduction of the MIT consumer NLOS result.
Expected evidence classes:
| Test | Valid conclusion | Invalid conclusion |
|---|---|---|
| Safari Three.js model | WebGL and touch interface work | Physical LiDAR works |
| Native app installation | SwiftUI client runs on the iPhone | NLOS sensing works |
| ARKit depth diagnostics | Visible surface depth, pose, and mesh work | Raw transient data is available |
| Synthetic track stream | RuView transport and visualization work | A hidden object was measured |
| External VL53L8CH capture | Raw transient bytes were received | Full physical reproduction passed |
| Witnessed physical protocol | Hardware gate passed under the documented criteria | General production readiness |
Relevant implementation
- Pull request: https://github.com/ruvnet/RuView/pull/1687
- Native application:
ui/ios-nlos/RuViewNLOS.xcodeproj - Native documentation:
ui/ios-nlos/README.md - Rust sensing service:
v2/crates/ruview-nlos - Physical protocol:
docs/research/consumer-nlos-acceptance-protocol.md - Interactive explainer: https://ruview-nlos.ruv.chatgpt.site
- Apple device testing guidance: https://developer.apple.com/documentation/xcode/running-your-app-on-simulated-or-physical-devices
- Apple personal development team limits: https://developer.apple.com/help/account/basics/about-your-developer-account/
Required equipment
For application and ARKit testing:
- A Mac capable of running a current Xcode release.
- A physical iPhone running iOS 16 or newer.
- A USB cable for initial pairing.
- An Apple Account added to Xcode.
- A local Rust toolchain for the synthetic RuView server.
- Internet access if using a temporary Cloudflare Tunnel.
For physical transient testing:
- ST P NUCLEO 53L8A1 development board.
- VL53L8CH histogram capable sensor.
- USB connection to the Mac or a Raspberry Pi.
- Stable relay wall or floor surface.
- Measured sensor pose or a synchronized pose capture process.
- A hidden target with a known reference position.
Part 1: record the test environment
Before changing anything, record:
Tester:
Date and timezone:
iPhone model:
iOS version:
Mac model:
macOS version:
Xcode version:
RuView commit:
Apple development team type: Personal or paid
Network type:
External sensor available: yes or no
Do not include Apple credentials, bearer tokens, signing certificates, device identifiers, or tunnel tokens.
Part 2: test the Safari graphics
On the iPhone:
- Open https://ruview-nlos.ruv.chatgpt.site in Safari.
- Rotate the phone between portrait and landscape.
- Drag the Three.js scene with one finger.
- Select
LiDAR only. - Confirm the RF shells disappear.
- Confirm confidence changes to 74 percent.
- Select
Synthetic fusion. - Confirm the RF shells return.
- Confirm confidence changes to 92 percent.
- Confirm the uncertainty volume contracts.
- Tap
Pause, wait five seconds, and confirm animation stops. - Tap
Resumeand confirm animation restarts. - Background Safari for ten seconds, return, and confirm the scene recovers.
Expected result:
- No page crash.
- Touch orbit remains responsive.
- Text is readable in both orientations.
- The scene retains the
G0 synthetic evidencelabel. - No claim suggests that the visualization is live sensor output.
Record any visual defect with a screenshot and device orientation.
Part 3: install the native application
On the Mac:
git clone https://github.com/ruvnet/RuView.git
cd RuView
git fetch origin pull/1687/head:ruview-nlos
git checkout ruview-nlos
open ui/ios-nlos/RuViewNLOS.xcodeproj
In Xcode:
- Select the
RuViewNLOSproject. - Open
Signing & Capabilities. - Select an Apple development team.
- Keep automatic signing enabled.
- Change the bundle identifier to a unique value such as
com.example.ruviewnlos.dev. - Connect the iPhone by cable.
- Tap
Truston the iPhone if prompted. - Select the
RuViewNLOSscheme. - Select the physical iPhone as the run destination.
- Choose
Product, thenRun. - Enable Developer Mode on the iPhone if requested.
- Reboot and confirm Developer Mode if iOS requires it.
- Run the application again.
Expected result:
- The project builds without source changes.
- The application launches on the physical device.
- The app displays the Apple capability summary.
- No camera permission is requested by the current static probe.
- No target appears until an authenticated track stream is connected.
A Personal Team is sufficient for initial testing, but the installed profile normally expires after seven days and must be rebuilt.
Part 4: capture the current static capability result
Record the values reported by the application for:
- AR world tracking support.
- Scene depth support.
- Smoothed scene depth support.
- Scene reconstruction mesh support.
- Raw photon timing histogram availability.
Expected result on a LiDAR equipped iPhone Pro:
- World tracking should normally be available.
- Scene depth should normally be available.
- Smoothed scene depth should normally be available.
- Mesh reconstruction should normally be available.
- Raw photon timing histograms should be reported unavailable.
The first four results are device and operating system capabilities. The fifth result is the critical NLOS limitation.
Part 5: add a live Apple LiDAR diagnostics mode
This is required before claiming that RuView has tested live Apple LiDAR frames. The current app does not yet start an ARSession.
Implement a clearly labeled Apple LiDAR Diagnostics research screen with these constraints:
- Require an explicit user action before starting ARKit.
- Request camera permission only when the diagnostics session starts.
- Use
ARWorldTrackingConfiguration. - Enable
.sceneDepthwhen supported. - Enable
.smoothedSceneDepthwhen supported. - Enable scene reconstruction mesh when supported.
- Never classify ARKit depth as NLOS evidence.
- Never promote ARKit output beyond a visible surface diagnostic.
- Do not retain RGB camera frames.
- Keep depth and pose data in memory unless the tester explicitly exports a diagnostic report.
- Export summaries without faces, images, tokens, device identifiers, or precise location.
- Stop the ARSession when the app backgrounds or the diagnostics screen closes.
Display these live metrics:
- Depth map width and height.
- Received depth frames per second.
- Valid depth pixel percentage.
- Minimum, median, and maximum visible depth.
- Confidence map distribution when available.
- Camera transform update rate.
- Estimated sensor translation during the sample.
- Mesh anchor count and approximate vertex count.
- Dropped frame count.
- Thermal state.
- Session interruption and relocalization count.
- Explicit label:
Visible surface depth only. Not raw transient NLOS data.
Part 6: run the live visible surface test
Use a simple room with a wall corner and a box.
- Measure the visible box position manually.
- Start Apple LiDAR Diagnostics.
- Hold the iPhone 1 to 2 metres from the visible box.
- Move the phone slowly through approximately 10 to 20 centimetres of translation.
- Record ten seconds of diagnostic metrics.
- Repeat with the box partly occluded.
- Move the box fully behind the corner.
- Repeat the same phone motion.
- Stop diagnostics.
- Export the redacted metrics report.
Expected positive control:
- The visible box contributes valid scene depth.
- Depth and pose update while the phone moves.
- Mesh anchors describe visible surfaces.
Expected negative control:
- The fully hidden box does not appear in the ARKit depth map.
- The application does not invent a hidden target.
- The report explicitly records that derived Apple depth cannot establish NLOS.
This negative control is important. It proves the software respects the API boundary instead of silently turning missing data into a detection.
Part 7: run the synthetic RuView stream
On the Mac:
cd RuView/v2
export RUVIEW_NLOS_TOKEN="$(openssl rand -hex 32)"
cargo run -p ruview-nlos -- serve --synthetic
In a second terminal:
npx wrangler tunnel quick-start http://127.0.0.1:8787
The tunnel prints a temporary HTTPS hostname. Convert it into the native WebSocket endpoint:
wss://YOUR_HOST.trycloudflare.com/api/v1/nlos/ws
In the iPhone app:
- Enter the
wssendpoint. - Enter the generated pairing token.
- Connect.
- Confirm a moving target appears.
- Confirm the frame is permanently labeled
SYNTHETIC. - Background the app.
- Confirm the app disconnects and clears the target.
- Return to the foreground and reconnect explicitly.
- Stop the Rust server.
- Confirm the target clears no later than its five second expiry.
- Enter an incorrect token and confirm authentication fails.
- Restore the correct token and reconnect.
Cloudflare Quick Tunnels are for development only. Do not reuse the temporary hostname for production.
Part 8: optional external transient sensor test
Do this only when the ST hardware is available.
- Connect the P NUCLEO 53L8A1 and VL53L8CH sensor.
- Confirm the device appears as a serial port.
- Prepare a synchronized pose JSONL file.
- Keep the first 60 frames as an empty room calibration sequence.
- Run:
cd RuView/v2
cargo run -p ruview-nlos --features hardware -- capture-st \
--port /dev/ttyACM0 \
--session iphone-lidar-lab-001 \
--frames 300 \
--sensor-id st-kit-001 \
--sensor-model VL53L8CH \
--firmware-version 15314de \
--pose-jsonl synchronized-poses.jsonl
- Preserve the raw capture locally.
- Record the calibration digest.
- Verify that raw histograms never enter the public track envelope.
- Run the preregistered physical acceptance protocol.
- Do not mark the hardware gate complete unless the witnessed criteria pass.
A fixed sensor is useful for transport diagnostics but cannot satisfy the motion induced aperture gate.
Troubleshooting
The iPhone is not listed in Xcode
- Use a cable for first pairing.
- Unlock the iPhone.
- Tap
Trust This Computer. - Open Xcode Device Hub and select the phone.
- Confirm the device operating system is supported by the installed Xcode version.
- Install the required iOS platform support when Xcode offers it.
- Enable Developer Mode after the pairing process begins.
Signing fails
- Confirm an Apple Account is added under Xcode Settings.
- Select the correct development team.
- Keep automatic signing enabled.
- Use a unique bundle identifier.
- Remove stale local copies of the app from the phone and rebuild.
- With a Personal Team, remember that profiles expire after seven days.
Developer Mode is missing
- Connect and pair the device in Xcode first.
- Restart the iPhone.
- Open Privacy & Security settings.
- Enable Developer Mode if the option appears.
- Confirm the mode after reboot.
Scene depth is unsupported
- Confirm the device is a LiDAR equipped iPhone Pro model.
- Run on the physical device, not the Simulator.
- Confirm AR world tracking is supported.
- Confirm the application checks feature support before enabling frame semantics.
- Record the device model and operating system version.
Camera permission is denied
- Open iOS Settings.
- Find RuView NLOS.
- Enable Camera access.
- Restart the diagnostics session.
- If permission remains unavailable, delete and reinstall the development app.
No live depth frames arrive
- Confirm an ARSession is actually running.
- Confirm
.sceneDepthwas added only when supported. - Move to a textured, well lit indoor area.
- Avoid pointing only at reflective glass, mirrors, direct sunlight, or featureless surfaces.
- Check ARSession interruption and failure callbacks.
- Record the exact ARKit error without including private imagery.
Frame rate is low
- Remove the protective case temporarily if the phone is hot.
- Stop screen recording.
- Close other graphics intensive applications.
- Reduce visualization complexity before reducing measurement integrity.
- Record thermal state and dropped frames.
- Repeat after the device cools for ten minutes.
The Three.js scene is blank
- Reload Safari.
- Disable content blockers for the site.
- Close other graphics heavy browser tabs.
- Restart Safari.
- Confirm WebGL works on another Three.js page.
- Record the iOS version and whether the fallback message appeared.
The native app cannot connect
- Confirm the endpoint starts with
wss://. - Confirm the path is
/api/v1/nlos/ws. - Confirm the bearer token is at least 32 visible characters.
- Confirm the Rust server and tunnel are both running.
- Open the tunnel HTTPS health endpoint at
/healthin Safari. - Regenerate the Quick Tunnel because its hostname changes after restart.
- Confirm no token was placed in the URL.
- Do not bypass TLS certificate validation or use a self signed certificate.
A target appears but immediately disappears
- Check the frame expiry timestamp.
- Confirm the iPhone clock is correct.
- Confirm sequence numbers increase.
- Confirm the stream does not switch session identifiers.
- Confirm no frame is more than one second ahead of the phone clock.
- Confirm the server is publishing continuously.
- Preserve the rejection reason but remove tokens before sharing logs.
Privacy and security rules
- Do not upload camera frames, raw room scans, faces, home interiors, tokens, signing keys, device identifiers, or precise location.
- Redact tunnel hostnames after the test if they remain active.
- Keep raw transient captures local until the dataset governance process is approved.
- Treat all visualizations as advisory research output.
- Do not connect target tracks to physical actuation, alarms, medical decisions, or safety decisions.
- Report security defects privately rather than attaching exploit details to a public comment.
Acceptance criteria
Software and device gate:
- Native project builds on a Mac without source changes.
- App installs and launches on a physical LiDAR equipped iPhone.
- Static capability results are recorded.
- Native synthetic stream authenticates and displays at approximately 30 updates per second.
- Synthetic evidence remains visibly watermarked.
- Incorrect authentication fails closed.
- Backgrounding clears the current track.
- Stream loss clears the current track within five seconds.
- Safari Three.js interaction works in portrait and landscape.
Apple LiDAR diagnostics gate:
- Live ARKit session starts only after explicit consent.
- Visible scene depth, pose, and mesh metrics are recorded.
- No RGB imagery is retained.
- Fully occluded objects are not presented as ARKit detections.
- Exported metrics remain clearly labeled as visible surface diagnostics.
- Raw transient availability remains
unavailable.
Physical NLOS gate:
- External histogram capable hardware is used.
- Calibration and pose lineage are recorded.
- Sustained tracking reaches at least 27 frames per second.
- Measured CSI fusion reduces position error or lost track rate by at least 25 percent.
- The physical protocol is independently witnessed.
- Hardware evidence is never inferred from the synthetic benchmark.
Feedback requested
Please add one comment per device using this template:
Device model:
iOS version:
Xcode version:
RuView commit:
Installation result: pass or fail
World tracking:
Scene depth:
Smoothed scene depth:
Mesh reconstruction:
Raw transient histograms: expected unavailable
Safari Three.js result:
Native synthetic stream result:
Average observed update rate:
Stale clearing result:
Thermal state:
External sensor used:
Unexpected behaviour:
Troubleshooting attempted:
Suggested improvement:
Attach only redacted screenshots and logs. Include exact reproduction steps for failures. Do not include pairing tokens or private room imagery.
Requested contributor feedback
We specifically need feedback on:
- Which LiDAR equipped iPhone models report different capability combinations.
- Whether depth frame rate changes materially across iOS releases.
- Safari Three.js performance and memory pressure on older devices.
- Signing and Developer Mode friction for first time testers.
- Accessibility and readability of the native visualization.
- Whether stale state and authentication failures are understandable.
- Whether the evidence boundary is clear to a non researcher.
- Which external transient sensor setup is easiest to reproduce.
- Any result that appears to overstate what Apple LiDAR actually measured.
Estimated effort
- Safari graphics test: 5 minutes.
- Native installation with Xcode already configured: 15 to 30 minutes.
- Synthetic end to end stream test: 15 to 30 minutes.
- Live ARKit diagnostics implementation: 1 to 2 engineering days.
- Controlled external sensor capture: 1 day after hardware and firmware are ready.
- Full physical and CSI witness protocol: 2 to 5 days depending on synchronization and environment control.
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Review PR #1687 and the native project at ui/ios-nlos/RuViewNLOS.xcodeproj, then read ui/ios-nlos/README.md and v2/crates/ruview-nlos. Run the existing static capability and synthetic-stream checks before assessing the live diagnostics work. Done means the documented iPhone, ARKit, synthetic-stream, and optional sensor tests produce redacted evidence without presenting derived depth as NLOS data.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- ios, rust, swift
- Domain
- embedded-iot, mobile-dev, testing-qa
- Issue type
- Feature
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 25/100
