step.servo.steps

Classes

Easing

Built-in easing functions for SlowServo.

SetServoPosition

Set a servo to a target angle and optionally wait for the move to finish.

ShakeServo

Oscillate a servo back and forth between two angles for a set time.

SlowServo

Move a servo to an angle with smooth interpolated motion.

FullyDisableServos

Fully disable all servo outputs, removing all power from the servo pins.

Functions

servo(→ SetServoPosition)

Set a servo to a specific angle and wait for the move to finish.

Module Contents

class step.servo.steps.Easing(*args, **kwds)

Bases: enum.Enum

Built-in easing functions for SlowServo.

Each member wraps a callable (t: float) -> float that maps normalised time t ∈ [0, 1] to an eased progress value in [0, 1].

LINEAR

Constant speed — no acceleration or deceleration.

EASE_IN

Quadratic ease-in — slow start, fast end.

EASE_OUT

Quadratic ease-out — fast start, slow end.

EASE_IN_OUT

Smoothstep (3t² − 2t³) — gentle acceleration and deceleration (default).

EASE_IN_OUT_COSINE

Cosine-based ease-in-out — similar feel, slightly different curve shape.

class step.servo.steps.SetServoPosition(servo: raccoon.hal.Servo | ServoPreset, target_angle: float, duration: float | None = None)

Bases: raccoon.step.Step

Set a servo to a target angle and optionally wait for the move to finish.

required_resources() frozenset[str]
step.servo.steps.servo(servo: raccoon.hal.Servo, angle: float) SetServoPosition

Set a servo to a specific angle and wait for the move to finish.

Commands the servo to the requested angle, then sleeps for an estimated duration based on the angular distance the servo needs to travel and its approximate speed. This ensures subsequent steps do not begin until the servo has physically reached its target.

Parameters:
  • servo – The servo to control, obtained from the robot hardware map (e.g. robot.servo(0)).

  • angle – Target angle in degrees.

Returns:

A SetServoPosition step with automatically estimated wait duration.

Example:

from raccoon.step.servo import servo

# Open a claw by moving servo 0 to 90 degrees
servo(robot.servo(0), 90.0)

# Close the claw, then raise the arm
sequence(
    servo(robot.servo(0), 10.0),
    motor_move_to(robot.motor(2), position=400),
)
class step.servo.steps.ShakeServo(servo: raccoon.hal.Servo | ServoPreset, duration: float, angle_a: float, angle_b: float)

Bases: raccoon.step.Step

Oscillate a servo back and forth between two angles for a set time.

Rapidly alternates the servo between angle_a and angle_b for the given duration. The dwell time at each angle is automatically estimated from the angular distance so the servo has time to physically reach each endpoint before reversing. Useful for shaking objects loose or signalling the operator.

Parameters:
  • servo – The servo to control, obtained from the robot hardware map (e.g. robot.servo(1)).

  • duration – Total oscillation time in seconds. Must be >= 0.

  • angle_a – First oscillation endpoint in degrees.

  • angle_b – Second oscillation endpoint in degrees.

Example:

from raccoon.step.servo import shake_servo

# Shake a sorting tray for 3 seconds between 60 and 120 degrees
shake_servo(robot.servo(1), duration=3.0, angle_a=60.0, angle_b=120.0)
required_resources() frozenset[str]
class step.servo.steps.SlowServo(servo: raccoon.hal.Servo | ServoPreset, angle: float, speed: float = 60.0, easing: Easing | EasingFunc = Easing.EASE_IN_OUT)

Bases: raccoon.step.Step

Move a servo to an angle with smooth interpolated motion.

Instead of commanding the servo to jump straight to the target (as servo() does), this step interpolates through intermediate positions using an easing curve. The default is smoothstep ease-in-ease-out (3t² − 2t³), which gives gentle acceleration and deceleration. Other curves can be selected via the easing parameter.

The total move duration is derived from the angular distance divided by speed. Intermediate positions are updated at ~10 Hz.

Parameters:
  • servo – The servo to control, obtained from the robot hardware map (e.g. robot.servo(0)).

  • angle – Target angle in degrees.

  • speed – Movement speed in degrees per second. Must be positive. Defaults to 60.0 deg/s.

  • easing – Interpolation curve. Pass an Easing member or any callable (t: float) -> float mapping [0, 1] → [0, 1]. Defaults to Easing.EASE_IN_OUT.

Example:

from raccoon.step.servo import slow_servo, Easing

# Gently lower the arm servo to 20 degrees at 45 deg/s
slow_servo(robot.servo(0), angle=20.0, speed=45.0)

# Linear (constant-speed) motion
slow_servo(robot.servo(0), angle=150.0, easing=Easing.LINEAR)

# Ease-out only (fast start, slow stop)
slow_servo(robot.servo(0), angle=0.0, easing=Easing.EASE_OUT)
required_resources() frozenset[str]
class step.servo.steps.FullyDisableServos

Bases: raccoon.step.Step

Fully disable all servo outputs, removing all power from the servo pins.

Commands the firmware to enter the fully-disabled servo mode for every servo port. In this mode, no PWM signal is sent and the servos can be moved freely by hand. This is useful for saving power or when the servos should not hold position (e.g. at the end of a run).

Servos will automatically re-enable when a new position command is sent (e.g. via servo() or slow_servo()).

Example:

from raccoon.step.servo import fully_disable_servos

# Release all servos at the end of a mission
fully_disable_servos()
required_resources() frozenset[str]