1#include "velocityController.h"
4int VoltageController::sign(
double x) {
5 return (x > 0) - (x < 0);
8VoltageController::VoltageController(
double kv,
double kaStraight,
double kaTurn,
double ksStraight,
double ksTurn,
double kp,
9 double ki,
double integralThreshold,
double trackWidth)
10 : kV(kv), kaStraight(kaStraight), kaTurn(kaTurn), ksStraight(ksStraight), ksTurn(ksTurn), kP(kp), kI(ki),
11 integralThreshold(integralThreshold), trackWidth(trackWidth) {}
13DrivetrainVoltages VoltageController::update(
double targetLinearVelocity,
double targetAngularVelocity,
double measuredLeftVelocity,
14 double measuredRightVelocity) {
16 double deltaW = (targetAngularVelocity - prevAngularVelocity) / 0.01;
18 double deltaV = (targetLinearVelocity - prevLinearVelocity) / 0.01;
20 prevAngularVelocity = targetAngularVelocity;
21 prevLinearVelocity = targetLinearVelocity;
23 double leftVelocity = targetLinearVelocity - targetAngularVelocity * (trackWidth / 2.0);
24 double rightVelocity = targetLinearVelocity + targetAngularVelocity * (trackWidth / 2.0);
26 double leftError = leftVelocity - measuredLeftVelocity;
27 double rightError = rightVelocity - measuredRightVelocity;
29 if ((leftError < 0) != (prevLeftError < 0)) {
32 if (std::abs(leftError) < integralThreshold) {
33 leftIntegral += leftError * 0.01;
35 if ((rightError < 0) != (prevRightError < 0)) {
38 if (std::abs(rightError) < integralThreshold) {
39 rightIntegral += rightError * 0.01;
42 double kaLeft = (kaStraight * deltaV) - (kaTurn * deltaW);
43 double kaRight = (kaStraight * deltaV) + (kaTurn * deltaW);
45 double ksLeft = (ksStraight * sign(leftVelocity)) - (ksTurn * sign(targetAngularVelocity));
46 double ksRight = (ksStraight * sign(rightVelocity)) + (ksTurn * sign(targetAngularVelocity));
49 (kV * leftVelocity) + (kaLeft) + (ksLeft) + (kP * leftError) + (kI * leftIntegral);
51 (kV * rightVelocity) + (kaRight) + (ksRight) + (kP * rightError) + (kI * rightIntegral);
52 double ratio = std::max(fabs(leftVoltage), fabs(rightVoltage)) / 12000.0;
55 rightVoltage /= ratio;
58 return {leftVoltage, rightVoltage};