25#include <SimoxUtility/algorithm/string/string_tools.h>
26#include <SimoxUtility/math/pose/pose.h>
44 defs->topic(debugObserver);
46 defs->optional(initialObjectIDs,
"Objects",
"Object IDs of objects to be tracked.")
47 .map(simox::alg::join(initialObjectIDs,
", "), initialObjectIDs);
49 defs->optional(singleShot,
"SingleShot",
"If true, publishes only one snapshot.");
57 return "ObjectPoseProviderExample";
63 for (
const auto& initial : initialObjectIDs)
66 requestedObjects.requestObjects({
ObjectID(initial)}, -1);
70 providerInfo.objectType = objpose::ObjectType::KnownObject;
71 std::vector<ObjectInfo>
objects = objectFinder.findAllObjectsOfDataset(
"KIT");
74 providerInfo.supportedObjects.push_back(
armarx::toIce(obj.id()));
83 poseEstimationTask->start();
102 objpose::provider::RequestObjectsOutput
106 ARMARX_INFO <<
"Requested object IDs for " << input.relativeTimeoutMS
107 <<
" ms: " << input.objectIDs;
109 std::scoped_lock lock(requestedObjectsMutex);
110 requestedObjects.requestObjects(input.objectIDs, input.relativeTimeoutMS);
113 objpose::provider::RequestObjectsOutput output;
115 for (
const auto&
id : input.objectIDs)
117 output.results[id].success =
true;
123 ObjectPoseProviderExample::poseEstimationTaskRun()
128 std::map<ObjectID, ObjectInfo> objectInfos;
130 while (poseEstimationTask and not poseEstimationTask->
isStopped())
133 float t =
float((now - start).toSecondsDouble());
137 std::scoped_lock lock(requestedObjectsMutex);
141 if (update.added.size() > 0 || update.removed.size() > 0)
143 ARMARX_INFO <<
"Added: " << update.added <<
"Removed: " << update.removed;
148 for (
const ObjectID&
id :
update.current)
150 if (objectInfos.count(
id) == 0)
152 if (std::optional<ObjectInfo> info = objectFinder.findObject(
id))
154 objectInfos.emplace(
id, *info);
161 const ObjectInfo& info = objectInfos.at(
id);
163 armarx::objpose::ProvidedObjectPose& pose = poses.emplace_back();
165 pose.
objectType = objpose::ObjectType::KnownObject;
169 Eigen::Vector3f pos =
170 200 * Eigen::Vector3f(std::sin(t - i), std::cos(t - i), 1 + i);
171 Eigen::AngleAxisf ori((t - i) / M_PI_2, Eigen::Vector3f::UnitZ());
172 pose.
objectPose = simox::math::pose(pos, ori);
180 const float posVar = 10 + 10 * std::sin(t - i);
186 Eigen::Matrix3f rot =
187 Eigen::AngleAxisf(0.25 * (t - i), Eigen::Vector3f::UnitZ())
194 const float oriVar = (M_PI_4) + (M_PI_4)*std::sin(t - i);
200 Eigen::Matrix3f rot =
201 Eigen::AngleAxisf(0.25 * (t - i), Eigen::Vector3f::UnitZ())
207 pose.
confidence = 0.75 + 0.25 * std::sin(t - i);
213 ARMARX_VERBOSE <<
"Reporting " << poses.size() <<
" object poses";
221 cycle.waitForCycleDuration();
Default component property definition container.
std::string getConfigIdentifier()
Retrieve config identifier for this component as set in constructor.
This util class helps with keeping a cycle time during a control cycle.
std::string getName() const
Retrieve name of object.
A known object ID of the form "Dataset/ClassName" or "Dataset/ClassName/InstanceName".
void onInitComponent() override
void onDisconnectComponent() override
armarx::PropertyDefinitionsPtr createPropertyDefinitions() override
void onConnectComponent() override
void onExitComponent() override
objpose::provider::RequestObjectsOutput requestObjects(const objpose::provider::RequestObjectsInput &input, const Ice::Current &) override
std::string getDefaultName() const override
objpose::ProviderInfo getProviderInfo(const Ice::Current &=Ice::emptyCurrent) override
objpose::ObjectPoseStorageInterfacePrx objectPoseTopic
bool isStopped()
Retrieve whether stop() has been called.
static IceUtil::Time GetTime(TimeMode timeMode=TimeMode::VirtualTime)
Get the current time.
float confidence
Confidence in [0, 1] (1 = full, 0 = none).
armarx::ObjectID objectID
The object ID, i.e. dataset, class name and instance name.
std::string providerName
Name of the providing component.
Eigen::Matrix4f objectPose
DateTime timestamp
Source timestamp.
ObjectType objectType
Known or unknown object.
std::string objectPoseFrame
std::optional< PoseManifoldGaussian > objectPoseGaussian
Update updateRequestedObjects()
#define ARMARX_INFO
The normal logging level.
#define ARMARX_WARNING
The logging level for unexpected behaviour, but not a serious problem.
#define ARMARX_VERBOSE
The logging level for verbose information.
bool update(mongocxx::collection &coll, const nlohmann::json &query, const nlohmann::json &update)
std::vector< ProvidedObjectPose > ProvidedObjectPoseSeq
objpose::AABB toIce(const simox::AxisAlignedBoundingBox &aabb)
This file offers overloads of toIce() and fromIce() functions for STL container types.
IceUtil::Handle< class PropertyDefinitionContainer > PropertyDefinitionsPtr
PropertyDefinitions smart pointer type.
void toIce(std::map< IceKeyT, IceValueT > &iceMap, const boost::container::flat_map< CppKeyT, CppValueT > &cppMap)
SimpleRunningTask(Ts...) -> SimpleRunningTask< std::function< void(void)> >