From fe16fd14b697e03d46c5ab18727257b9cf060fad Mon Sep 17 00:00:00 2001
From: armar4-user <armar4-user@kit.edu>
Date: Mon, 20 Mar 2017 12:57:31 +0100
Subject: [PATCH] ForceTorqueObserver: Fixed frames

---
 .../components/units/ForceTorqueObserver.cpp        | 13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)

diff --git a/source/RobotAPI/components/units/ForceTorqueObserver.cpp b/source/RobotAPI/components/units/ForceTorqueObserver.cpp
index 3da920390..452f4c350 100644
--- a/source/RobotAPI/components/units/ForceTorqueObserver.cpp
+++ b/source/RobotAPI/components/units/ForceTorqueObserver.cpp
@@ -305,7 +305,7 @@ void armarx::ForceTorqueObserver::reportSensorValues(const std::string& sensorNo
 {
     ScopedLock lock(dataMutex);
 
-    auto offerForceAndTorqueValue = [ = ](std::string const & sensorNodeName, std::string const & frame, std::string channelName)
+    auto offerForceAndTorqueValue = [ = ](std::string const & sensorNodeName, std::string const & frame, std::string channelName, const FramedDirectionBasePtr& forces, const FramedDirectionBasePtr& torques)
     {
         try
         {
@@ -358,9 +358,9 @@ void armarx::ForceTorqueObserver::reportSensorValues(const std::string& sensorNo
 
     FramedDirectionPtr realTorques = FramedDirectionPtr::dynamicCast(torques);
     realTorques->changeFrame(localRobot, forces->frame);
-    offerForceAndTorqueValue(sensorNodeName, forces->frame, "");
 
     FramedDirectionPtr realForces = FramedDirectionPtr::dynamicCast(forces);
+    offerForceAndTorqueValue(sensorNodeName, forces->frame, "", realForces, realTorques);
 
     auto sensorMappingRange = sensorRobotNodeMapping.equal_range(sensorNodeName);
     for (auto iter = sensorMappingRange.first; iter != sensorMappingRange.second; ++iter)
@@ -368,11 +368,12 @@ void armarx::ForceTorqueObserver::reportSensorValues(const std::string& sensorNo
         auto& sensorName = iter->first;
         auto& robotNodeName = iter->second.first;
         auto& channelName = iter->second.second;
+        FramedDirectionPtr forcesCopy = FramedDirectionPtr::dynamicCast(realForces->clone());
+        FramedDirectionPtr torquesCopy = FramedDirectionPtr::dynamicCast(realTorques->clone());
+        forcesCopy->changeFrame(localRobot, robotNodeName);
+        torquesCopy->changeFrame(localRobot, robotNodeName);
 
-        realTorques->changeFrame(localRobot, robotNodeName);
-        realForces->changeFrame(localRobot, robotNodeName);
-
-        offerForceAndTorqueValue(sensorName, robotNodeName, channelName);
+        offerForceAndTorqueValue(sensorName, robotNodeName, channelName, forcesCopy, torquesCopy);
     }
 }
 
-- 
GitLab