diff --git a/source/ArmarXSimulation/components/KinematicSelfLocalization/KinematicSelfLocalization.cpp b/source/ArmarXSimulation/components/KinematicSelfLocalization/KinematicSelfLocalization.cpp index 9182cef017fff66ce3acdc314df17af8ea6ee937..5e127faff4f9dd543385a2afcb2f3ce812598071 100644 --- a/source/ArmarXSimulation/components/KinematicSelfLocalization/KinematicSelfLocalization.cpp +++ b/source/ArmarXSimulation/components/KinematicSelfLocalization/KinematicSelfLocalization.cpp @@ -21,6 +21,10 @@ */ #include "KinematicSelfLocalization.h" +#include <Eigen/Geometry> +#include <SimoxUtility/math/convert/rpy_to_mat3f.h> +#include "RobotAPI/libraries/core/FramedPose.h" +#include <RobotAPI/interface/core/GeometryBase.h> #include <MemoryX/libraries/memorytypes/entity/AgentInstance.h> #include <MemoryX/core/MemoryXCoreObjectFactories.h> @@ -67,12 +71,18 @@ void KinematicSelfLocalization::onConnectComponent() ARMARX_INFO << "Creating robot agent...done"; // Simulating platform movement to initial pose - PlatformPose pose; - pose.timestampInMicroSeconds = TimeUtil::GetTime().toMicroSeconds(); - pose.x = getProperty<float>("InitialPlatformPoseX").getValue(); - pose.y = getProperty<float>("InitialPlatformPoseY").getValue(); - pose.rotationAroundZ = getProperty<float>("InitialPlatformPoseAngle").getValue(); - reportPlatformPose(pose); + Eigen::Isometry3f global_T_robot_initial = Eigen::Isometry3f::Identity(); + global_T_robot_initial.translation().x() = getProperty<float>("InitialPlatformPoseX").getValue(); + global_T_robot_initial.translation().y() = getProperty<float>("InitialPlatformPoseY").getValue(); + global_T_robot_initial.linear() = simox::math::rpy_to_mat3f(0, 0, getProperty<float>("InitialPlatformPoseAngle").getValue()); + + TransformStamped transformStamped; + transformStamped.transform = global_T_robot_initial.matrix(); + transformStamped.header.agent = agentName; + transformStamped.header.frame = GlobalFrame; + transformStamped.header.timestampInMicroSeconds = TimeUtil::GetTime().toMicroSeconds(); + + reportGlobalRobotPose(transformStamped); // periodic task setup cycleTime = 30; @@ -129,29 +139,12 @@ void KinematicSelfLocalization::reportRobotPose() } } -void armarx::KinematicSelfLocalization::reportPlatformPose(PlatformPose const& currentPose, const Ice::Current&) +void KinematicSelfLocalization::reportGlobalRobotPose(const ::armarx::TransformStamped& transformStamped, const ::Ice::Current&) { std::unique_lock lock(dataMutex); - Eigen::Matrix3f ori; - ori.setIdentity(); - ori = Eigen::AngleAxisf(currentPose.rotationAroundZ, Eigen::Vector3f::UnitZ()); - Eigen::Vector3f pos; - pos[0] = currentPose.x; - pos[1] = currentPose.y; - pos[2] = robotPoseZ; - - currentRobotPose = new FramedPose(ori, pos, armarx::GlobalFrame, ""); -} - -void armarx::KinematicSelfLocalization::reportNewTargetPose(Ice::Float, Ice::Float, Ice::Float, const Ice::Current&) -{ -} -void armarx::KinematicSelfLocalization::reportPlatformVelocity(Ice::Float, Ice::Float, Ice::Float, const Ice::Current&) -{ -} + Eigen::Isometry3f global_T_robot(transformStamped.transform); + global_T_robot.translation().z() = robotPoseZ; // TODO lecagy. Is this really necessary? - -void armarx::KinematicSelfLocalization::reportPlatformOdometryPose(Ice::Float, Ice::Float, Ice::Float, const Ice::Current&) -{ + currentRobotPose = new FramedPose(global_T_robot.matrix(), armarx::GlobalFrame, ""); } diff --git a/source/ArmarXSimulation/components/KinematicSelfLocalization/KinematicSelfLocalization.h b/source/ArmarXSimulation/components/KinematicSelfLocalization/KinematicSelfLocalization.h index 1628cf50bb658ca47604953f47170496a30c5161..c63525e8a6a6b083fd820583b5db4d9aa4279e01 100644 --- a/source/ArmarXSimulation/components/KinematicSelfLocalization/KinematicSelfLocalization.h +++ b/source/ArmarXSimulation/components/KinematicSelfLocalization/KinematicSelfLocalization.h @@ -24,6 +24,7 @@ #include <ArmarXCore/core/Component.h> #include <ArmarXCore/core/services/tasks/PeriodicTask.h> +#include <RobotAPI/interface/core/RobotLocalization.h> #include <RobotAPI/interface/core/RobotState.h> // MemoryX @@ -76,7 +77,7 @@ namespace armarx */ class KinematicSelfLocalization : virtual public armarx::Component, - public PlatformUnitListener + public GlobalRobotPoseLocalizationListener { public: /** @@ -134,11 +135,6 @@ namespace armarx float robotPoseZ; public: - // PlatformUnitListener interface - void reportPlatformPose(PlatformPose const& currentPose, const Ice::Current& = Ice::emptyCurrent) override; - void reportNewTargetPose(Ice::Float, Ice::Float, Ice::Float, const Ice::Current& = Ice::emptyCurrent) override; - void reportPlatformVelocity(Ice::Float, Ice::Float, Ice::Float, const Ice::Current& = Ice::emptyCurrent) override; - void reportPlatformOdometryPose(Ice::Float, Ice::Float, Ice::Float, const Ice::Current&) override; + void reportGlobalRobotPose(const ::armarx::TransformStamped&, const ::Ice::Current& = ::Ice::emptyCurrent) override; }; } -