Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
71 changes: 0 additions & 71 deletions .claude/agents/modernizer.md

This file was deleted.

74 changes: 0 additions & 74 deletions .github/agents/modernizer.agent.md

This file was deleted.

80 changes: 20 additions & 60 deletions numerical/controllers/implementations/PidIncremental.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,9 @@ namespace controllers
class PidIncrementalBase
{
public:
void Reset();
void SetPoint(QNumberType setPoint);
void SetLimits(PidLimits<QNumberType> limits);
void SetTunings(PidTunings<QNumberType> tunnings);
void Enable();
void Disable();
QNumberType Process(QNumberType processVariable);

protected:
Expand Down Expand Up @@ -50,13 +48,11 @@ namespace controllers
{
public:
PidIncrementalAsynchronous(PidDriver<QNumberType>& driver, std::chrono::system_clock::duration sampleTime, PidTunings<QNumberType> tunnings, PidLimits<QNumberType> limits);
~PidIncrementalAsynchronous();

// Implementation of AsynchronousPidController
void Reset() override;
void SetPoint(QNumberType setPoint) override;
void SetLimits(PidLimits<QNumberType> limits) override;
void SetTunings(PidTunings<QNumberType> tunnings) override;
void Enable() override;
void Disable() override;

private:
PidDriver<QNumberType>& driver;
Expand All @@ -71,12 +67,9 @@ namespace controllers
public:
PidIncrementalSynchronous(PidTunings<QNumberType> tunnings, PidLimits<QNumberType> limits);

// Implementation of SynchronousPidController
void Reset() override;
void SetPoint(QNumberType setPoint) override;
void SetLimits(PidLimits<QNumberType> limits) override;
void SetTunings(PidTunings<QNumberType> tunnings) override;
void Enable() override;
void Disable() override;
QNumberType Process(QNumberType processVariable) override;
};

Expand All @@ -93,35 +86,20 @@ namespace controllers
}

template<class QNumberType>
void PidIncrementalBase<QNumberType>::SetPoint(QNumberType _setPoint)
{
this->setPointValue = _setPoint;
this->hasSetPoint = true;
}

template<class QNumberType>
void PidIncrementalBase<QNumberType>::Enable()
void PidIncrementalBase<QNumberType>::Reset()
{
u = QNumberType(0.0f);
u_1 = QNumberType(0.0f);

e = QNumberType(0.0f);
e_1 = QNumberType(0.0f);
e_2 = QNumberType(0.0f);
}

template<class QNumberType>
void PidIncrementalBase<QNumberType>::Disable()
{
hasSetPoint = false;
}

template<class QNumberType>
void PidIncrementalBase<QNumberType>::SetLimits(PidLimits<QNumberType> _limits)
void PidIncrementalBase<QNumberType>::SetPoint(QNumberType _setPoint)
{
really_assert(_limits.max > _limits.min);

this->limits = _limits;
this->setPointValue = _setPoint;
this->hasSetPoint = true;
}

template<class QNumberType>
Expand Down Expand Up @@ -173,31 +151,25 @@ namespace controllers
{
this->driver.ControlAction(this->PidIncrementalBase<QNumberType>::Process(processVariable));
});
driver.Start(sampleTime);
}

template<class QNumberType>
void PidIncrementalAsynchronous<QNumberType>::SetPoint(QNumberType _setPoint)
template<typename QNumberType>
PidIncrementalAsynchronous<QNumberType>::~PidIncrementalAsynchronous()
{
PidIncrementalBase<QNumberType>::SetPoint(_setPoint);
driver.Stop();
}

template<class QNumberType>
void PidIncrementalAsynchronous<QNumberType>::Enable()
void PidIncrementalAsynchronous<QNumberType>::Reset()
{
PidIncrementalBase<QNumberType>::Enable();
driver.Start(sampleTime);
}

template<typename QNumberType>
void PidIncrementalAsynchronous<QNumberType>::Disable()
{
driver.Stop();
PidIncrementalBase<QNumberType>::Reset();
}

template<class QNumberType>
void PidIncrementalAsynchronous<QNumberType>::SetLimits(PidLimits<QNumberType> limits)
void PidIncrementalAsynchronous<QNumberType>::SetPoint(QNumberType _setPoint)
{
PidIncrementalBase<QNumberType>::SetLimits(limits);
PidIncrementalBase<QNumberType>::SetPoint(_setPoint);
}

template<class QNumberType>
Expand All @@ -213,15 +185,15 @@ namespace controllers
}

template<class QNumberType>
void PidIncrementalSynchronous<QNumberType>::SetPoint(QNumberType setPoint)
void PidIncrementalSynchronous<QNumberType>::Reset()
{
PidIncrementalBase<QNumberType>::SetPoint(setPoint);
PidIncrementalBase<QNumberType>::Reset();
}

template<class QNumberType>
void PidIncrementalSynchronous<QNumberType>::SetLimits(PidLimits<QNumberType> limits)
void PidIncrementalSynchronous<QNumberType>::SetPoint(QNumberType setPoint)
{
PidIncrementalBase<QNumberType>::SetLimits(limits);
PidIncrementalBase<QNumberType>::SetPoint(setPoint);
}

template<class QNumberType>
Expand All @@ -230,18 +202,6 @@ namespace controllers
PidIncrementalBase<QNumberType>::SetTunings(tunnings);
}

template<class QNumberType>
void PidIncrementalSynchronous<QNumberType>::Enable()
{
PidIncrementalBase<QNumberType>::Enable();
}

template<class QNumberType>
void PidIncrementalSynchronous<QNumberType>::Disable()
{
PidIncrementalBase<QNumberType>::Disable();
}

template<class QNumberType>
OPTIMIZE_FOR_SPEED
QNumberType
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -91,3 +91,39 @@ TEST_F(TestBangBangHysteresis, custom_output_levels)
EXPECT_FLOAT_EQ(customRelay.Update(0.0f), -1.0f);
EXPECT_FLOAT_EQ(customRelay.Update(0.2f), 1.0f);
}

TEST_F(TestBangBangHysteresis, reset_to_high_state)
{
relay.Reset(controllers::RelayState::High);

EXPECT_EQ(relay.State(), controllers::RelayState::High);
EXPECT_FLOAT_EQ(relay.Update(0.0f), 1.0f);
EXPECT_EQ(relay.State(), controllers::RelayState::High);
}

TEST_F(TestBangBangHysteresis, stays_low_inside_band)
{
float output = relay.Update(0.1f);

EXPECT_EQ(relay.State(), controllers::RelayState::Low);
EXPECT_FLOAT_EQ(output, 0.0f);
}

TEST_F(TestBangBangHysteresis, does_not_switch_high_below_upper_threshold)
{
float output = relay.Update(0.19f);

EXPECT_EQ(relay.State(), controllers::RelayState::Low);
EXPECT_FLOAT_EQ(output, 0.0f);
}

TEST_F(TestBangBangHysteresis, reset_then_update_matches_fresh_instance)
{
relay.Update(0.3f);
relay.Reset();

controllers::BangBangHysteresis<float> fresh{ -0.2f, 0.2f, 0.0f, 1.0f };

EXPECT_FLOAT_EQ(relay.Update(0.1f), fresh.Update(0.1f));
EXPECT_EQ(relay.State(), fresh.State());
}
26 changes: 24 additions & 2 deletions numerical/controllers/implementations/test/TestFeedforward2Dof.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,9 @@ TEST_F(TestFeedforward2Dof, passes_correct_error_to_feedback)
EXPECT_CALL(ff, Evaluate(0.4f)).WillOnce(testing::Return(0.0f));
EXPECT_CALL(fb, Process(0.3f)).WillOnce(testing::Return(0.3f));

controller.Compute(0.4f, 0.1f);
float result{ controller.Compute(0.4f, 0.1f) };

EXPECT_NEAR(result, 0.3f, math::Tolerance<float>());
}

TEST_F(TestFeedforward2Dof, passes_reference_to_feedforward)
Expand Down Expand Up @@ -87,6 +89,26 @@ TEST_F(TestFeedforward2Dof, perfect_feedforward_zero_error)
EXPECT_NEAR(result, 0.7f, math::Tolerance<float>());
}

TEST_F(TestFeedforward2Dof, output_is_clamped_negative)
{
EXPECT_CALL(ff, Evaluate(testing::_)).WillOnce(testing::Return(-0.9f));
EXPECT_CALL(fb, Process(testing::_)).WillOnce(testing::Return(-0.9f));

float result{ controller.Compute(-1.0f, 0.0f) };

EXPECT_NEAR(result, -1.0f, math::Tolerance<float>());
}

TEST_F(TestFeedforward2Dof, zero_feedback_reduces_to_feedforward)
{
EXPECT_CALL(ff, Evaluate(0.5f)).WillOnce(testing::Return(0.4f));
EXPECT_CALL(fb, Process(testing::_)).WillOnce(testing::Return(0.0f));

float result{ controller.Compute(0.5f, 0.1f) };

EXPECT_NEAR(result, 0.4f, math::Tolerance<float>());
}

TEST_F(TestFeedforward2Dof, reset_delegates_to_feedback)
{
EXPECT_CALL(fb, Reset()).Times(1);
Expand All @@ -97,7 +119,7 @@ TEST_F(TestFeedforward2Dof, reset_delegates_to_feedback)
TEST_F(TestFeedforward2Dof, negative_reference_handled)
{
EXPECT_CALL(ff, Evaluate(-0.3f)).WillOnce(testing::Return(-0.2f));
EXPECT_CALL(fb, Process(testing::_)).WillOnce(testing::Return(-0.1f));
EXPECT_CALL(fb, Process(-0.3f)).WillOnce(testing::Return(-0.1f));

float result{ controller.Compute(-0.3f, 0.0f) };

Expand Down
Loading
Loading