You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Window mark off by up to 5.4 in and gas meter by 4.8 in against the tape #30
Field test run 1 (PR #23) compared the app's marks with a tape measure, both measured from the meter's centre line. Positive means the app puts it farther right or higher. Measure Lab's bound is 4 in.
Feature
App − tape
Within 4 in
Window, right edge
−0.5 in
yes
Window, left edge
+5.4 in
no
Window, width
−5.9 in
no
Window, sill height
+1.9 in
yes
Gas meter stand-in, centre
4.8 in nearer the meter
no
Almost all of the window's width error comes from its left edge, the first corner tap (1:05–1:08 of the recording). The gas meter is a single tap with a nominal 1 ft width, so its centre is wherever that tap landed.
Next steps. One run can't tell a bad tap from drift. Runs 2 and 3 should tape the same features again. If the left edge is off again, check where the corner tap's raycast lands (the wall plane or the mesh) and how far the meter anchor drifts by that point in the walk.
Clip, 1:04–1:23 of the recording: the window corners, then the gas meter.
I checked the tap path at the t3/ios-mvf head (5c8c739) against run 1. The existing data can't prove a bug: the run 1 scan and tape readings aren't in the repo, and run 2 (#46) didn't read tape distances aloud. So there's no PR. Below are what I ruled out, the likely causes ranked, and what the next run needs to record to tell them apart.
How a mark is placed. A feature tap doesn't raycast against anything real. markFeaturePoint maps the view point to a sensor pixel, casts a ray from the last sampled camera pose, and intersects it with the analytic wall plane. That plane goes through the meter tap's hit and faces that hit's normal. The mark's position along the wall is then the perpendicular projection onto the wall line from the meter tap point. Only the meter tap raycasts, against a detected plane first and ARKit's estimated plane otherwise (L31–38).
Tap coordinates. The tap is read in global coordinates, and the view size comes from a full-screen CameraSizeReader, so they match.
A fix since run 1. None of the tap path has changed since the run 1 build (657ab28).
Scale error or a meter tap off the centre line. Either one moves both window edges the same way. Run 1 has the left edge at +5.4 in and the right edge at −0.5 in, so the edges moved in opposite directions and the window came out 5.9 in narrower. The right edge landing within half an inch suggests any offset shared by both edges is small.
Likely causes, most likely first
Parallax against the analytic plane. Anything that isn't on that plane moves sideways by its distance from the plane times the ray's sideways slope. That's a pull toward where the phone stood, or a push away from it.
Gas meter. The export already assumes a tapped point object stands 0.3 m (about 12 in) off the wall. A tap on its face lands on the wall plane behind it, shifted away from the phone. A 12 in deep object viewed 22° off square gives 12 × tan 22° ≈ 4.8 in, the size of the error. That makes this the top suspect for the gas meter.
Window. The pattern fits a wall plane that sits in front of the real wall at the window, or is turned a few degrees. That happens if the meter tap's estimated plane landed on the meter's face, or if its normal is off. A plane in front of the wall pulls both edges toward the phone. With the phone near the right edge, the left edge moves right a lot and the right edge barely moves, which is exactly what run 1 shows. At 7 ft, a 3° turn puts the plane about 4.4 in off.
A bad first corner tap. The left edge was the first tap, and one sample can't separate aim from geometry.
Tracking drift or anchor corrections. When the meter anchor moves more than 2 cm, refreshMeterFromAnchor moves the wall origin. The tapped world points stay put, though, so a correction after a tap shifts that whole feature. That moves both corners of one feature together, so it can't shrink the window, but it could shift the gas meter. The evals (feat(evals): real-data evals for AR drift, wall reconstruction, coverage and the field test #12) put a modern iPhone's position error at a p90 of 8.6 in after 10 ft.
A stale pose. Taps use the last sampled frame, every 6th camera frame (about 0.1 s). That's only about 1 in at 5 ft, unless the phone is panning during the tap.
What to record in the next field test
Share the scan off the phone. The export's meter plane source (detected or estimated) says whether the meter tap used a real wall plane.
Say, per tap, where you stand. Give the distance out from the wall and the distance left or right of the meter. Take each feature twice: once square on, and once from about 45° to the side.
If it's parallax, the error changes sign with the side you stand on and grows with the angle.
If it's a bad tap, the error is random.
If it's drift, both taps of one feature shift together, and the shift grows with walk time.
Tape the depths. Measure how far the gas meter stand-in's face stands off the wall, and how far the window glass and trim are set in or out. Then the parallax can be computed and compared.
Say what each window corner tap is on. Name it aloud: the trim's outer edge or the glass. Tape to the same edge.
Tap the meter again at the end of the walk. Also re-tap one window corner. The difference from the first taps measures drift directly.
If the scan shows that the error flips with the side you stand on, the fix is to raycast feature taps against the mesh or estimated surface and project the hit onto the wall line, instead of intersecting the analytic plane.
Activity
AidenJohnston commentedon Sep 26, 2026
I checked the tap path at the
t3/ios-mvfhead (5c8c739) against run 1. The existing data can't prove a bug: the run 1 scan and tape readings aren't in the repo, and run 2 (#46) didn't read tape distances aloud. So there's no PR. Below are what I ruled out, the likely causes ranked, and what the next run needs to record to tell them apart.How a mark is placed. A feature tap doesn't raycast against anything real.
markFeaturePointmaps the view point to a sensor pixel, casts a ray from the last sampled camera pose, and intersects it with the analytic wall plane. That plane goes through the meter tap's hit and faces that hit's normal. The mark's position along the wall is then the perpendicular projection onto the wall line from the meter tap point. Only the meter tap raycasts, against a detected plane first and ARKit's estimated plane otherwise (L31–38).Ruled out
CameraProjection.imagePixel(forViewPoint:)undoes the 90° clockwise, aspect-fill display correctly. The intrinsics and image size both come from the landscapeARFrame.camera.CameraFrame.ray(throughPixel:)is the exact inverse ofpixel(of:).CameraSizeReader, so they match.657ab28).Likely causes, most likely first
refreshMeterFromAnchormoves the wall origin. The tapped world points stay put, though, so a correction after a tap shifts that whole feature. That moves both corners of one feature together, so it can't shrink the window, but it could shift the gas meter. The evals (feat(evals): real-data evals for AR drift, wall reconstruction, coverage and the field test #12) put a modern iPhone's position error at a p90 of 8.6 in after 10 ft.What to record in the next field test
If the scan shows that the error flips with the side you stand on, the fix is to raycast feature taps against the mesh or estimated surface and project the hit onto the wall line, instead of intersecting the analytic plane.
Add meter and panel reads (WS-08) (#30)