PidConfiguration.cpp 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #include <AzCore/Serialization/EditContext.h>
  9. #include <AzCore/Serialization/EditContextConstants.inl>
  10. #include <AzCore/Serialization/SerializeContext.h>
  11. #include <ROS2/VehicleDynamics/DriveModels/PidConfiguration.h>
  12. namespace ROS2::VehicleDynamics
  13. {
  14. void PidConfiguration::Reflect(AZ::ReflectContext* context)
  15. {
  16. if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(context))
  17. {
  18. serializeContext->Class<PidConfiguration>()
  19. ->Version(1)
  20. ->Field("P", &PidConfiguration::m_p)
  21. ->Field("I", &PidConfiguration::m_i)
  22. ->Field("D", &PidConfiguration::m_d)
  23. ->Field("IMin", &PidConfiguration::m_iMin)
  24. ->Field("IMax", &PidConfiguration::m_iMax)
  25. ->Field("Anti windup", &PidConfiguration::m_antiWindup)
  26. ->Field("Output limit", &PidConfiguration::m_outputLimit);
  27. if (AZ::EditContext* ec = serializeContext->GetEditContext())
  28. {
  29. ec->Class<PidConfiguration>("PID configuration", "Configures a PID controller")
  30. ->DataElement(1, &PidConfiguration::m_p, "P", "Proportional gain")
  31. ->Attribute(AZ::Edit::Attributes::Min, 0.0)
  32. ->DataElement(AZ::Edit::UIHandlers::Default, &PidConfiguration::m_i, "I", "Integral gain")
  33. ->Attribute(AZ::Edit::Attributes::Min, 0.0)
  34. ->DataElement(AZ::Edit::UIHandlers::Default, &PidConfiguration::m_d, "D", "Derivative gain")
  35. ->Attribute(AZ::Edit::Attributes::Min, 0.0)
  36. ->DataElement(AZ::Edit::UIHandlers::Default, &PidConfiguration::m_iMin, "IMin", "Minimum allowable integral term")
  37. ->Attribute(AZ::Edit::Attributes::Min, 0.0)
  38. ->DataElement(AZ::Edit::UIHandlers::Default, &PidConfiguration::m_iMax, "IMax", "Maximum allowable integral term")
  39. ->Attribute(AZ::Edit::Attributes::Min, 0.0)
  40. ->DataElement(AZ::Edit::UIHandlers::Default, &PidConfiguration::m_antiWindup, "AntiWindup", "Anti windup")
  41. ->DataElement(
  42. AZ::Edit::UIHandlers::Default,
  43. &PidConfiguration::m_outputLimit,
  44. "OutputLimit",
  45. "Limit of the PID output [0, INF]. Set to 0.0 to disable.")
  46. ->Attribute(AZ::Edit::Attributes::Min, 0.0);
  47. }
  48. }
  49. }
  50. void PidConfiguration::InitializePid()
  51. {
  52. m_pid.initPid(m_p, m_i, m_d, m_iMax, m_iMin, m_antiWindup);
  53. }
  54. double PidConfiguration::ComputeCommand(double error, uint64_t deltaTimeNanoseconds)
  55. {
  56. double output = m_pid.computeCommand(error, deltaTimeNanoseconds);
  57. if (m_outputLimit > 0.0)
  58. {
  59. output = AZStd::clamp<float>(output, -m_outputLimit, m_outputLimit);
  60. }
  61. return output;
  62. }
  63. } // namespace ROS2::VehicleDynamics