Program Listing for File RamseteController.cpp
↰ Return to documentation for file (src/LouLib/Controllers/RamseteController.cpp
)
#include "RamseteController.hpp"
namespace LouLib {
namespace Controllers {
RamseteController::RamseteController(double b, double zeta) : b(b), zeta(zeta) {}
void RamseteController::computeControl(Paths::Trajectory& t, int idx, Math::Pose2D robotPose) {
double targX = t.getX(idx).to(Units::METER);
double targY = t.getY(idx).to(Units::METER);
double targTheta = t.getTheta(idx).to(Units::RADIAN);
double targV = t.getVelocity(idx).to(Units::METER_PER_SECOND);
double targOmega = t.getAngularVelocity(idx).to(Units::RADIAN_PER_SECOND);
double robotX = robotPose.getX().to(Units::METER);
double robotY = robotPose.getY().to(Units::METER);
double robotTheta = robotPose.getTheta().to(Units::RADIAN);
double targTheta_deg = t.getTheta(idx).to(Units::DEGREE);
double robotTheta_deg = robotPose.getTheta().to(Units::DEGREE);
double deltaX = targX - robotX;
double deltaY = targY - robotY;
double deltaTheta = (Math::angleDifference(targTheta_deg, robotTheta_deg)*Units::DEGREE).to(Units::RADIAN);
if(std::abs(deltaTheta) < Math::EPS) deltaTheta += 0.0001;
double ex = std::cos(robotTheta)*deltaX + std::sin(robotTheta)*deltaY;
double ey = -std::sin(robotTheta)*deltaX + std::cos(robotTheta)*deltaY;
double et = deltaTheta;
double k = 2*zeta*std::sqrt(targOmega*targOmega + b*targV*targV);
v = (targV*std::cos(et) + k*ex) * Units::METER_PER_SECOND;
omega = (targOmega + k*et + b*targV*std::sin(et)*ey/et) * Units::RADIAN_PER_SECOND;
}
const Units::Velocity &RamseteController::getV() const {
return v;
}
const Units::AngularVelocity &RamseteController::getOmega() const {
return omega;
}
} // LouLib
} // Controllers