1
Fork 0

chore: remove distance to target from model input

This commit is contained in:
Tibo De Peuter 2026-04-28 17:27:08 +02:00
parent 33fbc4c96f
commit 49f5874035
Signed by: tdpeuter
SSH key fingerprint: SHA256:u/h/LVoqKF1Iz02uOyxe6hcjmoZASCGV2HM0TG9ZMoU
3 changed files with 5 additions and 5 deletions

View file

@ -16,8 +16,7 @@ Global inputs, always broadcasted to all nodes:
$$ $$
tilt = sqrt(roll^2 + pitch^2) tilt = sqrt(roll^2 + pitch^2)
$$ $$
- Goal vector: Instead of just a scalar distance, the goal is represented asa a vector (distance and ange/direction) to - Goal vector: Instead of just a scalar distance, the goal is represented as an angle/direction to the target.
the target.
Local inputs, routed directly to specific nodes: Local inputs, routed directly to specific nodes:
@ -70,6 +69,10 @@ When designing the state space, we must ask: *Could a human operator perform thi
as a normalized unit vector bounds the values to the $[-1, 1]$ range, which stabilizes neural network training. as a normalized unit vector bounds the values to the $[-1, 1]$ range, which stabilizes neural network training.
Providing only a scalar "distance to the goal" would force the agent to learning localized searching behaviors (e.g. Providing only a scalar "distance to the goal" would force the agent to learning localized searching behaviors (e.g.
random walks or spiraling) to deduce the direction, drastically increasing the difficulty of the learning task. random walks or spiraling) to deduce the direction, drastically increasing the difficulty of the learning task.
**NOTE:** We later dropped the "distance to vector", switching to only a direction as the input. Our reasoning is
the agent should always move towards the goal (it should not learn to stop at the goal), which allows for this
simplification that decreases the model input size.
- Contact sensors: Segment contact detects external ground interaction and is biologically vital for timing gait - Contact sensors: Segment contact detects external ground interaction and is biologically vital for timing gait
transitions. transitions.
- **Zero-Centered Rescaling ($[-1, 1]$):** Using a zero-centered range is standard best practice for continuous control - **Zero-Centered Rescaling ($[-1, 1]$):** Using a zero-centered range is standard best practice for continuous control

View file

@ -72,7 +72,6 @@ class ObservationBoundsConfig:
joint_actuator_force: list[float] = field(default_factory=lambda: [-5.0, 5.0]) joint_actuator_force: list[float] = field(default_factory=lambda: [-5.0, 5.0])
segment_contact: list[float] = field(default_factory=lambda: [0.0, 1.0]) segment_contact: list[float] = field(default_factory=lambda: [0.0, 1.0])
unit_xy_direction_to_target: list[float] = field(default_factory=lambda: [-1.0, 1.0]) unit_xy_direction_to_target: list[float] = field(default_factory=lambda: [-1.0, 1.0])
xy_distance_to_target: list[float] = field(default_factory=lambda: [0.0, 20.0])
disk_z_tilt: list[float] = field(default_factory=lambda: [0.0, 3.141592653589793]) disk_z_tilt: list[float] = field(default_factory=lambda: [0.0, 3.141592653589793])
def to_bounds_dict(self) -> dict[str, tuple[float, float]]: def to_bounds_dict(self) -> dict[str, tuple[float, float]]:
@ -82,6 +81,5 @@ class ObservationBoundsConfig:
"joint_actuator_force": tuple(self.joint_actuator_force), "joint_actuator_force": tuple(self.joint_actuator_force),
"segment_contact": tuple(self.segment_contact), "segment_contact": tuple(self.segment_contact),
"unit_xy_direction_to_target": tuple(self.unit_xy_direction_to_target), "unit_xy_direction_to_target": tuple(self.unit_xy_direction_to_target),
"xy_distance_to_target": tuple(self.xy_distance_to_target),
"disk_z_tilt": tuple(self.disk_z_tilt), "disk_z_tilt": tuple(self.disk_z_tilt),
} }

View file

@ -63,7 +63,6 @@ def create_obs_processor(
"joint_velocity", "joint_velocity",
"segment_contact", "segment_contact",
"unit_xy_direction_to_target", "unit_xy_direction_to_target",
"xy_distance_to_target",
] ]
values = [] values = []
for key in ordered_keys: for key in ordered_keys: