27 #include <type_traits>
28 #include <SimoxUtility/json/json.hpp>
33 #include <RobotAPI/interface/units/RobotUnit/RobotUnitInterface.h>
38 #include <armarx/control/memory/config/Writer.h>
39 #include <armarx/control/memory/config/Reader.h>
41 #include <armarx/control/interface/ConfigurableNJointControllerInterface.h>
42 #include <armarx/control/core/Controller.h>
57 using AronDTO =
typename ControllerDescriptionType::AronDTO;
65 const memory::config::Reader& configProvider,
66 const memory::config::Writer& configWriter,
67 const std::string& controllerNamePrefix) :
68 controllerCreator(controllerCreator),
69 configReader(configProvider),
70 configWriter(configWriter),
71 controllerNamePrefix(controllerNamePrefix)
74 <<
"By convention, the controller name prefix must exist. This ensures that "
75 "in between components, no naming clashes occur.";
81 if (
auto cfg = configReader.getDefaultConfig(ControllerDescriptionType::name, name))
83 dto = AronDTO::FromAron(cfg);
96 auto cfg = configReader.getConfig(memoryId);
97 dto = AronDTO::FromAron(cfg);
110 nlohmann::json jsonConfig;
114 if(not this->dto.has_value())
124 this->dto->read(reader, jsonConfig);
147 this->nodeSetName = nodeSetName;
154 if (namePrefix.empty())
156 this->controllerNamePrefix = this->controllerNamePrefix +
"_" + namePrefix;
165 std::optional<ControllerWrapper<T>>
168 const std::string controllerClassName = ControllerDescriptionType::name;
169 return create(controllerClassName);
173 std::optional<ControllerWrapper<T>>
176 if (not ensureInitialized())
181 ::armarx::control::ConfigurableNJointControllerConfigPtr
config =
182 new ::armarx::control::ConfigurableNJointControllerConfig;
183 config->config = dto.value().toAronDTO();
185 if (not nodeSetName.has_value())
190 config->nodeSetName = nodeSetName.value();
192 controllerName = controllerNamePrefix +
"_" + nodeSetName.value() +
"_" + name;
193 const std::string controllerClassName = ControllerDescriptionType::name;
197 armarx::NJointControllerInterfacePrx
controller =
198 controllerCreator->getNJointController(controllerName);
201 const bool canReuseController = [&]() ->
bool
216 if (
controller->getClassName() != controllerClassName)
235 ARMARX_INFO <<
"Deleting existing controller `" << controllerName <<
"`";
239 controllerCreator->deactivateAndDeleteNJointController(controllerName);
255 ARMARX_INFO <<
"Deleting existing controller `" << controllerName <<
"`";
259 controllerCreator->deactivateAndDeleteNJointController(controllerName);
272 if (not canReuseController)
276 ARMARX_INFO <<
"Creating controller `" << controllerName <<
"`";
278 controller = controllerCreator->createNJointController(
279 controllerClassName, controllerName,
config);
285 ARMARX_WARNING <<
"Failed to create controller of type `" << controllerClassName
291 armarx::control::ConfigurableNJointControllerInterfacePrx::checkedCast(
controller);
298 ctrlWrapper.updateConfig();
300 return std::move(ctrlWrapper);
311 return controllerName;
318 if (
auto cfg = configReader.getDefaultConfig(ControllerDescriptionType::name))
320 dto = AronDTO::FromAron(cfg);
331 if (not dto.has_value())
333 return initDefaultConfig();
342 const memory::config::Reader configReader;
343 const memory::config::Writer configWriter;
345 std::optional<AronDTO> dto;
347 std::optional<std::string> nodeSetName;
349 std::string controllerNamePrefix;
350 std::string controllerName;
352 bool allowReuse_ =
false;