SkidSteeringModelLimits.cpp 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  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 "SkidSteeringModelLimits.h"
  9. #include <AzCore/Serialization/EditContext.h>
  10. #include <AzCore/Serialization/EditContextConstants.inl>
  11. #include <AzCore/Serialization/SerializeContext.h>
  12. namespace ROS2Controllers::VehicleDynamics
  13. {
  14. void SkidSteeringModelLimits::Reflect(AZ::ReflectContext* context)
  15. {
  16. if (AZ::SerializeContext* serialize = azrtti_cast<AZ::SerializeContext*>(context))
  17. {
  18. serialize->Class<SkidSteeringModelLimits>()
  19. ->Version(1)
  20. ->Field("LinearLimit", &SkidSteeringModelLimits::m_linearLimit)
  21. ->Field("AngularLimit", &SkidSteeringModelLimits::m_angularLimit)
  22. ->Field("LinearAcceleration", &SkidSteeringModelLimits::m_linearAcceleration)
  23. ->Field("AngularAcceleration", &SkidSteeringModelLimits::m_angularAcceleration);
  24. if (AZ::EditContext* ec = serialize->GetEditContext())
  25. {
  26. ec->Class<SkidSteeringModelLimits>("Skid steering Model Limits", "Limitations of speed, steering angles and other values")
  27. ->ClassElement(AZ::Edit::ClassElements::EditorData, "")
  28. ->Attribute(AZ::Edit::Attributes::Category, "ROS2")
  29. ->DataElement(
  30. AZ::Edit::UIHandlers::Default,
  31. &SkidSteeringModelLimits::m_linearLimit,
  32. "Linear speed Limit",
  33. "Max linear speed (meters/sec)")
  34. ->Attribute(AZ::Edit::Attributes::Min, 0.0f)
  35. ->Attribute(AZ::Edit::Attributes::Max, 100.0f)
  36. ->DataElement(
  37. AZ::Edit::UIHandlers::Default,
  38. &SkidSteeringModelLimits::m_angularLimit,
  39. "Angular speed Limit",
  40. "Max angular speed (rad/s)")
  41. ->Attribute(AZ::Edit::Attributes::Min, 0.0f)
  42. ->Attribute(AZ::Edit::Attributes::Max, 10.0f)
  43. ->DataElement(
  44. AZ::Edit::UIHandlers::Default,
  45. &SkidSteeringModelLimits::m_angularAcceleration,
  46. "Angular acceleration",
  47. "Acceleration in rad/s²")
  48. ->Attribute(AZ::Edit::Attributes::Min, 0.0f)
  49. ->Attribute(AZ::Edit::Attributes::Max, 100.0f)
  50. ->DataElement(
  51. AZ::Edit::UIHandlers::Default,
  52. &SkidSteeringModelLimits::m_linearAcceleration,
  53. "Linear acceleration",
  54. "Acceleration in m/s²")
  55. ->Attribute(AZ::Edit::Attributes::Min, 0.0f)
  56. ->Attribute(AZ::Edit::Attributes::Max, 100.0f);
  57. }
  58. }
  59. }
  60. SkidSteeringModelLimits::SkidSteeringModelLimits(
  61. const float linearLimit, const float angularLimit, const float linearAcceleration, const float angularAcceleration)
  62. {
  63. m_linearLimit = AZStd::clamp(linearLimit, 0.0f, 100.0f);
  64. m_angularLimit = AZStd::clamp(angularLimit, 0.0f, 10.0f);
  65. m_linearAcceleration = AZStd::clamp(linearAcceleration, 0.0f, 100.0f);
  66. m_angularAcceleration = AZStd::clamp(angularAcceleration, 0.0f, 100.0f);
  67. }
  68. VehicleInputs SkidSteeringModelLimits::LimitState(const VehicleInputs& inputState) const
  69. {
  70. VehicleInputs ret = inputState;
  71. ret.m_speed = AZ::Vector3{ LimitValue(ret.m_speed.GetX(), m_linearLimit), 0.f, 0.f };
  72. ret.m_angularRates = AZ::Vector3{ 0.f, 0.f, LimitValue(ret.m_angularRates.GetZ(), m_angularLimit) };
  73. return ret;
  74. }
  75. VehicleInputs SkidSteeringModelLimits::GetMaximumState() const
  76. {
  77. VehicleInputs ret;
  78. ret.m_speed = { m_linearLimit, 0, 0 };
  79. ret.m_angularRates = { 0, 0, m_angularLimit };
  80. return ret;
  81. }
  82. float SkidSteeringModelLimits::GetLinearAcceleration() const
  83. {
  84. return m_linearAcceleration;
  85. }
  86. float SkidSteeringModelLimits::GetAngularAcceleration() const
  87. {
  88. return m_angularAcceleration;
  89. }
  90. float SkidSteeringModelLimits::GetLinearSpeedLimit() const
  91. {
  92. return m_linearLimit;
  93. }
  94. float SkidSteeringModelLimits::GetAngularSpeedLimit() const
  95. {
  96. return m_angularLimit;
  97. }
  98. } // namespace ROS2Controllers::VehicleDynamics