# `Monty.Frameworks.Models.MotorPolicies.SurfacePolicyTelemetry`
[🔗](https://github.com/d-led/ex.tbp.monty/blob/v0.1.0/packages/ex_tbp_monty_core/lib/monty/frameworks/models/motor_policies/surface_policy_telemetry.ex#L1)

Why a surface policy chose the action it chose.

Mirrors `tbp/monty/frameworks/models/motor_policies.py::SurfacePolicyTelemetry`:
which principal curvature the policy headed along, whether the step was one of
its moves to get out of a tight spot, and the curvature vectors it used. A
policy that is doing something strange is explained here rather than guessed
at from the actions alone.

# `pc_heading`

```elixir
@type pc_heading() :: :min | :max | :no | :jump | nil
```

# `t`

```elixir
@type t() :: %Monty.Frameworks.Models.MotorPolicies.SurfacePolicyTelemetry{
  avoidance_heading: boolean() | nil,
  pc_heading: pc_heading(),
  z_defined_pc: term()
}
```

---

*Consult [api-reference.md](api-reference.md) for complete listing*
