diff --git a/MantleAPI/include/MantleAPI/Common/floating_point_helper.h b/MantleAPI/include/MantleAPI/Common/floating_point_helper.h index 690c90e0ed9addaaa5a5b1e983efffb6a465272a..78346376b6b0fa617bfb9096b51c849cd5c620c9 100644 --- a/MantleAPI/include/MantleAPI/Common/floating_point_helper.h +++ b/MantleAPI/include/MantleAPI/Common/floating_point_helper.h @@ -59,7 +59,7 @@ inline bool IsEqual(double lhs, double rhs, double precision = std::numeric_limi template <typename T, class = typename std::enable_if_t<units::traits::is_unit_t<T>::value>> bool IsEqual(T lhs, T rhs, double precision = std::numeric_limits<double>::epsilon()) { - return units::math::abs(lhs - rhs) < precision; + return units::unit_cast<double>(units::math::abs(lhs - rhs)) < precision; } /// @brief Compares two floating point numbers for equality. diff --git a/MantleAPI/include/MantleAPI/Common/poly_line.h b/MantleAPI/include/MantleAPI/Common/poly_line.h index 0bed8c5560e6a11a6fc6c18430d05c5ad5f16eb0..9e9f70a9e7000a219d2c482b02ed78fac3855ffa 100644 --- a/MantleAPI/include/MantleAPI/Common/poly_line.h +++ b/MantleAPI/include/MantleAPI/Common/poly_line.h @@ -42,7 +42,7 @@ inline std::ostream& operator<<(std::ostream& os, const PolyLinePoint& polyLineP if (polyLinePoint.time.has_value()) { - os << ", time in ms " << polyLinePoint.time.value().count(); + os << ", time in ms " << polyLinePoint.time.value(); } return os; diff --git a/MantleAPI/include/MantleAPI/Common/spline.h b/MantleAPI/include/MantleAPI/Common/spline.h index 8a9a4308f88f889148476bfb92daf2bd4ea2589e..32c97bc9d17b0624d7819acc84ad954968a6f203 100644 --- a/MantleAPI/include/MantleAPI/Common/spline.h +++ b/MantleAPI/include/MantleAPI/Common/spline.h @@ -21,7 +21,9 @@ #include <MantleAPI/Common/vector.h> #include <units.h> -#include <array> +#include <tuple> + +using namespace units; namespace mantle_api { @@ -34,29 +36,33 @@ struct SplineSegment Vec3<T> d; }; -template <typename T, class = typename std::enable_if_t<units::traits::is_unit_t<T>::value>> +template <typename T, class = typename std::enable_if_t<traits::is_unit<T>::value>> struct SplineSection { Time start_time{0}; Time end_time{0}; /// @brief Represents the polynomial. /// - /// The array stores in format \f$[a_3, a_2, a_1, a_0]\f$ for a polynomial in form + /// The tuple stores in format \f$[a_3, a_2, a_1, a_0]\f$ for a polynomial in form /// \f[ /// P(x) = \sum_{i=0}^{3} a_{i} x^{i} = a_3 x^3 + a_2 x^2 + a_1 x + a_0 /// \f] - std::array<T, 4> polynomial{0, 0, 0, 0}; + std::tuple<unit_t<compound_unit<T, inverse<cubed<time::second>>>>, + unit_t<compound_unit<T, inverse<squared<time::second>>>>, + unit_t<compound_unit<T, inverse<time::second>>>, + unit_t<T>> + polynomial{ + unit_t<compound_unit<T, inverse<cubed<time::second>>>>(0), + unit_t<compound_unit<T, inverse<squared<time::second>>>>(0), + unit_t<compound_unit<T, inverse<time::second>>>(0), + unit_t<T>(0)}; }; /// @brief Equality comparison for SplineSection. -template <typename T, class = typename std::enable_if_t<units::traits::is_unit_t<T>::value>> +template <typename T, class = typename std::enable_if_t<units::traits::is_unit<T>::value>> inline bool operator==(const SplineSection<T>& lhs, const SplineSection<T>& rhs) noexcept { - return lhs.start_time == rhs.start_time && lhs.end_time == rhs.end_time && - std::equal(lhs.polynomial.begin(), - lhs.polynomial.end(), - rhs.polynomial.begin(), - [](const T& a, const T& b) { return IsEqual(a, b); }); + return lhs.start_time == rhs.start_time && lhs.end_time == rhs.end_time && IsEqual(std::get<0>(lhs.polynomial), std::get<0>(rhs.polynomial)) && IsEqual(std::get<1>(lhs.polynomial), std::get<1>(rhs.polynomial)) && IsEqual(std::get<2>(lhs.polynomial), std::get<2>(rhs.polynomial)) && IsEqual(std::get<3>(lhs.polynomial), std::get<3>(rhs.polynomial)); } } // namespace mantle_api diff --git a/MantleAPI/include/MantleAPI/Common/vector.h b/MantleAPI/include/MantleAPI/Common/vector.h index 5d7a110dc41c9ce0fa117268019c4f35a49d0673..73df1bf6f1a840aebef2317ed0ca66a1949b8fe3 100644 --- a/MantleAPI/include/MantleAPI/Common/vector.h +++ b/MantleAPI/include/MantleAPI/Common/vector.h @@ -28,7 +28,7 @@ struct Vec3 T y{0}; T z{0}; - inline T Length() const { return sqrt((x * x) + (y * y) + (z * z)); } + inline T Length() const { return units::math::sqrt((x * x) + (y * y) + (z * z)); } }; template <typename T> @@ -73,7 +73,8 @@ inline Vec3<T> operator/(const Vec3<T>& lhs, double d) noexcept return {lhs.x / d, lhs.y / d, lhs.z / d}; } -inline Vec3d operator+=(Vec3d& lhs, const Vec3d& rhs) noexcept +template <typename T> +inline Vec3<T> operator+=(Vec3<T>& lhs, const Vec3<T>& rhs) noexcept { lhs.x += rhs.x; lhs.y += rhs.y; @@ -81,7 +82,8 @@ inline Vec3d operator+=(Vec3d& lhs, const Vec3d& rhs) noexcept return lhs; } -inline Vec3d operator-=(Vec3d& lhs, const Vec3d& rhs) noexcept +template <typename T> +inline Vec3<T> operator-=(Vec3<T>& lhs, const Vec3<T>& rhs) noexcept { lhs.x -= rhs.x; lhs.y -= rhs.y; @@ -89,15 +91,16 @@ inline Vec3d operator-=(Vec3d& lhs, const Vec3d& rhs) noexcept return lhs; } -inline Vec3d operator+=(Vec3d& lhs, double d) noexcept +template <typename T> +inline Vec3<T> operator+=(Vec3<T>& lhs, double d) noexcept { lhs.x += d; lhs.y += d; lhs.z += d; return lhs; } - -inline Vec3d operator-=(Vec3d& lhs, double d) noexcept +template <typename T> +inline Vec3<T> operator-=(Vec3<T>& lhs, double d) noexcept { lhs.x -= d; lhs.y -= d; diff --git a/MantleAPI/include/MantleAPI/Traffic/control_strategy.h b/MantleAPI/include/MantleAPI/Traffic/control_strategy.h index a896c9c9696c54745603c3aedb3418e22b0c35e2..5a8e3d40ee9f0b4e7bedb46f2baae376da839db3 100644 --- a/MantleAPI/include/MantleAPI/Traffic/control_strategy.h +++ b/MantleAPI/include/MantleAPI/Traffic/control_strategy.h @@ -92,8 +92,8 @@ struct FollowHeadingSplineControlStrategy : public ControlStrategy type = ControlStrategyType::kFollowHeadingSpline; } - std::vector<mantle_api::SplineSection<units::angle::radian_t>> heading_splines; - double default_value{0}; + std::vector<mantle_api::SplineSection<units::angle::radian>> heading_splines; + units::angle::radian_t default_value{0}; }; struct FollowVelocitySplineControlStrategy : public ControlStrategy @@ -104,8 +104,8 @@ struct FollowVelocitySplineControlStrategy : public ControlStrategy type = ControlStrategyType::kFollowVelocitySpline; } - std::vector<mantle_api::SplineSection<units::velocity::meters_per_second_t>> velocity_splines; - double default_value{0}; + std::vector<mantle_api::SplineSection<units::velocity::meters_per_second>> velocity_splines; + units::velocity::meters_per_second_t default_value{0}; }; inline bool operator==(const FollowVelocitySplineControlStrategy& lhs, @@ -128,7 +128,7 @@ struct FollowLateralOffsetSplineControlStrategy : public ControlStrategy type = ControlStrategyType::kFollowLateralOffsetSpline; } - std::vector<mantle_api::SplineSection<units::length::meter_t>> lateral_offset_splines; + std::vector<mantle_api::SplineSection<units::length::meter>> lateral_offset_splines; }; struct FollowRouteControlStrategy : public ControlStrategy @@ -194,7 +194,7 @@ struct FollowTrajectoryControlStrategy : public ControlStrategy { ReferenceContext domainAbsoluteRelative; double scale{0.0}; - double offset{0.0}; + units::time::second_t offset{0.0}; }; FollowTrajectoryControlStrategy() diff --git a/MantleAPI/include/MantleAPI/Traffic/entity_helper.h b/MantleAPI/include/MantleAPI/Traffic/entity_helper.h index 0c65ca40b0707fb757d55575d590ebcdef46a064..a09a4534b122807c65fb6dda7f586fb981a05d1b 100644 --- a/MantleAPI/include/MantleAPI/Traffic/entity_helper.h +++ b/MantleAPI/include/MantleAPI/Traffic/entity_helper.h @@ -21,14 +21,15 @@ namespace mantle_api { -inline void SetSpeed(mantle_api::IEntity* entity, double velocity) + +inline void SetSpeed(mantle_api::IEntity* entity, const units::velocity::meters_per_second_t &velocity) { auto orientation = entity->GetOrientation(); - double cos_elevation = std::cos(orientation.pitch); - mantle_api::Vec3d velocity_vector{velocity * std::cos(orientation.yaw) * cos_elevation, - velocity * std::sin(orientation.yaw) * cos_elevation, - velocity * -std::sin(orientation.pitch)}; + auto cos_elevation = units::math::cos(orientation.pitch); + mantle_api::Vec3<units::velocity::meters_per_second_t> velocity_vector{velocity * units::math::cos(orientation.yaw) * cos_elevation, + velocity * units::math::sin(orientation.yaw) * cos_elevation, + velocity * -units::math::sin(orientation.pitch)}; entity->SetVelocity(velocity_vector); } diff --git a/MantleAPI/test/MantleAPI/Test/test_utils.h b/MantleAPI/test/MantleAPI/Test/test_utils.h index 7c6494cb570a1c05a65a87d6471828eeb9a9c13c..25d4d0ba13cd581066007007711387144b4e9ccd 100644 --- a/MantleAPI/test/MantleAPI/Test/test_utils.h +++ b/MantleAPI/test/MantleAPI/Test/test_utils.h @@ -33,9 +33,9 @@ namespace mantle_api class MockConverter : public mantle_api::ICoordConverter { public: - MOCK_METHOD(mantle_api::Vec3d, Convert, (mantle_api::Position position), (const override)); + MOCK_METHOD(mantle_api::Vec3<units::length::meter_t>, Convert, (mantle_api::Position position), (const override)); - mantle_api::Position Convert(mantle_api::Vec3d vec) const override + mantle_api::Position Convert(mantle_api::Vec3<units::length::meter_t> vec) const override { std::ignore = vec; return mantle_api::Position{}; @@ -50,26 +50,26 @@ public: void SetName(const std::string& name) override { name_ = name; } const std::string& GetName() const override { return name_; } - MOCK_METHOD(void, SetPosition, (const mantle_api::Vec3d& inert_pos), (override)); - MOCK_METHOD(mantle_api::Vec3d, GetPosition, (), (const, override)); + MOCK_METHOD(void, SetPosition, (const mantle_api::Vec3<units::length::meter_t>& inert_pos), (override)); + MOCK_METHOD(mantle_api::Vec3<units::length::meter_t>, GetPosition, (), (const, override)); - MOCK_METHOD(void, SetVelocity, (const mantle_api::Vec3d& velocity), (override)); - MOCK_METHOD(mantle_api::Vec3d, GetVelocity, (), (const, override)); + MOCK_METHOD(void, SetVelocity, (const mantle_api::Vec3<units::velocity::meters_per_second_t>& velocity), (override)); + MOCK_METHOD(mantle_api::Vec3<units::velocity::meters_per_second_t>, GetVelocity, (), (const, override)); - MOCK_METHOD(void, SetAcceleration, (const mantle_api::Vec3d& acceleration), (override)); - MOCK_METHOD(mantle_api::Vec3d, GetAcceleration, (), (const, override)); + MOCK_METHOD(void, SetAcceleration, (const mantle_api::Vec3<units::acceleration::meters_per_second_squared_t>& acceleration), (override)); + MOCK_METHOD(mantle_api::Vec3<units::acceleration::meters_per_second_squared_t>, GetAcceleration, (), (const, override)); - MOCK_METHOD(void, SetOrientation, (const mantle_api::Orientation3d& orientation), (override)); - MOCK_METHOD(mantle_api::Orientation3d, GetOrientation, (), (const, override)); + MOCK_METHOD(void, SetOrientation, (const mantle_api::Orientation3<units::angle::radian_t>& orientation), (override)); + MOCK_METHOD(mantle_api::Orientation3<units::angle::radian_t>, GetOrientation, (), (const, override)); - MOCK_METHOD(void, SetOrientationRate, (const mantle_api::Orientation3d& orientation_rate), (override)); - MOCK_METHOD(mantle_api::Orientation3d, GetOrientationRate, (), (const, override)); + MOCK_METHOD(void, SetOrientationRate, (const mantle_api::Orientation3<units::angular_velocity::radians_per_second_t>& orientation_rate), (override)); + MOCK_METHOD(mantle_api::Orientation3<units::angular_velocity::radians_per_second_t>, GetOrientationRate, (), (const, override)); MOCK_METHOD(void, SetOrientationAcceleration, - (const mantle_api::Orientation3d& orientation_acceleration), + (const mantle_api::Orientation3<units::angular_acceleration::radians_per_second_squared_t>& orientation_acceleration), (override)); - MOCK_METHOD(mantle_api::Orientation3d, GetOrientationAcceleration, (), (const, override)); + MOCK_METHOD(mantle_api::Orientation3<units::angular_acceleration::radians_per_second_squared_t>, GetOrientationAcceleration, (), (const, override)); MOCK_METHOD(void, SetAssignedLaneIds, (const std::vector<std::uint64_t>& ids), (override)); MOCK_METHOD(std::vector<std::uint64_t>, GetAssignedLaneIds, (), (const, override)); @@ -91,22 +91,22 @@ private: class MockQueryService : public mantle_api::ILaneLocationQueryService { public: - Orientation3d GetLaneOrientation(const Vec3d& position) const override + Orientation3<units::angle::radian_t> GetLaneOrientation(const Vec3<units::length::meter_t>& position) const override { std::ignore = position; return {}; } - Vec3d GetUpwardsShiftedLanePosition(const Vec3d& position, + Vec3<units::length::meter_t> GetUpwardsShiftedLanePosition(const Vec3<units::length::meter_t>& position, double upwards_shift, bool allowed_to_leave_lane = false) const override { std::ignore = position; std::ignore = upwards_shift; std::ignore = allowed_to_leave_lane; - return mantle_api::Vec3d(); + return mantle_api::Vec3<units::length::meter_t>(); } - bool IsPositionOnLane(const Vec3d& position) const override + bool IsPositionOnLane(const Vec3<units::length::meter_t>& position) const override { std::ignore = position; return false; @@ -124,26 +124,26 @@ public: void SetName(const std::string& name) override { name_ = name; } const std::string& GetName() const override { return name_; } - MOCK_METHOD(void, SetPosition, (const mantle_api::Vec3d& inert_pos), (override)); - MOCK_METHOD(mantle_api::Vec3d, GetPosition, (), (const, override)); + MOCK_METHOD(void, SetPosition, (const mantle_api::Vec3<units::length::meter_t>& inert_pos), (override)); + MOCK_METHOD(mantle_api::Vec3<units::length::meter_t>, GetPosition, (), (const, override)); - MOCK_METHOD(void, SetVelocity, (const mantle_api::Vec3d& velocity), (override)); - MOCK_METHOD(mantle_api::Vec3d, GetVelocity, (), (const, override)); + MOCK_METHOD(void, SetVelocity, (const mantle_api::Vec3<units::velocity::meters_per_second_t>& velocity), (override)); + MOCK_METHOD(mantle_api::Vec3<units::velocity::meters_per_second_t>, GetVelocity, (), (const, override)); - MOCK_METHOD(void, SetAcceleration, (const mantle_api::Vec3d& acceleration), (override)); - MOCK_METHOD(mantle_api::Vec3d, GetAcceleration, (), (const, override)); + MOCK_METHOD(void, SetAcceleration, (const mantle_api::Vec3<units::acceleration::meters_per_second_squared_t>& acceleration), (override)); + MOCK_METHOD(mantle_api::Vec3<units::acceleration::meters_per_second_squared_t>, GetAcceleration, (), (const, override)); - MOCK_METHOD(void, SetOrientation, (const mantle_api::Orientation3d& orientation), (override)); - MOCK_METHOD(mantle_api::Orientation3d, GetOrientation, (), (const, override)); + MOCK_METHOD(void, SetOrientation, (const mantle_api::Orientation3<units::angle::radian_t>& orientation), (override)); + MOCK_METHOD(mantle_api::Orientation3<units::angle::radian_t>, GetOrientation, (), (const, override)); - MOCK_METHOD(void, SetOrientationRate, (const mantle_api::Orientation3d& orientation_rate), (override)); - MOCK_METHOD(mantle_api::Orientation3d, GetOrientationRate, (), (const, override)); + MOCK_METHOD(void, SetOrientationRate, (const mantle_api::Orientation3<units::angular_velocity::radians_per_second_t>& orientation_rate), (override)); + MOCK_METHOD(mantle_api::Orientation3<units::angular_velocity::radians_per_second_t>, GetOrientationRate, (), (const, override)); MOCK_METHOD(void, SetOrientationAcceleration, - (const mantle_api::Orientation3d& orientation_acceleration), + (const mantle_api::Orientation3<units::angular_acceleration::radians_per_second_squared_t>& orientation_acceleration), (override)); - MOCK_METHOD(mantle_api::Orientation3d, GetOrientationAcceleration, (), (const, override)); + MOCK_METHOD(mantle_api::Orientation3<units::angular_acceleration::radians_per_second_squared_t>, GetOrientationAcceleration, (), (const, override)); MOCK_METHOD(void, SetAssignedLaneIds, (const std::vector<std::uint64_t>& ids), (override)); MOCK_METHOD(std::vector<std::uint64_t>, GetAssignedLaneIds, (), (const, override)); @@ -167,26 +167,26 @@ public: void SetName(const std::string& name) override { name_ = name; } const std::string& GetName() const override { return name_; } - MOCK_METHOD(void, SetPosition, (const mantle_api::Vec3d& inert_pos), (override)); - MOCK_METHOD(mantle_api::Vec3d, GetPosition, (), (const, override)); + MOCK_METHOD(void, SetPosition, (const mantle_api::Vec3<units::length::meter_t>& inert_pos), (override)); + MOCK_METHOD(mantle_api::Vec3<units::length::meter_t>, GetPosition, (), (const, override)); - MOCK_METHOD(void, SetVelocity, (const mantle_api::Vec3d& velocity), (override)); - MOCK_METHOD(mantle_api::Vec3d, GetVelocity, (), (const, override)); + MOCK_METHOD(void, SetVelocity, (const mantle_api::Vec3<units::velocity::meters_per_second_t>& velocity), (override)); + MOCK_METHOD(mantle_api::Vec3<units::velocity::meters_per_second_t>, GetVelocity, (), (const, override)); - MOCK_METHOD(void, SetAcceleration, (const mantle_api::Vec3d& acceleration), (override)); - MOCK_METHOD(mantle_api::Vec3d, GetAcceleration, (), (const, override)); + MOCK_METHOD(void, SetAcceleration, (const mantle_api::Vec3<units::acceleration::meters_per_second_squared_t>& acceleration), (override)); + MOCK_METHOD(mantle_api::Vec3<units::acceleration::meters_per_second_squared_t>, GetAcceleration, (), (const, override)); - MOCK_METHOD(void, SetOrientation, (const mantle_api::Orientation3d& orientation), (override)); - MOCK_METHOD(mantle_api::Orientation3d, GetOrientation, (), (const, override)); + MOCK_METHOD(void, SetOrientation, (const mantle_api::Orientation3<units::angle::radian_t>& orientation), (override)); + MOCK_METHOD(mantle_api::Orientation3<units::angle::radian_t>, GetOrientation, (), (const, override)); - MOCK_METHOD(void, SetOrientationRate, (const mantle_api::Orientation3d& orientation_rate), (override)); - MOCK_METHOD(mantle_api::Orientation3d, GetOrientationRate, (), (const, override)); + MOCK_METHOD(void, SetOrientationRate, (const mantle_api::Orientation3<units::angular_velocity::radians_per_second_t>& orientation_rate), (override)); + MOCK_METHOD(mantle_api::Orientation3<units::angular_velocity::radians_per_second_t>, GetOrientationRate, (), (const, override)); MOCK_METHOD(void, SetOrientationAcceleration, - (const mantle_api::Orientation3d& orientation_acceleration), + (const mantle_api::Orientation3<units::angular_acceleration::radians_per_second_squared_t>& orientation_acceleration), (override)); - MOCK_METHOD(mantle_api::Orientation3d, GetOrientationAcceleration, (), (const, override)); + MOCK_METHOD(mantle_api::Orientation3<units::angular_acceleration::radians_per_second_squared_t>, GetOrientationAcceleration, (), (const, override)); MOCK_METHOD(void, SetAssignedLaneIds, (const std::vector<std::uint64_t>& ids), (override)); MOCK_METHOD(std::vector<std::uint64_t>, GetAssignedLaneIds, (), (const, override));