diff --git a/source/RobotAPI/components/ObjectPoseObserver/CMakeLists.txt b/source/RobotAPI/components/ObjectPoseObserver/CMakeLists.txt index d5760158331a6f3dc664f3116a9f571e6830d37d..b1644c6be2adf25870aa73f2bc63849550188771 100644 --- a/source/RobotAPI/components/ObjectPoseObserver/CMakeLists.txt +++ b/source/RobotAPI/components/ObjectPoseObserver/CMakeLists.txt @@ -15,6 +15,7 @@ set(SOURCES ObjectFinder.cpp ice_conversions.cpp + ObjectPose.cpp ) set(HEADERS ObjectPoseObserver.h @@ -22,6 +23,7 @@ set(HEADERS ObjectFinder.h ice_conversions.h + ObjectPose.h ) diff --git a/source/RobotAPI/components/ObjectPoseObserver/ObjectPose.cpp b/source/RobotAPI/components/ObjectPoseObserver/ObjectPose.cpp new file mode 100644 index 0000000000000000000000000000000000000000..f7ca54aae57a8c789cb5b425dd5408308542a391 --- /dev/null +++ b/source/RobotAPI/components/ObjectPoseObserver/ObjectPose.cpp @@ -0,0 +1,117 @@ +#include "ObjectPose.h" + +#include <RobotAPI/libraries/core/Pose.h> + + +namespace armarx::objpose +{ + ObjectPose::ObjectPose() + { + } + + ObjectPose::ObjectPose(const data::ObjectPose& ice) + { + fromIce(ice); + } + + void ObjectPose::fromIce(const data::ObjectPose& ice) + { + providerName = ice.providerName; + objectType = ice.objectType; + objectID = ice.objectID; + + objectPoseRobot = PosePtr::dynamicCast(ice.objectPoseRobot)->toEigen(); + objectPoseGlobal = PosePtr::dynamicCast(ice.objectPoseGlobal)->toEigen(); + objectPoseOriginal = PosePtr::dynamicCast(ice.objectPoseOriginal)->toEigen(); + objectPoseOriginalFrame = ice.objectPoseOriginalFrame; + + robotConfig = ice.robotConfig; + robotPose = PosePtr::dynamicCast(ice.robotPose)->toEigen(); + + confidence = ice.confidence; + timestamp = IceUtil::Time::microSeconds(ice.timestampMicroSeconds); + + localOOBB = ice.localOOBB; + } + + data::ObjectPose ObjectPose::toIce() const + { + data::ObjectPose ice; + toIce(ice); + return ice; + } + + void ObjectPose::toIce(data::ObjectPose& ice) const + { + ice.providerName = providerName; + ice.objectType = objectType; + ice.objectID = objectID; + + ice.objectPoseRobot = new Pose(objectPoseRobot); + ice.objectPoseGlobal = new Pose(objectPoseGlobal); + ice.objectPoseOriginal = new Pose(objectPoseOriginal); + ice.objectPoseOriginalFrame = objectPoseOriginalFrame; + + ice.robotConfig = robotConfig; + ice.robotPose = new Pose(robotPose); + + ice.confidence = confidence; + ice.timestampMicroSeconds = timestamp.toMicroSeconds(); + + ice.localOOBB = localOOBB; + } + + + void fromIce(const data::ObjectPose& ice, ObjectPose& pose) + { + pose.fromIce(ice); + } + ObjectPose fromIce(const data::ObjectPose& ice) + { + return ObjectPose(ice); + } + + void fromIce(const data::ObjectPoseSeq& ice, ObjectPoseSeq& poses) + { + poses.clear(); + poses.reserve(ice.size()); + for (const auto& i : ice) + { + poses.emplace_back(i); + } + } + ObjectPoseSeq fromIce(const data::ObjectPoseSeq& ice) + { + ObjectPoseSeq poses; + fromIce(ice, poses); + return poses; + } + + + void toIce(data::ObjectPose& ice, const ObjectPose& pose) + { + pose.toIce(ice); + } + data::ObjectPose toIce(const ObjectPose& pose) + { + return pose.toIce(); + } + + void toIce(const ObjectPoseSeq& poses, data::ObjectPoseSeq& ice) + { + ice.clear(); + ice.reserve(poses.size()); + for (const auto& p : poses) + { + ice.emplace_back(p.toIce()); + } + } + data::ObjectPoseSeq toIce(const ObjectPoseSeq& poses) + { + data::ObjectPoseSeq ice; + toIce(ice, poses); + return ice; + } + +} + diff --git a/source/RobotAPI/components/ObjectPoseObserver/ObjectPose.h b/source/RobotAPI/components/ObjectPoseObserver/ObjectPose.h new file mode 100644 index 0000000000000000000000000000000000000000..76be353c997825fbd2a15a19fa820cfd8021f74a --- /dev/null +++ b/source/RobotAPI/components/ObjectPoseObserver/ObjectPose.h @@ -0,0 +1,67 @@ +#pragma once + +#include <IceUtil/Time.h> + +#include <Eigen/Core> + +#include <RobotAPI/interface/objectpose/types.h> + + +namespace armarx::objpose +{ + + /** + * @brief An object pose as stored by the ObjectPoseObserver. + */ + struct ObjectPose + { + ObjectPose(); + ObjectPose(const data::ObjectPose& ice); + + void fromIce(const data::ObjectPose& ice); + + data::ObjectPose toIce() const; + void toIce(data::ObjectPose& ice) const; + + + /// Name of the providing component. + std::string providerName; + /// Known or unknown object. + ObjectTypeEnum objectType = AnyObject; + + /// The object ID, i.e. dataset and name. + ObjectID objectID; + + Eigen::Matrix4f objectPoseRobot; + Eigen::Matrix4f objectPoseGlobal; + Eigen::Matrix4f objectPoseOriginal; + std::string objectPoseOriginalFrame; + + std::map<std::string, float> robotConfig; + Eigen::Matrix4f robotPose; + + /// Confidence in [0, 1] (1 = full, 0 = none). + float confidence = 0; + /// Source timestamp. + IceUtil::Time timestamp = IceUtil::Time::microSeconds(-1); + + /// Object bounding box in object's local coordinate frame. + Box localOOBB; + }; + using ObjectPoseSeq = std::vector<ObjectPose>; + + + void fromIce(const data::ObjectPose& ice, ObjectPose& pose); + ObjectPose fromIce(const data::ObjectPose& ice); + + void fromIce(const data::ObjectPoseSeq& ice, ObjectPoseSeq& poses); + ObjectPoseSeq fromIce(const data::ObjectPoseSeq& ice); + + + void toIce(data::ObjectPose& ice, const ObjectPose& pose); + data::ObjectPose toIce(const ObjectPose& pose); + + void toIce(data::ObjectPoseSeq& ice, const ObjectPoseSeq& poses); + data::ObjectPoseSeq toIce(const ObjectPoseSeq& poses); + +} diff --git a/source/RobotAPI/interface/objectpose/types.ice b/source/RobotAPI/interface/objectpose/types.ice index 16f28f3d5a4c74d8f7e62cbeb9452bf5e94c7e83..eaf7adf779b0ac6d51c952f343f08d75bd87d93c 100644 --- a/source/RobotAPI/interface/objectpose/types.ice +++ b/source/RobotAPI/interface/objectpose/types.ice @@ -58,61 +58,63 @@ module armarx }; - /// An object pose provided by an ObjectPoseProvider. - struct ProvidedObjectPose + module data { - /// Name of the providing component. - string providerName; - /// Known or unknown object. - ObjectTypeEnum objectType = AnyObject; - - /// The object ID, i.e. dataset and name. - ObjectID objectID; - - /// Pose in `objectPoseFrame`. - PoseBase objectPose; - string objectPoseFrame; - - /// Confidence in [0, 1] (1 = full, 0 = none). - float confidence = 0; - /// Source timestamp. - long timestampMicroSeconds = -1; - - /// Object bounding box in object's local coordinate frame. - Box localOOBB; - }; - sequence<ProvidedObjectPose> ProvidedObjectPoseSeq; - - - /// An object pose as stored by the ObjectPoseObserver. - struct ObjectPose - { - /// Name of the providing component. - string providerName; - /// Known or unknown object. - ObjectTypeEnum objectType = AnyObject; - - /// The object ID, i.e. dataset and name. - ObjectID objectID; - - PoseBase objectPoseRobot; - PoseBase objectPoseGlobal; - PoseBase objectPoseOriginal; - string objectPoseOriginalFrame; - - StringFloatDictionary robotConfig; - PoseBase robotPose; - - /// Confidence in [0, 1] (1 = full, 0 = none). - float confidence = 0; - /// Source timestamp. - long timestampMicroSeconds = -1; - - /// Object bounding box in object's local coordinate frame. - Box localOOBB; - }; - sequence<ObjectPose> ObjectPoseSeq; - + /// An object pose provided by an ObjectPoseProvider. + struct ProvidedObjectPose + { + /// Name of the providing component. + string providerName; + /// Known or unknown object. + ObjectTypeEnum objectType = AnyObject; + + /// The object ID, i.e. dataset and name. + ObjectID objectID; + + /// Pose in `objectPoseFrame`. + PoseBase objectPose; + string objectPoseFrame; + + /// Confidence in [0, 1] (1 = full, 0 = none). + float confidence = 0; + /// Source timestamp. + long timestampMicroSeconds = -1; + + /// Object bounding box in object's local coordinate frame. + Box localOOBB; + }; + sequence<ProvidedObjectPose> ProvidedObjectPoseSeq; + + + /// An object pose as stored by the ObjectPoseObserver. + struct ObjectPose + { + /// Name of the providing component. + string providerName; + /// Known or unknown object. + ObjectTypeEnum objectType = AnyObject; + + /// The object ID, i.e. dataset and name. + ObjectID objectID; + + PoseBase objectPoseRobot; + PoseBase objectPoseGlobal; + PoseBase objectPoseOriginal; + string objectPoseOriginalFrame; + + StringFloatDictionary robotConfig; + PoseBase robotPose; + + /// Confidence in [0, 1] (1 = full, 0 = none). + float confidence = 0; + /// Source timestamp. + long timestampMicroSeconds = -1; + + /// Object bounding box in object's local coordinate frame. + Box localOOBB; + }; + sequence<ObjectPose> ObjectPoseSeq; + } }; };