From 58ddcc332430ae7e9a9207dfe05ab61b3099f392 Mon Sep 17 00:00:00 2001 From: Fabian Reister <fabian.reister@kit.edu> Date: Mon, 10 May 2021 15:08:13 +0200 Subject: [PATCH] odometry streaming now up and running --- .../RobotStateMemory/RobotStateMemory.cpp | 46 +++++++++++++++++++ .../server/localization/Segment.cpp | 31 ++++++++++++- .../server/localization/Segment.h | 4 ++ 3 files changed, 80 insertions(+), 1 deletion(-) diff --git a/source/RobotAPI/components/armem/server/RobotStateMemory/RobotStateMemory.cpp b/source/RobotAPI/components/armem/server/RobotStateMemory/RobotStateMemory.cpp index 45855e314..12efa6541 100644 --- a/source/RobotAPI/components/armem/server/RobotStateMemory/RobotStateMemory.cpp +++ b/source/RobotAPI/components/armem/server/RobotStateMemory/RobotStateMemory.cpp @@ -23,6 +23,8 @@ #include "RobotStateMemory.h" // STD +#include <Eigen/src/Geometry/Transform.h> +#include <SimoxUtility/math/convert/rpy_to_mat3f.h> #include <algorithm> #include <iostream> #include <fstream> @@ -45,6 +47,10 @@ #include <RobotAPI/libraries/armem_robot_state/server/common/Visu.h> +#include <RobotAPI/libraries/armem_robot_state/aron/Transform.aron.generated.h> + +#include <RobotAPI/libraries/core/FramedPose.h> + namespace armarx::armem::server::robot_state { RobotStateMemory::RobotStateMemory() @@ -284,6 +290,9 @@ namespace armarx::armem::server::robot_state // send batch to memory armem::data::Commit c; + + armem::data::Commit odometryCommit; + for (unsigned int i = 0; i < robotUnitMemoryBatchSize; ++i) { std::lock_guard g{robotUnitDataMutex}; @@ -303,6 +312,43 @@ namespace armarx::armem::server::robot_state update.timeCreatedMicroSeconds = timeUSec; update.instancesData = {aron->toAronDictPtr()}; } + + // odometry pose -> localization segment + auto it = convertedAndGroupedData.groups.find("sens.Platform"); + if (it != convertedAndGroupedData.groups.end()) + { + ARMARX_INFO << " found odometry data."; + + const RobotUnitData::RobotUnitDataGroup& timestep = it->second; + const float relPosX = aron::datanavigator::FloatNavigator::DynamicCast(timestep.data->getElement("sens.Platform.relativePositionX"))->getValue(); + const float relPosY = aron::datanavigator::FloatNavigator::DynamicCast(timestep.data->getElement("sens.Platform.relativePositionY"))->getValue(); + const float relOrientation = aron::datanavigator::FloatNavigator::DynamicCast(timestep.data->getElement("sens.Platform.relativePositionRotation"))->getValue(); + + Eigen::Affine3f odometryPose = Eigen::Affine3f::Identity(); + odometryPose.translation() << relPosX, relPosY, 0; // TODO set height + odometryPose.linear() = simox::math::rpy_to_mat3f(0.F, 0.F, relOrientation); + + const ::armarx::armem::robot_state::Transform transform + { + .header = + { + .parentFrame = OdometryFrame, + .frame = "root", // TODO: robot root node + .agent = robotUnitProviderID.providerSegmentName, + .timestamp = it->second.timestamp + }, + .transform = odometryPose + }; + + localizationSegment.storeTransform(transform); + + } + else + { + ARMARX_WARNING << "no odometry data!"; + } + + robotUnitDataQueue.pop(); } diff --git a/source/RobotAPI/libraries/armem_robot_state/server/localization/Segment.cpp b/source/RobotAPI/libraries/armem_robot_state/server/localization/Segment.cpp index 37f543b57..d245d2c87 100644 --- a/source/RobotAPI/libraries/armem_robot_state/server/localization/Segment.cpp +++ b/source/RobotAPI/libraries/armem_robot_state/server/localization/Segment.cpp @@ -1,6 +1,8 @@ #include "Segment.h" +#include <IceUtil/Time.h> #include <RobotAPI/libraries/armem_robot_state/aron/Transform.aron.generated.h> +#include <iterator> #include <sstream> #include <ArmarXCore/core/time/TimeUtil.h> @@ -17,8 +19,10 @@ #include <RobotAPI/libraries/armem/server/MemoryToIceAdapter.h> #include <RobotAPI/libraries/armem_robot/aron/Robot.aron.generated.h> -#include <RobotAPI/libraries/armem_robot/aron_conversions.h> +#include <RobotAPI/libraries/armem_robot_state/aron_conversions.h> +#include <RobotAPI/libraries/armem/core/aron_conversions.h> +#include <RobotAPI/libraries/aron/common/aron_conversions.h> namespace armarx::armem::server::robot_state::localization { @@ -46,6 +50,8 @@ namespace armarx::armem::server::robot_state::localization coreSegment = &iceMemory.workingMemory->addCoreSegment(p.coreSegment, arondto::Transform::toInitialAronType()); coreSegment->setMaxHistorySize(p.maxHistorySize); + + } void Segment::connect(viz::Client arviz) @@ -62,7 +68,30 @@ namespace armarx::armem::server::robot_state::localization return robotGlobalPoses; } + bool Segment::storeTransform(const armarx::armem::robot_state::Transform& transform) + { + + const auto timestamp = IceUtil::Time::microSeconds(transform.header.timestamp); + const MemoryID providerID = coreSegment->id().withProviderSegmentName(transform.header.agent); + if (not coreSegment->hasProviderSegment(providerID.providerSegmentName)) + { + coreSegment->addProviderSegment(providerID.providerSegmentName); + } + + Commit commit; + + EntityUpdate& update = commit.updates.emplace_back(); + update.entityID = providerID.withEntityName(transform.header.parentFrame + "," + transform.header.frame); + update.timeArrived = update.timeCreated = update.timeSent = timestamp; + + arondto::Transform aronTransform; + toAron(aronTransform, transform); + update.instancesData = {aronTransform.toAron()}; + + const armem::CommitResult result = iceMemory.commit(commit); + return result.allSuccess(); + } // std::unordered_map<armem::MemoryID, ::armarx::armem::articulated_object::ArticulatedObjectDescription> Segment::getKnownObjectClasses() const // { diff --git a/source/RobotAPI/libraries/armem_robot_state/server/localization/Segment.h b/source/RobotAPI/libraries/armem_robot_state/server/localization/Segment.h index 465ba2d8b..28730c956 100644 --- a/source/RobotAPI/libraries/armem_robot_state/server/localization/Segment.h +++ b/source/RobotAPI/libraries/armem_robot_state/server/localization/Segment.h @@ -36,6 +36,8 @@ #include "RobotAPI/libraries/armem/core/MemoryID.h" #include "RobotAPI/libraries/armem_objects/types.h" +#include <RobotAPI/libraries/armem_robot_state/types.h> + namespace armarx::armem { namespace server @@ -70,6 +72,8 @@ namespace armarx::armem::server::robot_state::localization std::unordered_map<std::string, Eigen::Affine3f> getRobotGlobalPoses() const; + bool storeTransform(const armarx::armem::robot_state::Transform& transform); + private: server::MemoryToIceAdapter& iceMemory; -- GitLab