LinkedPose.cpp
Go to the documentation of this file.
1/*
2 * This file is part of ArmarX.
3 *
4 * Copyright (C) 2011-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
19 * @author
20 * @date
21 * @copyright http://www.gnu.org/licenses/gpl-2.0.txt
22 * GNU General Public License
23 */
24#include "LinkedPose.h"
25
26#include <Eigen/Core>
27#include <Eigen/Geometry>
28
29#include <Ice/ObjectAdapter.h>
30
31#include <VirtualRobot/LinkedCoordinate.h>
32#include <VirtualRobot/VirtualRobot.h>
33
36
38
39namespace armarx
40{
41
43 {
44 this->referenceRobot = nullptr;
45 }
46
48 IceUtil::Shared(other),
49 armarx::Serializable(other),
50 armarx::VariantDataClass(other),
51 PoseBase(other),
52 FramedPoseBase(other),
53 LinkedPoseBase(other),
54 Pose(other),
55 FramedPose(other)
56 {
57 if (referenceRobot)
58 {
59 //ARMARX_WARNING_S << "Calling referenceRobot->ref() in cctor of LinkedPose";
60 referenceRobot->ref();
61 }
62 }
63
64 LinkedPose::LinkedPose(const FramedPose& other, const SharedRobotInterfacePrx& referenceRobot) :
65 IceUtil::Shared(other),
66 PoseBase(other),
67 FramedPoseBase(other),
68 Pose(other),
69 FramedPose(other)
70 {
71 ARMARX_CHECK_EXPRESSION(referenceRobot) << "The robot proxy must not be zero";
72 this->referenceRobot = referenceRobot;
73
74 if (referenceRobot)
75 {
76 //ARMARX_WARNING_S << "Calling referenceRobot->ref() in cctor of LinkedPose";
77 referenceRobot->ref();
78 }
79 }
80
81 LinkedPose::LinkedPose(const Eigen::Matrix3f& m,
82 const Eigen::Vector3f& v,
83 const std::string& s,
84 const SharedRobotInterfacePrx& referenceRobot) :
85 Pose(m, v), FramedPose(m, v, s, referenceRobot->getName())
86 {
87 ARMARX_CHECK_EXPRESSION(referenceRobot) << "The robot proxy must not be zero";
88 referenceRobot->ref();
89 this->referenceRobot = referenceRobot;
90 }
91
92 LinkedPose::LinkedPose(const Eigen::Matrix4f& m,
93 const std::string& s,
94 const SharedRobotInterfacePrx& referenceRobot) :
95 Pose(m), FramedPose(m, s, referenceRobot->getName())
96 {
97 ARMARX_CHECK_EXPRESSION(referenceRobot) << "The robot proxy must not be zero";
98 referenceRobot->ref();
99 this->referenceRobot = referenceRobot;
100 }
101
103 {
104 try
105 {
106 if (referenceRobot)
107 {
108 referenceRobot->unref();
109 }
110 }
111 catch (...)
112 {
114 }
115 }
116
117 VirtualRobot::LinkedCoordinate
119 {
120 VirtualRobot::RobotPtr sharedRobot(new RemoteRobot(referenceRobot));
121 VirtualRobot::LinkedCoordinate c(sharedRobot);
122 std::string frame = this->getFrame();
123
124 Eigen::Matrix4f pose = Eigen::Matrix4f::Identity();
125
126 pose.block<3, 3>(0, 0) = QuaternionPtr::dynamicCast(orientation)->toEigen();
127 pose.block<3, 1>(0, 3) = Vector3Ptr::dynamicCast(position)->toEigen();
128
129 c.set(frame, pose);
130
131 return c;
132 }
133
134 Ice::ObjectPtr
136 {
137 return this->clone();
138 }
139
140 VariantDataClassPtr
141 LinkedPose::clone(const Ice::Current& c) const
142 {
143 return new LinkedPose(*this);
144 }
145
146 std::string
147 LinkedPose::output(const Ice::Current& c) const
148 {
149 std::stringstream s;
150 s << FramedPose::output() << std::endl
151 << "reference robot: " << referenceRobot->ice_toString();
152 return s.str();
153 }
154
156 LinkedPose::getType(const Ice::Current& c) const
157 {
159 }
160
161 bool
162 LinkedPose::validate(const Ice::Current& c)
163 {
164 return true;
165 }
166
167 void
168 LinkedPose::changeFrame(const std::string& newFrame, const Ice::Current& c)
169 {
170 FramedPose::changeFrame(referenceRobot, newFrame);
171 }
172
173 void
175 {
176 FramedPose::changeToGlobal(referenceRobot);
177 }
178
181 {
182 FramedPosePtr fp = this->FramedPose::toGlobal(referenceRobot);
183 LinkedPosePtr newPose = new LinkedPose(fp->toEigen(), fp->frame, referenceRobot);
184 return newPose;
185 }
186
187 void
188 LinkedPose::serialize(const ObjectSerializerBasePtr& serializer, const ::Ice::Current& c) const
189 {
190 AbstractObjectSerializerPtr obj = AbstractObjectSerializerPtr::dynamicCast(serializer);
191
192 Pose::serialize(obj, c);
193 obj->setString("referenceRobot", "");
194 }
195
196 void
197 LinkedPose::deserialize(const ObjectSerializerBasePtr& serializer, const ::Ice::Current& c)
198 {
199 AbstractObjectSerializerPtr obj = AbstractObjectSerializerPtr::dynamicCast(serializer);
200
202
203 std::string remoteRobotId = obj->getString("referenceRobot");
204 referenceRobot = SharedRobotInterfacePrx::uncheckedCast(
205 c.adapter->getCommunicator()->stringToProxy(remoteRobotId));
206
207 if (!referenceRobot)
208 {
209 ARMARX_ERROR_S << "ReferenceRobot for LinkedPose not registered: " << remoteRobotId
210 << flush;
211 }
212 }
213
214 void
216 {
217 if (referenceRobot)
218 {
219 //ARMARX_WARNING_S << "Calling referenceRobot->ref() in __read(IceInternal::BasicStream *__is, bool __rid) of LinkedPose";
220 referenceRobot->ref();
221 }
222
224 }
225
227
229 IceUtil::Shared(source),
230 armarx::Serializable(source),
231 Vector3Base(source),
232 FramedDirectionBase(source),
233 LinkedDirectionBase(source),
234 Vector3(source),
235 FramedDirection(source)
236 {
237 referenceRobot = source.referenceRobot;
238
239 if (referenceRobot)
240 {
241 //ARMARX_WARNING_S << "Calling referenceRobot->ref() in cctor of LinkedPose";
242 referenceRobot->ref();
243 }
244 }
245
246 LinkedDirection::LinkedDirection(const Eigen::Vector3f& v,
247 const std::string& frame,
248 const SharedRobotInterfacePrx& referenceRobot) :
249 FramedDirection(v, frame, referenceRobot->getName())
250 {
251 referenceRobot->ref();
252 this->referenceRobot = referenceRobot;
253 }
254
256 {
257 try
258 {
259 if (referenceRobot)
260 {
261 referenceRobot->unref();
262 }
263 }
264 catch (...)
265 {
267 }
268 }
269
270 void
271 LinkedDirection::changeFrame(const std::string& newFrame, const Ice::Current& c)
272 {
273 if (newFrame == frame)
274 {
275 return;
276 }
277
278 VirtualRobot::RobotPtr sharedRobot(new RemoteRobot(referenceRobot));
279
280 FramedDirectionPtr frVec = ChangeFrame(sharedRobot, *this, newFrame);
281 x = frVec->x;
282 y = frVec->y;
283 z = frVec->z;
284 frame = frVec->frame;
285 }
286
287 void
288 LinkedDirection::serialize(const ObjectSerializerBasePtr& serializer, const Ice::Current&) const
289 {
290 throw LocalException("LinkedDirection cannot be serialized! Serialize FramedDirection");
291 }
292
293 void
294 LinkedDirection::deserialize(const ObjectSerializerBasePtr& serializer, const Ice::Current&)
295 {
296 throw LocalException("LinkedDirection cannot be deserialized! Deserialize FramedDirection");
297 }
298
299 void
301 {
302 if (referenceRobot)
303 {
304 // ARMARX_WARNING_S << "Calling referenceRobot->ref() in __read(IceInternal::BasicStream *__is, bool __rid) of LinkedPose";
305 referenceRobot->ref();
306 }
307
308 FramedDirection::ice_postUnmarshal();
309 }
310
311 void
317
318} // namespace armarx
#define VAROUT(x)
constexpr T c
static FramedDirectionPtr ChangeFrame(const VirtualRobot::RobotConstPtr &robot, const FramedDirection &framedVec, const std::string &newFrame)
std::string output(const Ice::Current &c=Ice::emptyCurrent) const override
void deserialize(const armarx::ObjectSerializerBasePtr &serializer, const ::Ice::Current &=Ice::emptyCurrent) override
void changeToGlobal(const SharedRobotInterfacePrx &referenceRobot)
FramedPosePtr toGlobal(const SharedRobotInterfacePrx &referenceRobot) const
std::string getFrame() const
void changeFrame(const SharedRobotInterfacePrx &referenceRobot, const std::string &newFrame)
void ice_postUnmarshal() override
void changeFrame(const std::string &newFrame, const Ice::Current &c=Ice::emptyCurrent) override
void deserialize(const armarx::ObjectSerializerBasePtr &serializer, const ::Ice::Current &=Ice::emptyCurrent) override
void serialize(const armarx::ObjectSerializerBasePtr &serializer, const ::Ice::Current &=Ice::emptyCurrent) const override
VariantTypeId getType(const Ice::Current &c=Ice::emptyCurrent) const override
void ice_postUnmarshal() override
std::string output(const Ice::Current &c=Ice::emptyCurrent) const override
VariantDataClassPtr clone(const Ice::Current &c=Ice::emptyCurrent) const override
void changeFrame(const std::string &newFrame, const Ice::Current &c=Ice::emptyCurrent) override
bool validate(const Ice::Current &c=Ice::emptyCurrent) override
VirtualRobot::LinkedCoordinate createLinkedCoordinate()
void deserialize(const armarx::ObjectSerializerBasePtr &serializer, const ::Ice::Current &=Ice::emptyCurrent) override
LinkedPosePtr toGlobal() const
Ice::ObjectPtr ice_clone() const override
void serialize(const armarx::ObjectSerializerBasePtr &serializer, const ::Ice::Current &=Ice::emptyCurrent) const override
~LinkedPose() override
The Pose class.
Definition Pose.h:243
void ice_postUnmarshal() override
Definition Pose.cpp:376
void serialize(const armarx::ObjectSerializerBasePtr &serializer, const ::Ice::Current &=Ice::emptyCurrent) const override
Definition Pose.cpp:353
Mimics the behaviour of the VirtualRobot::Robot class while redirecting everything to an Ice proxy.
The Vector3 class.
Definition Pose.h:113
#define ARMARX_CHECK_EXPRESSION(expression)
This macro evaluates the expression and if it turns out to be false it will throw an ExpressionExcept...
#define ARMARX_DEBUG_S
The logging level for output that is only interesting while debugging.
Definition Logging.h:205
#define ARMARX_ERROR_S
The logging level for unexpected behaviour, that must be fixed.
Definition Logging.h:216
std::shared_ptr< class Robot > RobotPtr
Definition Bus.h:19
const VariantTypeId LinkedDirection
Definition LinkedPose.h:44
void suppressWarningUnusedVariableForLinkedPoseAndDirection()
const VariantTypeId LinkedPose
Definition LinkedPose.h:43
This file offers overloads of toIce() and fromIce() functions for STL container types.
void handleExceptions()
IceInternal::Handle< LinkedPose > LinkedPosePtr
Definition LinkedPose.h:52
IceInternal::Handle< FramedDirection > FramedDirectionPtr
Definition FramedPose.h:84
IceInternal::Handle< AbstractObjectSerializer > AbstractObjectSerializerPtr
::IceInternal::ProxyHandle<::IceProxy::armarx::SharedRobotInterface > SharedRobotInterfacePrx
Definition FramedPose.h:59
Ice::Int VariantTypeId
Definition Variant.h:43
const LogSender::manipulator flush
Definition LogSender.h:251
IceInternal::Handle< FramedPose > FramedPosePtr
Definition FramedPose.h:272