Skip to content

File servo.cpp

File List > controls > sae_2025_ws > src > payload > src > servo.cpp

Go to the documentation of this file

#include "payload/servo.hpp"

#include <algorithm>

Servo::Servo(int pi, int pin, int frequency, float pulse_min_u, float pulse_max_u)
: frequency_(frequency),
  servo_pin_(pi, pin, Direction::Output),
  pulse_min_u_(pulse_min_u),
  pulse_max_u_(pulse_max_u) {}

void Servo::degree_setpoint(float degree) {
    int pulse = angle_to_pulse(degree);
    RCLCPP_DEBUG(logger(), "Outputting pulse: %d", pulse);
    servo_pin_.write_servo(pulse);
}

void Servo::normalized_setpoint(float t) {
    const float clamped = std::clamp(t, 0.0f, 1.0f);
    const int pulse = static_cast<int>(
        pulse_min_u_ + clamped * (pulse_max_u_ - pulse_min_u_));
    RCLCPP_DEBUG(logger(), "Normalized %.2f -> pulse: %d", clamped, pulse);
    servo_pin_.write_servo(pulse);
}

int Servo::angle_to_pulse(float degree) {
    const float clamped = std::clamp(degree, 0.0f, 180.0f);
    return static_cast<int>(
        pulse_min_u_ + (clamped / 180.0f) * (pulse_max_u_ - pulse_min_u_));
}

rclcpp::Logger Servo::logger() {
    return rclcpp::get_logger("servo");
}