Skip to content

visual approaches: direct the numbers, clearances from the downwind - #967

Open
nreisbeck wants to merge 1 commit into
mmp:masterfrom
nreisbeck:direct-downwind-visuals
Open

visual approaches: direct the numbers, clearances from the downwind#967
nreisbeck wants to merge 1 commit into
mmp:masterfrom
nreisbeck:direct-downwind-visuals

Conversation

@nreisbeck

@nreisbeck nreisbeck commented Aug 26, 2026

Copy link
Copy Markdown
Contributor

Two visual-approach improvements:

  • Direct the numbers / direct the field (Add support for "proceed|turn direct the numbers" (before or after visual approach clearance) #880): DTN (and LDTN/RDTN with a turn direction) sends the aircraft direct to the assigned approach runway's threshold; DTF direct to the arrival airport. Spoken forms: "turn left direct the numbers", "proceed direct the field". Works before or after a visual approach clearance.

  • Visual clearances from the downwind (Allow clearing aircraft on a downwind for a visual approach #882): when the abeam projection onto the reference route is behind the aircraft, the clearance now joins the route at a point downwind of the aircraft — it continues ahead, turns in to that fix, and flies the route inbound from there — rather than refusing. This follows the approach suggested in the issue.

Also rewords the synthesis-failure refusal from "we don't know runway X" (which reads as a data problem) to "we're not in position for the visual to runway X".

Fixes #880
Fixes #882

@nreisbeck
nreisbeck force-pushed the direct-downwind-visuals branch from bed7e14 to dadf7d4 Compare August 26, 2026 01:46
@nreisbeck

Copy link
Copy Markdown
Contributor Author

hold for bug fix

@nreisbeck
nreisbeck force-pushed the direct-downwind-visuals branch from dadf7d4 to 5a53d8c Compare August 26, 2026 23:22
- DTN (LDTN/RDTN with a turn direction) sends the aircraft direct to
  the assigned approach runway's threshold; DTF direct to the arrival
  airport. spoken forms: "turn left direct the numbers", "proceed
  direct the field". works before or after a visual approach
  clearance. (mmp#880)
- when the abeam projection onto the reference route is behind the
  aircraft (a downwind), a visual approach clearance now joins the
  route at a point downwind of the aircraft instead of refusing: it
  continues ahead, turns in to that fix, and flies the route inbound,
  per the suggestion in mmp#882. includes a regression test.
- reword the synthesis-failure refusal: "we don't know runway X" now
  reads "we're not in position for the visual to runway X"; the old
  text implied a data problem when the issue is geometry
@nreisbeck
nreisbeck force-pushed the direct-downwind-visuals branch from 5a53d8c to 1352fa7 Compare August 27, 2026 17:49

@mmp mmp left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry for not getting to this sooner. Looks generally good! A few comments below.

Comment thread stt/handlers.go
WithName("right_direct_numbers"), WithPriority(14),
)
registerSTTCommand(
"turn|proceed [direct] direct [to] the numbers",

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here and the next one has [direct] direct which seems redundant and above just has direct; I assume they should all be the same? IMHO [direct] is probably best as far as being a bit more forgiving, which is helpful with STT since the transcripts are often a little garbled.

Comment thread stt/handlers.go
// === NAVIGATION COMMANDS ===
// Direct the numbers / the field (must outrank the generic {fix}
// patterns so "the numbers" isn't fed to the fix matcher).
registerSTTCommand(

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please add entries in the "ATC Commands (Spoken)" section in website/index.html to document these.

Comment thread sim/command_parser.go

case 'L':
if len(command) >= 5 && command[1] == 'D' {
if command == "LDTN" {

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please add entries in the "ATC Commands (Keyboard)" section in website/index.html to document these. Also please add them to secondaryAcCommands in cmd/vice/ui.go so they're there in the app's help window.

Comment thread nav/commands.go
return av.MakeUnableIntent("unable. you haven't given us a runway")
}
wps := []av.Waypoint{
{Fix: "_NUMBERS", Location: ap.Threshold},

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the Waypoint here should have Flags: av.WaypointFlagLand (so that the aircraft is deleted when it reaches this point or goes around if it's still goo high) as well as an altitude restriction based on the runway elevation and threshold crossing height, roughly

rwy := ...
alt := rwy.Elevation + rwy.ThresholdCrossingHeight
wp.SetAltitudeRestriction(MakeAtAltitudeRestriction(float32(alt)))

Comment thread nav/commands.go
// DirectAirport has the pilot proceed direct to the arrival airport
// ("proceed direct the field").
func (nav *Nav) DirectAirport(turn av.TurnDirection, simTime Time, delayReduction time.Duration) av.CommandIntent {
wps := []av.Waypoint{nav.FlightState.ArrivalAirport}

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(Same comment as above w.r.t. flags and altitude restriction.)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

2 participants