Skip to content

Can DWB be tuned to penetrate deeper into the XY goal region before final rotation, without changing xy_goal_tolerance? #6099

@maartenkoks

Description

@maartenkoks

Hi all,

I am doing a sim-to-real analysis of MPPI vs DWB on a skid-steer robot in a narrow warehouse task, and I am trying to understand whether DWB can be made to drive deeper into the XY goal region before final rotation, without tightening DWB’s own internal near-goal tolerance.

Context

  • Platform: skid-steer / differential-drive robot
  • Stack: Nav2 Jazzy
  • Controllers compared: DWB vs MPPI
  • Same robot, same task, same localization pipeline, same goals, same goal checker
  • Goal checker: SimpleGoalChecker(xy_goal_tolerance=0.10, yaw_goal_tolerance=0.05, stateful=false)
  • I am explicitly comparing native controller behaviour, so I am not using Rotation Shim or controller switching

Observed behaviour in the controller-visible map frame

  • DWB sim: 29/30 success
  • DWB real: 1/15 success
  • MPPI sim: 29/30 success
  • MPPI real: 15/15 success

Near-goal metrics:

  • DWB median min_xy_err: 0.094 m in sim, 0.105 m in real
  • MPPI median min_xy_err: 0.023 m in sim, 0.030 m in real

What I consistently see is:

  • DWB tends to operate right at the XY tolerance boundary
  • Near goal, DWB often becomes rotate-dominant while still having very little XY margin
  • MPPI tends to drive much deeper into the goal region before final orientation correction

This makes DWB much more sensitive to small real-world effects such as skid-steer motion behaviour, wheel separation / ICR mismatch, low-speed rotation effects, and localization imperfections.

What I can already do
I was able to make DWB converge much deeper by reducing DWB’s internal xy_goal_tolerance from 0.10 to 0.05, while keeping the external goal checker at 0.10.

In a runtime single-goal probe, that gave:

  • final_xy_error: 0.057 m
  • min_xy_error_est: 0.053 m
  • success: True

So tightening the controller’s internal near-goal threshold clearly changes the behaviour in the direction I want.

My actual question
I do NOT mainly want to know whether DWB can be made deeper by changing its internal xy_goal_tolerance, because I have already confirmed that.

What I want to understand is:

Can DWB be made to converge deeper before final rotation while keeping its internal xy_goal_tolerance unchanged?

In other words:

  • is deeper XY penetration fundamentally tied to the internal threshold at which DWB switches into terminal behaviour
  • or are there supported ways to get similar behaviour from the algorithm itself, without moving that threshold?

More concretely:

  1. Is DWB fundamentally expected to stop around its internal xy_goal_tolerance and then rotate?
  2. If I keep that internal threshold unchanged, are there tuning paths that can still make DWB translate deeper before final rotation?
  3. If yes, which parameters matter most?
    • RotateToGoal
    • slowing_factor
    • GoalDist, GoalAlign, PathAlign
    • sampling / horizon settings
    • any other near-goal mechanism
  4. Or is this effectively a structural limitation of DWB, where deeper terminal convergence mostly requires changing the internal threshold itself?

What I already tried

  • Changing critic weights
  • Adjusting RotateToGoal related settings
  • Trying to bias the controller toward stronger translational convergence near goal

So far, the only thing that clearly changes the behaviour in the desired way is reducing DWB’s internal xy_goal_tolerance.

That is why my main question is whether I am missing an intended algorithmic tuning path, or whether this is simply not how DWB is designed to behave.

If useful, I can also share:

  • a minimal config
  • the runtime single-goal probe output
  • short near-goal trajectory plots comparing DWB and MPPI

Metadata

Metadata

Assignees

No one assigned

    Labels

    questionFurther information is requested

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions