SceneProvider.cpp
Go to the documentation of this file.
1 #include "SceneProvider.h"
2 
3 #include <utility>
4 #include <vector>
5 
6 #include <VirtualRobot/SceneObjectSet.h> // IWYU pragma: keep
7 #include <VirtualRobot/XML/RobotIO.h>
8 
16 
22 
32 
34 {
35 
37  srv(srv), config(config)
38  {
39  }
40 
41  const core::Scene&
43  {
44  return scn;
45  }
46 
47  bool
49  {
50  scn.timestamp = timestamp;
51 
52  // Only load structure. This includes the primitive models (no mesh files though).
54  config.robotName, timestamp, VirtualRobot::RobotIO::RobotDescription::eStructure);
55  scn.robot->setPrimitiveApproximationModel(config.primitiveApproximationModels);
56 
58 
59  scn.staticScene.emplace(getStaticScene(timestamp));
60  scn.dynamicScene.emplace(getDynamicScene(timestamp));
61  scn.graph = getSceneGraph(timestamp);
62 
63  return true; // TODO(fabian.reister): return false if sync fails
64  }
65 
66  bool
67  SceneProvider::synchronize(const DateTime& timestamp, const bool fullUpdate)
68  {
69  scn.timestamp = timestamp;
70 
73 
74  if (fullUpdate)
75  {
76  scn.staticScene.emplace(getStaticScene(timestamp));
77  }
78  scn.dynamicScene.emplace(getDynamicScene(timestamp));
79  // scn.graph = getSceneGraph(timestamp);
80 
81  const auto platformState =
82  srv.virtualRobotReader->queryPlatformState(scn.robot->getName(), timestamp);
83  ARMARX_CHECK(platformState.has_value())
84  << "Could not get a platform state for ts: " << VAROUT(timestamp);
85 
86  scn.platformVelocity = core::Twist{.linear = platformState->twist.linear,
87  .angular = platformState->twist.angular};
88 
89  return true; // TODO(fabian.reister): return false if sync fails
90  }
91 
93  SceneProvider::getStaticScene(const DateTime& timestamp) const
94  {
96 
97  ARMARX_VERBOSE << "Getting static scene info";
98 
100 
101  objpose::ObjectPoseMap objectMap;
102  for (const objpose::ObjectPose& object : objectPoses)
103  {
104  objectMap.emplace(object.objectID, object);
105  }
106 
107  std::vector<ObjectInfo> objectInfo = srv.objectPoseClient.objectFinder.findAllObjects();
108 
109  // remove those objects that belong to an object dataset. the manipulation object / distance computation is broken
110  auto objectPosesStatic = armarx::objpose::util::filterObjects(
111  objectPoses, {"KIT", "HOPE", "MDB", "YCB", "Kitchen", "Maintenance"});
112 
113  ARMARX_INFO << "Static objects:";
114  for (const auto& objectPose : objectPosesStatic)
115  {
116  ARMARX_INFO << "- " << objectPose.objectID;
117  }
118 
119  const auto objects = armarx::objpose::util::asSceneObjects(objectPosesStatic);
120 
121  ARMARX_CHECK_NOT_NULL(objects);
122  ARMARX_INFO << objects->getSize() << " objects in the scene";
123 
124  ARMARX_INFO << "Retrieving costmap in memory";
125 
126  ARMARX_TRACE;
127 
128  const algorithms::Costmap costmap = [&]()
129  {
130  // waiting for static costmap to become available
131  while (true)
132  {
133  const memory::client::costmap::Reader::Query query{
134  .providerName = config.staticCostmapProviderName,
135  .name = config.staticCostmapName,
136  .timestamp = armarx::Clock::Now()};
137 
138 
139  if (const memory::client::costmap::Reader::Result costmap =
140  srv.costmapReader->query(query))
141  {
142  ARMARX_CHECK(costmap.costmap.has_value());
143  ARMARX_INFO << "Static costmap available.";
144  return costmap.costmap.value();
145  }
146 
147  ARMARX_INFO << deactivateSpam(5) << "Static costmap `" << query.name
148  << "` from provider " << query.providerName << " not available yet.";
149  }
150  }();
151 
152  const auto locations = srv.graphReader->locations();
153 
154  ARMARX_INFO << "Retrieved static costmap";
155 
156  return {.objects = objects,
157  .objectMap = std::move(objectMap),
158  .objectInfo = std::move(objectInfo),
159  .distanceToObstaclesCostmap = costmap,
160  .locations = std::move(locations)};
161  }
162 
163  core::DynamicScene
164  SceneProvider::getDynamicScene(const DateTime& timestamp) const
165  {
166  const memory::client::human::Reader::Query queryHumans{
167  .providerName = config.humanProviderName,
168  .timestamp = timestamp,
169  .maxAge = Duration::MilliSeconds(500)};
170 
171  const memory::client::laser_scanner_features::Reader::Query queryFeatures{
172  .providerName = config.laserScannerFeaturesProviderName,
173  .name = {},
174  .timestamp = timestamp};
175 
176  return {.humans = srv.humanReader->queryHumans(queryHumans).humans,
177  .laserScannerFeatures =
178  srv.laserScannerFeaturesReader->queryData(queryFeatures).features};
179  }
180 
181  core::SceneGraph
182  SceneProvider::getSceneGraph(const DateTime& /*timestamp*/) const
183  {
185  return {.subgraphs = srv.graphReader->graphs()};
186  }
187 
188 } // namespace armarx::navigation::server::scene_provider
armarx::navigation::server::scene_provider::SceneProvider::Config::staticCostmapProviderName
std::string staticCostmapProviderName
Definition: SceneProvider.h:92
armarx::navigation::core::Scene::graph
std::optional< core::SceneGraph > graph
Definition: types.h:70
armarx::navigation::core::Scene::robot
VirtualRobot::RobotPtr robot
Definition: types.h:67
ARMARX_VERBOSE
#define ARMARX_VERBOSE
Definition: Logging.h:187
armarx::objpose::ObjectPoseClient::fetchObjectPoses
ObjectPoseSeq fetchObjectPoses() const
Fetch all known object poses.
Definition: ObjectPoseClient.cpp:34
armarx::navigation::server::scene_provider::SceneProvider::InjectedServices::objectPoseClient
objpose::ObjectPoseClient objectPoseClient
Definition: SceneProvider.h:85
armarx::objpose::util::filterObjects
objpose::ObjectPoseSeq filterObjects(objpose::ObjectPoseSeq objects, const std::vector< std::string > &datasetDisableList)
Definition: util.cpp:37
armarx::navigation::server::scene_provider::SceneProvider::InjectedServices::graphReader
memory::client::graph::Reader * graphReader
Definition: SceneProvider.h:73
armarx::armem::robot_state::RobotReader::queryPlatformState
std::optional< PlatformState > queryPlatformState(const std::string &robotName, const armem::Time &timestamp) const
Definition: RobotReader.cpp:336
armarx::navigation::core::Scene::staticScene
std::optional< core::StaticScene > staticScene
Definition: types.h:64
armarx::objpose::ObjectPoseSeq
std::vector< ObjectPose > ObjectPoseSeq
Definition: forward_declarations.h:20
armarx::ObjectFinder::findAllObjects
std::vector< ObjectInfo > findAllObjects(bool checkPaths=true) const
Definition: ObjectFinder.cpp:149
basic_types.h
armarx::navigation::server::scene_provider::SceneProvider::InjectedServices::virtualRobotReader
armem::robot_state::VirtualRobotReader * virtualRobotReader
Definition: SceneProvider.h:79
DateTime.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::navigation::server::scene_provider::SceneProvider::Config::primitiveApproximationModels
std::vector< std::string > primitiveApproximationModels
Definition: SceneProvider.h:98
armarx::navigation::memory::client::laser_scanner_features::Reader::queryData
Result queryData(const Query &query) const
Definition: Reader.cpp:121
DynamicScene.h
trace.h
armarx::objpose::ObjectPoseClient::objectFinder
ObjectFinder objectFinder
Definition: ObjectPoseClient.h:107
Duration.h
Reader.h
util.h
StaticScene.h
armarx::armem::robot_state::VirtualRobotReader::synchronizeRobot
bool synchronizeRobot(VirtualRobot::Robot &robot, const armem::Time &timestamp) const
Synchronize both the platform pose and the joint values of a virtual robot, according to the robot st...
Definition: VirtualRobotReader.cpp:20
armarx::navigation::server::scene_provider::SceneProvider::Config::robotName
std::string robotName
Definition: SceneProvider.h:90
armarx::navigation::memory::client::costmap::Reader::query
Result query(const Query &query) const
Definition: Reader.cpp:80
armarx::navigation::server::scene_provider::SceneProvider::SceneProvider
SceneProvider(const InjectedServices &srv, const Config &config)
Definition: SceneProvider.cpp:36
armarx::navigation::server::scene_provider
Definition: Navigator.h:58
StringHelpers.h
armarx::navigation::server::scene_provider::SceneProvider::InjectedServices::laserScannerFeaturesReader
memory::client::laser_scanner_features::Reader * laserScannerFeaturesReader
Definition: SceneProvider.h:83
ARMARX_CHECK
#define ARMARX_CHECK(expression)
Shortcut for ARMARX_CHECK_EXPRESSION.
Definition: ExpressionException.h:82
armarx::navigation::memory::client::human::Reader::queryHumans
HumanResult queryHumans(const Query &query) const
Definition: Reader.cpp:204
Reader.h
Clock.h
armarx::navigation::core::Twist
Definition: basic_types.h:53
Costmap.h
armarx::navigation::core::Scene::platformVelocity
core::Twist platformVelocity
Definition: types.h:68
armarx::navigation::server::scene_provider::SceneProvider::Config::staticCostmapName
std::string staticCostmapName
Definition: SceneProvider.h:93
deactivateSpam
SpamFilterDataPtr deactivateSpam(SpamFilterDataPtr const &spamFilter, float deactivationDurationSec, const std::string &identifier, bool deactivate)
Definition: Logging.cpp:75
armarx::navigation::core::Scene::timestamp
DateTime timestamp
Definition: types.h:62
ARMARX_TRACE
#define ARMARX_TRACE
Definition: trace.h:77
armarx::navigation::server::scene_provider::SceneProvider::Config
Definition: SceneProvider.h:88
armarx::armem::robot_state::VirtualRobotReader::getRobotWaiting
VirtualRobot::RobotPtr getRobotWaiting(const std::string &name, const armem::Time &timestamp=armem::Time::Invalid(), const VirtualRobot::RobotIO::RobotDescription &loadMode=VirtualRobot::RobotIO::RobotDescription::eStructure)
In contrast to getRobot(), this function will retry to query the robot until it exists.
Definition: VirtualRobotReader.cpp:105
ObjectPose.h
ObjectInfo.h
types.h
armarx::navigation::server::scene_provider::SceneProvider::InjectedServices::humanReader
memory::client::human::Reader * humanReader
Definition: SceneProvider.h:81
armarx::navigation::core::Scene
Definition: types.h:60
Reader.h
armarx::navigation::server::scene_provider::SceneProvider::synchronize
bool synchronize(const DateTime &timestamp, bool fullUpdate) override
Definition: SceneProvider.cpp:67
armarx::navigation::server::scene_provider::SceneProvider::scene
const core::Scene & scene() const override
Definition: SceneProvider.cpp:42
armarx::navigation::core::Scene::dynamicScene
std::optional< core::DynamicScene > dynamicScene
Definition: types.h:65
ExpressionException.h
armarx::core::time::DateTime
Represents a point in time.
Definition: DateTime.h:24
armarx::navigation::core::Twist::linear
LinearVelocity linear
Definition: basic_types.h:55
armarx::navigation::memory::client::graph::Reader::locations
std::map< std::string, core::Location > locations()
Definition: Reader.cpp:49
armarx::navigation::memory::client::graph::Reader::graphs
std::vector< armarx::navigation::core::Graph > graphs()
Definition: Reader.cpp:71
armarx::navigation::memory::client::human::Reader::HumanResult::humans
armarx::navigation::human::Humans humans
Definition: Reader.h:52
forward_declarations.h
ARMARX_INFO
#define ARMARX_INFO
Definition: Logging.h:181
VAROUT
#define VAROUT(x)
Definition: StringHelpers.h:198
armarx::objpose::util::asSceneObjects
VirtualRobot::SceneObjectSetPtr asSceneObjects(const objpose::ObjectPoseSeq &objectPoses)
Definition: util.cpp:133
armarx::navigation::memory::client::laser_scanner_features::Reader::Result::features
std::vector< LaserScannerFeatures > features
Definition: Reader.h:69
armarx::core::time::Clock::Now
static DateTime Now()
Current time on the virtual clock.
Definition: Clock.cpp:93
armarx::navigation::server::scene_provider::SceneProvider::Config::laserScannerFeaturesProviderName
std::string laserScannerFeaturesProviderName
Definition: SceneProvider.h:96
armarx::navigation::server::scene_provider::SceneProvider::Config::humanProviderName
std::string humanProviderName
Definition: SceneProvider.h:95
armarx::navigation::server::scene_provider::SceneProvider::initialize
bool initialize(const DateTime &timestamp) override
Definition: SceneProvider.cpp:48
armarx::navigation::server::scene_provider::SceneProvider::InjectedServices::costmapReader
memory::client::costmap::Reader * costmapReader
Definition: SceneProvider.h:75
Logging.h
armarx::navigation::core::StaticScene
Definition: StaticScene.h:43
types.h
Reader.h
armarx::objpose::ObjectPose
An object pose as stored by the ObjectPoseStorage.
Definition: ObjectPose.h:33
armarx::core::time::Duration::MilliSeconds
static Duration MilliSeconds(std::int64_t milliSeconds)
Constructs a duration in milliseconds.
Definition: Duration.cpp:48
armarx::navigation::server::scene_provider::SceneProvider::InjectedServices
Definition: SceneProvider.h:70
SceneProvider.h
armarx::objpose::ObjectPoseMap
std::map< ObjectID, ObjectPose > ObjectPoseMap
Definition: forward_declarations.h:21