Skip to content
Snippets Groups Projects
Commit fe995aac authored by René Paris's avatar René Paris
Browse files

Merge branch 'fix/47-missing-controller-name' into 'main'

fix: Make engine set name of controller(s)

Closes #47

See merge request !168
parents 5bc8f9a7 bd0ff61c
No related branches found
No related tags found
1 merge request!168fix: Make engine set name of controller(s)
Pipeline #31866 canceled
......@@ -91,29 +91,29 @@ spec:
stages {
stage('Windows: Prepare openscenario_api dependency') {
steps {
bat 'subst E: %WORKSPACE%'
dir('E:/') {
bat 'subst W: %WORKSPACE%'
dir('W:/') {
bat 'C:\\msys64\\usr\\bin\\bash -lc repo/utils/ci/scripts/10_prepare_openscenario_api.sh'
}
}
}
stage('Windows: Configure build') {
steps {
dir('E:/') {
dir('W:/') {
bat 'C:\\msys64\\usr\\bin\\bash -lc repo/utils/ci/scripts/20_configure.sh'
}
}
}
stage('Windows: Build and install project') {
steps {
dir('E:/') {
dir('W:/') {
bat 'C:\\msys64\\usr\\bin\\bash -lc repo/utils/ci/scripts/30_build.sh'
}
}
}
stage('Windows: Build and run unit tests') {
steps {
dir('E:/') {
dir('W:/') {
bat 'C:\\msys64\\usr\\bin\\bash -lc repo/utils/ci/scripts/40_unit_tests.sh'
}
}
......@@ -121,7 +121,7 @@ spec:
}
post {
always {
bat 'subst E: /d'
bat 'subst W: /d'
}
}
}
......
......@@ -252,11 +252,11 @@ Converts `NET_ASAM_OPENSCENARIO::v1_2::ITransitionDynamics` object type to [mant
| Dependency | Commit | Version | License |
| ---------- | ------ | ------- | ------- |
| [MantleAPI](https://gitlab.eclipse.org/eclipse/openpass/mantle-api) | cab24eba | | EPL 2.0 |
| [MantleAPI](https://gitlab.eclipse.org/eclipse/openpass/mantle-api) | 9a038989 | | EPL 2.0 |
| [OpenSCENARIO API](https://github.com/RA-Consulting-GmbH/openscenario.api.test/) | 65f8dca | 1.3.1 | Apache 2.0 |
| [YASE](https://gitlab.eclipse.org/eclipse/openpass/yase) | e687b5c4 | | EPL 2.0 |
| [Units](https://github.com/nholthaus/units) | ea6d126 | | MIT License |
| [googletest](https://github.com/google/googletest) | 58d77fa | 1.12.1 | BSD-3-Clause License |
| [googletest](https://github.com/google/googletest) | f8d7d77 | 1.14.0 | BSD-3-Clause License |
| [CPM](https://github.com/cpm-cmake/CPM.cmake) | 03705fc | 0.36.0 | MIT License |
# Issues
......
Subproject commit cab24ebad3b6d8d8bb85487d7bc80c91029da566
Subproject commit 9a038989604e8da62ecddbe2094b16ce1b778be1
......@@ -102,7 +102,7 @@ TrafficDefinition ConvertScenarioTrafficDefinition(const std::shared_ptr<NET_ASA
for(const auto& vehicle_category_distribution_entry : osc_traffic_definition->GetVehicleCategoryDistribution()->GetVehicleCategoryDistributionEntries())
{
auto converted{detail::ConvertVehicleCategoryDistributionEntry(vehicle_category_distribution_entry)};
vehicle_category_distribution_entries.push_back(converted);
vehicle_category_distribution_entries.push_back(std::move(converted));
}
std::vector<ControllerDistribution> controller_distribution_entries;
......@@ -110,7 +110,7 @@ TrafficDefinition ConvertScenarioTrafficDefinition(const std::shared_ptr<NET_ASA
for(const auto& controller_distribution_entry : osc_traffic_definition->GetControllerDistribution()->GetControllerDistributionEntries())
{
auto converted{detail::ConvertControllerDistributionEntry(controller_distribution_entry)};
controller_distribution_entries.push_back(converted);
controller_distribution_entries.push_back(std::move(converted));
}
return {osc_traffic_definition->GetName(), vehicle_category_distribution_entries, controller_distribution_entries};
......
......@@ -31,18 +31,19 @@ bool IsCatalogReferenceControllableObject(
return NET_ASAM_OPENSCENARIO::v1_2::CatalogHelper::IsVehicle(catalog_element) ||
NET_ASAM_OPENSCENARIO::v1_2::CatalogHelper::IsPedestrian(catalog_element);
}
throw std::runtime_error("ControllerCreator: CatalogReference " + catalog_reference->GetEntryName() +
throw std::runtime_error("ControllerCreator: CatalogReference \"" + catalog_reference->GetEntryName() + "\"" +
" for entity object cannot be resolved.");
}
auto CreateExternalControllerConfig(
const std::string& controller_name,
const std::shared_ptr<NET_ASAM_OPENSCENARIO::v1_2::IController>& controller)
{
auto external_config = std::make_unique<mantle_api::ExternalControllerConfig>();
if (controller)
{
external_config->name = controller->GetName();
external_config->name = controller_name;
for (const auto& property : controller->GetProperties()->GetProperties())
{
external_config->parameters.emplace(property->GetName(), property->GetValue());
......@@ -52,12 +53,11 @@ auto CreateExternalControllerConfig(
return external_config;
}
auto CreateExternalControllerConfig(
const std::shared_ptr<NET_ASAM_OPENSCENARIO::v1_2::IObjectController>& object_controller)
std::shared_ptr<NET_ASAM_OPENSCENARIO::v1_2::IController> Parse(const std::shared_ptr<NET_ASAM_OPENSCENARIO::v1_2::IObjectController>& object_controller)
{
if (auto controller = object_controller->GetController())
{
return detail::CreateExternalControllerConfig(controller);
return controller;
}
if (auto catalog_reference = object_controller->GetCatalogReference())
{
......@@ -65,9 +65,9 @@ auto CreateExternalControllerConfig(
NET_ASAM_OPENSCENARIO::v1_2::CatalogHelper::IsController(ref))
{
const auto& controller = NET_ASAM_OPENSCENARIO::v1_2::CatalogHelper::AsController(ref);
return detail::CreateExternalControllerConfig(controller);
return controller;
}
throw std::runtime_error("ControllerCreator: CatalogReference " + catalog_reference->GetEntryName() +
throw std::runtime_error("ControllerCreator: CatalogReference \"" + catalog_reference->GetEntryName() + "\"" +
" for object controller cannot be resolved.");
}
throw std::runtime_error(
......@@ -76,13 +76,20 @@ auto CreateExternalControllerConfig(
"Please correct the scenario.");
}
auto CreateExternalControllerConfig(
const std::string& controller_name,
const std::shared_ptr<NET_ASAM_OPENSCENARIO::v1_2::IObjectController>& object_controller)
{
return detail::CreateExternalControllerConfig(controller_name, detail::Parse(object_controller));
}
bool IsNotControllable(const std::shared_ptr<NET_ASAM_OPENSCENARIO::v1_2::IScenarioObject>& scenario_object)
{
auto entity_object = scenario_object->GetEntityObject();
if (!entity_object)
{
throw std::runtime_error("ControllerCreator: EntityObject missing in ScenarioObject " + scenario_object->GetName());
throw std::runtime_error("ControllerCreator: EntityObject missing in ScenarioObject \"" + scenario_object->GetName() + "\"");
}
if (entity_object->GetVehicle() || entity_object->GetPedestrian())
......@@ -128,14 +135,14 @@ void ControllerCreator::CreateControllers(const std::vector<std::shared_ptr<NET_
const auto entity_name = scenario_object->GetName();
if (detail::IsNotControllable(scenario_object))
{
Logger::Info("ControllerCreator: No controller created for non-vehicle and non-pedestrian type scenario object " + entity_name);
Logger::Info("ControllerCreator: No controller created for non-vehicle and non-pedestrian type scenario object \"" + entity_name + "\"");
return;
}
const auto entity = environment_.GetEntityRepository().Get(entity_name);
if (!entity.has_value())
{
throw std::runtime_error("ControllerCreator: Trying to create controller for unavailable entity " + entity_name);
throw std::runtime_error("ControllerCreator: Trying to create controller for unavailable entity \"" + entity_name + "\"");
}
auto& controller_repository = environment_.GetControllerRepository();
......@@ -170,11 +177,12 @@ ControllerRegistrar::ControllerRegistrar(
void ControllerRegistrar::CreateDefaultController()
{
Logger::Info("ControllerCreator: Setting up internal controller for entity " + entity_name_);
Logger::Info("ControllerCreator: Setting up internal controller for entity \"" + entity_name_ + "\"");
auto default_config = std::make_unique<mantle_api::InternalControllerConfig>();
default_config->control_strategies.push_back(std::make_unique<mantle_api::KeepVelocityControlStrategy>());
default_config->control_strategies.push_back(std::make_unique<mantle_api::KeepLaneOffsetControlStrategy>());
default_config->name = CONTROLLER_NAME_DEFAULT;
auto& controller = controller_repository_.Create(std::move(default_config));
RegisterDefaultController(controller);
}
......@@ -185,9 +193,11 @@ void ControllerRegistrar::CreateUserDefinedControllers(bool control_override)
{
if (control_override && IsDrivingFunctionControlledEntity(entity_name_))
{
// Empty external controller, as control override is active
auto& controller = controller_repository_.Create(
std::make_unique<mantle_api::ExternalControllerConfig>());
auto external_config = std::make_unique<mantle_api::ExternalControllerConfig>();
external_config->name = CONTROLLER_NAME_OVERRIDE;
Logger::Info("ControllerRegistrar: Setting up external controller \"" + external_config->name + "\" for entity \"" + entity_name_ + "\"");
auto& controller = controller_repository_.Create(std::move(external_config));
RegisterUserDefinedController(controller);
}
}
......@@ -195,9 +205,10 @@ void ControllerRegistrar::CreateUserDefinedControllers(bool control_override)
{
for (const auto& object_controller : object_controllers_)
{
Logger::Info("ControllerRegistrar: Setting up external controller for entity " + entity_name_);
auto controller_name = detail::Parse(object_controller)->GetName();
auto external_config = detail::CreateExternalControllerConfig(controller_name, object_controller);
auto external_config = detail::CreateExternalControllerConfig(object_controller);
Logger::Info("ControllerRegistrar: Setting up external controller \"" + external_config->name + "\" for entity \"" + entity_name_ + "\"");
auto& controller = controller_repository_.Create(std::move(external_config));
RegisterUserDefinedController(controller);
}
......
......@@ -19,6 +19,10 @@
namespace OpenScenarioEngine::v1_2
{
static constexpr const char* CONTROLLER_NAME_DEFAULT {"OpenScenarioEngine::v1_2::Default"};
static constexpr const char* CONTROLLER_NAME_OVERRIDE {"OpenScenarioEngine::v1_2::ExternalOverride"};
class ControllerService;
class ControllerCreator
......@@ -56,9 +60,9 @@ public:
void CreateUserDefinedControllers(bool control_override);
private:
void RegisterController(mantle_api::IController& controller, bool is_default);
void RegisterDefaultController(mantle_api::IController& controller);
void RegisterUserDefinedController(mantle_api::IController& controller);
void RegisterController(mantle_api::IController& controller, bool is_default);
const std::vector<std::shared_ptr<NET_ASAM_OPENSCENARIO::v1_2::IObjectController>> object_controllers_;
const std::string& entity_name_;
......
......@@ -29,6 +29,7 @@ using testing::_;
using testing::Return;
using testing::ReturnRef;
using testing::Pointee;
using testing::SaveArgPointee;
using namespace units::literals;
using namespace std::string_literals;
......@@ -36,7 +37,7 @@ using namespace std::string_literals;
class OpenScenarioEngineTest : public OpenScenarioEngineTestBase
{
protected:
void SetUp() override {
void SetUp() override {
OpenScenarioEngineTestBase::SetUp();
ON_CALL(controller_, GetName()).WillByDefault(ReturnRef(controller_name));
ON_CALL(controller_, GetUniqueId()).WillByDefault(Return(1234));
......@@ -256,26 +257,63 @@ TEST_F(OpenScenarioEngineTest, GivenScenarioWithEntities_WhenInitScenario_ThenCr
EXPECT_NO_THROW(engine.Init());
}
TEST_F(OpenScenarioEngineTest,
GivenScenarioWithExternallyControlledEntity_WhenInit_ThenControllerWithExternalConfigIsCreatedAndAssigned)
{
std::string xosc_file_path{GetScenariosPath(test_info_->file()) + default_xosc_scenario_};
OpenScenarioEngine::v1_2::OpenScenarioEngine engine(xosc_file_path, env_);
mantle_api::InternalControllerConfig internal_controller_config{};
internal_controller_config.control_strategies = {
std::make_unique<mantle_api::KeepVelocityControlStrategy>(),
std::make_unique<mantle_api::KeepLaneOffsetControlStrategy>()};
mantle_api::MockController mock_default_controller;
const mantle_api::UniqueId DEFAULT_CONTROLLER_ID {1234};
const std::string DEFAULT_CONTROLLER_NAME {"TestDefaultController"};
ON_CALL(mock_default_controller, GetUniqueId()).WillByDefault(Return(DEFAULT_CONTROLLER_ID));
ON_CALL(mock_default_controller, GetName()).WillByDefault(ReturnRef(DEFAULT_CONTROLLER_NAME));
mantle_api::MockController mock_user_defined_controller;
const mantle_api::UniqueId USER_DEFINED_CONTROLLER_ID {5678};
const std::string USER_DEFINED_CONTROLLER_NAME {"TestUserDefinedController"};
ON_CALL(mock_user_defined_controller, GetUniqueId()).WillByDefault(Return(USER_DEFINED_CONTROLLER_ID));
ON_CALL(mock_user_defined_controller, GetName()).WillByDefault(ReturnRef(USER_DEFINED_CONTROLLER_NAME));
mantle_api::InternalControllerConfig internal_config_actual;
mantle_api::ExternalControllerConfig external_config_actual;
ON_CALL(env_->GetControllerRepository(), Create(_))
.WillByDefault(::testing::Invoke([&](std::unique_ptr<mantle_api::IControllerConfig> received_controller) -> mantle_api::IController&
{
if (auto internal = dynamic_cast<mantle_api::InternalControllerConfig*>(received_controller.get()))
{
internal_config_actual = *internal; // copy assignment, as we drop the unique_ptr
return mock_default_controller;
}
mantle_api::ExternalControllerConfig external_controller_config{};
external_controller_config.name = "ALKSController",
external_controller_config.parameters.emplace("controller_property", "3");
if (auto external = dynamic_cast<mantle_api::ExternalControllerConfig*>(received_controller.get()))
{
external_config_actual = *external; // copy assignment, as we drop the unique_ptr
return mock_user_defined_controller;
}
throw std::runtime_error("Untested ControllerConfigType");
}));
EXPECT_CALL(env_->GetControllerRepository(), Create(Pointee(internal_controller_config)));
EXPECT_CALL(env_->GetControllerRepository(), Create(Pointee(external_controller_config)));
EXPECT_CALL(*env_, AddEntityToController(_, 1234)).Times(2);
EXPECT_CALL(*env_, AddEntityToController(_, DEFAULT_CONTROLLER_ID));
EXPECT_CALL(*env_, AddEntityToController(_, USER_DEFINED_CONTROLLER_ID));
EXPECT_NO_THROW(engine.Init());
mantle_api::InternalControllerConfig internal_config_expected{};
internal_config_expected.name = OpenScenarioEngine::v1_2::CONTROLLER_NAME_DEFAULT;
internal_config_expected.control_strategies = {
std::make_shared<mantle_api::KeepVelocityControlStrategy>(),
std::make_shared<mantle_api::KeepLaneOffsetControlStrategy>()};
mantle_api::ExternalControllerConfig external_config_expected{};
external_config_expected.name = "ALKSController",
external_config_expected.parameters.emplace("controller_property", "3");
EXPECT_EQ(internal_config_expected, internal_config_actual);
EXPECT_EQ(external_config_expected, external_config_actual);
}
TEST_F(OpenScenarioEngineTest, GivenScenarioWithInitTeleportAction_WhenInitAndStepEngine_ThenSetPositionIsCalled)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment