Component.cpp
Go to the documentation of this file.
1 /**
2  * This file is part of ArmarX.
3  *
4  * ArmarX is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License version 2 as
6  * published by the Free Software Foundation.
7  *
8  * ArmarX is distributed in the hope that it will be useful, but
9  * WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11  * GNU General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public License
14  * along with this program. If not, see <http://www.gnu.org/licenses/>.
15  *
16  * @package navigation::ArmarXObjects::distance_to_obstacle_costmap_provider
17  * @author Fabian Reister ( fabian dot reister at kit dot edu )
18  * @date 2022
19  * @copyright http://www.gnu.org/licenses/gpl-2.0.txt
20  * GNU General Public License
21  */
22 
23 
24 #include "Component.h"
25 
26 #include <mutex>
27 #include <optional>
28 #include <set>
29 #include <string>
30 #include <vector>
31 
32 #include <SimoxUtility/algorithm/string/string_tools.h>
33 #include <VirtualRobot/SceneObjectSet.h> // IWYU pragma: keep
34 #include <VirtualRobot/VirtualRobot.h>
35 #include <VirtualRobot/XML/RobotIO.h>
36 
46 
53 
58 
59 #include <range/v3/range/conversion.hpp>
60 #include <range/v3/view/filter.hpp>
61 #include <range/v3/view/transform.hpp>
62 
64 {
66  {
67  addPlugin(virtualRobotReaderPlugin);
68  addPlugin(costmapReaderPlugin);
69  addPlugin(costmapWriterPlugin);
70  addPlugin(articulatedObjectReaderPlugin);
71  addPlugin(roomReaderPlugin);
72  }
73 
74  const std::string Component::defaultName = "distance_to_obstacle_costmap_provider";
75 
78  {
81 
82  def->required(properties.robotName, "p.robotName", "Robot name.");
83 
84  def->optional(properties.costmapParams.binaryGrid, "p.costmapParams.binaryGrid");
85  def->optional(properties.costmapParams.cellSize, "p.costmapParams.cellSize");
86  def->optional(properties.costmapParams.sceneBoundsMargin,
87  "p.costmapParams.sceneBoundsMargin");
88  def->optional(properties.costmapBuilderParams.restrictToRooms,
89  "p.costmapBuilderParams.restrictToRooms");
90 
91  def->optional(properties.colModel, "p.colModel");
92  def->optional(properties.buildSecondCostmapWithSmallerMargins,
93  "p.buildSecondCostmapWithSmallerMargins");
94 
95  def->optional(properties.costmapToExtend,
96  "p.costmapToExtend",
97  "Name the initial costmap that should be extended. Format is "
98  "`ProviderName`/`EntityName` to reference a costmap in the memory.");
99  def->optional(
100  properties.costmapSmallerMarginsToExtend,
101  "p.costmapSmallerMarginsToExtend",
102  "Name the initial costmap that should be extended with smaller margins. Format is "
103  "`ProviderName`/`EntityName` to reference a costmap in the memory.");
104 
105  return def;
106  }
107 
108  void
110  {
111  // This should not be necessary but seems to be. ToDo: Look into this.
113 
115  armarx::armem::MemoryID{"Object", "Instance"}, this, &Component::processObjectInstance);
116  }
117 
118  void
120  {
121  ARMARX_VERBOSE << "Creating initial creation of costmap";
123  }
124 
125  void
127  const std::vector<armem::MemoryID>& snapshotIDs)
128  {
129 
130  ARMARX_VERBOSE << "Object instance changed!";
131 
132  const auto toObjectID = [](const armem::MemoryID& id) -> armarx::ObjectID
133  { return armarx::ObjectID{id.entityName}; };
134 
135  // Get the object IDs of the changed objects.
136  const std::vector<armarx::ObjectID> changedObjectClasses =
137  snapshotIDs | ranges::views::transform(toObjectID) | ranges::to_vector;
138 
139  // Filter out object classes that are not relevant for the costmap.
140  // FIXME: include Kitchen/mobile-fridge, ...
141  const std::set<std::string> nonRelevantObjectClasses = {"KIT",
142  "HOPE",
143  "MDB",
144  "YCB",
145  "Kitchen",
146  "Elevator",
147  "Maintenance",
148  "KIT_Coopetition",
149  "Stanford_SRC"};
150 
151  const auto isRelevantClass =
152  [&nonRelevantObjectClasses](const armarx::ObjectID& objectID) -> bool
153  { return nonRelevantObjectClasses.count(objectID.dataset()) == 0; };
154 
155  const std::vector<armarx::ObjectID> relevantObjectClasses =
156  changedObjectClasses | ranges::views::filter(isRelevantClass) | ranges::to_vector;
157 
158  if (relevantObjectClasses.empty())
159  {
160  return;
161  }
162 
163  ARMARX_INFO << "Relevant object classes changed: " << relevantObjectClasses;
164 
165  // Create and store the costmap.
167  }
168 
169  inline algorithms::Costmap
171  costmapReaderPlugin,
172  std::string& costmapNameWithProvider)
173  {
174  ARMARX_INFO << "Extending costmap `" << costmapNameWithProvider << "`.";
175  const std::vector<std::string> splits = simox::alg::split(costmapNameWithProvider, "/");
176  ARMARX_CHECK_EQUAL(splits.size(), 2);
177 
178 
179  const auto initialCostmap =
180  [costmapReaderPlugin, &costmapNameWithProvider, &splits]() -> algorithms::Costmap
181  {
182  while (true)
183  {
184  const memory::client::costmap::Reader::Query query{.providerName = splits.front(),
185  .name = splits.back(),
186  .timestamp = Clock::Now()};
187 
188  const auto result = costmapReaderPlugin->get().query(query);
189 
190  if (not result)
191  {
192  ARMARX_INFO << deactivateSpam(60) << "Costmap `" << costmapNameWithProvider
193  << "` is not available yet. Retrying ...";
195  continue;
196  }
197 
198  ARMARX_CHECK_NOT_NULL(result.costmap);
199  return result.costmap.value();
200  }
201  }();
202  return initialCostmap;
203  }
204 
205  inline algorithms::Costmap
207  memory::client::costmap::Reader>* costmapReaderPlugin,
208  algorithms::CostmapBuilder& costmapBuilder,
209  std::string& costmapNameWithProvider)
210  {
211  if (not costmapNameWithProvider.empty())
212  {
213  const auto initialCostmap = loadCostmap(costmapReaderPlugin, costmapNameWithProvider);
214  const auto costmap = costmapBuilder.extend(initialCostmap);
215  return costmap;
216  }
217 
218  // If no initial costmap is available, create it from scratch.
219  {
220  const auto costmap = costmapBuilder.create();
221  return costmap;
222  }
223  }
224 
225  bool
227  {
228  std::lock_guard g{createCostmapMtx};
229 
230  ARMARX_VERBOSE << "Creating costmap";
231 
232  const std::vector<std::string> primitiveModelIds = [&]() -> std::vector<std::string>
233  {
234  if (not properties.primitiveModelIds.empty())
235  {
236  const std::vector<std::string> primitiveModelIds =
237  simox::alg::split(properties.primitiveModelIds, ",", true, false);
238  ARMARX_VERBOSE << VAROUT(primitiveModelIds);
239  return primitiveModelIds;
240  }
241 
242  return {};
243  }();
244 
245  const auto loadMode = primitiveModelIds.empty()
246  ? VirtualRobot::RobotIO::RobotDescription::eCollisionModel
247  : VirtualRobot::RobotIO::RobotDescription::eStructure;
248 
249  const auto robot = virtualRobotReaderPlugin->get().getRobotWaiting(
250  properties.robotName, armarx::DateTime::Invalid(), loadMode);
251 
252  ARMARX_CHECK_NOT_NULL(robot);
253 
254  if (not primitiveModelIds.empty())
255  {
256  ARMARX_VERBOSE << "Using primitive approximation model";
257  robot->setPrimitiveApproximationModel(primitiveModelIds);
258  }
259 
260  const auto objectPoseClient = ObjectPoseClientPluginUser::getClient();
261 
262  const objpose::ObjectPoseSeq objectPoses = objectPoseClient.fetchObjectPoses();
263 
264  // remove those objects that belong to an object dataset. the manipulation object / distance computation is broken
265  const objpose::ObjectPoseSeq objectPosesStatic =
267 
268  const objpose::ObjectPoseSeq objectPosesStaticNonArticulated =
270  const objpose::ObjectPoseSeq objectPosesStaticArticulated =
272 
273  const VirtualRobot::SceneObjectSetPtr obstacles =
274  armarx::objpose::util::asSceneObjects(objectPosesStaticNonArticulated);
275 
276  std::vector<VirtualRobot::RobotPtr> articulatedObjects;
277  for (const auto& objectPoseStaticArticulated : objectPosesStaticArticulated)
278  {
279  ARMARX_VERBOSE << "Loading articulated object: "
280  << objectPoseStaticArticulated.objectID;
281 
282  const auto articulatedObject =
283  articulatedObjectReaderPlugin->get().getArticulatedObject(
284  objectPoseStaticArticulated.objectID.getClassID().str(),
285  Clock::Now(),
286  std::nullopt,
287  objectPoseStaticArticulated.objectID.instanceName());
288 
289  ARMARX_CHECK_NOT_NULL(articulatedObject)
290  << objectPoseStaticArticulated.objectID.getClassID().str();
291 
292  ARMARX_CHECK(articulatedObjectReaderPlugin->get().synchronizeArticulatedObject(
293  *articulatedObject, Clock::Now(), std::nullopt));
294 
295  std::set<std::string> primitiveIDs;
296  articulatedObject->getPrimitiveApproximationIDs(primitiveIDs);
297 
298  if (articulatedObject->getCollisionModels().empty())
299  {
301  << "The articualted object `" << articulatedObject->getType() << "/"
302  << articulatedObject->getName()
303  << "` does not have a collision model. Using primitive model instead.";
304 
305  // use all primitive ids
306  // TODO: refine selection?
307  const std::vector<std::string> usedPrimitiveModelIDs(primitiveIDs.begin(),
308  primitiveIDs.end());
309  articulatedObject->setPrimitiveApproximationModel(usedPrimitiveModelIDs);
310  }
311 
312  articulatedObjects.push_back(articulatedObject);
313  }
314 
315 
316  ARMARX_CHECK_NOT_NULL(obstacles);
317  ARMARX_INFO << obstacles->getSize() << " objects in the scene";
318 
319  ARMARX_VERBOSE << "Static objects (non-articulated)";
320  for (const objpose::ObjectPose& objectPose : objectPosesStaticNonArticulated)
321  {
322  ARMARX_VERBOSE << " - " << objectPose.objectID;
323  }
324 
325  ARMARX_VERBOSE << "Static objects (articulated)";
326  for (const auto& object : articulatedObjects)
327  {
328  ARMARX_VERBOSE << " - " << object->getType() << "/" << object->getName();
329  }
330 
331  ARMARX_VERBOSE << "Rooms:";
332 
333  ARMARX_CHECK_NOT_NULL(roomReaderPlugin);
334 
335  // query all rooms
337  const auto result = roomReaderPlugin->get().query(query);
338 
339  const auto& rooms = result.rooms;
340 
341  for (const auto& room : rooms)
342  {
343  ARMARX_VERBOSE << " - " << room.name;
344  }
345 
346  ARMARX_VERBOSE << "Creating costmap";
347  const auto costmap = [&]() -> algorithms::Costmap
348  {
349  algorithms::CostmapBuilder costmapBuilder(robot,
350  obstacles,
352  rooms,
353  properties.costmapParams,
354  properties.colModel,
355  properties.costmapBuilderParams);
356 
357  return extendOrCreateCostmap(
358  costmapReaderPlugin, costmapBuilder, properties.costmapToExtend);
359  }();
360 
361  ARMARX_VERBOSE << "Storing costmap in the memory.";
362  bool successful = costmapWriterPlugin->get().store(
363  costmap, "distance_to_obstacles", getName(), armarx::Clock::Now());
364 
365  if (properties.buildSecondCostmapWithSmallerMargins)
366  {
367  auto costmapBuilderParams = properties.costmapBuilderParams;
368  costmapBuilderParams.collisionModelScaleFactor = Eigen::Vector3f{0.01, 1, 0.01};
369  algorithms::CostmapBuilder costmapBuilder(robot,
370  obstacles,
372  rooms,
373  properties.costmapParams,
374  properties.colModel,
375  costmapBuilderParams);
376 
377  const auto costmap = extendOrCreateCostmap(
378  costmapReaderPlugin, costmapBuilder, properties.costmapSmallerMarginsToExtend);
379 
380  ARMARX_VERBOSE << "Storing costmap with smaller margins in the memory.";
381  successful =
382  successful &&
383  costmapWriterPlugin->get().store(
384  costmap, "distance_to_obstacles_small_margin", getName(), armarx::Clock::Now());
385  }
386 
387  return successful;
388  }
389 
390  void
392  {
393  }
394 
395  void
397  {
398  }
399 
400  std::string
402  {
403  return Component::defaultName;
404  }
405 
406  std::string
408  {
409  return Component::defaultName;
410  }
411 
412  /* (Requires the armarx::LightweightRemoteGuiComponentPluginUser.)
413  void
414  Component::createRemoteGuiTab()
415  {
416  using namespace armarx::RemoteGui::Client;
417 
418  // Setup the widgets.
419 
420  tab.boxLayerName.setValue(properties.boxLayerName);
421 
422  tab.numBoxes.setValue(properties.numBoxes);
423  tab.numBoxes.setRange(0, 100);
424 
425  tab.drawBoxes.setLabel("Draw Boxes");
426 
427  // Setup the layout.
428 
429  GridLayout grid;
430  int row = 0;
431  {
432  grid.add(Label("Box Layer"), {row, 0}).add(tab.boxLayerName, {row, 1});
433  ++row;
434 
435  grid.add(Label("Num Boxes"), {row, 0}).add(tab.numBoxes, {row, 1});
436  ++row;
437 
438  grid.add(tab.drawBoxes, {row, 0}, {2, 1});
439  ++row;
440  }
441 
442  VBoxLayout root = {grid, VSpacer()};
443  RemoteGui_createTab(getName(), root, &tab);
444  }
445 
446 
447  void
448  Component::RemoteGui_update()
449  {
450  if (tab.boxLayerName.hasValueChanged() || tab.numBoxes.hasValueChanged())
451  {
452  std::scoped_lock lock(propertiesMutex);
453  properties.boxLayerName = tab.boxLayerName.getValue();
454  properties.numBoxes = tab.numBoxes.getValue();
455 
456  {
457  setDebugObserverDatafield("numBoxes", properties.numBoxes);
458  setDebugObserverDatafield("boxLayerName", properties.boxLayerName);
459  sendDebugObserverBatch();
460  }
461  }
462  if (tab.drawBoxes.wasClicked())
463  {
464  // Lock shared variables in methods running in seperate threads
465  // and pass them to functions. This way, the called functions do
466  // not need to think about locking.
467  std::scoped_lock lock(propertiesMutex, arvizMutex);
468  drawBoxes(properties, arviz);
469  }
470  }
471  */
472 
473 
474  /* (Requires the armarx::ArVizComponentPluginUser.)
475  void
476  Component::drawBoxes(const Component::Properties& p, viz::Client& arviz)
477  {
478  // Draw something in ArViz (requires the armarx::ArVizComponentPluginUser.
479  // See the ArVizExample in RobotAPI for more examples.
480 
481  viz::Layer layer = arviz.layer(p.boxLayerName);
482  for (int i = 0; i < p.numBoxes; ++i)
483  {
484  layer.add(viz::Box("box_" + std::to_string(i))
485  .position(Eigen::Vector3f(i * 100, 0, 0))
486  .size(20).color(simox::Color::blue()));
487  }
488  arviz.commit(layer);
489  }
490  */
491 
492 
494 
495 } // namespace armarx::navigation::components::distance_to_obstacle_costmap_provider
ARMARX_VERBOSE
#define ARMARX_VERBOSE
Definition: Logging.h:187
armarx::ObjectID
A known object ID of the form "Dataset/ClassName" or "Dataset/ClassName/InstanceName".
Definition: ObjectID.h:10
armarx::navigation::components::distance_to_obstacle_costmap_provider::Component::createAndStoreCostmap
bool createAndStoreCostmap()
Definition: Component.cpp:226
armarx::navigation::components::distance_to_obstacle_costmap_provider::Component::onDisconnectComponent
void onDisconnectComponent() override
Definition: Component.cpp:391
armarx::navigation::components::distance_to_obstacle_costmap_provider::Component::GetDefaultName
static std::string GetDefaultName()
Get the component's default name.
Definition: Component.cpp:407
armarx::objpose::ObjectPoseSeq
std::vector< ObjectPose > ObjectPoseSeq
Definition: forward_declarations.h:20
armarx::navigation::components::distance_to_obstacle_costmap_provider::Component::onConnectComponent
void onConnectComponent() override
Definition: Component.cpp:119
armarx::navigation::components::distance_to_obstacle_costmap_provider::loadCostmap
algorithms::Costmap loadCostmap(armem::client::plugins::ReaderWriterPlugin< memory::client::costmap::Reader > *costmapReaderPlugin, std::string &costmapNameWithProvider)
Definition: Component.cpp:170
ObjectPoseClientPlugin.h
armarx::core::time::Clock::WaitFor
static void WaitFor(const Duration &duration)
Wait for a certain duration on the virtual clock.
Definition: Clock.cpp:99
armarx::navigation::memory::client::rooms::Reader::Query
Definition: Reader.h:43
MemoryID.h
armarx::armem::client::plugins::PluginUser::memoryNameSystem
MemoryNameSystem & memoryNameSystem()
Definition: PluginUser.cpp:20
DateTime.h
CostmapBuilder.h
ARMARX_CHECK_NOT_NULL
#define ARMARX_CHECK_NOT_NULL(ptr)
This macro evaluates whether ptr is not null and if it turns out to be false it will throw an Express...
Definition: ExpressionException.h:206
armarx::armem::client::plugins::ReaderWriterPlugin
A component plugin offering client-side access to a reader or writer and manages the lifecycle,...
Definition: ReaderWriterPlugin.h:44
armarx::objpose::util::articulatedObjects
objpose::ObjectPoseSeq articulatedObjects(objpose::ObjectPoseSeq objects)
Definition: util.cpp:82
Duration.h
Reader.h
util.h
armarx::navigation::components::distance_to_obstacle_costmap_provider::Component::createPropertyDefinitions
armarx::PropertyDefinitionsPtr createPropertyDefinitions() override
Definition: Component.cpp:77
armarx::rooms
Brief description of class rooms.
Definition: rooms.h:38
ReaderWriterPlugin.h
armarx::ManagedIceObject::addPlugin
PluginT * addPlugin(const std::string prefix="", ParamsT &&... params)
Definition: ManagedIceObject.h:186
armarx::navigation::components::distance_to_obstacle_costmap_provider::Component::processObjectInstance
void processObjectInstance(const armem::MemoryID &id, const std::vector< armem::MemoryID > &snapshotIDs)
Definition: Component.cpp:126
StringHelpers.h
ARMARX_CHECK
#define ARMARX_CHECK(expression)
Shortcut for ARMARX_CHECK_EXPRESSION.
Definition: ExpressionException.h:82
Clock.h
armarx::navigation::memory::client::costmap::Reader::Query::providerName
std::string providerName
Definition: Reader.h:44
Costmap.h
armarx::navigation::algorithms::CostmapBuilder::extend
Costmap extend(Costmap costmap)
Definition: CostmapBuilder.cpp:77
armarx::navigation::components::distance_to_obstacle_costmap_provider::Component::onInitComponent
void onInitComponent() override
Definition: Component.cpp:109
deactivateSpam
SpamFilterDataPtr deactivateSpam(SpamFilterDataPtr const &spamFilter, float deactivationDurationSec, const std::string &identifier, bool deactivate)
Definition: Logging.cpp:75
armarx::navigation::memory::client::costmap::Reader
Definition: Reader.h:36
armarx::armem::MemoryID
A memory ID.
Definition: MemoryID.h:47
ObjectID.h
Reader.h
armarx::armem::client::util::MemoryListener::subscribe
SubscriptionHandle subscribe(const MemoryID &subscriptionID, Callback Callback)
Definition: MemoryListener.cpp:116
armarx::navigation::algorithms::CostmapBuilder
Definition: CostmapBuilder.h:40
armarx::navigation::memory::client::costmap::Reader::Query
Definition: Reader.h:42
armarx::navigation::components::distance_to_obstacle_costmap_provider::ARMARX_REGISTER_COMPONENT_EXECUTABLE
ARMARX_REGISTER_COMPONENT_EXECUTABLE(Component, Component::GetDefaultName())
armarx::navigation::memory::client::rooms::Reader::Query::timestamp
armem::Time timestamp
Definition: Reader.h:47
Component.h
armarx::objpose::util::staticObjects
objpose::ObjectPoseSeq staticObjects(objpose::ObjectPoseSeq objects)
Definition: util.cpp:54
armarx::armem::client::plugins::ReaderWriterPlugin::get
T & get()
Definition: ReaderWriterPlugin.h:87
armarx::transform
auto transform(const Container< InputT, Alloc > &in, OutputT(*func)(InputT const &)) -> Container< OutputT, typename std::allocator_traits< Alloc >::template rebind_alloc< OutputT >>
Convenience function (with less typing) to transform a container of type InputT into the same contain...
Definition: algorithm.h:351
ExpressionException.h
armarx::Component::getConfigIdentifier
std::string getConfigIdentifier()
Retrieve config identifier for this component as set in constructor.
Definition: Component.cpp:79
armarx::armem::articulated_object::ArticulatedObjectReader::synchronizeArticulatedObject
bool synchronizeArticulatedObject(VirtualRobot::Robot &object, const armem::Time &timestamp, const std::optional< std::string > &providerName)
Definition: ArticulatedObjectReader.cpp:62
armarx::navigation::components::distance_to_obstacle_costmap_provider::Component
Definition: Component.h:52
Decoupled.h
forward_declarations.h
armarx::objpose::util::nonArticulatedObjects
objpose::ObjectPoseSeq nonArticulatedObjects(objpose::ObjectPoseSeq objects)
Definition: util.cpp:64
armarx::armem::client::MemoryNameSystem::setComponent
void setComponent(ManagedIceObject *component)
Definition: MemoryNameSystem.cpp:462
armarx::ComponentPropertyDefinitions
Default component property definition container.
Definition: Component.h:69
ARMARX_INFO
#define ARMARX_INFO
Definition: Logging.h:181
PropertyDefinitionContainer.h
VAROUT
#define VAROUT(x)
Definition: StringHelpers.h:198
armarx::objpose::util::asSceneObjects
VirtualRobot::SceneObjectSetPtr asSceneObjects(const objpose::ObjectPoseSeq &objectPoses)
Definition: util.cpp:133
IceUtil::Handle
Definition: forward_declarations.h:30
armarx::navigation::algorithms::CostmapBuilder::create
Costmap create(const SceneBounds &init=SceneBounds())
Definition: CostmapBuilder.cpp:115
armarx::navigation::components::distance_to_obstacle_costmap_provider::Component::onExitComponent
void onExitComponent() override
Definition: Component.cpp:396
armarx::navigation::components::distance_to_obstacle_costmap_provider::extendOrCreateCostmap
algorithms::Costmap extendOrCreateCostmap(armem::client::plugins::ReaderWriterPlugin< memory::client::costmap::Reader > *costmapReaderPlugin, algorithms::CostmapBuilder &costmapBuilder, std::string &costmapNameWithProvider)
Definition: Component.cpp:206
armarx::core::time::Clock::Now
static DateTime Now()
Current time on the virtual clock.
Definition: Clock.cpp:93
armarx::ManagedIceObject::getName
std::string getName() const
Retrieve name of object.
Definition: ManagedIceObject.cpp:108
Logging.h
ARMARX_CHECK_EQUAL
#define ARMARX_CHECK_EQUAL(lhs, rhs)
This macro evaluates whether lhs is equal (==) rhs and if it turns out to be false it will throw an E...
Definition: ExpressionException.h:130
armarx::ObjectPoseClientPluginUser::getClient
objpose::ObjectPoseClient getClient() const
Definition: ObjectPoseClientPlugin.cpp:70
armarx::armem::articulated_object::ArticulatedObjectReader::getArticulatedObject
VirtualRobot::RobotPtr getArticulatedObject(const std::string &typeName, const armem::Time &timestamp, const std::optional< std::string > &providerName, const std::string &instanceName="", VirtualRobot::RobotIO::RobotDescription loadMode=VirtualRobot::RobotIO::eStructure)
Definition: ArticulatedObjectReader.cpp:30
armarx::navigation::components::distance_to_obstacle_costmap_provider::Component::Component
Component()
Definition: Component.cpp:65
armarx::core::time::DateTime::Invalid
static DateTime Invalid()
Definition: DateTime.cpp:57
armarx::objpose::ObjectPose
An object pose as stored by the ObjectPoseStorage.
Definition: ObjectPose.h:33
armarx::navigation::algorithms::Costmap
Definition: Costmap.h:16
armarx::core::time::Duration::MilliSeconds
static Duration MilliSeconds(std::int64_t milliSeconds)
Constructs a duration in milliseconds.
Definition: Duration.cpp:48
armarx::navigation::components::distance_to_obstacle_costmap_provider
Definition: Component.cpp:63
armarx::navigation::components::distance_to_obstacle_costmap_provider::Component::getDefaultName
std::string getDefaultName() const override
Definition: Component.cpp:401
armarx::split
std::vector< std::string > split(const std::string &source, const std::string &splitBy, bool trimElements=false, bool removeEmptyElements=false)
Definition: StringHelpers.cpp:38