util.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 * @author Fabian Reister ( fabian dot reister at kit dot edu )
17 * @date 2022
18 * @copyright http://www.gnu.org/licenses/gpl-2.0.txt
19 * GNU General Public License
20 */
21
22#include "util.h"
23
24#include <algorithm>
25#include <optional>
26#include <string>
27#include <vector>
28
29#include <Eigen/Geometry>
30
31#include <VirtualRobot/ManipulationObject.h> // IWYU pragma: keep
32#include <VirtualRobot/SceneObjectSet.h>
33#include <VirtualRobot/VirtualRobot.h>
34#include <VirtualRobot/XML/BaseIO.h>
35#include <VirtualRobot/XML/ObjectIO.h>
36
39
44
46{
47
50 const std::vector<std::string>& datasetDisableList)
51 {
52 const auto isInDisableList = [&datasetDisableList](const objpose::ObjectPose& objectPose)
53 {
54 const auto dataset = objectPose.objectID.dataset();
55
56 return std::find(datasetDisableList.begin(), datasetDisableList.end(), dataset) !=
57 datasetDisableList.end();
58 };
59
60 objects.erase(std::remove_if(objects.begin(), objects.end(), isInDisableList),
61 objects.end());
62 return objects;
63 }
64
67 {
68 const auto isDynamic = [](const objpose::ObjectPose& objectPose)
69 { return not objectPose.isStatic; };
70
71 objects.erase(std::remove_if(objects.begin(), objects.end(), isDynamic), objects.end());
72 return objects;
73 }
74
77 {
78 ObjectFinder finder;
79 finder.setLogObjectDiscoveryError(false);
80
81 const auto isArticulated = [&finder](const objpose::ObjectPose& objectPose)
82 {
83 const auto objInfo = finder.findObject(objectPose.objectID);
84 ARMARX_CHECK_NOT_NULL(objInfo) << objectPose.objectID;
85 const bool hasArticulatedModel = objInfo->getArticulatedModel().has_value();
86 return hasArticulatedModel;
87 };
88
89 objects.erase(std::remove_if(objects.begin(), objects.end(), isArticulated), objects.end());
90 return objects;
91 }
92
95 {
96 ObjectFinder finder;
97 finder.setLogObjectDiscoveryError(false);
98
99 const auto isNonArticulated = [&finder](const objpose::ObjectPose& objectPose)
100 {
101 const auto objInfo = finder.findObject(objectPose.objectID);
102 ARMARX_CHECK_NOT_NULL(objInfo) << objectPose.objectID;
103 const bool hasArticulatedModel = objInfo->getArticulatedModel().has_value();
104 return not hasArticulatedModel;
105 };
106
107 objects.erase(std::remove_if(objects.begin(), objects.end(), isNonArticulated),
108 objects.end());
109 return objects;
110 }
111
112 std::optional<objpose::ObjectPose>
113 findObject(const objpose::ObjectPoseSeq& objectPoses, const armarx::ObjectID& objectID)
114 {
115 const auto matchesId = [&objectID](const objpose::ObjectPose& objectPose) -> bool
116 { return objectPose.objectID == objectID; };
117
118 const auto it = std::find_if(objectPoses.begin(), objectPoses.end(), matchesId);
119 if (it != objectPoses.end())
120 {
121 return *it;
122 }
123
124 return std::nullopt;
125 }
126
127 VirtualRobot::ManipulationObjectPtr
129 const VirtualRobot::ObjectIO::ObjectDescription loadMode)
130 {
131 ObjectFinder finder;
132 finder.setLogObjectDiscoveryError(false);
133
134 VirtualRobot::SceneObjectSetPtr sceneObjects(new VirtualRobot::SceneObjectSet);
135 if (auto obstacle = finder.loadManipulationObject(objectPose, loadMode))
136 {
137 obstacle->setName(objectPose.objectID.str());
138 obstacle->setGlobalPose(objectPose.objectPoseGlobal);
139 return obstacle;
140 }
141
142 ARMARX_WARNING << "Failed to load scene object `" << objectPose.objectID << "`";
143 return nullptr;
144 }
145
146 VirtualRobot::SceneObjectSetPtr
148 const VirtualRobot::ObjectIO::ObjectDescription loadMode)
149 {
150 ObjectFinder finder;
151 finder.setLogObjectDiscoveryError(false);
152
153 VirtualRobot::SceneObjectSetPtr sceneObjects(new VirtualRobot::SceneObjectSet);
154 for (const auto& objectPose : objectPoses)
155 {
156 ARMARX_VERBOSE << "Loading object `" << objectPose.objectID << "`";
157 if (auto obstacle = finder.loadManipulationObject(objectPose, loadMode))
158 {
159 obstacle->setName(objectPose.objectID.str());
160 obstacle->setGlobalPose(objectPose.objectPoseGlobal);
161 sceneObjects->addSceneObject(obstacle);
162 }
163 }
164
165 return sceneObjects;
166 }
167
168 VirtualRobot::SceneObjectSetPtr
169 asSceneObjects(const VirtualRobot::SceneObjectSetPtr& existingSceneObjectSet,
170 const objpose::ObjectPoseSeq& objectPoses,
171 const VirtualRobot::ObjectIO::ObjectDescription loadMode)
172 {
173
174 // instantiate a local cache to check whether a certain object (by id) already exists
175 std::map<armarx::ObjectID, VirtualRobot::SceneObjectPtr> existingSceneObjectSetMap;
176
177 if (existingSceneObjectSet)
178 {
179 for (const auto& sceneObject : existingSceneObjectSet->getSceneObjects())
180 {
181 existingSceneObjectSetMap.emplace(armarx::ObjectID(sceneObject->getName()),
182 sceneObject);
183 }
184 }
185
186 VirtualRobot::SceneObjectSetPtr sceneObjects(new VirtualRobot::SceneObjectSet);
187
188 objpose::ObjectPoseSeq existingObjectPoses;
189 objpose::ObjectPoseSeq objectPosesToLoad;
190
191 // split the provided objectPoses into a list of (1) already loaded and (2) to be loaded
192 for (const auto& objectPose : objectPoses)
193 {
194 if (existingSceneObjectSetMap.count(objectPose.objectID) > 0)
195 {
196 existingObjectPoses.push_back(objectPose);
197 }
198 else
199 {
200 objectPosesToLoad.push_back(objectPose);
201 }
202 }
203
204 // for the ones that are already available, synchronize their state
205 for (const auto& objectPose : existingObjectPoses)
206 {
207 const VirtualRobot::SceneObjectPtr& sceneObject =
208 existingSceneObjectSetMap.at(objectPose.objectID);
209 sceneObject->setGlobalPose(objectPose.objectPoseGlobal);
210 sceneObjects->addSceneObject(sceneObject);
211 }
212
213 if (not objectPosesToLoad.empty())
214 {
215 ObjectFinder finder;
216 finder.setLogObjectDiscoveryError(false);
217
218 for (const auto& objectPose : objectPosesToLoad)
219 {
220 ARMARX_VERBOSE << "Loading object `" << objectPose.objectID << "`";
221 if (auto obstacle = finder.loadManipulationObject(objectPose, loadMode))
222 {
223 obstacle->setName(objectPose.objectID.str());
224 obstacle->setGlobalPose(objectPose.objectPoseGlobal);
225 sceneObjects->addSceneObject(obstacle);
226 }
227 }
228 }
229
230 return sceneObjects;
231 }
232
233 VirtualRobot::SceneObjectPtr
235 const VirtualRobot::ObjectIO::ObjectDescription loadMode)
236 {
237 ObjectFinder finder;
238 finder.setLogObjectDiscoveryError(false);
239
240 VirtualRobot::SceneObjectSetPtr sceneObjects(new VirtualRobot::SceneObjectSet);
241 if (auto obstacle = finder.loadManipulationObject(objectPose, loadMode))
242 {
243 obstacle->setName(objectPose.objectID.str());
244 obstacle->setGlobalPose(objectPose.objectPoseGlobal);
245 return obstacle;
246 }
247 return nullptr;
248 }
249
250
251} // namespace armarx::objpose::util
Used to find objects in the ArmarX objects repository [1] (formerly [2]).
static VirtualRobot::ManipulationObjectPtr loadManipulationObject(const std::optional< ObjectInfo > &ts, VirtualRobot::ObjectIO::ObjectDescription loadMode=VirtualRobot::ObjectIO::ObjectDescription::eFull)
void setLogObjectDiscoveryError(bool logEnabled)
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".
Definition ObjectID.h:11
std::string str() const
Return "dataset/className" or "dataset/className/instanceName".
Definition ObjectID.cpp:60
#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_WARNING
The logging level for unexpected behaviour, but not a serious problem.
Definition Logging.h:193
#define ARMARX_VERBOSE
The logging level for verbose information.
Definition Logging.h:187
This file is part of ArmarX.
Definition util.cpp:46
objpose::ObjectPoseSeq nonArticulatedObjects(objpose::ObjectPoseSeq objects)
Definition util.cpp:76
VirtualRobot::SceneObjectSetPtr asSceneObjects(const objpose::ObjectPoseSeq &objectPoses, const VirtualRobot::ObjectIO::ObjectDescription loadMode)
Definition util.cpp:147
objpose::ObjectPoseSeq articulatedObjects(objpose::ObjectPoseSeq objects)
Definition util.cpp:94
objpose::ObjectPoseSeq staticObjects(objpose::ObjectPoseSeq objects)
Definition util.cpp:66
VirtualRobot::ManipulationObjectPtr asManipulationObject(const objpose::ObjectPose &objectPose, const VirtualRobot::ObjectIO::ObjectDescription loadMode)
Definition util.cpp:128
objpose::ObjectPoseSeq filterObjects(objpose::ObjectPoseSeq objects, const std::vector< std::string > &datasetDisableList)
Definition util.cpp:49
std::optional< objpose::ObjectPose > findObject(const objpose::ObjectPoseSeq &objectPoses, const armarx::ObjectID &objectID)
Definition util.cpp:113
VirtualRobot::SceneObjectPtr asSceneObject(const objpose::ObjectPose &objectPose, const VirtualRobot::ObjectIO::ObjectDescription loadMode)
Definition util.cpp:234
std::vector< ObjectPose > ObjectPoseSeq
An object pose as stored by the ObjectPoseStorage.
Definition ObjectPose.h:34
armarx::ObjectID objectID
The object ID, i.e. dataset, class name and instance name.
Definition ObjectPose.h:56
Eigen::Matrix4f objectPoseGlobal
The object pose in the global frame.
Definition ObjectPose.h:71