9#include <unordered_map>
12#include <SimoxUtility/algorithm/string.h>
13#include <SimoxUtility/filesystem/list_directory.h>
14#include <VirtualRobot/VirtualRobot.h>
15#include <VirtualRobot/XML/ObjectIO.h>
28 namespace fs = std::filesystem;
32 packageName(objectsPackageName), relObjectsDir(relObjectsDir)
41 absPackageDataDir.clear();
51 ObjectFinder::init()
const
53 if (absPackageDataDir.empty())
56 absPackageDataDir = packageFinder.getDataDir();
57 if (absPackageDataDir.empty())
59 ARMARX_WARNING <<
"Could not find package '" << packageName <<
"'.";
73 ObjectFinder::isDatasetDirValid(
const path& path)
const
75 return std::filesystem::is_directory(
path);
78 std::optional<ObjectInfo>
88 return ObjectInfo(packageName, absPackageDataDir, relObjectsDir, dataset, name);
91 const std::vector<std::string>& datasets =
getDatasets();
92 for (
const std::string& ds : datasets)
94 if (fs::is_directory(_rootDirAbs() / ds / name))
96 return ObjectInfo(packageName, absPackageDataDir, relObjectsDir, ds, name);
100 std::stringstream ss;
101 ss <<
"Did not find object '" << name <<
"' in any of these datasets:\n";
102 for (
const auto& ds : datasets)
104 ss <<
"- " << ds <<
"\n";
106 ss <<
"Objects root directory: " << _rootDirAbs();
112 std::optional<ObjectInfo>
118 std::optional<ObjectInfo>
121 return findObject(
id.dataset(),
id.className());
124 std::optional<ObjectInfo>
130 std::vector<std::string>
134 std::vector<std::string> datasets;
137 datasets.push_back(dir.filename());
142 std::vector<ObjectFinder::path>
150 const bool local =
false;
151 std::vector<path> dirs = simox::fs::list_directory(_rootDirAbs(), local);
152 std::vector<path> datasetDirs;
153 for (
const path& p : dirs)
155 if (isDatasetDirValid(p))
157 datasetDirs.push_back(p);
163 std::vector<ObjectInfo>
171 const bool local =
true;
172 std::vector<ObjectInfo>
objects;
173 for (
const path& datasetDir : simox::fs::list_directory(_rootDirAbs(), local))
175 if (isDatasetDirValid(_rootDirAbs() / datasetDir))
178 for (
const auto& o : dataset)
187 std::vector<armem::articulated_object::ArticulatedObjectDescription>
196 const bool local =
true;
198 std::vector<armem::articulated_object::ArticulatedObjectDescription>
objects;
199 for (
const path& datasetDir : simox::fs::list_directory(_rootDirAbs(), local))
201 if (isDatasetDirValid(_rootDirAbs() / datasetDir))
210 std::map<std::string, std::vector<ObjectInfo>>
214 std::map<std::string, std::vector<ObjectInfo>>
objects;
222 std::vector<ObjectInfo>
230 path datasetDir = _rootDirAbs() / dataset;
231 if (!fs::is_directory(datasetDir))
233 ARMARX_WARNING <<
"Expected dataset directory for dataset '" << dataset <<
"': \n"
238 std::vector<ObjectInfo>
objects;
239 const bool local =
true;
240 for (
const path& dir : simox::fs::list_directory(datasetDir, local))
242 if (fs::is_directory(datasetDir / dir))
249 object.setLogError(logObjectDiscoveryError);
251 if (!checkPaths ||
object.checkPaths())
260 std::unordered_map<std::string,
261 std::vector<armem::articulated_object::ArticulatedObjectDescription>>
270 const bool local =
true;
272 std::unordered_map<std::string,
273 std::vector<armem::articulated_object::ArticulatedObjectDescription>>
275 for (
const path& datasetDir : simox::fs::list_directory(_rootDirAbs(), local))
277 if (isDatasetDirValid(_rootDirAbs() / datasetDir))
280 datasets[datasetDir] = dataset;
286 std::vector<armem::articulated_object::ArticulatedObjectDescription>
295 path datasetDir = _rootDirAbs() / dataset;
296 if (!isDatasetDirValid(datasetDir))
298 ARMARX_WARNING <<
"Expected dataset directory for dataset '" << dataset <<
"': \n"
303 std::vector<armem::articulated_object::ArticulatedObjectDescription>
objects;
304 const bool local =
true;
305 for (
const path& dir : simox::fs::list_directory(datasetDir, local))
307 if (fs::is_directory(datasetDir / dir))
314 std::optional<PackageFileLocation> modelFile =
object.getArticulatedModel();
315 if (modelFile.has_value())
318 .name =
object.idStr(),
319 .xml = {modelFile->package, modelFile->relativePath},
330 VirtualRobot::ManipulationObjectPtr
332 const VirtualRobot::ObjectIO::ObjectDescription loadMode)
338 const auto data = ts->simoxXML();
345 return VirtualRobot::ObjectIO::loadManipulationObject(
abs, loadMode);
348 VirtualRobot::ManipulationObjectPtr
351 const VirtualRobot::ObjectIO::ObjectDescription loadMode)
const
356 VirtualRobot::ObstaclePtr
363 const auto data = ts->simoxXML();
370 return VirtualRobot::ObjectIO::loadObstacle(
abs);
373 VirtualRobot::ObstaclePtr
379 static std::vector<std::string>
383 const bool includeClassName,
384 const std::function<std::optional<std::vector<std::string>>(
const ObjectInfo&)> loadNamesFn)
386 std::vector<std::string> names;
387 if (includeClassName)
389 names.push_back(simox::alg::to_lower(objectID.
className()));
391 if (std::optional<ObjectInfo> info = finder.
findObject(objectID))
393 if (std::optional<std::vector<std::string>> loadedNames = loadNamesFn(*info))
396 names.insert(names.end(), loadedNames->begin(), loadedNames->end());
402 std::vector<std::string>
405 return _loadNames(*
this,
411 std::vector<std::string>
414 return _loadNames(*
this,
423 logObjectDiscoveryError = logEnabled;
427 ObjectFinder::_rootDirAbs()
const
429 return absPackageDataDir / packageName / relObjectsDir;
433 ObjectFinder::_rootDirRel()
const
439 ObjectFinder::_ready()
const
441 return !absPackageDataDir.empty();
static bool SearchReadableFile(const std::string &querryFileName, std::string &resultFileName, bool verbose=true)
static void addDataPaths(const std::string &dataPathList)
static bool FindPackageAndAddDataPath(const std::string &packageName)
Search for the package and add its data path if it was found.
The CMakePackageFinder class provides an interface to the CMake Package finder capabilities.
void setTag(const LogTag &tag)
Used to find objects in the ArmarX objects repository [1] (formerly [2]).
std::vector< path > getDatasetDirectories() const
std::vector< std::string > loadSpokenNames(const ObjectID &objectID, bool includeClassName=false) const
Load names to use when verbalizing an object name.
ObjectFinder(const std::string &objectsPackageName=DefaultObjectsPackageName, const path &relObjectsDir=DefaultObjectsDirectory)
std::vector< std::string > getDatasets() const
static VirtualRobot::ObstaclePtr loadObstacle(const std::optional< ObjectInfo > &ts)
std::vector< std::string > loadRecognizedNames(const ObjectID &objectID, bool includeClassName=false) const
Load names to use when matched when recognizing an object by name.
std::vector< ObjectInfo > findAllObjects(bool checkPaths=true) const
std::unordered_map< std::string, std::vector< armem::articulated_object::ArticulatedObjectDescription > > findAllArticulatedObjectsByDataset(bool checkPaths=true) const
std::string getPackageName() const
void setPath(const std::string &path)
std::filesystem::path path
static VirtualRobot::ManipulationObjectPtr loadManipulationObject(const std::optional< ObjectInfo > &ts, VirtualRobot::ObjectIO::ObjectDescription loadMode=VirtualRobot::ObjectIO::ObjectDescription::eFull)
std::vector< armem::articulated_object::ArticulatedObjectDescription > findAllArticulatedObjects(bool checkPaths) const
std::vector< armem::articulated_object::ArticulatedObjectDescription > findAllArticulatedObjectsOfDataset(const std::string &dataset, bool checkPaths) const
void setLogObjectDiscoveryError(bool logEnabled)
std::vector< ObjectInfo > findAllObjectsOfDataset(const std::string &dataset, bool checkPaths=true) const
std::map< std::string, std::vector< ObjectInfo > > findAllObjectsByDataset(bool checkPaths=true) const
std::optional< ObjectInfo > findObject(const std::string &dataset, const std::string &name) const
A known object ID of the form "Dataset/ClassName" or "Dataset/ClassName/InstanceName".
std::string className() const
Accessor for the object files.
std::optional< std::vector< std::string > > loadSpokenNames() const
Load names to use when verbalizing an object name.
std::optional< std::vector< std::string > > loadRecognizedNames() const
Load names to use when matched when recognizing an object by name.
#define ARMARX_WARNING
The logging level for unexpected behaviour, but not a serious problem.
#define ARMARX_VERBOSE
The logging level for verbose information.
armarx::armem::robot_state::description::RobotDescription ArticulatedObjectDescription
const simox::meta::IntEnumNames names
This file offers overloads of toIce() and fromIce() functions for STL container types.
std::vector< T > abs(const std::vector< T > &v)
An object pose as stored by the ObjectPoseStorage.
armarx::ObjectID objectID
The object ID, i.e. dataset, class name and instance name.