Skip to content

v3.8.0

Choose a tag to compare

@github-actions github-actions released this 14 Oct 16:57
· 3 commits to main since this release
0756749

Motion validation is public, and it is the planner's own check (#230).
sscbirrt.Validator answers for a state, a motion, a path or a timed
trajectory under an explicit policy. The planner returns a path or
trajectory only after that same validator accepts it. Seeded paths differ
from 3.7 because edge subdivision now tolerates rounding.

Added

  • Public motion validation (#230). sscbirrt.Validator validates a state, one motion or a whole path, and
    returns a ValidationReport: valid under the reported ValidationPolicy, or the first invalid state with its
    segment, fraction, failure kind, contacts (native MuJoCo scene) and violated path-constraint member. It is the
    planner's own check: Validator.for_problem(problem, config), in Python and natively (sscbirrt::Validator), with
    the native core used when every component lowers.

    • Motions are raw-linear: the straight line in raw joint values, as runtimes execute it. A continuous joint is never
      wrapped, so a half turn or more is validated as the long raw line.
    • PlanResult.validation is the returned path's report. A planner returns a path only after validating it whole;
      a path that fails is not returned (failure_reason "Returned path failed final validation", native status
      invalid_result). Only checkers that are not invariant to full turns of a continuous joint can fail it.
    • sscbirrt._native.__version__, and a StateValidator::contacts hook that witnesses use.
  • Timed trajectories are validated whole (#230). Validator.validate_trajectory checks a trajectory's whole law:

    • pieces along its source path (Trajectory.path) at the path's own states within their span;
    • other pieces at speed-bounded time steps;
    • position limits exactly, at every ramp's turning point.

    Its witness gives the piece and time_s. A trajectory that breaks its own invariants raises MalformedTrajectory.
    The smoother accepts a shortcut only if every piece the splice leaves passes this rule, and Trajectory.validation
    is the returned trajectory's report. A trajectory that failed would not be returned ("Returned trajectory failed
    final validation").

  • sscbirrt.mujoco.validator(model, data, arm, ...): the validator plan with the same arguments applies.

  • Evidence for #230.

    • tools/validation_artifact.py writes tests/reference/validation_evidence.json, and a test holds a fresh run's
      verdicts to it. On a small native MuJoCo world it records, for both backends:
      • an accepted and a rejected path, with the rejection's witness;
      • a trajectory along its path (an exact reparameterization), and a trace-changing shortcut through the wall;
      • the reports from planning next to the public calls;
      • repeated and reordered queries.
    • tools/geodude_132_evidence.py reruns the reduced Geodude edge of personalrobotics/ssrobot#132 inside ssrobot and
      records the result in tests/reference/geodude_132_evidence.json. Its timed trajectory crosses the left gripper
      for 4 ms inside a shortcut.
      • The 3.7 rule and this validator both accept it under the 0.05 policy, and planning and the public call agree.
      • The miss is the policy's, which #222 owns.
  • Two modes of motion check (#230).

    • Prefix: MotionValidator.validate answers how far from the start a motion is valid. Tree growth keeps that
      prefix, so it checks in order.
    • Whole: the new optional validate_whole (native: a virtual with a default through validate) answers whether
      the whole motion is valid. It returns the same configurations on a yes, and checks the same states in van der
      Corput order, so it stops sooner on a no. Path shortcuts and trajectory shortcut acceptance use it.
    • Reports: Validator answers whole first. On a failure it refines to the earliest invalid state.
    • Verdicts and planner outputs are unchanged; only the order of the checks differs.

Changed

  • Edge subdivision tolerates rounding (#230). An edge of length d is checked at max(1, ceil(d / resolution - 1e-9)) intervals, in the planner and the validator alike. Without the tolerance, a path piece exactly one resolution
    long, recomputed from its stored nodes, could split in two, so the final check sampled a state the planner never
    checked (one door path in 20 failed at such a midpoint). It also drops the redundant third sample that a step of
    exactly step_size took. Search state checks fall 4–14% on the benchmark problems (door about 1%), with every
    problem still succeeding 100%. Seeded paths differ from 3.7; the reference artifact's cases and statuses do not.