step.motion.resync ================== .. py:module:: step.motion.resync .. autoapi-nested-parse:: Minimal resync steps that inject observations into the localization filter. Classes ------- .. autoapisummary:: step.motion.resync.ResyncAtStartPose step.motion.resync.FindLineResync step.motion.resync.AlignToWallResync Functions --------- .. autoapisummary:: step.motion.resync.resync_at_start_pose step.motion.resync.find_line_resync step.motion.resync.align_to_wall_resync Module Contents --------------- .. py:class:: ResyncAtStartPose(expected_x_cm: float | None = None, expected_y_cm: float | None = None, expected_theta_deg: float | None = None, snap_axes: tuple[bool, bool, bool] = (True, True, True), sigma_xy_cm: float = 1.0, sigma_theta_deg: float = 5.0) Bases: :py:obj:`step.Step` Inject a direct absolute pose observation without additional motion. Reads the robot's current odometry pose (or uses supplied override values) and feeds it as an absolute-pose observation into the localization filter. Use this at the start of a run to anchor the EKF to the known start pose. :param expected_x_cm: Override for the expected X position in cm. If None, the robot's current odometric X is used. :param expected_y_cm: Override for the expected Y position in cm. If None, the robot's current odometric Y is used. :param expected_theta_deg: Override for the expected heading in degrees. If None, the robot's current odometric heading is used. :param snap_axes: Which axes (x, y, theta) to include in the observation. Defaults to (True, True, True) — all three. :param sigma_xy_cm: Position uncertainty (standard deviation) in cm. :param sigma_theta_deg: Heading uncertainty (standard deviation) in degrees. Example:: from raccoon.step.motion import resync_at_start_pose resync_at_start_pose(expected_x_cm=0.0, expected_y_cm=0.0, expected_theta_deg=0.0) .. py:attribute:: expected_x_cm :value: None .. py:attribute:: expected_y_cm :value: None .. py:attribute:: expected_theta_deg :value: None .. py:attribute:: snap_axes :value: (True, True, True) .. py:attribute:: sigma_xy_cm :value: 1.0 .. py:attribute:: sigma_theta_deg :value: 5.0 .. py:class:: FindLineResync(sensor: raccoon.sensor_ir.IRSensor, sensor_position: raccoon.map.SensorOffset, *, expected_x_cm: float | None = None, expected_y_cm: float | None = None, expected_theta_deg: float | None = None, snap_axes: tuple[bool, bool, bool] = (False, True, False), sigma_xy_cm: float = 1.0, sigma_theta_deg: float = 5.0, line_sigma_cm: float = 0.75, threshold: float = 0.7, forward_speed_mps: float = 0.15, strafe_speed_mps: float = 0.0, timeout_s: float = 3.0) Bases: :py:obj:`step.motion.motion_step.MotionStep` Drive until an IR sensor sees a line, then inject a localization observation. .. py:attribute:: sensor .. py:attribute:: sensor_position .. py:attribute:: expected_x_cm :value: None .. py:attribute:: expected_y_cm :value: None .. py:attribute:: expected_theta_deg :value: None .. py:attribute:: snap_axes :value: (False, True, False) .. py:attribute:: sigma_xy_cm :value: 1.0 .. py:attribute:: sigma_theta_deg :value: 5.0 .. py:attribute:: line_sigma_cm :value: 0.75 .. py:attribute:: threshold :value: 0.7 .. py:attribute:: forward_speed_mps :value: 0.15 .. py:attribute:: strafe_speed_mps :value: 0.0 .. py:attribute:: timeout_s :value: 3.0 .. py:method:: on_start(robot: raccoon.robot.api.GenericRobot) -> None .. py:method:: on_update(robot: raccoon.robot.api.GenericRobot, dt: float) -> bool .. py:class:: AlignToWallResync(direction: step.motion.wall_align.WallDirection = WallDirection.FORWARD, *, expected_x_cm: float | None = None, expected_y_cm: float | None = None, expected_theta_deg: float | None = None, snap_axes: tuple[bool, bool, bool] = (True, True, True), sigma_xy_cm: float = 1.0, sigma_theta_deg: float = 5.0, wall_sigma_cm: float = 0.75, sensor_position: SensorOffset | None = None, speed: float = 1.0, accel_threshold: float = 0.5, settle_duration: float = 0.2, max_duration: float = 5.0, grace_period: float = 0.3) Bases: :py:obj:`step.Step` Run wall-align, then inject a wall-based observation into localization. .. py:attribute:: direction .. py:attribute:: expected_x_cm :value: None .. py:attribute:: expected_y_cm :value: None .. py:attribute:: expected_theta_deg :value: None .. py:attribute:: snap_axes :value: (True, True, True) .. py:attribute:: sigma_xy_cm :value: 1.0 .. py:attribute:: sigma_theta_deg :value: 5.0 .. py:attribute:: wall_sigma_cm :value: 0.75 .. py:attribute:: sensor_position :value: None .. py:method:: required_resources() -> frozenset[str] Return the hardware resources this step requires exclusive access to. For leaf steps (drive, motor, servo), return the resources this step directly uses. Composite steps override ``collected_resources`` instead to include children — ``required_resources`` stays empty for composites because they don't touch hardware themselves. .. py:function:: resync_at_start_pose(expected_x_cm: float | None = None, expected_y_cm: float | None = None, expected_theta_deg: float | None = None, *, snap_axes: tuple[bool, bool, bool] = (True, True, True), sigma_xy_cm: float = 1.0, sigma_theta_deg: float = 5.0) -> ResyncAtStartPose .. py:function:: find_line_resync(sensor: raccoon.sensor_ir.IRSensor, sensor_position: raccoon.map.SensorOffset, *, expected_x_cm: float | None = None, expected_y_cm: float | None = None, expected_theta_deg: float | None = None, snap_axes: tuple[bool, bool, bool] = (False, True, False), sigma_xy_cm: float = 1.0, sigma_theta_deg: float = 5.0, line_sigma_cm: float = 0.75, threshold: float = 0.7, forward_speed_mps: float = 0.15, strafe_speed_mps: float = 0.0, timeout_s: float = 3.0) -> FindLineResync .. py:function:: align_to_wall_resync(*, direction: step.motion.wall_align.WallDirection = WallDirection.FORWARD, expected_x_cm: float | None = None, expected_y_cm: float | None = None, expected_theta_deg: float | None = None, snap_axes: tuple[bool, bool, bool] = (True, True, True), sigma_xy_cm: float = 1.0, sigma_theta_deg: float = 5.0, wall_sigma_cm: float = 0.75, sensor_position: SensorOffset | None = None, speed: float = 1.0, accel_threshold: float = 0.5, settle_duration: float = 0.2, max_duration: float = 5.0, grace_period: float = 0.3) -> AlignToWallResync