KinematicSelfLocalization.cpp
Go to the documentation of this file.
1 /*
2  * This file is part of ArmarX.
3  *
4  * ArmarX is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License version 2 as
6  * published by the Free Software Foundation.
7  *
8  * ArmarX is distributed in the hope that it will be useful, but
9  * WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11  * GNU General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public License
14  * along with this program. If not, see <http://www.gnu.org/licenses/>.
15  *
16  * @package ArmarXSimulation::ArmarXObjects::KinematicSelfLocalization
17  * @author Mirko Waechter ( mirko dot waechter at kit dot edu )
18  * @date 2016
19  * @copyright http://www.gnu.org/licenses/gpl-2.0.txt
20  * GNU General Public License
21  */
22 
24 
25 #include <Eigen/Geometry>
26 
27 #include <SimoxUtility/math/convert/rpy_to_mat3f.h>
28 
30 #include <RobotAPI/interface/core/GeometryBase.h>
31 
34 
35 using namespace armarx;
36 
37 void
39 {
40  usingProxy(getProperty<std::string>("RobotStateComponentName").getValue());
41 
42  usingProxy(getProperty<std::string>("WorkingMemoryName").getValue());
43  usingTopic(getProperty<std::string>("PlatformTopicName").getValue());
44 }
45 
46 void
48 {
49  robotStateComponentPrx = getProxy<RobotStateComponentInterfacePrx>(
50  getProperty<std::string>("RobotStateComponentName").getValue());
52  ARMARX_INFO << "Retrieved robot state proxy...";
53 
54  memoryPrx = getProxy<memoryx::WorkingMemoryInterfacePrx>(
55  getProperty<std::string>("WorkingMemoryName").getValue());
57  ARMARX_INFO << "Retrieved WM proxy...";
58 
59  agentsMemoryPrx = memoryPrx->getAgentInstancesSegment();
61  ARMARX_INFO << "Retrieved WM agent segment ...";
62 
63  Ice::CommunicatorPtr iceCommunicator = getIceManager()->getCommunicator();
64 
65  robotName = getProperty<std::string>("RobotName").getValue();
66  robotPoseZ =
67  getProperty<float>("RobotPoseZ").isSet() ? getProperty<float>("RobotPoseZ").getValue() : 0;
68 
69  std::string agentName = getProperty<std::string>("AgentName").isSet()
70  ? getProperty<std::string>("AgentName").getValue()
71  : robotName;
72 
73 
74  ARMARX_INFO << "Creating robot agent with name " << agentName;
75  robotAgent = new memoryx::AgentInstance(agentName);
76  auto robot = robotStateComponentPrx->getSynchronizedRobot();
77  robotAgent->setSharedRobot(robot);
78  robotAgent->setName(agentName);
79  robotAgent->setStringifiedSharedRobotInterfaceProxy(iceCommunicator->proxyToString(robot));
80  robotAgent->setAgentFilePath(robotStateComponentPrx->getRobotFilename());
81  ARMARX_INFO << "Creating robot agent...done";
82 
83  // Simulating platform movement to initial pose
84  Eigen::Isometry3f global_T_robot_initial = Eigen::Isometry3f::Identity();
85  global_T_robot_initial.translation().x() =
86  getProperty<float>("InitialPlatformPoseX").getValue();
87  global_T_robot_initial.translation().y() =
88  getProperty<float>("InitialPlatformPoseY").getValue();
89  global_T_robot_initial.linear() =
90  simox::math::rpy_to_mat3f(0, 0, getProperty<float>("InitialPlatformPoseAngle").getValue());
91 
92  TransformStamped transformStamped;
93  transformStamped.transform = global_T_robot_initial.matrix();
94  transformStamped.header.agent = agentName;
95  transformStamped.header.frame = GlobalFrame;
96  transformStamped.header.timestampInMicroSeconds = TimeUtil::GetTime().toMicroSeconds();
97 
98  reportGlobalRobotPose(transformStamped);
99 
100  // periodic task setup
101  cycleTime = 30;
102 
103  if (execTask)
104  {
105  execTask->stop();
106  }
107 
108  execTask =
111  cycleTime,
112  false,
113  "KinematicSelfLocalizationCalculation");
114  execTask->start();
115  execTask->setDelayWarningTolerance(100);
116 }
117 
118 void
120 {
121  execTask->stop();
122 }
123 
124 void
126 {
127 }
128 
131 {
134 }
135 
136 void
138 {
139  try
140  {
141  std::unique_lock lock(dataMutex);
142  ARMARX_DEBUG << "Reporting robot agent:" << robotAgent->getName()
143  << ", robotAgentId:" << robotAgentId << ", self:" << this->getName();
144 
145 
146  if (!currentRobotPose)
147  {
148  return;
149  }
150  robotAgent->setPose(currentRobotPose);
151 
152  robotAgentId = agentsMemoryPrx->upsertEntityByName(robotAgent->getName(), robotAgent);
153  robotAgent->setId(robotAgentId);
154  }
155  catch (...)
156  {
157  ARMARX_WARNING << deactivateSpam(10) << "Could not update robot pose in agents segment...\n"
159  robotAgentId.clear();
160  }
161 }
162 
163 void
164 KinematicSelfLocalization::reportGlobalRobotPose(const ::armarx::TransformStamped& transformStamped,
165  const ::Ice::Current&)
166 {
167  std::unique_lock lock(dataMutex);
168 
169  Eigen::Isometry3f global_T_robot(transformStamped.transform);
170  global_T_robot.translation().z() = robotPoseZ; // TODO lecagy. Is this really necessary?
171 
172  currentRobotPose = new FramedPose(global_T_robot.matrix(), armarx::GlobalFrame, "");
173 }
armarx::KinematicSelfLocalization::dataMutex
std::mutex dataMutex
Definition: KinematicSelfLocalization.h:149
armarx::KinematicSelfLocalizationPropertyDefinitions
Definition: KinematicSelfLocalization.h:49
armarx::ManagedIceObject::getIceManager
IceManagerPtr getIceManager() const
Returns the IceManager.
Definition: ManagedIceObject.cpp:366
armarx::VariantType::FramedPose
const VariantTypeId FramedPose
Definition: FramedPose.h:36
armarx::KinematicSelfLocalization::reportGlobalRobotPose
void reportGlobalRobotPose(const ::armarx::TransformStamped &, const ::Ice::Current &=::Ice::emptyCurrent) override
Definition: KinematicSelfLocalization.cpp:164
armarx::GlobalFrame
const std::string GlobalFrame
Definition: FramedPose.h:65
armarx::KinematicSelfLocalization::onInitComponent
void onInitComponent() override
Definition: KinematicSelfLocalization.cpp:38
armarx::KinematicSelfLocalization::robotName
std::string robotName
Definition: KinematicSelfLocalization.h:147
armarx::KinematicSelfLocalization::robotStateComponentPrx
RobotStateComponentInterfacePrx robotStateComponentPrx
Definition: KinematicSelfLocalization.h:140
armarx::KinematicSelfLocalization::robotAgentId
std::string robotAgentId
Definition: KinematicSelfLocalization.h:146
armarx::KinematicSelfLocalization::onDisconnectComponent
void onDisconnectComponent() override
Definition: KinematicSelfLocalization.cpp:119
IceInternal::Handle<::Ice::Communicator >
armarx::GetHandledExceptionString
std::string GetHandledExceptionString()
Definition: Exception.cpp:165
armarx::KinematicSelfLocalization::robotAgent
memoryx::AgentInstancePtr robotAgent
Definition: KinematicSelfLocalization.h:144
GfxTL::Identity
void Identity(MatrixXX< N, N, T > *a)
Definition: MatrixXX.h:570
KinematicSelfLocalization.h
FramedPose.h
ARMARX_DEBUG
#define ARMARX_DEBUG
Definition: Logging.h:184
armarx::KinematicSelfLocalization::cycleTime
int cycleTime
Definition: KinematicSelfLocalization.h:138
MemoryXCoreObjectFactories.h
armarx::KinematicSelfLocalization::onConnectComponent
void onConnectComponent() override
Definition: KinematicSelfLocalization.cpp:47
armarx::KinematicSelfLocalization::onExitComponent
void onExitComponent() override
Definition: KinematicSelfLocalization.cpp:125
armarx::KinematicSelfLocalization::execTask
PeriodicTask< KinematicSelfLocalization >::pointer_type execTask
Definition: KinematicSelfLocalization.h:136
armarx::KinematicSelfLocalization::agentsMemoryPrx
memoryx::AgentInstancesSegmentBasePrx agentsMemoryPrx
Definition: KinematicSelfLocalization.h:143
armarx::TimeUtil::GetTime
static IceUtil::Time GetTime(TimeMode timeMode=TimeMode::VirtualTime)
Get the current time.
Definition: TimeUtil.cpp:42
armarx::ManagedIceObject::usingTopic
void usingTopic(const std::string &name, bool orderedPublishing=false)
Registers a proxy for subscription after initialization.
Definition: ManagedIceObject.cpp:254
armarx::Component::getConfigIdentifier
std::string getConfigIdentifier()
Retrieve config identifier for this component as set in constructor.
Definition: Component.cpp:79
ARMARX_CHECK_EXPRESSION
#define ARMARX_CHECK_EXPRESSION(expression)
This macro evaluates the expression and if it turns out to be false it will throw an ExpressionExcept...
Definition: ExpressionException.h:73
ARMARX_INFO
#define ARMARX_INFO
Definition: Logging.h:181
IceUtil::Handle< class PropertyDefinitionContainer >
armarx::KinematicSelfLocalization::robotPoseZ
float robotPoseZ
Definition: KinematicSelfLocalization.h:151
armarx::KinematicSelfLocalization::reportRobotPose
void reportRobotPose()
Definition: KinematicSelfLocalization.cpp:137
AgentInstance.h
armarx::Logging::deactivateSpam
SpamFilterDataPtr deactivateSpam(float deactivationDurationSec=10.0f, const std::string &identifier="", bool deactivate=true) const
disables the logging for the current line for the given amount of seconds.
Definition: Logging.cpp:99
armarx::ManagedIceObject::getName
std::string getName() const
Retrieve name of object.
Definition: ManagedIceObject.cpp:108
armarx::PeriodicTask
Definition: ArmarXManager.h:70
memoryx::AgentInstance
Definition: AgentInstance.h:45
ARMARX_WARNING
#define ARMARX_WARNING
Definition: Logging.h:193
armarx::PropertyDefinitionsPtr
IceUtil::Handle< class PropertyDefinitionContainer > PropertyDefinitionsPtr
PropertyDefinitions smart pointer type.
Definition: forward_declarations.h:35
armarx::KinematicSelfLocalization::memoryPrx
memoryx::WorkingMemoryInterfacePrx memoryPrx
Definition: KinematicSelfLocalization.h:142
armarx::KinematicSelfLocalization::currentRobotPose
FramedPosePtr currentRobotPose
Definition: KinematicSelfLocalization.h:139
armarx::ManagedIceObject::usingProxy
bool usingProxy(const std::string &name, const std::string &endpoints="")
Registers a proxy for retrieval after initialization and adds it to the dependency list.
Definition: ManagedIceObject.cpp:154
armarx
This file offers overloads of toIce() and fromIce() functions for STL container types.
Definition: ArmarXTimeserver.cpp:27
armarx::KinematicSelfLocalization::createPropertyDefinitions
armarx::PropertyDefinitionsPtr createPropertyDefinitions() override
Definition: KinematicSelfLocalization.cpp:130