FMIAdapter.cpp
Go to the documentation of this file.
1 // Copyright (c) 2018 - for information on the respective copyright owner
2 // see the NOTICE file and/or the repository https://github.com/boschresearch/fmi_adapter.
3 //
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 // http://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15 
16 #include "fmi_adapter/FMIAdapter.h"
17 
18 #include <cstdlib>
19 
20 #include <algorithm>
21 #include <exception>
22 #include <fstream>
23 #include <functional>
24 #include <iostream>
25 #include <utility>
26 
27 #include <dirent.h>
28 #include <unistd.h>
29 
30 #include <fmilib.h>
31 
32 namespace fmi_adapter {
33 
34 namespace helpers {
35 
36 bool canWriteToFolder(const std::string& path) {
37  DIR* dir = opendir(path.c_str());
38  if (dir == nullptr) {
39  return false;
40  }
41  closedir(dir);
42  return (access(path.c_str(), W_OK) == 0);
43 }
44 
45 
46 bool canReadFromFile(const std::string& path) {
47  std::ifstream stream(path.c_str());
48  if (stream.is_open() && stream.good()) {
49  stream.close();
50  return true;
51  } else {
52  return false;
53  }
54 }
55 
56 
57 bool variableFilterAll(__attribute__((unused)) fmi2_import_variable_t* variable) { return true; }
58 
59 
60 bool variableFilterByCausality(fmi2_import_variable_t* variable, fmi2_causality_enu_t causality) {
61  return (fmi2_import_get_causality(variable) == causality);
62 }
63 
64 
66 std::vector<fmi2_import_variable_t*> getVariablesFromFMU(
67  fmi2_import_t* fmu, std::function<bool(fmi2_import_variable_t*)> filter = variableFilterAll) {
68  assert(fmu);
69 
70  std::vector<fmi2_import_variable_t*> result;
71 
72  fmi2_import_variable_list_t* variableList = fmi2_import_get_variable_list(fmu, 0);
73  const size_t variablesCount = fmi2_import_get_variable_list_size(variableList);
74  for (size_t index = 0; index < variablesCount; ++index) {
75  fmi2_import_variable_t* variable = fmi2_import_get_variable(variableList, index);
76  if (filter(variable)) {
77  result.push_back(variable);
78  }
79  }
80 
81  fmi2_import_free_variable_list(variableList);
82 
83  return result;
84 }
85 
86 
88 std::vector<std::string> getVariableNamesFromFMU(
89  fmi2_import_t* fmu, std::function<bool(fmi2_import_variable_t*)> filter = variableFilterAll) {
90  assert(fmu);
91 
92  std::vector<std::string> result;
93 
94  fmi2_import_variable_list_t* variableList = fmi2_import_get_variable_list(fmu, 0);
95  const size_t variablesCount = fmi2_import_get_variable_list_size(variableList);
96  for (size_t index = 0; index < variablesCount; ++index) {
97  fmi2_import_variable_t* variable = fmi2_import_get_variable(variableList, index);
98  if (filter(variable)) {
99  std::string name = fmi2_import_get_variable_name(variable);
100  result.push_back(name);
101  }
102  }
103 
104  fmi2_import_free_variable_list(variableList);
105 
106  return result;
107 }
108 
109 } // namespace helpers
110 
111 
112 FMIAdapter::FMIAdapter(const std::string& fmuPath, ros::Duration stepSize, bool interpolateInput,
113  const std::string& tmpPath)
114  : fmuPath_(fmuPath), stepSize_(stepSize), interpolateInput_(interpolateInput), tmpPath_(tmpPath) {
115  if (stepSize == ros::Duration(0.0)) {
116  // Use step-size from FMU. See end of ctor.
117  } else if (stepSize < ros::Duration(0.0)) {
118  throw std::invalid_argument("Step size must be positive!");
119  }
120  if (!helpers::canReadFromFile(fmuPath)) {
121  throw std::invalid_argument("Given FMU file '" + fmuPath + "' not found or cannot be read!");
122  }
123  if (tmpPath_.empty()) {
124  char pathPattern[] = "/tmp/fmi_adapter_XXXXXX";
125  tmpPath_ = mkdtemp(pathPattern);
126  removeTmpPathInDtor_ = true;
127  }
129  throw std::invalid_argument("Cannot access tmp folder '" + tmpPath_ + "'!");
130  }
131 
132  // Some of the following lines have been taken from FMILibrary 2.3.0 src/test/fmi2_import_cs_test.c
133  // under BSD style license.
134 
135  jmCallbacks_ = new jm_callbacks;
136  jmCallbacks_->malloc = malloc;
137  jmCallbacks_->calloc = calloc;
138  jmCallbacks_->realloc = realloc;
139  jmCallbacks_->free = free;
140  jmCallbacks_->logger = jm_default_logger;
141  jmCallbacks_->log_level = jm_log_level_error;
142  jmCallbacks_->context = 0;
143 
144  context_ = fmi_import_allocate_context(jmCallbacks_);
145 
146  fmi_version_enu_t fmuVersion = fmi_import_get_fmi_version(context_, fmuPath_.c_str(), tmpPath_.c_str());
147  if (fmuVersion != fmi_version_2_0_enu) {
148  throw std::invalid_argument("Could not load the FMU or the FMU does not meet the FMI 2.0 standard!");
149  }
150 
151  fmu_ = fmi2_import_parse_xml(context_, tmpPath_.c_str(), 0);
152  if (!fmu_) {
153  throw std::invalid_argument("Could not parse XML description of FMU!");
154  }
155 
156  if (fmi2_import_get_fmu_kind(fmu_) != fmi2_fmu_kind_cs) {
157  throw std::invalid_argument("Given FMU is not for co-simulation!");
158  }
159 
160  fmi2_callback_functions_t* fmiCallbacks = new fmi2_callback_functions_t;
161  fmiCallbacks->logger = fmi2_log_forwarding;
162  fmiCallbacks->allocateMemory = calloc;
163  fmiCallbacks->freeMemory = free;
164  fmiCallbacks->componentEnvironment = fmu_;
165  fmiCallbacks_ = fmiCallbacks;
166 
167  jm_status_enu_t jmStatus = fmi2_import_create_dllfmu(fmu_, fmi2_fmu_kind_cs, fmiCallbacks);
168  if (jmStatus == jm_status_error) {
169  throw std::runtime_error("Creation of dllfmu failed!");
170  }
171 
172  const fmi2_string_t instanceName = fmi2_import_get_model_name(fmu_);
173  const fmi2_string_t fmuLocation = nullptr; // Indicates that FMU should get path to the unzipped location.
174  const fmi2_boolean_t visible = fmi2_false;
175  const fmi2_real_t relativeTol = 1e-4;
176  jmStatus = fmi2_import_instantiate(fmu_, instanceName, fmi2_cosimulation, fmuLocation, visible);
177  assert(jmStatus != jm_status_error);
178 
179  const fmi2_real_t startTime = 0.0;
180  const fmi2_real_t stopTime = -1.0;
181  fmi2_status_t fmiStatus = fmi2_import_setup_experiment(fmu_, fmi2_true, relativeTol, startTime, fmi2_false, stopTime);
182  if (fmiStatus != fmi2_status_ok) {
183  throw std::runtime_error("fmi2_import_setup_experiment failed!");
184  }
185 
186  fmiStatus = fmi2_import_enter_initialization_mode(fmu_);
187  if (fmiStatus != fmi2_status_ok) {
188  throw std::runtime_error("fmi2_import_enter_initialization_mode failed!");
189  }
190 
191  if (stepSize == ros::Duration(0.0)) {
192  stepSize_ = ros::Duration(fmi2_import_get_default_experiment_step(fmu_));
193  if (stepSize_ <= ros::Duration(0.0)) {
194  throw std::invalid_argument("Default experiment step size from FMU is not positive!");
195  }
196  ROS_INFO("No step-size argument given. Using default from FMU, which is %fs.", stepSize_.toSec());
197  }
198 }
199 
200 
202  fmi2_import_terminate(fmu_);
203  fmi2_import_free_instance(fmu_);
204  fmi2_import_destroy_dllfmu(fmu_);
205  fmi2_import_free(fmu_);
206  fmi_import_free_context(context_);
207  delete jmCallbacks_;
208  delete static_cast<fmi2_callback_functions_t*>(fmiCallbacks_);
209 
210  if (removeTmpPathInDtor_) {
211  // TODO(Ralph) Remove folder fmi_adapter_XXXXXX from /tmp.
212  // Such function is not provided by Posix or C++11/14.
213  // Possibly use boost::filesystem::remove_all. Then other
214  // filesystem functions used here and use of "/tmp" may be
215  // replaced by corresponding functions from boost::filesystem.
216  }
217 }
218 
219 
220 std::string FMIAdapter::rosifyName(const std::string& name) {
221  std::string result = name;
222  for (size_t i = 0; i < result.size(); ++i) {
223  char c = result[i];
224  if (('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') || ('0' <= c && c <= '9') || c == '_') {
225  // Keep valid char
226  } else {
227  result[i] = '_';
228  }
229  }
230 
231  while (result.length() > 0 && result[0] == '_') {
232  result.erase(0, 1);
233  }
234 
235  return result;
236 }
237 
238 
240  return static_cast<bool>(fmi2_import_get_capability(fmu_, fmi2_cs_canHandleVariableCommunicationStepSize));
241 }
242 
243 
245  return ros::Duration(fmi2_import_get_default_experiment_step(fmu_));
246 }
247 
248 
249 std::vector<fmi2_import_variable_t*> FMIAdapter::getAllVariables() const {
251 }
252 
253 
254 std::vector<fmi2_import_variable_t*> FMIAdapter::getInputVariables() const {
255  auto filter = std::bind(helpers::variableFilterByCausality, std::placeholders::_1, fmi2_causality_enu_input);
256  return helpers::getVariablesFromFMU(fmu_, filter);
257 }
258 
259 
260 std::vector<fmi2_import_variable_t*> FMIAdapter::getOutputVariables() const {
261  auto filter = std::bind(helpers::variableFilterByCausality, std::placeholders::_1, fmi2_causality_enu_output);
262  return helpers::getVariablesFromFMU(fmu_, filter);
263 }
264 
265 
266 std::vector<fmi2_import_variable_t*> FMIAdapter::getParameters() const {
267  auto filter = std::bind(helpers::variableFilterByCausality, std::placeholders::_1, fmi2_causality_enu_parameter);
268  return helpers::getVariablesFromFMU(fmu_, filter);
269 }
270 
271 
272 std::vector<std::string> FMIAdapter::getAllVariableNames() const {
274 }
275 
276 
277 std::vector<std::string> FMIAdapter::getInputVariableNames() const {
278  auto filter = std::bind(helpers::variableFilterByCausality, std::placeholders::_1, fmi2_causality_enu_input);
279  return helpers::getVariableNamesFromFMU(fmu_, filter);
280 }
281 
282 
283 std::vector<std::string> FMIAdapter::getOutputVariableNames() const {
284  auto filter = std::bind(helpers::variableFilterByCausality, std::placeholders::_1, fmi2_causality_enu_output);
285  return helpers::getVariableNamesFromFMU(fmu_, filter);
286 }
287 
288 
289 std::vector<std::string> FMIAdapter::getParameterNames() const {
290  auto filter = std::bind(helpers::variableFilterByCausality, std::placeholders::_1, fmi2_causality_enu_parameter);
291  return helpers::getVariableNamesFromFMU(fmu_, filter);
292 }
293 
294 
296  if (!inInitializationMode_) {
297  throw std::runtime_error("FMU is no longer in initialization mode!");
298  }
299 
300  fmi2_status_t fmiStatus = fmi2_import_exit_initialization_mode(fmu_);
301  if (fmiStatus != fmi2_status_ok) {
302  throw std::runtime_error("fmi2_import_exit_initialization_mode failed!");
303  }
304  inInitializationMode_ = false;
305 
306  fmuTimeOffset_ = simulationTime - ros::Time(0.0);
307  assert(fmuTime_ == 0.0);
308 
309  for (fmi2_import_variable_t* variable : getInputVariables()) { // TODO(Ralph) Avoid creation of std::vector here.
310  std::map<ros::Time, double>& inputValues = inputValuesByVariable_[variable];
311  if (inputValues.empty() || inputValues.begin()->first > simulationTime) {
312  fmi2_value_reference_t valueReference = fmi2_import_get_variable_vr(variable);
313  fmi2_real_t value;
314  fmi2_import_get_real(fmu_, &valueReference, 1, &value);
315  inputValues[simulationTime] = value;
316  }
317  }
318 }
319 
320 
322  if (inInitializationMode_) {
323  throw std::runtime_error("FMU is still in initialization mode!");
324  }
325 
327 
328  return getSimulationTimeInternal();
329 }
330 
331 
333  if (stepSize <= ros::Duration(0.0)) {
334  throw std::invalid_argument("Step size must be positive!");
335  }
336  if (inInitializationMode_) {
337  throw std::runtime_error("FMU is still in initialization mode!");
338  }
339 
340  doStepInternal(stepSize);
341 
342  return getSimulationTimeInternal();
343 }
344 
345 
347  for (fmi2_import_variable_t* variable : getInputVariables()) { // TODO(Ralph) Avoid creation of std::vector here.
348  std::map<ros::Time, double>& inputValues = inputValuesByVariable_[variable];
349  assert(!inputValues.empty() && (inputValues.begin()->first - fmuTimeOffset_).toSec() <= fmuTime_);
350  while (inputValues.size() >= 2 && (std::next(inputValues.begin())->first - fmuTimeOffset_).toSec() <= fmuTime_) {
351  inputValues.erase(inputValues.begin());
352  }
353  assert(!inputValues.empty() && (inputValues.begin()->first - fmuTimeOffset_).toSec() <= fmuTime_);
354  double value = inputValues.begin()->second;
355  if (interpolateInput_ && inputValues.size() > 1) {
356  double t0 = (inputValues.begin()->first - fmuTimeOffset_).toSec();
357  double t1 = (std::next(inputValues.begin())->first - fmuTimeOffset_).toSec();
358  double weight = (t1 - fmuTime_) / (t1 - t0);
359  double x0 = value;
360  double x1 = std::next(inputValues.begin())->second;
361  value = weight * x0 + (1.0 - weight) * x1;
362  }
363 
364  fmi2_value_reference_t valueReference = fmi2_import_get_variable_vr(variable);
365  fmi2_import_set_real(fmu_, &valueReference, 1, &value);
366  }
367 
368  const fmi2_boolean_t doStep = fmi2_true;
369  fmi2_status_t fmiStatus = fmi2_import_do_step(fmu_, fmuTime_, stepSize.toSec(), doStep);
370  if (fmiStatus != fmi2_status_ok) {
371  throw std::runtime_error("fmi2_import_do_step failed!");
372  }
373  fmuTime_ += stepSize.toSec();
374 }
375 
376 
378  if (inInitializationMode_) {
379  throw std::runtime_error("FMU is still in initialization mode!");
380  }
381 
382  fmi2_real_t targetFMUTime = (simulationTime - fmuTimeOffset_).toSec();
383  if (targetFMUTime < fmuTime_ - stepSize_.toSec() / 2.0) { // Subtract stepSize/2 for rounding.
384  ROS_ERROR("Given time %f is before current simulation time %f!", targetFMUTime, fmuTime_);
385  throw std::invalid_argument("Given time is before current simulation time!");
386  }
387 
388  while (fmuTime_ + stepSize_.toSec() / 2.0 < targetFMUTime) {
390  }
391 
392  return getSimulationTimeInternal();
393 }
394 
395 
397  if (inInitializationMode_) {
398  throw std::runtime_error("FMU is still in initialization mode!");
399  }
400 
401  return getSimulationTimeInternal();
402 }
403 
404 
405 void FMIAdapter::setInputValue(fmi2_import_variable_t* variable, ros::Time time, double value) {
406  if (fmi2_import_get_causality(variable) != fmi2_causality_enu_input) {
407  throw std::invalid_argument("Given variable is not an input variable!");
408  }
409 
410  inputValuesByVariable_[variable].insert(std::make_pair(time, value));
411 }
412 
413 
414 void FMIAdapter::setInputValue(std::string variableName, ros::Time time, double value) {
415  fmi2_import_variable_t* variable = fmi2_import_get_variable_by_name(fmu_, variableName.c_str());
416  if (variable == nullptr) {
417  throw std::invalid_argument("Unknown variable name!");
418  }
419 
420  setInputValue(variable, time, value);
421 }
422 
423 
425  if (fmi2_import_get_causality(variable) != fmi2_causality_enu_output) {
426  throw std::invalid_argument("Given variable is not an output variable!");
427  }
428 
429  fmi2_value_reference_t valueReference = fmi2_import_get_variable_vr(variable);
430  fmi2_real_t value;
431  fmi2_import_get_real(fmu_, &valueReference, 1, &value);
432 
433  return value;
434 }
435 
436 
437 double FMIAdapter::getOutputValue(const std::string& variableName) const {
438  fmi2_import_variable_t* variable = fmi2_import_get_variable_by_name(fmu_, variableName.c_str());
439  if (variable == nullptr) {
440  throw std::invalid_argument("Unknown variable name!");
441  }
442 
443  return getOutputValue(variable);
444 }
445 
446 
448  if (!inInitializationMode_) {
449  throw std::runtime_error("Initial values can be only set in initialization mode!");
450  }
451 
452  fmi2_value_reference_t valueReference = fmi2_import_get_variable_vr(variable);
453  fmi2_import_set_real(fmu_, &valueReference, 1, &value);
454 
455  std::string name = fmi2_import_get_variable_name(variable);
456  ROS_INFO("Set initial value of variable '%s' to %f", name.c_str(), value);
457 }
458 
459 
460 void FMIAdapter::setInitialValue(const std::string& variableName, double value) {
461  fmi2_import_variable_t* variable = fmi2_import_get_variable_by_name(fmu_, variableName.c_str());
462  if (variable == nullptr) {
463  throw std::invalid_argument("Unknown variable name!");
464  }
465 
466  setInitialValue(variable, value);
467 }
468 
469 
472  std::string name = fmi2_import_get_variable_name(variable);
473  name = rosifyName(name);
474  double value = 0.0;
475  if (handle.getParam(name, value)) {
476  setInitialValue(variable, value);
477  }
478  }
479 }
480 
481 } // namespace fmi_adapter
fmi_adapter::FMIAdapter::setInputValue
void setInputValue(fmi2_import_variable_t *variable, ros::Time time, double value)
Stores a value for the given variable to be considered by doStep*(..) at the given time of the FMU si...
Definition: FMIAdapter.cpp:405
fmi_adapter::FMIAdapter::doStep
ros::Time doStep()
Performs one simulation step using the configured step size and returns the current simulation time.
Definition: FMIAdapter.cpp:321
fmi2_import_variable_t
struct fmi2_xml_variable_t fmi2_import_variable_t
Definition: FMIAdapter.h:30
fmi_adapter::FMIAdapter::getOutputVariableNames
std::vector< std::string > getOutputVariableNames() const
Returns the names of all output variables of the wrapped FMU in the FMI Library's internal representa...
Definition: FMIAdapter.cpp:283
fmi_adapter::FMIAdapter::FMIAdapter
FMIAdapter(const std::string &fmuPath, ros::Duration stepSize=ros::Duration(0.0), bool interpolateInput=true, const std::string &tmpPath="")
Definition: FMIAdapter.cpp:112
fmi_adapter::FMIAdapter::getParameterNames
std::vector< std::string > getParameterNames() const
Returns the names of all parameters of the wrapped FMU in the FMI Library's internal representation.
Definition: FMIAdapter.cpp:289
fmi_adapter::FMIAdapter::getOutputVariables
std::vector< fmi2_import_variable_t * > getOutputVariables() const
Returns all output variables of the wrapped FMU in the FMI Library's internal representation.
Definition: FMIAdapter.cpp:260
fmi_adapter::FMIAdapter::getAllVariables
std::vector< fmi2_import_variable_t * > getAllVariables() const
Definition: FMIAdapter.cpp:249
fmi_adapter::FMIAdapter::exitInitializationMode
void exitInitializationMode(ros::Time simulationTime)
Definition: FMIAdapter.cpp:295
ros::NodeHandle::getParam
bool getParam(const std::string &key, bool &b) const
fmi_adapter::helpers::canReadFromFile
bool canReadFromFile(const std::string &path)
Definition: FMIAdapter.cpp:46
fmi_adapter::FMIAdapter::getDefaultExperimentStep
ros::Duration getDefaultExperimentStep() const
Returns the default experiment step-size of the FMU of this instance.
Definition: FMIAdapter.cpp:244
fmi_adapter::FMIAdapter::getSimulationTime
ros::Time getSimulationTime() const
Returns the current simulation time.
Definition: FMIAdapter.cpp:396
fmi_adapter::FMIAdapter::canHandleVariableCommunicationStepSize
bool canHandleVariableCommunicationStepSize() const
Returns true if the FMU of this instances supports a variable communication step-size.
Definition: FMIAdapter.cpp:239
fmi_adapter::FMIAdapter::fmiCallbacks_
void * fmiCallbacks_
Definition: FMIAdapter.h:180
fmi_adapter::FMIAdapter::doStepsUntil
ros::Time doStepsUntil(const ros::Time &simulationTime)
Definition: FMIAdapter.cpp:377
fmi_adapter::FMIAdapter::removeTmpPathInDtor_
bool removeTmpPathInDtor_
In case that a random folder /tmp is being used (i.e. if given tmp path is ""), clean up this folder ...
Definition: FMIAdapter.h:159
fmi_adapter::FMIAdapter::getInputVariables
std::vector< fmi2_import_variable_t * > getInputVariables() const
Returns all input variables of the wrapped FMU in the FMI Library's internal representation.
Definition: FMIAdapter.cpp:254
fmi_adapter::helpers::getVariablesFromFMU
std::vector< fmi2_import_variable_t * > getVariablesFromFMU(fmi2_import_t *fmu, std::function< bool(fmi2_import_variable_t *)> filter=variableFilterAll)
This helper functions returns all variables with a certain property defined by an optional filter.
Definition: FMIAdapter.cpp:66
fmi_adapter::helpers::variableFilterByCausality
bool variableFilterByCausality(fmi2_import_variable_t *variable, fmi2_causality_enu_t causality)
Definition: FMIAdapter.cpp:60
fmi_adapter::FMIAdapter::jmCallbacks_
jm_callbacks * jmCallbacks_
Further callback functions for FMI Library.
Definition: FMIAdapter.h:183
fmi_adapter::FMIAdapter::fmuTimeOffset_
ros::Duration fmuTimeOffset_
Offset between the FMU's simulation time and the ROS-based simulation time for doStep*(....
Definition: FMIAdapter.h:164
fmi_adapter::helpers::canWriteToFolder
bool canWriteToFolder(const std::string &path)
Definition: FMIAdapter.cpp:36
fmi_adapter::FMIAdapter::~FMIAdapter
virtual ~FMIAdapter()
Definition: FMIAdapter.cpp:201
fmi_adapter::FMIAdapter::inInitializationMode_
bool inInitializationMode_
Definition: FMIAdapter.h:161
fmi_adapter::FMIAdapter::fmu_
fmi2_import_t * fmu_
Pointer from the FMU Library types to the FMU instance.
Definition: FMIAdapter.h:173
fmi_adapter::FMIAdapter::fmuTime_
double fmuTime_
The current FMU's simulation time. It is fmuTime_ = simulationTime_ - fmuTimeOffset_.
Definition: FMIAdapter.h:167
fmi_adapter::helpers::getVariableNamesFromFMU
std::vector< std::string > getVariableNamesFromFMU(fmi2_import_t *fmu, std::function< bool(fmi2_import_variable_t *)> filter=variableFilterAll)
This helper functions returns all variable names with a certain property defined by an optional filte...
Definition: FMIAdapter.cpp:88
fmi_adapter::FMIAdapter::setInitialValue
void setInitialValue(fmi2_import_variable_t *variable, double value)
Definition: FMIAdapter.cpp:447
ros::Time
fmi_adapter::FMIAdapter::initializeFromROSParameters
void initializeFromROSParameters(const ros::NodeHandle &handle)
Definition: FMIAdapter.cpp:470
fmi_adapter
Definition: FMIAdapter.h:33
fmi_adapter::FMIAdapter::doStepInternal
void doStepInternal(const ros::Duration &stepSize)
Definition: FMIAdapter.cpp:346
ROS_ERROR
#define ROS_ERROR(...)
fmi_adapter::FMIAdapter::interpolateInput_
bool interpolateInput_
Definition: FMIAdapter.h:153
fmi_adapter::FMIAdapter::getInputVariableNames
std::vector< std::string > getInputVariableNames() const
Returns the names of all input variables of the wrapped FMU in the FMI Library's internal representat...
Definition: FMIAdapter.cpp:277
fmi_adapter::FMIAdapter::getSimulationTimeInternal
ros::Time getSimulationTimeInternal() const
Returns the current simulation time. The state w.r.t. initialization mode is not checked.
Definition: FMIAdapter.h:193
fmi_adapter::helpers::variableFilterAll
bool variableFilterAll(__attribute__((unused)) fmi2_import_variable_t *variable)
Definition: FMIAdapter.cpp:57
DurationBase< Duration >::toSec
double toSec() const
fmi_adapter::FMIAdapter::getAllVariableNames
std::vector< std::string > getAllVariableNames() const
Definition: FMIAdapter.cpp:272
fmi_adapter::FMIAdapter::getParameters
std::vector< fmi2_import_variable_t * > getParameters() const
Returns all parameters of the wrapped FMU in the FMI Library's internal representation.
Definition: FMIAdapter.cpp:266
ROS_INFO
#define ROS_INFO(...)
fmi_adapter::FMIAdapter::stepSize_
ros::Duration stepSize_
Step size for the FMU simulation.
Definition: FMIAdapter.h:149
ros::Duration
fmi_adapter::FMIAdapter::inputValuesByVariable_
std::map< fmi2_import_variable_t *, std::map< ros::Time, double > > inputValuesByVariable_
Stores the mapping from timestamps to variable values for the FMU simulation.
Definition: FMIAdapter.h:186
fmi_adapter::FMIAdapter::rosifyName
static std::string rosifyName(const std::string &name)
Definition: FMIAdapter.cpp:220
fmi_adapter::FMIAdapter::getOutputValue
double getOutputValue(fmi2_import_variable_t *variable) const
Returns the current value of the given output variable.
Definition: FMIAdapter.cpp:424
FMIAdapter.h
fmi_adapter::FMIAdapter::tmpPath_
std::string tmpPath_
Path to folder for extracting the FMU file temporarilly.
Definition: FMIAdapter.h:156
ros::NodeHandle
fmi_adapter::FMIAdapter::fmuPath_
const std::string fmuPath_
Path of the FMU being wrapped by this instance.
Definition: FMIAdapter.h:146
fmi_adapter::FMIAdapter::context_
fmi_import_context_t * context_
Pointer from the FMU Library types to the FMU context.
Definition: FMIAdapter.h:176


fmi_adapter
Author(s): Ralph Lange
autogenerated on Thu Nov 24 2022 03:51:09