RobotPoseUnitDynamicSimulation.cpp
Go to the documentation of this file.
1 /*
2  * This file is part of ArmarX.
3  *
4  * Copyright (C) 2013-2016, High Performance Humanoid Technologies (H2T), Karlsruhe Institute of Technology (KIT), all rights reserved.
5  *
6  * ArmarX is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 as
8  * published by the Free Software Foundation.
9  *
10  * ArmarX is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program. If not, see <http://www.gnu.org/licenses/>.
17  *
18  * @package ArmarXSimulation::units
19  * @author Nikolaus Vahrenkamp
20  * @date 2016
21  * @copyright http://www.gnu.org/licenses/gpl-2.0.txt
22  * GNU General Public License
23  */
24 
25 
27 
28 #include <cmath>
29 
30 #include <Eigen/Geometry>
31 
32 #include <VirtualRobot/MathTools.h>
33 
35 
36 using namespace armarx;
37 
38 void
40 {
41  //linearVelocityMax = getProperty<float>("LinearVelocityMax").getValue();
42  //linearVelocityMin = getProperty<float>("LinearVelocityMin").getValue();
43  //linearAccelerationMax = getProperty<float>("LinearAccelerationMax").getValue();
44  //angularVelocityMax = getProperty<float>("AngularVelocityMax").getValue();
45  //angularAccelerationMax = getProperty<float>("AngularAccelerationMax").getValue();
46 
47  robotName = getProperty<std::string>("RobotName").getValue();
48  //robotRootNodeName = getProperty<std::string>("RobotRootNodeName").getValue();
49 
50  simulatorPrxName = getProperty<std::string>("SimulatorProxyName").getValue();
51 
52  positionalAccuracy = 0.02f; //in m
53  orientationalAccuracy = 0.1f; //in rad
54 
55  intervalMs = getProperty<int>("IntervalMs").getValue();
56  ARMARX_VERBOSE << "Starting RobotPose unit dynamic simulation with " << intervalMs
57  << " ms interval";
59  this,
61  intervalMs,
62  false,
63  "RobotPoseUnitSimulation");
64  simulationTask->setDelayWarningTolerance(100);
65 
66  if (!robotName.empty())
67  {
68  std::string robotTopicName = "Simulator_Robot_";
69  robotTopicName += robotName;
70  ARMARX_INFO << "Simulator Robot topic: " << robotTopicName;
71  usingTopic(robotTopicName);
72  }
73  else
74  {
75  ARMARX_WARNING << "No robot loaded...";
76  }
77 
79 
81  m.setIdentity();
82  currentPose = Pose(m);
83  targetPose = Pose(m);
84 }
85 
86 void
88 {
89  ARMARX_INFO << "Stopping RobotPose unit";
90  std::unique_lock lock(currentPoseMutex);
91  simulationTask->stop();
92  simulatorPrx = nullptr;
93 }
94 
95 void
97 {
98  RobotPoseControlMode = eUnknown;
99 
100  ARMARX_INFO << "Using simulator proxy: " << simulatorPrxName;
101  simulatorPrx = getProxy<SimulatorInterfacePrx>(simulatorPrxName);
102  PoseBasePtr p = simulatorPrx->getRobotPose(robotName);
103  setCurrentPose(p);
105 
106  simulationTask->start();
107 }
108 
109 void
111 {
112  simulationTask->stop();
113 }
114 
115 void
117 {
119  PosePtr p(new Pose(m));
120 
121  moveRelative(p, 500, 500, current);
122 }
123 
124 void
126 {
127  // todo: implement velocity control....
128 
129  {
130  std::unique_lock lock(currentPoseMutex);
131 
132  if (!simulatorPrx)
133  {
134  return;
135  }
136  }
137 }
138 
139 void
140 RobotPoseUnitDynamicSimulation::moveTo(const PoseBasePtr& targetPose,
141  Ice::Float positionalAccuracy,
142  Ice::Float orientationalAccuracy,
143  const Ice::Current& c)
144 {
145  std::unique_lock lock(currentPoseMutex);
146  RobotPoseControlMode = ePositionControl;
147  ARMARX_DEBUG << "RobotPose move to" << flush;
148  this->targetPose = *(PosePtr::dynamicCast(targetPose));
149  this->positionalAccuracy = positionalAccuracy * .001f;
150  this->orientationalAccuracy = orientationalAccuracy;
151  listenerPrx->begin_reportNewTargetPose(targetPose);
152  ARMARX_LOG << deactivateSpam(5) << "New Target: " << targetPose->position->x << " "
153  << targetPose->position->y << " " << targetPose->position->z;
154  if (simulatorPrx)
155  {
156  //simulatorPrx->begin_setRobotPose(robotName, targetPose);
157  simulatorPrx->setRobotPose(robotName, targetPose);
158  }
159 }
160 
161 Eigen::Vector3f
163 {
164  Eigen::Quaternionf q(QuaternionPtr::dynamicCast(pose->orientation)->toEigen());
165  Eigen::Matrix4f m = VirtualRobot::MathTools::quat2eigen4f(q.x(), q.y(), q.z(), q.w());
166  Eigen::Vector3f rpy;
167  VirtualRobot::MathTools::eigen4f2rpy(m, rpy);
168  return rpy;
169 }
170 
171 void
172 RobotPoseUnitDynamicSimulation::move(const PoseBasePtr& targetVelocity, const Ice::Current& c)
173 {
174  std::unique_lock lock(currentPoseMutex);
175  ARMARX_INFO << deactivateSpam(1) << "NYI";
176 }
177 
178 void
179 RobotPoseUnitDynamicSimulation::moveRelative(const PoseBasePtr& relativeTarget,
180  float positionalAccuracy,
181  float orientationalAccuracy,
182  const Ice::Current& c)
183 {
184  PosePtr p;
185  {
186  std::unique_lock lock(currentPoseMutex);
187  RobotPoseControlMode = ePositionControl;
188  Eigen::Matrix4f pose;
190  Eigen::Matrix4f rel = PosePtr::dynamicCast(relativeTarget)->toEigen();
191  pose = cur * rel;
192  p = PosePtr(new Pose(pose));
193  ARMARX_DEBUG << "RobotPose move relative" << flush;
194  }
196 }
197 
198 void
200  float angularVelocity,
201  const Ice::Current& c)
202 {
203  //linearVelocityMax = linearVelocity;
204  //angularVelocityMax = angularVelocity;
205 }
206 
207 void
209 {
210  ARMARX_DEBUG << "Update new RobotPose pose" << flush;
211 
212  if (!newPose)
213  {
214  return;
215  }
216 
217  currentPose = *PosePtr::dynamicCast(newPose);
218 }
219 
220 void
221 RobotPoseUnitDynamicSimulation::reportState(SimulatedRobotState const& state, const Ice::Current&)
222 {
223  setCurrentPose(state.pose);
224 }
225 
226 void
228 {
229  std::unique_lock lock(currentPoseMutex);
230  updateCurrentPose(newPose);
231  try
232  {
233  PosePtr p(new Pose(currentPose));
234  listenerPrx->begin_reportRobotPose(p);
235  }
236  catch (...)
237  {
238  }
239 }
240 
243 {
244  return PropertyDefinitionsPtr(
246 }
armarx::RobotPoseUnitDynamicSimulation::setCurrentPose
void setCurrentPose(const PoseBasePtr &newPose)
Definition: RobotPoseUnitDynamicSimulation.cpp:227
armarx::RobotPoseUnitDynamicSimulation::currentPose
Pose currentPose
Definition: RobotPoseUnitDynamicSimulation.h:140
ARMARX_VERBOSE
#define ARMARX_VERBOSE
Definition: Logging.h:187
armarx::VariantType::Float
const VariantTypeId Float
Definition: Variant.h:919
armarx::RobotPoseUnitDynamicSimulation::getRPY
Eigen::Vector3f getRPY(PoseBasePtr pose)
Definition: RobotPoseUnitDynamicSimulation.cpp:162
armarx::navigation::core::Pose
Eigen::Isometry3f Pose
Definition: basic_types.h:31
armarx::RobotPoseUnitDynamicSimulation::moveRelative
void moveRelative(const PoseBasePtr &relativeTarget, Ice::Float positionalAccuracy, Ice::Float orientationalAccuracy, const Ice::Current &c=Ice::emptyCurrent) override
Definition: RobotPoseUnitDynamicSimulation.cpp:179
armarx::PosePtr
IceInternal::Handle< Pose > PosePtr
Definition: Pose.h:306
GfxTL::Matrix4f
MatrixXX< 4, 4, float > Matrix4f
Definition: MatrixXX.h:650
armarx::RobotPoseUnitDynamicSimulationPropertyDefinitions
Moves the robot around. Currently only position control is implemented.
Definition: RobotPoseUnitDynamicSimulation.h:47
armarx::RobotPoseUnitDynamicSimulation::onStartRobotPoseUnit
void onStartRobotPoseUnit() override
Definition: RobotPoseUnitDynamicSimulation.cpp:96
c
constexpr T c
Definition: UnscentedKalmanFilterTest.cpp:46
armarx::RobotPoseUnitDynamicSimulation::setMaxVelocities
void setMaxVelocities(Ice::Float positionalVelocity, Ice::Float orientationalVelocity, const Ice::Current &c=Ice::emptyCurrent) override
Definition: RobotPoseUnitDynamicSimulation.cpp:199
armarx::RobotPoseUnitDynamicSimulation::simulatorPrxName
std::string simulatorPrxName
Definition: RobotPoseUnitDynamicSimulation.h:145
armarx::RobotPoseUnit::listenerPrx
RobotPoseUnitListenerPrx listenerPrx
RobotPoseUnitListener proxy for publishing state updates.
Definition: RobotPoseUnit.h:132
armarx::RobotPoseUnitDynamicSimulation::robotName
std::string robotName
Definition: RobotPoseUnitDynamicSimulation.h:146
armarx::RobotPoseUnitDynamicSimulation::simulationTask
PeriodicTask< RobotPoseUnitDynamicSimulation >::pointer_type simulationTask
Definition: RobotPoseUnitDynamicSimulation.h:151
IceInternal::Handle< Pose >
GfxTL::Identity
void Identity(MatrixXX< N, N, T > *a)
Definition: MatrixXX.h:570
armarx::RobotPoseUnitDynamicSimulation::simulationFunction
void simulationFunction()
Definition: RobotPoseUnitDynamicSimulation.cpp:125
armarx::RobotPoseUnitDynamicSimulation::RobotPoseControlMode
ControlMode RobotPoseControlMode
Definition: RobotPoseUnitDynamicSimulation.h:147
armarx::RobotPoseUnitDynamicSimulation::orientationalAccuracy
::Ice::Float orientationalAccuracy
Definition: RobotPoseUnitDynamicSimulation.h:143
armarx::flush
const LogSender::manipulator flush
Definition: LogSender.h:251
ARMARX_DEBUG
#define ARMARX_DEBUG
Definition: Logging.h:184
armarx::RobotPoseUnitDynamicSimulation::targetPose
Pose targetPose
Definition: RobotPoseUnitDynamicSimulation.h:141
armarx::Pose::toEigen
virtual Eigen::Matrix4f toEigen() const
Definition: Pose.cpp:334
Synchronization.h
armarx::RobotPoseUnitDynamicSimulation::createPropertyDefinitions
PropertyDefinitionsPtr createPropertyDefinitions() override
Definition: RobotPoseUnitDynamicSimulation.cpp:242
q
#define q
ARMARX_LOG
#define ARMARX_LOG
Definition: Logging.h:165
armarx::RobotPoseUnitDynamicSimulation::updateCurrentPose
void updateCurrentPose(const PoseBasePtr &newPose)
Definition: RobotPoseUnitDynamicSimulation.cpp:208
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::RobotPoseUnitDynamicSimulation::onExitRobotPoseUnit
void onExitRobotPoseUnit() override
Definition: RobotPoseUnitDynamicSimulation.cpp:110
armarx::RobotPoseUnitDynamicSimulation::onStopRobotPoseUnit
void onStopRobotPoseUnit() override
Definition: RobotPoseUnitDynamicSimulation.cpp:87
ARMARX_INFO
#define ARMARX_INFO
Definition: Logging.h:181
armarx::RobotPoseUnitDynamicSimulation::currentPoseMutex
std::mutex currentPoseMutex
Definition: RobotPoseUnitDynamicSimulation.h:135
RobotPoseUnitDynamicSimulation.h
armarx::Quaternion< float, 0 >
IceUtil::Handle< class PropertyDefinitionContainer >
armarx::RobotPoseUnitDynamicSimulation::onInitRobotPoseUnit
void onInitRobotPoseUnit() override
Definition: RobotPoseUnitDynamicSimulation.cpp:39
armarx::RobotPoseUnitDynamicSimulation::move
void move(const PoseBasePtr &targetVelocity, const Ice::Current &c=Ice::emptyCurrent) override
Definition: RobotPoseUnitDynamicSimulation.cpp:172
armarx::RobotPoseUnitDynamicSimulation::simulatorPrx
SimulatorInterfacePrx simulatorPrx
Definition: RobotPoseUnitDynamicSimulation.h:149
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::PeriodicTask
Definition: ArmarXManager.h:70
armarx::RobotPoseUnitDynamicSimulation::intervalMs
int intervalMs
Definition: RobotPoseUnitDynamicSimulation.h:137
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::RobotPoseUnitDynamicSimulation::positionalAccuracy
::Ice::Float positionalAccuracy
Definition: RobotPoseUnitDynamicSimulation.h:142
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::RobotPoseUnitDynamicSimulation::reportState
void reportState(SimulatedRobotState const &state, const Ice::Current &) override
Definition: RobotPoseUnitDynamicSimulation.cpp:221
armarx::RobotPoseUnitDynamicSimulation::stopMovement
void stopMovement(const Ice::Current &c=Ice::emptyCurrent) override
Definition: RobotPoseUnitDynamicSimulation.cpp:116
armarx::RobotPoseUnitDynamicSimulation::moveTo
void moveTo(const PoseBasePtr &targetPose, Ice::Float positionalAccuracy, Ice::Float orientationalAccuracy, const Ice::Current &c=Ice::emptyCurrent) override
Definition: RobotPoseUnitDynamicSimulation.cpp:140