# `BB.Dsl.Verifiers.ValidatePositionFeedback`
[🔗](https://github.com/beam-bots/bb/blob/main/lib/bb/dsl/verifiers/validate_position_feedback.ex#L5)

Warns about joints that are driven but never measured.

`BB.Robot.State` is written from `BB.Message.Sensor.JointState` messages and
from nothing else - commanding a joint doesn't move it in state, because a
commanded position isn't a measured one. A joint that nothing reports on
therefore stays at its initial configuration forever, which quietly ruins
anything reading it: forward kinematics, the URDF-driven visualisers, and
inverse kinematics, which seeds each solve from the current configuration.

Two things can report on a joint. A sensor declared alongside the actuator -
an encoder, or `BB.Sensor.OpenLoopPositionEstimator` interpolating from the
actuator's `BeginMotion` messages for hardware with no feedback at all. Or
the actuator itself, if it reads position back from the hardware and says so
through `c:BB.Actuator.capabilities/1`. A joint with neither gets a warning
naming both fixes.

The driver is asked directly rather than the robot's author being made to
declare it, because whether a smart servo answers position queries is a
property of the driver, not of the robot it's wired into.

Simulation adds an estimator to every actuator without a declared position
sensor; hardware doesn't, which is why this check exists.

It warns rather than failing the build. A robot that is only ever driven
open-loop, never asked where it is, is unusual but not wrong.

---

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