diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000000000000000000000000000000000000..e23ece2c852415800ac224b74ede6c5849f6f88d --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,277 @@ +Eclipse Public License - v 2.0 + + THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE + PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION + OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. + +1. DEFINITIONS + +"Contribution" means: + + a) in the case of the initial Contributor, the initial content + Distributed under this Agreement, and + + b) in the case of each subsequent Contributor: + i) changes to the Program, and + ii) additions to the Program; + where such changes and/or additions to the Program originate from + and are Distributed by that particular Contributor. A Contribution + "originates" from a Contributor if it was added to the Program by + such Contributor itself or anyone acting on such Contributor's behalf. + Contributions do not include changes or additions to the Program that + are not Modified Works. + +"Contributor" means any person or entity that Distributes the Program. + +"Licensed Patents" mean patent claims licensable by a Contributor which +are necessarily infringed by the use or sale of its Contribution alone +or when combined with the Program. + +"Program" means the Contributions Distributed in accordance with this +Agreement. + +"Recipient" means anyone who receives the Program under this Agreement +or any Secondary License (as applicable), including Contributors. + +"Derivative Works" shall mean any work, whether in Source Code or other +form, that is based on (or derived from) the Program and for which the +editorial revisions, annotations, elaborations, or other modifications +represent, as a whole, an original work of authorship. + +"Modified Works" shall mean any work in Source Code or other form that +results from an addition to, deletion from, or modification of the +contents of the Program, including, for purposes of clarity any new file +in Source Code form that contains any contents of the Program. Modified +Works shall not include works that contain only declarations, +interfaces, types, classes, structures, or files of the Program solely +in each case in order to link to, bind by name, or subclass the Program +or Modified Works thereof. + +"Distribute" means the acts of a) distributing or b) making available +in any manner that enables the transfer of a copy. + +"Source Code" means the form of a Program preferred for making +modifications, including but not limited to software source code, +documentation source, and configuration files. + +"Secondary License" means either the GNU General Public License, +Version 2.0, or any later versions of that license, including any +exceptions or additional permissions as identified by the initial +Contributor. + +2. GRANT OF RIGHTS + + a) Subject to the terms of this Agreement, each Contributor hereby + grants Recipient a non-exclusive, worldwide, royalty-free copyright + license to reproduce, prepare Derivative Works of, publicly display, + publicly perform, Distribute and sublicense the Contribution of such + Contributor, if any, and such Derivative Works. + + b) Subject to the terms of this Agreement, each Contributor hereby + grants Recipient a non-exclusive, worldwide, royalty-free patent + license under Licensed Patents to make, use, sell, offer to sell, + import and otherwise transfer the Contribution of such Contributor, + if any, in Source Code or other form. This patent license shall + apply to the combination of the Contribution and the Program if, at + the time the Contribution is added by the Contributor, such addition + of the Contribution causes such combination to be covered by the + Licensed Patents. The patent license shall not apply to any other + combinations which include the Contribution. No hardware per se is + licensed hereunder. + + c) Recipient understands that although each Contributor grants the + licenses to its Contributions set forth herein, no assurances are + provided by any Contributor that the Program does not infringe the + patent or other intellectual property rights of any other entity. + Each Contributor disclaims any liability to Recipient for claims + brought by any other entity based on infringement of intellectual + property rights or otherwise. As a condition to exercising the + rights and licenses granted hereunder, each Recipient hereby + assumes sole responsibility to secure any other intellectual + property rights needed, if any. For example, if a third party + patent license is required to allow Recipient to Distribute the + Program, it is Recipient's responsibility to acquire that license + before distributing the Program. + + d) Each Contributor represents that to its knowledge it has + sufficient copyright rights in its Contribution, if any, to grant + the copyright license set forth in this Agreement. + + e) Notwithstanding the terms of any Secondary License, no + Contributor makes additional grants to any Recipient (other than + those set forth in this Agreement) as a result of such Recipient's + receipt of the Program under the terms of a Secondary License + (if permitted under the terms of Section 3). + +3. REQUIREMENTS + +3.1 If a Contributor Distributes the Program in any form, then: + + a) the Program must also be made available as Source Code, in + accordance with section 3.2, and the Contributor must accompany + the Program with a statement that the Source Code for the Program + is available under this Agreement, and informs Recipients how to + obtain it in a reasonable manner on or through a medium customarily + used for software exchange; and + + b) the Contributor may Distribute the Program under a license + different than this Agreement, provided that such license: + i) effectively disclaims on behalf of all other Contributors all + warranties and conditions, express and implied, including + warranties or conditions of title and non-infringement, and + implied warranties or conditions of merchantability and fitness + for a particular purpose; + + ii) effectively excludes on behalf of all other Contributors all + liability for damages, including direct, indirect, special, + incidental and consequential damages, such as lost profits; + + iii) does not attempt to limit or alter the recipients' rights + in the Source Code under section 3.2; and + + iv) requires any subsequent distribution of the Program by any + party to be under a license that satisfies the requirements + of this section 3. + +3.2 When the Program is Distributed as Source Code: + + a) it must be made available under this Agreement, or if the + Program (i) is combined with other material in a separate file or + files made available under a Secondary License, and (ii) the initial + Contributor attached to the Source Code the notice described in + Exhibit A of this Agreement, then the Program may be made available + under the terms of such Secondary Licenses, and + + b) a copy of this Agreement must be included with each copy of + the Program. + +3.3 Contributors may not remove or alter any copyright, patent, +trademark, attribution notices, disclaimers of warranty, or limitations +of liability ("notices") contained within the Program from any copy of +the Program which they Distribute, provided that Contributors may add +their own appropriate notices. + +4. COMMERCIAL DISTRIBUTION + +Commercial distributors of software may accept certain responsibilities +with respect to end users, business partners and the like. While this +license is intended to facilitate the commercial use of the Program, +the Contributor who includes the Program in a commercial product +offering should do so in a manner which does not create potential +liability for other Contributors. Therefore, if a Contributor includes +the Program in a commercial product offering, such Contributor +("Commercial Contributor") hereby agrees to defend and indemnify every +other Contributor ("Indemnified Contributor") against any losses, +damages and costs (collectively "Losses") arising from claims, lawsuits +and other legal actions brought by a third party against the Indemnified +Contributor to the extent caused by the acts or omissions of such +Commercial Contributor in connection with its distribution of the Program +in a commercial product offering. The obligations in this section do not +apply to any claims or Losses relating to any actual or alleged +intellectual property infringement. In order to qualify, an Indemnified +Contributor must: a) promptly notify the Commercial Contributor in +writing of such claim, and b) allow the Commercial Contributor to control, +and cooperate with the Commercial Contributor in, the defense and any +related settlement negotiations. The Indemnified Contributor may +participate in any such claim at its own expense. + +For example, a Contributor might include the Program in a commercial +product offering, Product X. That Contributor is then a Commercial +Contributor. If that Commercial Contributor then makes performance +claims, or offers warranties related to Product X, those performance +claims and warranties are such Commercial Contributor's responsibility +alone. Under this section, the Commercial Contributor would have to +defend claims against the other Contributors related to those performance +claims and warranties, and if a court requires any other Contributor to +pay any damages as a result, the Commercial Contributor must pay +those damages. + +5. NO WARRANTY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT +PERMITTED BY APPLICABLE LAW, THE PROGRAM IS PROVIDED ON AN "AS IS" +BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR +IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF +TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR +PURPOSE. Each Recipient is solely responsible for determining the +appropriateness of using and distributing the Program and assumes all +risks associated with its exercise of rights under this Agreement, +including but not limited to the risks and costs of program errors, +compliance with applicable laws, damage to or loss of data, programs +or equipment, and unavailability or interruption of operations. + +6. DISCLAIMER OF LIABILITY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT +PERMITTED BY APPLICABLE LAW, NEITHER RECIPIENT NOR ANY CONTRIBUTORS +SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST +PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE +EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + +7. GENERAL + +If any provision of this Agreement is invalid or unenforceable under +applicable law, it shall not affect the validity or enforceability of +the remainder of the terms of this Agreement, and without further +action by the parties hereto, such provision shall be reformed to the +minimum extent necessary to make such provision valid and enforceable. + +If Recipient institutes patent litigation against any entity +(including a cross-claim or counterclaim in a lawsuit) alleging that the +Program itself (excluding combinations of the Program with other software +or hardware) infringes such Recipient's patent(s), then such Recipient's +rights granted under Section 2(b) shall terminate as of the date such +litigation is filed. + +All Recipient's rights under this Agreement shall terminate if it +fails to comply with any of the material terms or conditions of this +Agreement and does not cure such failure in a reasonable period of +time after becoming aware of such noncompliance. If all Recipient's +rights under this Agreement terminate, Recipient agrees to cease use +and distribution of the Program as soon as reasonably practicable. +However, Recipient's obligations under this Agreement and any licenses +granted by Recipient relating to the Program shall continue and survive. + +Everyone is permitted to copy and distribute copies of this Agreement, +but in order to avoid inconsistency the Agreement is copyrighted and +may only be modified in the following manner. The Agreement Steward +reserves the right to publish new versions (including revisions) of +this Agreement from time to time. No one other than the Agreement +Steward has the right to modify this Agreement. The Eclipse Foundation +is the initial Agreement Steward. The Eclipse Foundation may assign the +responsibility to serve as the Agreement Steward to a suitable separate +entity. Each new version of the Agreement will be given a distinguishing +version number. The Program (including Contributions) may always be +Distributed subject to the version of the Agreement under which it was +received. In addition, after a new version of the Agreement is published, +Contributor may elect to Distribute the Program (including its +Contributions) under the new version. + +Except as expressly stated in Sections 2(a) and 2(b) above, Recipient +receives no rights or licenses to the intellectual property of any +Contributor under this Agreement, whether expressly, by implication, +estoppel or otherwise. All rights in the Program not expressly granted +under this Agreement are reserved. Nothing in this Agreement is intended +to be enforceable by any entity that is not a Contributor or Recipient. +No third-party beneficiary rights are created under this Agreement. + +Exhibit A - Form of Secondary Licenses Notice + +"This Source Code may also be made available under the following +Secondary Licenses when the conditions for such availability set forth +in the Eclipse Public License, v. 2.0 are satisfied: {name license(s), +version(s), and exceptions or additional permissions here}." + + Simply including a copy of this Agreement, including this Exhibit A + is not sufficient to license the Source Code under Secondary Licenses. + + If it is not possible or desirable to put the notice in a particular + file, then You may include the notice in a location (such as a LICENSE + file in a relevant directory) where a recipient would be likely to + look for such a notice. + + You may add additional accurate notices of copyright ownership. \ No newline at end of file diff --git a/MantleAPI/BUILD.bazel b/MantleAPI/BUILD.bazel new file mode 100644 index 0000000000000000000000000000000000000000..02f78c62627606308879cc0ee81d5e438d6c0434 --- /dev/null +++ b/MantleAPI/BUILD.bazel @@ -0,0 +1,52 @@ +/******************************************************************************* +* Copyright (c) 2021, Bayerische Motoren Werke Aktiengesellschaft (BMW AG) +* +* This program and the accompanying materials are made +* available under the terms of the Eclipse Public License 2.0 +* which is available at https://www.eclipse.org/legal/epl-2.0/ +* +* SPDX-License-Identifier: EPL-2.0 +*******************************************************************************/ + +cc_library( + name = "mantle_api", + hdrs = glob([ + "include/**/*.h", + ]), + includes = [ + "include", + ], + visibility = [ + "//visibility:public", + ], +) + +cc_library( + name = "mantle_api_test_utils", + hdrs = glob([ + "test/**/*.h", + ]), + includes = [ + "test", + ], + visibility = [ + "//visibility:public", + ], + deps = [ + ":mantle_api", + "@googletest//:gtest_main", + ], +) + +cc_test( + name = "mantle_api_test", + timeout = "short", + srcs = ["test/interface_test.cpp"], + data = [ + "//Core/Service/Testing:sanitizer-suppressions", + ], + tags = ["test"], + deps = [ + ":mantle_api_test_utils", + ], +) diff --git a/MantleAPI/include/MantleAPI/Common/bounding_box.h b/MantleAPI/include/MantleAPI/Common/bounding_box.h new file mode 100644 index 0000000000000000000000000000000000000000..3c611b8fd01f33e176786ba90d78aabbde9d2fcd --- /dev/null +++ b/MantleAPI/include/MantleAPI/Common/bounding_box.h @@ -0,0 +1,34 @@ +/******************************************************************************* +* Copyright (c) 2021, Bayerische Motoren Werke Aktiengesellschaft (BMW AG) +* +* This program and the accompanying materials are made +* available under the terms of the Eclipse Public License 2.0 +* which is available at https://www.eclipse.org/legal/epl-2.0/ +* +* SPDX-License-Identifier: EPL-2.0 +*******************************************************************************/ + +//----------------------------------------------------------------------------- +/** @file bounding_box.h */ +//----------------------------------------------------------------------------- + +#ifndef MANTLEAPI_COMMON_BOUNDINGBOX_H +#define MANTLEAPI_COMMON_BOUNDINGBOX_H + +#include <MantleAPI/Common/i_position.h> +#include <MantleAPI/Common/vector.h> + +namespace mantle_api +{ +/// Bounding box is defined in local object coordinate system. +/// The origin of the object coordinate system is defined in relation to the geometric center. +struct BoundingBox +{ + Vec3d geometric_center{0.0, 0.0, 0.0}; + double width{0.0}; + double length{0.0}; + double height{0.0}; +}; +} // namespace mantle_api + +#endif // MANTLEAPI_COMMON_BOUNDINGBOX_H diff --git a/MantleAPI/include/MantleAPI/Common/dimension.h b/MantleAPI/include/MantleAPI/Common/dimension.h new file mode 100644 index 0000000000000000000000000000000000000000..f7650230ae3f51d87628ba79a5bd734c2cb91106 --- /dev/null +++ b/MantleAPI/include/MantleAPI/Common/dimension.h @@ -0,0 +1,46 @@ +/******************************************************************************* +* Copyright (c) 2021, Bayerische Motoren Werke Aktiengesellschaft (BMW AG) +* +* This program and the accompanying materials are made +* available under the terms of the Eclipse Public License 2.0 +* which is available at https://www.eclipse.org/legal/epl-2.0/ +* +* SPDX-License-Identifier: EPL-2.0 +*******************************************************************************/ + +//----------------------------------------------------------------------------- +/** @file dimension.h */ +//----------------------------------------------------------------------------- + +#ifndef MANTLEAPI_COMMON_DIMENSION_H +#define MANTLEAPI_COMMON_DIMENSION_H + +#include <MantleAPI/Common/floating_point_helper.h> +#include <MantleAPI/Common/vector.h> + +namespace mantle_api +{ + +template <typename T> +struct Dimension3 +{ + T length{}; + T width{}; + T height{}; +}; + +using Dimension3d = Dimension3<double>; + +inline bool operator==(const Dimension3d& lhs, const Dimension3d& rhs) noexcept +{ + return IsEqual(lhs.length, rhs.length) && IsEqual(lhs.width, rhs.width) && IsEqual(lhs.height, rhs.height); +} + +inline bool operator!=(const Dimension3d& lhs, const Dimension3d& rhs) noexcept +{ + return !(lhs == rhs); +} + +} // namespace mantle_api + +#endif // MANTLEAPI_COMMON_DIMENSION_H diff --git a/MantleAPI/include/MantleAPI/Common/floating_point_helper.h b/MantleAPI/include/MantleAPI/Common/floating_point_helper.h new file mode 100644 index 0000000000000000000000000000000000000000..218c26ae1c07c9c56b0f5788372b561e0d7fc278 --- /dev/null +++ b/MantleAPI/include/MantleAPI/Common/floating_point_helper.h @@ -0,0 +1,93 @@ +/******************************************************************************* +* Copyright (c) 2021, Bayerische Motoren Werke Aktiengesellschaft (BMW AG) +* +* This program and the accompanying materials are made +* available under the terms of the Eclipse Public License 2.0 +* which is available at https://www.eclipse.org/legal/epl-2.0/ +* +* SPDX-License-Identifier: EPL-2.0 +*******************************************************************************/ + +//----------------------------------------------------------------------------- +/** @file floating_point_helper.h */ +//----------------------------------------------------------------------------- + +#ifndef THIRDPARTY_MANTLEAPI_INCLUDE_MANTLEAPI_COMMON_FLOATING_POINT_HELPER_H +#define THIRDPARTY_MANTLEAPI_INCLUDE_MANTLEAPI_COMMON_FLOATING_POINT_HELPER_H + +#include <cmath> +#include <limits> +#include <type_traits> +namespace mantle_api +{ + +/// @brief Compares two floating point numbers for equality. +/// +/// **Attention** No approximation of the correct precision for the actual value is done! +/// +/// This function uses a default precision of `std::numeric_limts<T>::epsilon()`, which means that without providing the +/// precision yourself, it is only suited for +/// * bit-wise equal numbers +/// * numbers around 1 or smaller +/// +/// @tparam T Floating point type, ensured by SFINAE +/// @param lhs Left-hand operand +/// @param rhs Right-hand operand +/// @param precision Given precision, defaults to `std::numeric_limits<T>::epsilon()`. +/// @return True if both numbers are equal within the given precision. +template <typename T, typename std::enable_if_t<std::is_floating_point_v<T>>* = nullptr> +bool IsEqual(T lhs, T rhs, T precision = std::numeric_limits<T>::epsilon()) +{ + return std::abs(lhs - rhs) < precision; +} + +/// @brief Compares two floating point numbers for equality. +/// +/// **Attention** No approximation of the correct precision for the actual value is done! +/// +/// This function uses a default precision of `std::numeric_limts<T>::epsilon()`, which means that without providing the +/// precision yourself, it is only suited for +/// * bit-wise equal numbers +/// * numbers around 1 or smaller +/// +/// @tparam T Floating point type, ensured by SFINAE +/// @param lhs Left-hand operand +/// @param rhs Right-hand operand +/// @param precision Given precision, defaults to `std::numeric_limits<T>::epsilon()`. +/// @return True if lhs is greater than rhs or both numbers are equal within the given precision. +template <typename T, typename std::enable_if_t<std::is_floating_point_v<T>>* = nullptr> +bool GreaterOrEqual(T lhs, T rhs, T precision = std::numeric_limits<T>::epsilon()) +{ + if (lhs > rhs) + { + return true; + } + return IsEqual(lhs, rhs, precision); +} + +/// @brief Compares two floating point numbers for equality. +/// +/// **Attention** No approximation of the correct precision for the actual value is done! +/// +/// This function uses a default precision of `std::numeric_limts<T>::epsilon()`, which means that without providing the +/// precision yourself, it is only suited for +/// * bit-wise equal numbers +/// * numbers around 1 or smaller +/// +/// @tparam T Floating point type, ensured by SFINAE +/// @param lhs Left-hand operand +/// @param rhs Right-hand operand +/// @param precision Given precision, defaults to `std::numeric_limits<T>::epsilon()`. +/// @return True if lhs is less than rhs or both numbers are equal within the given precision. +template <typename T, typename std::enable_if_t<std::is_floating_point_v<T>>* = nullptr> +bool LessOrEqual(T lhs, T rhs, T precision = std::numeric_limits<T>::epsilon()) +{ + if (lhs < rhs) + { + return true; + } + return IsEqual(lhs, rhs, precision); +} +} // namespace mantle_api + +#endif // THIRDPARTY_MANTLEAPI_INCLUDE_MANTLEAPI_COMMON_FLOATING_POINT_HELPER_H diff --git a/MantleAPI/include/MantleAPI/Common/i_identifiable.h b/MantleAPI/include/MantleAPI/Common/i_identifiable.h new file mode 100644 index 0000000000000000000000000000000000000000..71ea8d6eef94ef94ae915f3e5411d220647049eb --- /dev/null +++ b/MantleAPI/include/MantleAPI/Common/i_identifiable.h @@ -0,0 +1,43 @@ +/******************************************************************************* +* Copyright (c) 2021, Bayerische Motoren Werke Aktiengesellschaft (BMW AG) +* +* This program and the accompanying materials are made +* available under the terms of the Eclipse Public License 2.0 +* which is available at https://www.eclipse.org/legal/epl-2.0/ +* +* SPDX-License-Identifier: EPL-2.0 +*******************************************************************************/ + +//----------------------------------------------------------------------------- +/** @file i_identifiable.h */ +//----------------------------------------------------------------------------- + + +#ifndef MANTLEAPI_COMMON_IIDENTIFIABLE_H +#define MANTLEAPI_COMMON_IIDENTIFIABLE_H + +#include <cstdint> +#include <string> + +namespace mantle_api +{ +using UniqueId = std::uint64_t; + +/// Common interface for all classes that can be referenced by an ID or name. +class IIdentifiable +{ + public: + virtual ~IIdentifiable() = default; + + /// The unique id is provided and maintained by the scenario simulator. + virtual UniqueId GetUniqueId() const = 0; + /// Scenario specific name of an object. + /// + /// The scenario description is responsible for keeping the name unique. + virtual void SetName(const std::string& name) = 0; + virtual const std::string& GetName() const = 0; +}; + +} // namespace mantle_api + +#endif // MANTLEAPI_COMMON_IIDENTIFIABLE_H diff --git a/MantleAPI/include/MantleAPI/Common/orientation.h b/MantleAPI/include/MantleAPI/Common/orientation.h new file mode 100644 index 0000000000000000000000000000000000000000..d9651e5ad1840022b13c6bc41e471d66735355b2 --- /dev/null +++ b/MantleAPI/include/MantleAPI/Common/orientation.h @@ -0,0 +1,46 @@ +/******************************************************************************* +* Copyright (c) 2021, Bayerische Motoren Werke Aktiengesellschaft (BMW AG) +* +* This program and the accompanying materials are made +* available under the terms of the Eclipse Public License 2.0 +* which is available at https://www.eclipse.org/legal/epl-2.0/ +* +* SPDX-License-Identifier: EPL-2.0 +*******************************************************************************/ + +//----------------------------------------------------------------------------- +/** @file orientation.h */ +//----------------------------------------------------------------------------- + + +#ifndef SIMULATOR_ORIENTATION_H +#define SIMULATOR_ORIENTATION_H + +#include <MantleAPI/Common/floating_point_helper.h> + +namespace mantle_api +{ + +template <typename T> +struct Orientation3 +{ + T yaw{}; + T pitch{}; + T roll{}; +}; + +using Orientation3d = Orientation3<double>; + +inline bool operator==(const Orientation3d& lhs, const Orientation3d& rhs) noexcept +{ + return IsEqual(lhs.yaw, rhs.yaw) && IsEqual(lhs.pitch, rhs.pitch) && IsEqual(lhs.roll, rhs.roll); +} + +inline bool operator!=(const Orientation3d& lhs, const Orientation3d& rhs) noexcept +{ + return !(lhs == rhs); +} + +} // namespace mantle_api + +#endif // SIMULATOR_ORIENTATION_H diff --git a/MantleAPI/include/MantleAPI/Common/pose.h b/MantleAPI/include/MantleAPI/Common/pose.h new file mode 100644 index 0000000000000000000000000000000000000000..57b41c93ae02d60f1698d1be04802ce9db193a47 --- /dev/null +++ b/MantleAPI/include/MantleAPI/Common/pose.h @@ -0,0 +1,31 @@ +/******************************************************************************* +* Copyright (c) 2021, Bayerische Motoren Werke Aktiengesellschaft (BMW AG) +* +* This program and the accompanying materials are made +* available under the terms of the Eclipse Public License 2.0 +* which is available at https://www.eclipse.org/legal/epl-2.0/ +* +* SPDX-License-Identifier: EPL-2.0 +*******************************************************************************/ + +//----------------------------------------------------------------------------- +/** @file pose.h */ +//----------------------------------------------------------------------------- + +#ifndef MANTLEAPI_COMMON_POSE_H +#define MANTLEAPI_COMMON_POSE_H + +#include <MantleAPI/Common/orientation.h> +#include <MantleAPI/Common/vector.h> + +namespace mantle_api +{ +struct Pose +{ + Vec3d position{}; + Orientation3d orientation{}; +}; + +} // namespace mantle_api + +#endif // MANTLEAPI_COMMON_POSE_H diff --git a/MantleAPI/include/MantleAPI/Common/position.h b/MantleAPI/include/MantleAPI/Common/position.h new file mode 100644 index 0000000000000000000000000000000000000000..d8d0131405d76ecd6d2703e9eaa88e1da788e435 --- /dev/null +++ b/MantleAPI/include/MantleAPI/Common/position.h @@ -0,0 +1,82 @@ +/******************************************************************************* +* Copyright (c) 2021, Bayerische Motoren Werke Aktiengesellschaft (BMW AG) +* +* This program and the accompanying materials are made +* available under the terms of the Eclipse Public License 2.0 +* which is available at https://www.eclipse.org/legal/epl-2.0/ +* +* SPDX-License-Identifier: EPL-2.0 +*******************************************************************************/ + +//----------------------------------------------------------------------------- +/** @file position.h */ +//----------------------------------------------------------------------------- + +#ifndef SCENARIOABSTRACT_COMMON_IPOSITION_H +#define SCENARIOABSTRACT_COMMON_IPOSITION_H + +#include <MantleAPI/Common/floating_point_helper.h> +#include <MantleAPI/Common/vector.h> + +#include <cmath> +#include <cstdint> +#include <variant> + +namespace mantle_api +{ +struct ReferencedObject +{ + std::int32_t road{0}; + std::int32_t lane{0}; +}; + +struct OpenDrivePosition +{ + ReferencedObject referenced_object{}; + + /// @brief Offset in s direction, unit: [m] + double s_offset{0.0}; + /// @brief Offset in t direction, unit: [m] + double t_offset{0.0}; +}; + +struct LatLonPosition +{ + /// @brief GPS latitude, unit: [rad] + double latitude{0.0}; + /// @brief GPS longitude, unit: [rad] + double longitude{0.0}; +}; + +using Position = std::variant<OpenDrivePosition, LatLonPosition, Vec3d>; + +/// @brief Equality comparison for OpenDrivePosition. +/// +/// **Attention** Floating-point comparision may require tweaks in precision. +inline bool operator==(const OpenDrivePosition& lhs, const OpenDrivePosition& rhs) noexcept +{ + return lhs.referenced_object.road == rhs.referenced_object.road && + lhs.referenced_object.lane == rhs.referenced_object.lane && IsEqual(lhs.s_offset, rhs.s_offset) && + IsEqual(lhs.t_offset, rhs.t_offset); +} + +inline bool operator!=(const OpenDrivePosition& lhs, const OpenDrivePosition& rhs) noexcept +{ + return !(lhs == rhs); +} + +/// @brief Equality comparison for LatLonPosition. +/// +/// **Attention** Floating-point comparision may require tweaks in precision. +inline bool operator==(const LatLonPosition& lhs, const LatLonPosition& rhs) noexcept +{ + return IsEqual(lhs.latitude, rhs.latitude) && IsEqual(lhs.longitude, rhs.longitude); +} + +inline bool operator!=(const LatLonPosition& lhs, const LatLonPosition& rhs) noexcept +{ + return !(lhs == rhs); +} + +} // namespace mantle_api +#endif // SCENARIOABSTRACT_COMMON_IPOSITION_H diff --git a/MantleAPI/include/MantleAPI/Common/simulation_time.h b/MantleAPI/include/MantleAPI/Common/simulation_time.h new file mode 100644 index 0000000000000000000000000000000000000000..4e94030aeab93a12ead91e2a2481753d9b19e029 --- /dev/null +++ b/MantleAPI/include/MantleAPI/Common/simulation_time.h @@ -0,0 +1,25 @@ +/******************************************************************************* +* Copyright (c) 2021, Bayerische Motoren Werke Aktiengesellschaft (BMW AG) +* +* This program and the accompanying materials are made +* available under the terms of the Eclipse Public License 2.0 +* which is available at https://www.eclipse.org/legal/epl-2.0/ +* +* SPDX-License-Identifier: EPL-2.0 +*******************************************************************************/ + +//----------------------------------------------------------------------------- +/** @file simulation_time.h */ +//----------------------------------------------------------------------------- + +#ifndef SCENARIOABSTRACT_COMMON_SIMULATION_TIME_H +#define SCENARIOABSTRACT_COMMON_SIMULATION_TIME_H + +#include <chrono> + +namespace mantle_api +{ +using SimulationTime = std::chrono::duration<std::int64_t, std::milli>; +} + +#endif // SCENARIOABSTRACT_COMMON_SIMULATION_TIME_H \ No newline at end of file diff --git a/MantleAPI/include/MantleAPI/Common/spline.h b/MantleAPI/include/MantleAPI/Common/spline.h new file mode 100644 index 0000000000000000000000000000000000000000..9c399447aedb3c57b5ac8fc15da7fad7200e3f8f --- /dev/null +++ b/MantleAPI/include/MantleAPI/Common/spline.h @@ -0,0 +1,50 @@ +/******************************************************************************* +* Copyright (c) 2021, Bayerische Motoren Werke Aktiengesellschaft (BMW AG) +* +* This program and the accompanying materials are made +* available under the terms of the Eclipse Public License 2.0 +* which is available at https://www.eclipse.org/legal/epl-2.0/ +* +* SPDX-License-Identifier: EPL-2.0 +*******************************************************************************/ + +//----------------------------------------------------------------------------- +/** @file spline.h */ +//----------------------------------------------------------------------------- + +#ifndef SCENARIOABSTRACT_COMMON_SPLINE_H +#define SCENARIOABSTRACT_COMMON_SPLINE_H + +#include <MantleAPI/Common/floating_point_helper.h> +#include <MantleAPI/Common/simulation_time.h> + +#include <array> + +namespace mantle_api +{ +struct SplineSection +{ + mantle_api::SimulationTime start_time{0}; + mantle_api::SimulationTime 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 + /// \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<double, 4> polynomial; +}; + +/// @brief Equality comparison for SplineSection. +inline bool operator==(const SplineSection& lhs, const SplineSection& 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 double a, const double b) { return IsEqual(a, b); }); +} + +} // namespace mantle_api + +#endif // SCENARIOABSTRACT_COMMON_SPLINE_H \ No newline at end of file diff --git a/MantleAPI/include/MantleAPI/Common/vector.h b/MantleAPI/include/MantleAPI/Common/vector.h new file mode 100644 index 0000000000000000000000000000000000000000..2405e5a49bfec554660c5b8dc4dc51b4a4369533 --- /dev/null +++ b/MantleAPI/include/MantleAPI/Common/vector.h @@ -0,0 +1,60 @@ +/******************************************************************************* +* Copyright (c) 2021, Bayerische Motoren Werke Aktiengesellschaft (BMW AG) +* +* This program and the accompanying materials are made +* available under the terms of the Eclipse Public License 2.0 +* which is available at https://www.eclipse.org/legal/epl-2.0/ +* +* SPDX-License-Identifier: EPL-2.0 +*******************************************************************************/ + +//----------------------------------------------------------------------------- +/** @file vector.h */ +//----------------------------------------------------------------------------- + + +#ifndef MANTLEAPI_COMMON_VECTOR_H +#define MANTLEAPI_COMMON_VECTOR_H + +#include <MantleAPI/Common/floating_point_helper.h> + +#include <cstdint> + +namespace mantle_api +{ + +template <typename T> +struct Vec3 +{ + Vec3() = default; + Vec3(T x, T y, T z) : x{x}, y{y}, z{z} {} + + T x{}; + T y{}; + T z{}; +}; +using Vec3d = Vec3<double>; + +inline bool operator==(const Vec3d& lhs, const Vec3d& rhs) noexcept +{ + return IsEqual(lhs.x, rhs.x) && IsEqual(lhs.y, rhs.y) && IsEqual(lhs.z, rhs.z); +} + +inline bool operator!=(const Vec3d& lhs, const Vec3d& rhs) noexcept +{ + return !(lhs == rhs); +} + +inline Vec3d operator-(const Vec3d& lhs, const Vec3d& rhs) noexcept +{ + return {lhs.x - rhs.x, lhs.y - rhs.y, lhs.z - rhs.z}; +} + +inline Vec3d operator+(const Vec3d& lhs, const Vec3d& rhs) noexcept +{ + return {lhs.x + rhs.x, lhs.y + rhs.y, lhs.z + rhs.z}; +} + +} // namespace mantle_api + +#endif // MANTLEAPI_COMMON_VECTOR_H diff --git a/MantleAPI/include/MantleAPI/EnvironmentalConditions/road_condition.h b/MantleAPI/include/MantleAPI/EnvironmentalConditions/road_condition.h new file mode 100644 index 0000000000000000000000000000000000000000..fdabdd08e7e9700e1854166b4efc6ee78d7d7116 --- /dev/null +++ b/MantleAPI/include/MantleAPI/EnvironmentalConditions/road_condition.h @@ -0,0 +1,34 @@ +/******************************************************************************* +* Copyright (c) 2021, Bayerische Motoren Werke Aktiengesellschaft (BMW AG) +* +* This program and the accompanying materials are made +* available under the terms of the Eclipse Public License 2.0 +* which is available at https://www.eclipse.org/legal/epl-2.0/ +* +* SPDX-License-Identifier: EPL-2.0 +*******************************************************************************/ + +//----------------------------------------------------------------------------- +/** @file road_condition.h */ +//----------------------------------------------------------------------------- + +#ifndef MANTLEAPI_ENVIRONMENTALCONDITIONS_ROADCONDITION_H +#define MANTLEAPI_ENVIRONMENTALCONDITIONS_ROADCONDITION_H + +#include <MantleAPI/Common/position.h> +namespace mantle_api +{ + +struct Rectangle +{ + Position bottom_left; + Position top_right; +}; + +struct FrictionPatch +{ + Rectangle bounding_box; + double friction; +}; +} // namespace mantle_api +#endif // MANTLEAPI_ENVIRONMENTALCONDITIONS_ROADCONDITION_H diff --git a/MantleAPI/include/MantleAPI/EnvironmentalConditions/weather.h b/MantleAPI/include/MantleAPI/EnvironmentalConditions/weather.h new file mode 100644 index 0000000000000000000000000000000000000000..955b720c74ef22c45a06d8a6b0473ae68910e06c --- /dev/null +++ b/MantleAPI/include/MantleAPI/EnvironmentalConditions/weather.h @@ -0,0 +1,79 @@ +/******************************************************************************* +* Copyright (c) 2021, Bayerische Motoren Werke Aktiengesellschaft (BMW AG) +* +* This program and the accompanying materials are made +* available under the terms of the Eclipse Public License 2.0 +* which is available at https://www.eclipse.org/legal/epl-2.0/ +* +* SPDX-License-Identifier: EPL-2.0 +*******************************************************************************/ + +//----------------------------------------------------------------------------- +/** @file weather.h */ +//----------------------------------------------------------------------------- + +#ifndef MANTLEAPI_ENVIRONMENTALCONDITIONS_WEATHER_H +#define MANTLEAPI_ENVIRONMENTALCONDITIONS_WEATHER_H + +#include <chrono> + +using Milliseconds = std::chrono::duration<int64_t, std::ratio<1, 1000>>; + +namespace mantle_api +{ +enum class Precipitation +{ + kUnknown, + kOther, + kNone, + kVeryLight, + kLight, + kModerate, + kHeavy, + kVeryHeavy, + kExtreme +}; + +enum class Fog +{ + kUnknown, + kOther, + kExcellentVisibility, + kGoodVisibility, + kModerateVisibility, + kPoorVisibility, + kMist, + kLight, + kThick, + kDense +}; + +enum class Illumination +{ + kUnknown, + kOther, + kLevel1, + kLevel2, + kLevel3, + kLevel4, + kLevel5, + kLevel6, + kLevel7, + kLevel8, + kLevel9 +}; + +struct Weather +{ + Fog fog{Fog::kUnknown}; + Precipitation precipitation{Precipitation::kUnknown}; + Illumination illumination{Illumination::kUnknown}; + double humidity_percent{0.0}; + double temperature_kelvin{0.0}; + double atmospheric_pressure_pascal{0.0}; + + Milliseconds date_time_ms{0}; // TODO: we should move this out of the weather...?! +}; +} // namespace mantle_api + +#endif // MANTLEAPI_ENVIRONMENTALCONDITIONS_WEATHER_H diff --git a/MantleAPI/include/MantleAPI/Execution/i_environment.h b/MantleAPI/include/MantleAPI/Execution/i_environment.h new file mode 100644 index 0000000000000000000000000000000000000000..1983b4dc57a7aed50b1e3feb6e41e6cf3591df74 --- /dev/null +++ b/MantleAPI/include/MantleAPI/Execution/i_environment.h @@ -0,0 +1,71 @@ +/******************************************************************************* +* Copyright (c) 2021, Bayerische Motoren Werke Aktiengesellschaft (BMW AG) +* +* This program and the accompanying materials are made +* available under the terms of the Eclipse Public License 2.0 +* which is available at https://www.eclipse.org/legal/epl-2.0/ +* +* SPDX-License-Identifier: EPL-2.0 +*******************************************************************************/ + +//----------------------------------------------------------------------------- +/** @file i_environment.h */ +//----------------------------------------------------------------------------- + + +#ifndef MANTLEAPI_EXECUTION_IENVIRONMENT_H +#define MANTLEAPI_EXECUTION_IENVIRONMENT_H + +#include <MantleAPI/EnvironmentalConditions/road_condition.h> +#include <MantleAPI/EnvironmentalConditions/weather.h> +#include <MantleAPI/Map/i_coord_converter.h> +#include <MantleAPI/Map/i_lane_location_query_service.h> +#include <MantleAPI/Traffic/i_entity_repository.h> + +#include <string> + +namespace mantle_api +{ + +class IEnvironment +{ + public: + virtual ~IEnvironment() = default; + + virtual void Init() = 0; + virtual void Step() = 0; + + /// Load a map file and parse it into the memory. + /// + /// @param file_path raw map file path from the scenario file. Resolving to a valid file path is done in the + /// environment. + virtual void CreateMap(const std::string& file_path, const std::vector<Position>& map_region) = 0; + + /// Creates a controller from the given config. A created controller can be assigned to multiple entities. + /// + /// @param config Specifies what kind of controller shall be created. The config needs to contain an ID to + /// in order to be able to assign this controller to an entity. + virtual void CreateController(std::unique_ptr<IControllerConfig> config) = 0; + + /// Assigns an entity to a copy of the specified controller. This controller needs to be created beforehand. + /// + /// @param entity The entity to be manipulated by the specified controller. + /// @param controller_id Identifies the controller to manipulate the entity. + virtual void AddEntityToController(IEntity& entity, std::uint64_t controller_id) = 0; + + virtual const ILaneLocationQueryService& GetQueryService() const = 0; + virtual const ICoordConverter* GetConverter() const = 0; + + virtual IEntityRepository& GetEntityRepository() = 0; + virtual const IEntityRepository& GetEntityRepository() const = 0; + + /// @brief DateTime in UTC (converted from RFC 3339 standard) + virtual void SetDateTime(std::chrono::duration<std::int64_t, std::milli> date_time) = 0; + virtual std::chrono::duration<std::int64_t, std::milli> GetDateTime() = 0; + + virtual void SetWeather(Weather weather) = 0; + virtual void SetRoadCondition(std::vector<FrictionPatch> friction_patches) = 0; +}; +} // namespace mantle_api + +#endif // MANTLEAPI_EXECUTION_IENVIRONMENT_H diff --git a/MantleAPI/include/MantleAPI/Execution/i_scenario_engine.h b/MantleAPI/include/MantleAPI/Execution/i_scenario_engine.h new file mode 100644 index 0000000000000000000000000000000000000000..ee08f52cda8a7615d1bf8508f6a06aec0c6fc888 --- /dev/null +++ b/MantleAPI/include/MantleAPI/Execution/i_scenario_engine.h @@ -0,0 +1,48 @@ +/******************************************************************************* +* Copyright (c) 2021, Bayerische Motoren Werke Aktiengesellschaft (BMW AG) +* +* This program and the accompanying materials are made +* available under the terms of the Eclipse Public License 2.0 +* which is available at https://www.eclipse.org/legal/epl-2.0/ +* +* SPDX-License-Identifier: EPL-2.0 +*******************************************************************************/ + +//----------------------------------------------------------------------------- +/** @file i_scenario_engine.h */ +//----------------------------------------------------------------------------- + + +#ifndef MANTLEAPI_EXECUTION_ISCENARIOENGINE_H +#define MANTLEAPI_EXECUTION_ISCENARIOENGINE_H + +#include <MantleAPI/Execution/scenario_info.h> + +#include <string> + +namespace mantle_api +{ +class IScenarioEngine +{ + public: + virtual ~IScenarioEngine() = default; + + /// Initialization of the scenario state, e.g. loading the scenario file, map file, etc. + virtual void Init() = 0; + + /// Provide information about the scenario loaded in `Init()` + virtual ScenarioInfo GetScenarioInfo() const = 0; + + /// Calculate the new state of the scenario implementation. + /// + /// Calling this function after `IsFinished()` should be a no-op. + /// @see IsFinished() + virtual void Step() = 0; + + /// Indicates whether the scenario implementation has finished processing the scenario (end of scenario is reached). + /// @return `true` if processing the scenario is complete, `false` otherwise. + virtual bool IsFinished() const = 0; +}; +} // namespace mantle_api + +#endif // MANTLEAPI_EXECUTION_ISCENARIOENGINE_H diff --git a/MantleAPI/include/MantleAPI/Execution/scenario_info.h b/MantleAPI/include/MantleAPI/Execution/scenario_info.h new file mode 100644 index 0000000000000000000000000000000000000000..3bf2b708d792bd7dae5a42abaa45f6a490e1faab --- /dev/null +++ b/MantleAPI/include/MantleAPI/Execution/scenario_info.h @@ -0,0 +1,36 @@ +/******************************************************************************* +* Copyright (c) 2021, Bayerische Motoren Werke Aktiengesellschaft (BMW AG) +* +* This program and the accompanying materials are made +* available under the terms of the Eclipse Public License 2.0 +* which is available at https://www.eclipse.org/legal/epl-2.0/ +* +* SPDX-License-Identifier: EPL-2.0 +*******************************************************************************/ + +//----------------------------------------------------------------------------- +/** @file scenario_info.h */ +//----------------------------------------------------------------------------- + + +#ifndef MANTLEAPI_EXECUTION_SCENARIOINFO_H +#define MANTLEAPI_EXECUTION_SCENARIOINFO_H + +#include <MantleAPI/Execution/simulation_time.h> + +#include <map> +#include <string> + +namespace mantle_api +{ + +struct ScenarioInfo +{ + SimulationTime scenario_timeout_duration; + std::string description; + std::map<std::string, std::string> additional_information; +}; + +} // namespace mantle_api + +#endif // MANTLEAPI_EXECUTION_SCENARIOINFO_H diff --git a/MantleAPI/include/MantleAPI/Execution/simulation_time.h b/MantleAPI/include/MantleAPI/Execution/simulation_time.h new file mode 100644 index 0000000000000000000000000000000000000000..ab2974898d2b3e0819441396a953918c49d9d612 --- /dev/null +++ b/MantleAPI/include/MantleAPI/Execution/simulation_time.h @@ -0,0 +1,30 @@ +/******************************************************************************* +* Copyright (c) 2021, Bayerische Motoren Werke Aktiengesellschaft (BMW AG) +* +* This program and the accompanying materials are made +* available under the terms of the Eclipse Public License 2.0 +* which is available at https://www.eclipse.org/legal/epl-2.0/ +* +* SPDX-License-Identifier: EPL-2.0 +*******************************************************************************/ + +//----------------------------------------------------------------------------- +/** @file simulation_time.h */ +//----------------------------------------------------------------------------- + + +#ifndef MANTLEAPI_EXECUTION_SIMULATIONTIME_H +#define MANTLEAPI_EXECUTION_SIMULATIONTIME_H + +#include <chrono> +#include <cstdint> + +namespace mantle_api +{ + +/// @brief Use milliseconds with std::int64_t representation as simulation time +using SimulationTime = std::chrono::duration<std::int64_t, std::milli>; + +} // namespace mantle_api + +#endif // MANTLEAPI_EXECUTION_SIMULATIONTIME_H diff --git a/MantleAPI/include/MantleAPI/Map/i_coord_converter.h b/MantleAPI/include/MantleAPI/Map/i_coord_converter.h new file mode 100644 index 0000000000000000000000000000000000000000..ed3cdb33deb0453c832a0607aa375a857b38ae2d --- /dev/null +++ b/MantleAPI/include/MantleAPI/Map/i_coord_converter.h @@ -0,0 +1,39 @@ +/******************************************************************************* +* Copyright (c) 2021, Bayerische Motoren Werke Aktiengesellschaft (BMW AG) +* +* This program and the accompanying materials are made +* available under the terms of the Eclipse Public License 2.0 +* which is available at https://www.eclipse.org/legal/epl-2.0/ +* +* SPDX-License-Identifier: EPL-2.0 +*******************************************************************************/ + +//----------------------------------------------------------------------------- +/** @file i_coord_converter.h */ +//----------------------------------------------------------------------------- + + +#ifndef MANTLEAPI_MAP_ICOORDCONVERTER_H +#define MANTLEAPI_MAP_ICOORDCONVERTER_H + +#include <MantleAPI/Common/position.h> +#include <MantleAPI/Common/vector.h> + +namespace mantle_api +{ + +/// Interface that provides functionality to query the underlying map with regard to transformation of different +/// position types, curvature, elevation etc. +class ICoordConverter +{ + public: + virtual ~ICoordConverter() = default; + /// Converts a track position to its corresponding inertial position. + virtual Vec3d Convert(Position position) const = 0; + + /// Converts alane position to its corresponding inertial position. + virtual Position Convert(Vec3d) const = 0; +}; +} // namespace mantle_api + +#endif // MANTLEAPI_MAP_ICOORDCONVERTER_H diff --git a/MantleAPI/include/MantleAPI/Map/i_lane_location_query_service.h b/MantleAPI/include/MantleAPI/Map/i_lane_location_query_service.h new file mode 100644 index 0000000000000000000000000000000000000000..c5703824efa4b489e04f99f67e569eeca6814e3a --- /dev/null +++ b/MantleAPI/include/MantleAPI/Map/i_lane_location_query_service.h @@ -0,0 +1,38 @@ +/******************************************************************************* +* Copyright (c) 2021, Bayerische Motoren Werke Aktiengesellschaft (BMW AG) +* +* This program and the accompanying materials are made +* available under the terms of the Eclipse Public License 2.0 +* which is available at https://www.eclipse.org/legal/epl-2.0/ +* +* SPDX-License-Identifier: EPL-2.0 +*******************************************************************************/ + +//----------------------------------------------------------------------------- +/** @file i_lane_location_query_service.h */ +//----------------------------------------------------------------------------- + +#ifndef MANTLEAPI_MAP_IQUERYSERVICE_H +#define MANTLEAPI_MAP_IQUERYSERVICE_H + +#include <MantleAPI/Common/i_identifiable.h> + +namespace mantle_api +{ + +/// Abstraction layer for all map related functions. +class ILaneLocationQueryService +{ + public: + virtual ~ILaneLocationQueryService() = default; + + /// TODO: Currently LaneLocationProvider just inherits from this for the sake of easily passing it to the + /// controllers + /// Therefore the GetMapObjectById function has been removed from the interface - for now. + /// We need to think about proper interface functions we want to define here (GetLaneLocation? GetLanes? But this + /// would add a rat-tail of more interfaces we need to define (ILaneLocation, ILane, ...?) + // virtual const IIdentifiable& GetMapObjectById(UniqueId id) = 0; +}; +} // namespace mantle_api + +#endif // MANTLEAPI_MAP_IQUERYSERVICE_H diff --git a/MantleAPI/include/MantleAPI/Map/i_route.h b/MantleAPI/include/MantleAPI/Map/i_route.h new file mode 100644 index 0000000000000000000000000000000000000000..e13adac7a575dfeb49870713db6453321b352d6e --- /dev/null +++ b/MantleAPI/include/MantleAPI/Map/i_route.h @@ -0,0 +1,60 @@ +/******************************************************************************* +* Copyright (c) 2021, Bayerische Motoren Werke Aktiengesellschaft (BMW AG) +* +* This program and the accompanying materials are made +* available under the terms of the Eclipse Public License 2.0 +* which is available at https://www.eclipse.org/legal/epl-2.0/ +* +* SPDX-License-Identifier: EPL-2.0 +*******************************************************************************/ + +//----------------------------------------------------------------------------- +/** @file i_route.h */ +//----------------------------------------------------------------------------- + + +#ifndef MANTLEAPI_MAP_IROUTE_H +#define MANTLEAPI_MAP_IROUTE_H + +#include <MantleAPI/Common/i_identifiable.h> +#include <MantleAPI/Common/vector.h> + +namespace mantle_api +{ +enum class LaneId +{ + kLeft9, + kLeft8, + kLeft7, + kLeft6, + kLeft5, + kLeft4, + kLeft3, + kLeft2, + kLeft1, + kRef, + kRight1, + kRight2, + kRight3, + kRight4, + kRight5, + kRight6, + kRight7, + kRight8, + kRight9 +}; + +class IRoute : public virtual IIdentifiable +{ + public: + virtual IRoute& AddWaypoint(const Vec3d& inert_pos) = 0; + virtual IRoute& AddWaypoint(Vec3d&& inert_pos) = 0; + virtual Vec3d GetInertPos(double route_pos, LaneId lane_id, double lane_offset = 0) const = 0; + virtual double GetLaneWidth(double route_pos, LaneId lane_id) const = 0; + virtual LaneId GetLaneId(const Vec3d& inert_pos) const = 0; + virtual double GetDistanceFromStartTo(const Vec3d& inert_pos) const = 0; + virtual double GetLength() const = 0; +}; +} // namespace mantle_api + +#endif // MANTLEAPI_MAP_IROUTE_H diff --git a/MantleAPI/include/MantleAPI/Traffic/entity_properties.h b/MantleAPI/include/MantleAPI/Traffic/entity_properties.h new file mode 100644 index 0000000000000000000000000000000000000000..5800b3d4945cb78fdcfa13ac146d8d71a31a9750 --- /dev/null +++ b/MantleAPI/include/MantleAPI/Traffic/entity_properties.h @@ -0,0 +1,139 @@ +/******************************************************************************* +* Copyright (c) 2021, Bayerische Motoren Werke Aktiengesellschaft (BMW AG) +* +* This program and the accompanying materials are made +* available under the terms of the Eclipse Public License 2.0 +* which is available at https://www.eclipse.org/legal/epl-2.0/ +* +* SPDX-License-Identifier: EPL-2.0 +*******************************************************************************/ + +//----------------------------------------------------------------------------- +/** @file entity_properties.h */ +//----------------------------------------------------------------------------- + + +#ifndef MANTLEAPI_TRAFFIC_ENTITYPROPERTIES_H +#define MANTLEAPI_TRAFFIC_ENTITYPROPERTIES_H + +#include <MantleAPI/Common/dimension.h> +#include <MantleAPI/Common/floating_point_helper.h> +#include <MantleAPI/Common/vector.h> + +#include <string> + +namespace mantle_api +{ +enum class EntityType +{ + // Other (unspecified but known) type of moving object. + kOther = 1, + // Object is a vehicle. + kVehicle = 2, + // Object is a pedestrian. + kPedestrian = 3, + // Object is an animal. + kAnimal = 4 +}; + +/// Basic properties that describe scenario entities. +struct EntityProperties +{ + virtual ~EntityProperties() = default; + + Dimension3d dimension{0.0, 0.0, 0.0}; + EntityType type{EntityType::kOther}; + std::string model{}; +}; + +inline bool operator==(const EntityProperties& lhs, const EntityProperties& rhs) noexcept +{ + return lhs.dimension == rhs.dimension && lhs.type == rhs.type && lhs.model == rhs.model; +} + +enum class VehicleClass +{ + kOther = 1, // Other (unspecified but known) type of vehicle. + // Vehicle is a small car. + // Definition: Hatchback car with maximum length 4 m. + kSmall_car = 2, + // Vehicle is a compact car. + // Definition: Hatchback car with length between 4 and 4.5 m. + kCompact_car = 3, + // Vehicle is a medium car. + // Definition: Hatchback or sedan with length between 4.5 and 5 m. + kMedium_car = 4, + // Vehicle is a luxury car. + // Definition: Sedan or coupe that is longer then 5 m. + kLuxury_car = 5, + // Vehicle is a delivery van. + // Definition: A delivery van. + kDelivery_van = 6, + // Vehicle is a heavy truck. + kHeavy_truck = 7, + // Vehicle is a truck with semitrailer. + kSemitrailer = 8, + // Vehicle is a trailer (possibly attached to another vehicle). + kTrailer = 9, + // Vehicle is a motorbike or moped. + kMotorbike = 10, + // Vehicle is a bicycle (without motor and specific lights). + kBicycle = 11, + // Vehicle is a bus. + kBus = 12, + // Vehicle is a tram. + kTram = 13, + // Vehicle is a train. + kTrain = 14, + // Vehicle is a wheelchair. + kWheelchair = 15, + // Vehicle type not specified properly. + kInvalid = -1 +}; + +enum class IndicatorState +{ + // Indicator state is unknown (must not be used in ground truth). + kUnknown = 0, + // Other (unspecified but known) state of indicator. + kOther = 1, + // Indicators are off. + kOff = 2, + // Left indicator is on. + kLeft = 3, + // Right indicator is on. + kRight = 4, + // Hazard/warning light, i.e. both indicators, are on. + kWarning = 5 +}; + +struct VehicleProperties : public EntityProperties +{ + VehicleClass classification{VehicleClass::kOther}; + Vec3d bb_center_to_front{}; + Vec3d bb_center_to_rear{}; + double front_wheel_diameter{0.0}; + double rear_wheel_diameter{0.0}; + bool is_host{false}; +}; + +inline bool operator==(const VehicleProperties& lhs, const VehicleProperties& rhs) noexcept +{ + return lhs.dimension == rhs.dimension && lhs.type == rhs.type && lhs.model == rhs.model && + lhs.classification == rhs.classification && lhs.bb_center_to_front == rhs.bb_center_to_front && + lhs.bb_center_to_rear == rhs.bb_center_to_rear && + IsEqual(lhs.front_wheel_diameter, rhs.front_wheel_diameter) && + IsEqual(lhs.rear_wheel_diameter, rhs.rear_wheel_diameter) && lhs.is_host == rhs.is_host; +} + +struct PedestrianProperties : public EntityProperties +{ +}; + +struct StaticObjectProperties : public EntityProperties +{ +}; + +} // namespace mantle_api + +#endif // MANTLEAPI_TRAFFIC_ENTITYPROPERTIES_H diff --git a/MantleAPI/include/MantleAPI/Traffic/i_controller_config.h b/MantleAPI/include/MantleAPI/Traffic/i_controller_config.h new file mode 100644 index 0000000000000000000000000000000000000000..6e4ca6d23c8ec4084c05d4c5fc74d4a2c2d30fcf --- /dev/null +++ b/MantleAPI/include/MantleAPI/Traffic/i_controller_config.h @@ -0,0 +1,52 @@ +/******************************************************************************* +* Copyright (c) 2021, Bayerische Motoren Werke Aktiengesellschaft (BMW AG) +* +* This program and the accompanying materials are made +* available under the terms of the Eclipse Public License 2.0 +* which is available at https://www.eclipse.org/legal/epl-2.0/ +* +* SPDX-License-Identifier: EPL-2.0 +*******************************************************************************/ + +//----------------------------------------------------------------------------- +/** @file i_controller_config.h */ +//----------------------------------------------------------------------------- + + +#ifndef MANTLEAPI_TRAFFIC_ICONTROLLERCONFIG_H +#define MANTLEAPI_TRAFFIC_ICONTROLLERCONFIG_H + +#include <MantleAPI/Common/spline.h> +#include <MantleAPI/Map/i_lane_location_query_service.h> + +#include <vector> + +namespace mantle_api +{ + +struct IControllerConfig +{ + virtual ~IControllerConfig() = default; + + ILaneLocationQueryService* map_query_service{nullptr}; + std::uint64_t id{0}; +}; + +struct NoOpControllerConfig : public IControllerConfig +{ +}; + +struct PathControllerConfig : public IControllerConfig +{ + std::vector<mantle_api::Vec3d> waypoints{}; +}; + +struct TrajectoryControllerConfig : public IControllerConfig +{ + std::vector<mantle_api::SplineSection> heading_splines; + std::vector<mantle_api::SplineSection> velocity_splines; +}; + +} // namespace mantle_api + +#endif // MANTLEAPI_TRAFFIC_ICONTROLLERCONFIG_H diff --git a/MantleAPI/include/MantleAPI/Traffic/i_entity.h b/MantleAPI/include/MantleAPI/Traffic/i_entity.h new file mode 100644 index 0000000000000000000000000000000000000000..ba688c174f90bb14c3c4ac66433aa6d0e99ee349 --- /dev/null +++ b/MantleAPI/include/MantleAPI/Traffic/i_entity.h @@ -0,0 +1,83 @@ +/******************************************************************************* +* Copyright (c) 2021, Bayerische Motoren Werke Aktiengesellschaft (BMW AG) +* +* This program and the accompanying materials are made +* available under the terms of the Eclipse Public License 2.0 +* which is available at https://www.eclipse.org/legal/epl-2.0/ +* +* SPDX-License-Identifier: EPL-2.0 +*******************************************************************************/ + +//----------------------------------------------------------------------------- +/** @file i_entity.h */ +//----------------------------------------------------------------------------- + + +#ifndef MANTLEAPI_TRAFFIC_IENTITY_H +#define MANTLEAPI_TRAFFIC_IENTITY_H + +#include <MantleAPI/Common/bounding_box.h> +#include <MantleAPI/Common/i_identifiable.h> +#include <MantleAPI/Common/pose.h> +#include <MantleAPI/Traffic/entity_properties.h> +#include <MantleAPI/Traffic/i_controller_config.h> + +#include <memory> +#include <vector> + +namespace mantle_api +{ +/// Base interface for all static and dynamic scenario entities. +class IEntity : public IIdentifiable +{ + public: + virtual void SetPosition(const Vec3d& inert_pos) = 0; + virtual Vec3d GetPosition() const = 0; + + virtual void SetOrientation(const Orientation3d& orientation) = 0; + virtual Orientation3d GetOrientation() const = 0; + + virtual void SetBoundingBox(const BoundingBox& bounding_box) = 0; + virtual BoundingBox GetBoundingBox() const = 0; + + virtual void SetVelocity(const Vec3d& velocity) = 0; + virtual Vec3d GetVelocity() const = 0; + + virtual void SetAcceleration(const Vec3d& acceleration) = 0; + virtual Vec3d GetAcceleration() const = 0; + + virtual void SetProperties(std::unique_ptr<mantle_api::EntityProperties> properties) = 0; + virtual EntityProperties* GetProperties() const = 0; + + // TODO: evaluate if this will be part of the final interface or if this for simulator only (= defined in Vehicle entity) + virtual void SetAssignedLaneIds(const std::vector<std::uint64_t>& assigned_lane_ids) = 0; + virtual std::vector<std::uint64_t> GetAssignedLaneIds() const = 0; +}; + +class IVehicle : public virtual IEntity +{ + public: + virtual VehicleProperties* GetProperties() const = 0; + + virtual void SetIndicatorState(IndicatorState state) = 0; + virtual IndicatorState GetIndicatorState() const = 0; + + // virtual bool IsHost() const = 0; + // virtual void SetHost() = 0; +}; + +class IPedestrian : public virtual IEntity +{ + public: + virtual PedestrianProperties* GetProperties() const = 0; +}; + +class IStaticObject : public virtual IEntity +{ + public: + virtual StaticObjectProperties* GetProperties() const = 0; +}; + +} // namespace mantle_api + +#endif // MANTLEAPI_TRAFFIC_IENTITY_H diff --git a/MantleAPI/include/MantleAPI/Traffic/i_entity_repository.h b/MantleAPI/include/MantleAPI/Traffic/i_entity_repository.h new file mode 100644 index 0000000000000000000000000000000000000000..c547f80ecf8140d5659ef7ec7d0776f77ee1fc14 --- /dev/null +++ b/MantleAPI/include/MantleAPI/Traffic/i_entity_repository.h @@ -0,0 +1,51 @@ +/******************************************************************************* +* Copyright (c) 2021, Bayerische Motoren Werke Aktiengesellschaft (BMW AG) +* +* This program and the accompanying materials are made +* available under the terms of the Eclipse Public License 2.0 +* which is available at https://www.eclipse.org/legal/epl-2.0/ +* +* SPDX-License-Identifier: EPL-2.0 +*******************************************************************************/ + +//----------------------------------------------------------------------------- +/** @file i_entity_repository.h */ +//----------------------------------------------------------------------------- + + +#ifndef MANTLEAPI_TRAFFIC_IENTITYREPOSITORY_H +#define MANTLEAPI_TRAFFIC_IENTITYREPOSITORY_H + +#include <MantleAPI/Traffic/entity_properties.h> +#include <MantleAPI/Traffic/i_entity.h> + +#include <string> +#include <vector> + +namespace mantle_api +{ +/// This interface provides CRUD functionality for scenario entities. +class IEntityRepository +{ + public: + virtual IVehicle& Create(const std::string& name, const VehicleProperties& properties) = 0; + virtual IVehicle& Create(UniqueId id, const std::string& name, const VehicleProperties& properties) = 0; + virtual IPedestrian& Create(const std::string& name, const PedestrianProperties& properties) = 0; + virtual IPedestrian& Create(UniqueId id, const std::string& name, const PedestrianProperties& properties) = 0; + virtual IStaticObject& Create(const std::string& name, const StaticObjectProperties& properties) = 0; + virtual IStaticObject& Create(UniqueId id, const std::string& name, const StaticObjectProperties& properties) = 0; + + virtual IVehicle& GetHost() = 0; + virtual IEntity& Get(const std::string& name) = 0; + virtual IEntity& Get(UniqueId id) = 0; + virtual bool Contains(UniqueId id) const = 0; + + virtual void Delete(const std::string& name) = 0; + virtual void Delete(UniqueId id) = 0; + + virtual const std::vector<std::unique_ptr<mantle_api::IEntity>>& GetEntities() const = 0; +}; + +} // namespace mantle_api + +#endif // MANTLEAPI_TRAFFIC_IENTITYREPOSITORY_H diff --git a/MantleAPI/test/MantleAPI/Test/test_utils.h b/MantleAPI/test/MantleAPI/Test/test_utils.h new file mode 100644 index 0000000000000000000000000000000000000000..36eb1d81762289894337aab48c28fcb97b6b40d5 --- /dev/null +++ b/MantleAPI/test/MantleAPI/Test/test_utils.h @@ -0,0 +1,306 @@ +/******************************************************************************* +* Copyright (c) 2021, Bayerische Motoren Werke Aktiengesellschaft (BMW AG) +* +* This program and the accompanying materials are made +* available under the terms of the Eclipse Public License 2.0 +* which is available at https://www.eclipse.org/legal/epl-2.0/ +* +* SPDX-License-Identifier: EPL-2.0 +*******************************************************************************/ + +//----------------------------------------------------------------------------- +/** @file test_utils.h */ +//----------------------------------------------------------------------------- + +#pragma once + +#include <MantleAPI/Common/i_identifiable.h> +#include <MantleAPI/Common/position.h> +#include <MantleAPI/EnvironmentalConditions/road_condition.h> +#include <MantleAPI/EnvironmentalConditions/weather.h> +#include <MantleAPI/Execution/i_environment.h> +#include <MantleAPI/Map/i_coord_converter.h> +#include <MantleAPI/Map/i_lane_location_query_service.h> +#include <MantleAPI/Traffic/entity_properties.h> +#include <MantleAPI/Traffic/i_controller_config.h> +#include <MantleAPI/Traffic/i_entity.h> +#include <MantleAPI/Traffic/i_entity_repository.h> +#include <gmock/gmock.h> +#include <gtest/gtest.h> + +namespace mantle_api +{ + +class MockConverter : public mantle_api::ICoordConverter +{ + public: + mantle_api::Vec3d Convert(mantle_api::Position position) const override + { + std::ignore = position; + return mantle_api::Vec3d(); + } + + mantle_api::Position Convert(mantle_api::Vec3d vec) const override + { + std::ignore = vec; + return mantle_api::Position{}; + } +}; + +class MockVehicle : public mantle_api::IVehicle +{ + public: + mantle_api::UniqueId GetUniqueId() const override { return 0; } + + void SetName(const std::string& name) override { name_ = name; } + const std::string& GetName() const override { return name_; } + + void SetPosition(const mantle_api::Vec3d& inert_pos) override { std::ignore = inert_pos; } + mantle_api::Vec3d GetPosition() const override { return mantle_api::Vec3d(); } + + void SetOrientation(const mantle_api::Orientation3d& orientation) override { std::ignore = orientation; } + mantle_api::Orientation3d GetOrientation() const override { return mantle_api::Orientation3d(); } + + void SetBoundingBox(const mantle_api::BoundingBox& bounding_box) override { std::ignore = bounding_box; } + mantle_api::BoundingBox GetBoundingBox() const override { return mantle_api::BoundingBox(); } + + void SetVelocity(const mantle_api::Vec3d& velocity) override { std::ignore = velocity; } + mantle_api::Vec3d GetVelocity() const override { return {}; } + + void SetAcceleration(const mantle_api::Vec3d& acceleration) override { std::ignore = acceleration; } + mantle_api::Vec3d GetAcceleration() const override { return {}; } + + void SetAssignedLaneIds(const std::vector<std::uint64_t>& ids) override { std::ignore = ids; } + std::vector<std::uint64_t> GetAssignedLaneIds() const override { return {}; } + + void SetProperties(std::unique_ptr<mantle_api::EntityProperties> properties) override { std::ignore = properties; } + mantle_api::VehicleProperties* GetProperties() const override + { + return static_cast<mantle_api::VehicleProperties*>(properties_.get()); + } + + void SetIndicatorState(mantle_api::IndicatorState state) override { std::ignore = state; } + mantle_api::IndicatorState GetIndicatorState() const override { return mantle_api::IndicatorState::kUnknown; } + + private: + std::string name_{}; + std::unique_ptr<mantle_api::EntityProperties> properties_{nullptr}; +}; + +class MockQueryService : public mantle_api::ILaneLocationQueryService +{ + public: + /// TODO: cleanup once the IQueryService interface is properly defined + const mantle_api::IIdentifiable& GetMapObjectById(mantle_api::UniqueId id) + { + std::ignore = id; + return test_vehicle_; + } + + private: + MockVehicle test_vehicle_{}; +}; + +class MockPedestrian : public mantle_api::IPedestrian +{ + public: + mantle_api::UniqueId GetUniqueId() const override { return 0; } + + void SetName(const std::string& name) override { name_ = name; } + const std::string& GetName() const override { return name_; } + + void SetPosition(const mantle_api::Vec3d& inert_pos) override { std::ignore = inert_pos; } + mantle_api::Vec3d GetPosition() const override { return mantle_api::Vec3d(); } + + void SetOrientation(const mantle_api::Orientation3d& orientation) override { std::ignore = orientation; } + mantle_api::Orientation3d GetOrientation() const override { return mantle_api::Orientation3d(); } + + void SetBoundingBox(const mantle_api::BoundingBox& bounding_box) override { std::ignore = bounding_box; } + mantle_api::BoundingBox GetBoundingBox() const override { return mantle_api::BoundingBox(); } + + void SetVelocity(const mantle_api::Vec3d& velocity) override { std::ignore = velocity; } + mantle_api::Vec3d GetVelocity() const override { return {}; } + + void SetAcceleration(const mantle_api::Vec3d& acceleration) override { std::ignore = acceleration; } + mantle_api::Vec3d GetAcceleration() const override { return {}; } + + void SetAssignedLaneIds(const std::vector<std::uint64_t>& ids) override { std::ignore = ids; } + std::vector<std::uint64_t> GetAssignedLaneIds() const override { return {}; } + + void SetProperties(std::unique_ptr<mantle_api::EntityProperties> properties) override { std::ignore = properties; } + mantle_api::PedestrianProperties* GetProperties() const override + { + return static_cast<mantle_api::PedestrianProperties*>(properties_.get()); + } + + private: + std::string name_{}; + std::unique_ptr<mantle_api::EntityProperties> properties_{nullptr}; +}; + +class MockStaticObject : public mantle_api::IStaticObject +{ + public: + mantle_api::UniqueId GetUniqueId() const override { return 0; } + + void SetName(const std::string& name) override { name_ = name; } + const std::string& GetName() const override { return name_; } + + void SetPosition(const mantle_api::Vec3d& inert_pos) override { std::ignore = inert_pos; } + mantle_api::Vec3d GetPosition() const override { return mantle_api::Vec3d(); } + + void SetOrientation(const mantle_api::Orientation3d& orientation) override { std::ignore = orientation; } + mantle_api::Orientation3d GetOrientation() const override { return mantle_api::Orientation3d(); } + + void SetBoundingBox(const mantle_api::BoundingBox& bounding_box) override { std::ignore = bounding_box; } + mantle_api::BoundingBox GetBoundingBox() const override { return mantle_api::BoundingBox(); } + + void SetVelocity(const mantle_api::Vec3d& velocity) override { std::ignore = velocity; } + mantle_api::Vec3d GetVelocity() const override { return {}; } + + void SetAcceleration(const mantle_api::Vec3d& acceleration) override { std::ignore = acceleration; } + mantle_api::Vec3d GetAcceleration() const override { return {}; } + + void SetAssignedLaneIds(const std::vector<std::uint64_t>& ids) override { std::ignore = ids; } + std::vector<std::uint64_t> GetAssignedLaneIds() const override { return {}; } + + void SetProperties(std::unique_ptr<mantle_api::EntityProperties> properties) override { std::ignore = properties; } + mantle_api::StaticObjectProperties* GetProperties() const override + { + return static_cast<mantle_api::StaticObjectProperties*>(properties_.get()); + } + + private: + std::string name_{}; + std::unique_ptr<mantle_api::EntityProperties> properties_{nullptr}; +}; + +class MockEntityRepository : public mantle_api::IEntityRepository +{ + public: + MOCK_METHOD(mantle_api::IVehicle&, + Create, + (const std::string& name, const mantle_api::VehicleProperties& properties), + (override)); + + mantle_api::IVehicle& Create(mantle_api::UniqueId id, + const std::string& name, + const mantle_api::VehicleProperties& properties) override + { + std::ignore = id; + std::ignore = name; + std::ignore = properties; + return test_vehicle_; + } + + MOCK_METHOD(mantle_api::IPedestrian&, + Create, + (const std::string& name, const mantle_api::PedestrianProperties& properties), + (override)); + + mantle_api::IPedestrian& Create(mantle_api::UniqueId id, + const std::string& name, + const mantle_api::PedestrianProperties& properties) override + { + std::ignore = id; + std::ignore = name; + std::ignore = properties; + return test_pedestrian_; + } + + MOCK_METHOD(mantle_api::IStaticObject&, + Create, + (const std::string& name, const mantle_api::StaticObjectProperties& properties), + (override)); + + mantle_api::IStaticObject& Create(mantle_api::UniqueId id, + const std::string& name, + const mantle_api::StaticObjectProperties& properties) override + { + std::ignore = id; + std::ignore = name; + std::ignore = properties; + return test_static_object_; + } + + mantle_api::IEntity& Get(const std::string& name) override + { + std::ignore = name; + return test_vehicle_; + } + + mantle_api::IEntity& Get(mantle_api::UniqueId id) override + { + std::ignore = id; + return test_vehicle_; + } + + mantle_api::IVehicle& GetHost() override { return test_vehicle_; } + + const std::vector<std::unique_ptr<mantle_api::IEntity>>& GetEntities() const override { return entities_; } + + void Delete(const std::string& name) override { std::ignore = name; } + bool Contains(UniqueId id) const override { return false; } + void Delete(UniqueId id) override { std::ignore = id; } + + // const std::vector<mantle_api::IEntity>& GetEntities() const override { return <#initializer #>{}; } + // std::vector<mantle_api::IEntity>& GetEntities() override { return <#initializer #>; } + + private: + MockVehicle test_vehicle_{}; + MockPedestrian test_pedestrian_{}; + MockStaticObject test_static_object_{}; + std::vector<std::unique_ptr<mantle_api::IEntity>> entities_{}; +}; + +class MockEnvironment : public mantle_api::IEnvironment +{ + public: + virtual void Init() override {} + + virtual void Step() override {} + + MOCK_METHOD(void, + CreateMap, + (const std::string& file_path, const std::vector<mantle_api::Position>& map_region), + (override) + + ); + + MOCK_METHOD(void, CreateController, (std::unique_ptr<IControllerConfig> config), (override) + + ); + + MOCK_METHOD(void, AddEntityToController, (mantle_api::IEntity & entity, std::uint64_t controller_id), (override) + + ); + + const mantle_api::ILaneLocationQueryService& GetQueryService() const override { return query_service_; } + + const mantle_api::ICoordConverter* GetConverter() const override { return &converter_; } + + mantle_api::IEntityRepository& GetEntityRepository() override { return entity_repository_; } + + const mantle_api::IEntityRepository& GetEntityRepository() const override { return entity_repository_; } + + void SetWeather(mantle_api::Weather weather) override { std::ignore = weather; } + + void SetRoadCondition(std::vector<mantle_api::FrictionPatch> friction_patches) override + { + std::ignore = friction_patches; + } + + void SetDateTime(std::chrono::duration<std::int64_t, std::milli> date_time) override { std::ignore = date_time; } + + std::chrono::duration<std::int64_t, std::milli> GetDateTime() override + { + return std::chrono::duration<std::int64_t, std::milli>(); + } + + private: + MockQueryService query_service_{}; + MockEntityRepository entity_repository_{}; + MockConverter converter_{}; +}; + +} // namespace mantle_api diff --git a/MantleAPI/test/interface_test.cpp b/MantleAPI/test/interface_test.cpp new file mode 100644 index 0000000000000000000000000000000000000000..c98b70833f09e1234184c8973790dcd2b4ede4bb --- /dev/null +++ b/MantleAPI/test/interface_test.cpp @@ -0,0 +1,34 @@ +/******************************************************************************* +* Copyright (c) 2021, Bayerische Motoren Werke Aktiengesellschaft (BMW AG) +* +* This program and the accompanying materials are made +* available under the terms of the Eclipse Public License 2.0 +* which is available at https://www.eclipse.org/legal/epl-2.0/ +* +* SPDX-License-Identifier: EPL-2.0 +*******************************************************************************/ + +//----------------------------------------------------------------------------- +/** @file interface_test.cpp */ +//----------------------------------------------------------------------------- + + +#include <MantleAPI/Test/test_utils.h> + +TEST(InterfaceTest, GivenTeleportAction_When_ThenHostVehicleIsPlaced) +{ + mantle_api::Position inert_pos{}; + inert_pos = mantle_api::OpenDrivePosition{{0, 0}, 0, 0}; + mantle_api::MockEnvironment env{}; + env.CreateMap("dummy_map_path", {}); + + mantle_api::VehicleProperties vehicle_properties; + vehicle_properties.is_host = true; + vehicle_properties.model = "G12"; + + auto& repo = env.GetEntityRepository(); + auto& host_vehicle = repo.Create(0, "host", vehicle_properties); + const auto* const converter = env.GetConverter(); + auto world_pos = converter->Convert(inert_pos); + host_vehicle.SetPosition(world_pos); +} diff --git a/README.md b/README.md index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..e31998126c1aab953ecae282eaf7549f7ffb44a6 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,6 @@ +# Scenario API + +A collection of interfaces for abstraction between a scenario engine and an environment simulator. +It is intended to be usable with a wide variety of scenario description languages by implementing according scenario engines. + +Remark: This is currently work in progress and no stable state is reached yet.