123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195 |
- /*
- * Copyright (c) Contributors to the Open 3D Engine Project.
- * For complete copyright and license terms please see the LICENSE at the root of this distribution.
- *
- * SPDX-License-Identifier: Apache-2.0 OR MIT
- *
- */
- #include <AzCore/UnitTest/TestTypes.h>
- #include <AzTest/AzTest.h>
- #include <ROS2Controllers/Controllers/PidConfiguration.h>
- namespace UnitTest
- {
- static const uint64_t secToNanosec = 1e9;
- class PIDTest : public LeakDetectionFixture
- {
- };
- TEST_F(PIDTest, iClampAntiwindup)
- {
- double iGain = 1.0;
- double iMin = -1.0;
- double iMax = 1.0;
- ROS2Controllers::PidConfiguration pid(0.0, iGain, 0.0, iMax, iMin, true, 1.0);
- pid.InitializePid();
- double output = 0.0;
- output = pid.ComputeCommand(-10.0, 1 * secToNanosec);
- EXPECT_EQ(0.0, output);
- output = pid.ComputeCommand(30.0, 1 * secToNanosec);
- EXPECT_EQ(1.0, output);
- }
- TEST_F(PIDTest, iClampNoGain)
- {
- double iGain = 0.0;
- double iMin = -1.0;
- double iMax = 1.0;
- ROS2Controllers::PidConfiguration pid(0.0, iGain, 0.0, iMax, iMin, false, 0.0);
- pid.InitializePid();
- double output = 0.0;
- output = pid.ComputeCommand(-1.0, 1 * secToNanosec);
- EXPECT_LE(iMin, output);
- EXPECT_LE(output, iMax);
- EXPECT_EQ(0.0, output);
- output = pid.ComputeCommand(-1.0, 1 * secToNanosec);
- EXPECT_LE(iMin, output);
- EXPECT_LE(output, iMax);
- EXPECT_EQ(0.0, output);
- }
- TEST_F(PIDTest, iAntiwindup)
- {
- double iGain = 2.0;
- double iMin = -1.0;
- double iMax = 1.0;
- ROS2Controllers::PidConfiguration pid(0.0, iGain, 0.0, iMax, iMin, true, 0.0);
- pid.InitializePid();
- double output = 0.0;
- output = pid.ComputeCommand(-1.0, 1 * secToNanosec);
- EXPECT_EQ(-1.0, output);
- output = pid.ComputeCommand(-1.0, 1 * secToNanosec);
- EXPECT_EQ(-1.0, output);
- output = pid.ComputeCommand(0.5, 1 * secToNanosec);
- EXPECT_EQ(0.0, output);
- output = pid.ComputeCommand(-1.0, 1 * secToNanosec);
- EXPECT_EQ(-1.0, output);
- }
- TEST_F(PIDTest, negativeIAntiwindup)
- {
- double iGain = -2.5;
- double iMin = -0.2;
- double iMax = 0.5;
- ROS2Controllers::PidConfiguration pid(0.0, iGain, 0.0, iMax, iMin, true, 0.0);
- pid.InitializePid();
- double output = 0.0;
- output = pid.ComputeCommand(0.1, 1 * secToNanosec);
- EXPECT_EQ(-0.2, output);
- output = pid.ComputeCommand(0.1, 1 * secToNanosec);
- EXPECT_EQ(-0.2, output);
- output = pid.ComputeCommand(-0.05, 1 * secToNanosec);
- EXPECT_EQ(-0.075, output);
- output = pid.ComputeCommand(0.1, 1 * secToNanosec);
- EXPECT_EQ(-0.2, output);
- }
- TEST_F(PIDTest, pOnly)
- {
- ROS2Controllers::PidConfiguration pid(1.0, 0.0, 0.0, 0.0, 0.0, false, 0.0);
- pid.InitializePid();
- double output = 0.0;
- output = pid.ComputeCommand(-0.5, 1 * secToNanosec);
- EXPECT_EQ(-0.5, output);
- output = pid.ComputeCommand(-0.5, 1 * secToNanosec);
- EXPECT_EQ(-0.5, output);
- output = pid.ComputeCommand(-1.0, 1 * secToNanosec);
- EXPECT_EQ(-1.0, output);
- output = pid.ComputeCommand(0.5, 1 * secToNanosec);
- EXPECT_EQ(0.5, output);
- }
- TEST_F(PIDTest, iOnly)
- {
- ROS2Controllers::PidConfiguration pid(0.0, 1.0, 0.0, 5.0, -5.0, false, 0.0);
- pid.InitializePid();
- double output = 0.0;
- output = pid.ComputeCommand(-0.5, 1 * secToNanosec);
- EXPECT_EQ(-0.5, output);
- output = pid.ComputeCommand(-0.5, 1 * secToNanosec);
- EXPECT_EQ(-1.0, output);
- output = pid.ComputeCommand(0.0, 1 * secToNanosec);
- EXPECT_EQ(-1.0, output);
- output = pid.ComputeCommand(0.0, 1 * secToNanosec);
- EXPECT_EQ(-1.0, output);
- output = pid.ComputeCommand(1.0, 1 * secToNanosec);
- EXPECT_EQ(0.0, output);
- output = pid.ComputeCommand(-0.5, 1 * secToNanosec);
- EXPECT_EQ(-0.5, output);
- }
- TEST_F(PIDTest, dOnly)
- {
- ROS2Controllers::PidConfiguration pid(0.0, 0.0, 1.0, 0.0, 0.0, false, 0.0);
- pid.InitializePid();
- double output = 0.0;
- output = pid.ComputeCommand(-0.5, 1 * secToNanosec);
- EXPECT_EQ(-0.5, output);
- output = pid.ComputeCommand(-0.5, 1 * secToNanosec);
- EXPECT_EQ(0.0, output);
- output = pid.ComputeCommand(-0.5, 0 * secToNanosec);
- EXPECT_EQ(0.0, output);
- output = pid.ComputeCommand(-1.0, 1 * secToNanosec);
- EXPECT_EQ(-0.5, output);
- output = pid.ComputeCommand(-0.5, 1 * secToNanosec);
- EXPECT_EQ(0.5, output);
- }
- TEST_F(PIDTest, completePID)
- {
- ROS2Controllers::PidConfiguration pid(1.0, 1.0, 1.0, 5.0, -5.0, false, 0.0);
- pid.InitializePid();
- double output = 0.0;
- output = pid.ComputeCommand(-0.5, 1 * secToNanosec);
- EXPECT_EQ(-1.5, output);
- output = pid.ComputeCommand(-0.5, 1 * secToNanosec);
- EXPECT_EQ(-1.5, output);
- output = pid.ComputeCommand(-1.0, 1 * secToNanosec);
- EXPECT_EQ(-3.5, output);
- }
- } // namespace UnitTest
|