32#include <SimoxUtility/algorithm/string/string_tools.h>
33#include <SimoxUtility/color/cmaps/colormaps.h>
34#include <VirtualRobot/SceneObjectSet.h>
35#include <VirtualRobot/VirtualRobot.h>
36#include <VirtualRobot/XML/ObjectIO.h>
37#include <VirtualRobot/XML/RobotIO.h>
67#include <range/v3/range/conversion.hpp>
68#include <range/v3/view/enumerate.hpp>
69#include <range/v3/view/filter.hpp>
70#include <range/v3/view/transform.hpp>
83 const std::string Component::defaultName =
"nav_3d_test";
91 def->required(properties.robotName,
"p.robotName",
"Robot name.");
93 def->optional(properties.costmapParams.binaryGrid,
"p.costmapParams.binaryGrid");
94 def->optional(properties.costmapParams.cellSize,
"p.costmapParams.cellSize");
95 def->optional(properties.costmapParams.orientations,
"p.costmapParams.orientations");
96 def->optional(properties.costmapParams.sceneBoundsMargin,
97 "p.costmapParams.sceneBoundsMargin");
98 def->optional(properties.costmapBuilderParams.restrictToRooms,
99 "p.costmapBuilderParams.restrictToRooms");
101 def->optional(properties.colModel,
"p.colModel");
102 def->optional(properties.buildSecondCostmapWithSmallerMargins,
103 "p.buildSecondCostmapWithSmallerMargins");
105 def->optional(properties.costmapToExtend,
107 "Name the initial costmap that should be extended. Format is "
108 "`ProviderName`/`EntityName` to reference a costmap in the memory.");
110 properties.costmapSmallerMarginsToExtend,
111 "p.costmapSmallerMarginsToExtend",
112 "Name the initial costmap that should be extended with smaller margins. Format is "
113 "`ProviderName`/`EntityName` to reference a costmap in the memory.");
115 def->optional(properties.robotModelXmlFilepath,
"p.robotModelXmlFilepath",
"");
117 def->optional(properties.costmapBuilderParams.approximation2D,
118 "p.use2dApproximation",
119 "Calculate distances in 2d instead of 3d space");
120 def->optional(properties.costmapBuilderParams.approx2DignoreVerticesOver,
121 "p.approx2DignoreVerticesOver",
122 "Ignore vertices that are higher than this in 2d approximation [mm]");
141 return {pos.x(), pos.y(), 0.F};
147 Eigen::Matrix3f mat3D;
149 mat3D.topLeftCorner<2, 2>() = mat;
159 const auto traj3D = ranges::views::transform(
162 {
return {pose.translation().x(), pose.translation().y(), 0}; }) |
165 layer.
add(
viz::Path(
"path").points(traj3D).color(simox::color::Color::blue()));
167 const auto cmap = simox::color::cmaps::viridis();
169 for (
const auto& [idx, tp] :
trajectory | ranges::views::enumerate)
171 const float scale = 150.F;
173 const Eigen::Vector2f target = scale * tp.linear() * Eigen::Vector2f::UnitY();
175 layer.add(
viz::Arrow(
"velocity_" + std::to_string(idx))
176 .fromTo(
vecTo3D(tp.translation()),
vecTo3D(tp.translation() + target))
177 .
color(cmap.at(1.F)));
199 const auto aStarWithOrientationParams =
202 aStarWithOrientationParams};
203 const core::Pose2D start = Eigen::Isometry2f{Eigen::Translation2f{0, 0}};
205 Eigen::Isometry2f{Eigen::Translation2f{4000, 7000}} * Eigen::Rotation2Df{3.F};
209 const auto trajectory = planner.plan(start, goal);
211 ARMARX_INFO <<
"Calculating trajectory took " << (timestamp2 - timestamp1).toMilliSeconds()
215 ARMARX_INFO <<
"-- (" << pose.translation().x() <<
", " << pose.translation().y()
216 <<
") " << Eigen::Rotation2Df{pose.linear()}.angle() * 180.F /
M_PI
224 const std::vector<armem::MemoryID>& snapshotIDs)
233 const std::vector<armarx::ObjectID> changedObjectClasses =
234 snapshotIDs | ranges::views::transform(toObjectID) | ranges::to_vector;
238 const std::set<std::string> nonRelevantObjectClasses = {
"KIT",
248 const auto isRelevantClass =
250 {
return nonRelevantObjectClasses.count(objectID.dataset()) == 0; };
252 const std::vector<armarx::ObjectID> relevantObjectClasses =
253 changedObjectClasses | ranges::views::filter(isRelevantClass) | ranges::to_vector;
255 if (relevantObjectClasses.empty())
260 ARMARX_INFO <<
"Relevant object classes changed: " << relevantObjectClasses;
269 std::string& costmapNameWithProvider)
272 const std::vector<std::string> splits = simox::alg::split(costmapNameWithProvider,
"/");
276 const auto initialCostmap =
282 .name = splits.back(),
285 const auto result = costmapReaderPlugin->
get().query(query);
290 <<
"` is not available yet. Retrying ...";
296 return result.costmap.value();
299 return initialCostmap;
306 std::string& costmapNameWithProvider)
318 const auto costmap = costmapBuilder.
create();
326 std::lock_guard g{createCostmapMtx};
330 const std::vector<std::string> primitiveModelIds = [&]() -> std::vector<std::string>
332 if (not properties.primitiveModelIds.empty())
334 const std::vector<std::string> primitiveModelIds =
335 simox::alg::split(properties.primitiveModelIds,
",",
true,
false);
337 return primitiveModelIds;
343 const auto loadMode = primitiveModelIds.empty()
344 ? VirtualRobot::RobotIO::RobotDescription::eCollisionModel
345 : VirtualRobot::RobotIO::RobotDescription::eStructure;
347 auto robot = virtualRobotReaderPlugin->get().getRobotWaiting(properties.robotName,
351 if (properties.robotModelXmlFilepath !=
"")
353 robot = VirtualRobot::RobotIO::loadRobot(properties.robotModelXmlFilepath, loadMode);
354 robot->setName(
"custom_robot");
359 if (not primitiveModelIds.empty())
362 robot->setPrimitiveApproximationModel(primitiveModelIds);
379 objectPosesStaticNonArticulated,
380 VirtualRobot::ObjectIO::ObjectDescription::eCollisionModel);
382 std::vector<VirtualRobot::RobotPtr> articulatedObjects;
383 for (
const auto& objectPoseStaticArticulated : objectPosesStaticArticulated)
386 << objectPoseStaticArticulated.objectID;
388 const auto articulatedObject =
389 articulatedObjectReaderPlugin->get().getArticulatedObject(
390 objectPoseStaticArticulated.objectID.getClassID().str(),
393 objectPoseStaticArticulated.objectID.instanceName());
396 << objectPoseStaticArticulated.objectID.getClassID().str();
398 ARMARX_CHECK(articulatedObjectReaderPlugin->get().synchronizeArticulatedObject(
403 std::set<std::string> primitiveIDs;
404 articulatedObject->getPrimitiveApproximationIDs(primitiveIDs);
406 if (articulatedObject->getCollisionModels().empty())
409 <<
"The articualted object `" << articulatedObject->getType() <<
"/"
410 << articulatedObject->getName()
411 <<
"` does not have a collision model. Using primitive model instead.";
415 const std::vector<std::string> usedPrimitiveModelIDs(primitiveIDs.begin(),
417 articulatedObject->setPrimitiveApproximationModel(usedPrimitiveModelIDs);
420 articulatedObjects.push_back(articulatedObject);
425 ARMARX_INFO << obstacles->getSize() <<
" objects in the scene";
434 for (
const auto&
object : articulatedObjects)
436 ARMARX_VERBOSE <<
" - " <<
object->getType() <<
"/" <<
object->getName();
445 const auto result = roomReaderPlugin->get().query(query);
447 const auto&
rooms = result.rooms;
449 for (
const auto& room :
rooms)
455 state.costmap.emplace(
463 properties.costmapParams,
465 properties.costmapBuilderParams);
469 properties.costmapToExtend);
476 return state.costmap.has_value();
492 return Component::defaultName;
498 return Component::defaultName;
570 for (
const auto& grid : state.costmap->getGrid())
573 <<
", costmap max: " << grid.maxCoeff();
576 std::vector<viz::Layer> layers;
577 for (
int i = 0; i < state.costmap->params().orientations; ++i)
579 std::stringstream ss;
580 ss <<
"costmap3d_" << i;
585 for (
const auto& layer : layers)
#define ARMARX_REGISTER_COMPONENT_EXECUTABLE(ComponentT, applicationName)
SpamFilterDataPtr deactivateSpam(SpamFilterDataPtr const &spamFilter, float deactivationDurationSec, const std::string &identifier, bool deactivate)
armarx::viz::Client arviz
static DateTime Now()
Current time on the virtual clock.
static void WaitFor(const Duration &duration)
Wait for a certain duration on the virtual clock.
Default component property definition container.
std::string getConfigIdentifier()
Retrieve config identifier for this component as set in constructor.
static DateTime Invalid()
static Duration MilliSeconds(std::int64_t milliSeconds)
Constructs a duration in milliseconds.
PluginT * addPlugin(const std::string prefix="", ParamsT &&... params)
A known object ID of the form "Dataset/ClassName" or "Dataset/ClassName/InstanceName".
objpose::ObjectPoseClient getClient() const
void setComponent(ManagedIceObject *component)
MemoryNameSystem & memoryNameSystem()
A component plugin offering client-side access to a reader or writer and manages the lifecycle,...
SubscriptionHandle subscribe(const MemoryID &subscriptionID, Callback Callback)
static DateTime Now()
Current time on the virtual clock.
The A* planner (3D version including orientation dimension)
Costmap3D create(const SceneBounds &init=SceneBounds())
void onInitComponent() override
void onDisconnectComponent() override
armarx::PropertyDefinitionsPtr createPropertyDefinitions() override
void processObjectInstance(const armem::MemoryID &id, const std::vector< armem::MemoryID > &snapshotIDs)
void onConnectComponent() override
static std::string GetDefaultName()
Get the component's default name.
bool createAndStoreCostmap()
void onExitComponent() override
std::string getDefaultName() const override
virtual Layer layer(std::string const &name) const
CommitResult commit(StagedCommit const &commit)
DerivedT & color(Color color)
#define ARMARX_CHECK(expression)
Shortcut for ARMARX_CHECK_EXPRESSION.
#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...
#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...
#define ARMARX_INFO
The normal logging level.
#define ARMARX_ERROR
The logging level for unexpected behaviour, that must be fixed.
#define ARMARX_DEBUG
The logging level for output that is only interesting while debugging.
#define ARMARX_VERBOSE
The logging level for verbose information.
void visualize(const algorithms::Costmap &costmap, viz::Layer &layer, const std::string &name, const float zOffset)
Eigen::Matrix3f matTo3D(const Eigen::Matrix2f &mat)
algorithms::Costmap loadCostmap(armem::client::plugins::ReaderWriterPlugin< memory::client::costmap::Reader > *costmapReaderPlugin, std::string &costmapNameWithProvider)
algorithms::orientation_aware::Costmap3D extendOrCreateCostmap(armem::client::plugins::ReaderWriterPlugin< memory::client::costmap::Reader > *costmapReaderPlugin, algorithms::orientation_aware::Costmap3DBuilder &costmapBuilder, std::string &costmapNameWithProvider)
Eigen::Vector3f vecTo3D(const Eigen::Vector2f &pos)
objpose::ObjectPoseSeq nonArticulatedObjects(objpose::ObjectPoseSeq objects)
VirtualRobot::SceneObjectSetPtr asSceneObjects(const objpose::ObjectPoseSeq &objectPoses, const VirtualRobot::ObjectIO::ObjectDescription loadMode)
objpose::ObjectPoseSeq articulatedObjects(objpose::ObjectPoseSeq objects)
objpose::ObjectPoseSeq staticObjects(objpose::ObjectPoseSeq objects)
std::vector< ObjectPose > ObjectPoseSeq
IceUtil::Handle< class PropertyDefinitionContainer > PropertyDefinitionsPtr
PropertyDefinitions smart pointer type.
An object pose as stored by the ObjectPoseStorage.
void add(ElementT const &element)