27 #include <Eigen/Geometry>
29 #include <IceUtil/Time.h>
31 #include <SimoxUtility/math/pose/pose.h>
32 #include <VirtualRobot/Robot.h>
33 #include <VirtualRobot/VirtualRobot.h>
34 #include <VirtualRobot/XML/RobotIO.h>
63 defs->topic(debugObserver);
65 defs->optional(p.updateFrequency,
"updateFrequency",
"Memory update frequency (write).");
67 defs->optional(p.obj.dataset,
"p.obj.dataset",
"");
68 defs->optional(p.obj.className,
"p.obj.class",
"");
77 return "ArticulatedObjectLocalizerExample";
84 auto& articulatedObjectWriter = articulatedObjectWriterPlugin->get();
86 articulatedObjectWriter.setProviderName(
getName());
98 static_cast<int>(1000.f / p.updateFrequency));
114 ArticulatedObjectLocalizerExample::createArticulatedObject()
116 auto& articulatedObjectReader = articulatedObjectReaderPlugin->get();
118 const std::string dishwasherName = p.obj.dataset +
"/" + p.obj.className;
120 const auto descriptions =
121 articulatedObjectReader.queryDescriptions(
armem::Time::Now(), std::nullopt);
123 ARMARX_INFO <<
"Found " << descriptions.size() <<
" articulated object descriptions";
125 for (
const auto& description : descriptions)
130 const auto it = std::find_if(
131 descriptions.begin(),
134 { return desc.name == dishwasherName; });
136 if (it == descriptions.end())
138 ARMARX_WARNING <<
"Articulated object " << dishwasherName <<
" not (yet) available";
142 auto obj = VirtualRobot::RobotIO::loadRobot(it->xml.toSystemPath(),
143 VirtualRobot::RobotIO::eStructure);
151 obj->setType(it->name);
159 if (articulatedObject ==
nullptr)
161 articulatedObject = createArticulatedObject();
163 if (articulatedObject ==
nullptr)
173 const std::optional<armem::robot_state::RobotState> state =
174 articulatedObjectReaderPlugin->get().queryState(
175 articulatedObject->getType() +
"/" + articulatedObject->getName(),
177 p.obj.readProviderName);
181 return state.value();
188 .jointMap = articulatedObject->getJointValues(),
189 .proprioception = std::nullopt};
194 articulatedObject->setGlobalPose(state.
globalPose.matrix());
199 const float t =
static_cast<float>((now - start).toSecondsDouble());
202 const float k = (1 + std::sin(t / (M_2_PI))) / 2;
204 auto jointValues = articulatedObject->getJointValues();
206 for (
auto& [name, jointValue] : jointValues)
208 const auto node = articulatedObject->getRobotNode(name);
209 jointValue = node->unscaleJointValue(k, 0, 1);
213 articulatedObject->setJointValues(jointValues);
218 {
ARMARX_INFO <<
"Storing object took " << dur <<
"."; });
220 auto& articulatedObjectWriter = articulatedObjectWriterPlugin->get();
221 articulatedObjectWriter.storeArticulatedObject(articulatedObject, now);