Gazebo Rendering
API Reference
9.0.0
insert_drive_file
Tutorials
library_books
Classes
toc
Namespaces
insert_drive_file
Files
launch
Gazebo Website
Index
List
Hierarchy
Members: All
Members: Functions
Members: Variables
Members: Typedefs
Members: Enumerations
Members: Enumerator
List
Members
Functions
Typedefs
Variables
Enumerations
Enumerator
src
gz-rendering
include
gz
rendering
base
BaseNode.hh
Go to the documentation of this file.
1
/*
2
* Copyright (C) 2015 Open Source Robotics Foundation
3
*
4
* Licensed under the Apache License, Version 2.0 (the "License");
5
* you may not use this file except in compliance with the License.
6
* You may obtain a copy of the License at
7
*
8
* http://www.apache.org/licenses/LICENSE-2.0
9
*
10
* Unless required by applicable law or agreed to in writing, software
11
* distributed under the License is distributed on an "AS IS" BASIS,
12
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
* See the License for the specific language governing permissions and
14
* limitations under the License.
15
*
16
*/
17
#ifndef GZ_RENDERING_BASE_BASENODE_HH_
18
#define GZ_RENDERING_BASE_BASENODE_HH_
19
20
#include <map>
21
#include <string>
22
23
#include "
gz/rendering/Node.hh
"
24
#include "
gz/rendering/Storage.hh
"
25
#include "
gz/rendering/base/BaseStorage.hh
"
26
27
namespace
gz
28
{
29
namespace
rendering
30
{
31
inline
namespace
GZ_RENDERING_VERSION_NAMESPACE {
32
//
33
template
<
class
T>
34
class
BaseNode
:
35
public
virtual
Node
,
36
public
virtual
T
37
{
38
protected
:
BaseNode
();
39
40
public
:
virtual
~BaseNode
();
41
42
public
:
virtual
NodePtr
Parent
()
const override
= 0;
43
44
// Documentation inherited
45
public
:
virtual
void
RemoveParent
()
override
;
46
47
public
:
virtual
math::Vector3d
LocalPosition
()
const override
;
48
49
public
:
virtual
math::Pose3d
LocalPose
()
const override
;
50
51
// Documentation inherited
52
public
:
virtual
math::Pose3d
InitialLocalPose
()
const override
;
53
54
public
:
virtual
void
SetLocalPose
(
const
math::Pose3d
&_pose)
override
;
55
56
public
:
virtual
void
SetLocalPosition
(
double
_x,
double
_y,
double
_z)
57
override
;
58
59
public
:
virtual
void
SetLocalPosition
(
const
math::Vector3d
&_position)
60
override
;
61
62
public
:
virtual
math::Quaterniond
LocalRotation
()
const override
;
63
64
public
:
virtual
void
SetLocalRotation
(
double
_r,
double
_p,
double
_y)
65
override
;
66
67
public
:
virtual
void
SetLocalRotation
(
double
_w,
double
_x,
double
_y,
68
double
_z)
override
;
69
70
public
:
virtual
void
SetLocalRotation
(
const
math::Quaterniond
&_rotation)
71
override
;
72
73
public
:
virtual
math::Pose3d
WorldPose
()
const override
;
74
75
public
:
virtual
void
SetWorldPose
(
const
math::Pose3d
&_pose)
override
;
76
77
public
:
virtual
math::Vector3d
WorldPosition
()
const override
;
78
79
public
:
virtual
void
SetWorldPosition
(
double
_x,
double
_y,
double
_z)
80
override
;
81
82
public
:
virtual
void
SetWorldPosition
(
const
math::Vector3d
&_position)
83
override
;
84
85
public
:
virtual
math::Quaterniond
WorldRotation
()
const override
;
86
87
public
:
virtual
void
SetWorldRotation
(
double
_r,
double
_p,
double
_y)
88
override
;
89
90
public
:
virtual
void
SetWorldRotation
(
double
_w,
double
_x,
double
_y,
91
double
_z)
override
;
92
93
public
:
virtual
void
SetWorldRotation
(
const
math::Quaterniond
&_rotation)
94
override
;
95
96
public
:
virtual
math::Pose3d
WorldToLocal
(
const
math::Pose3d
&_pose)
97
const override
;
98
99
public
:
virtual
math::Vector3d
Origin
()
const override
;
100
101
public
:
virtual
void
SetOrigin
(
double
_x,
double
_y,
double
_z)
override
;
102
103
public
:
virtual
void
SetOrigin
(
const
math::Vector3d
&_origin)
override
;
104
105
// Documentation inherited
106
public
:
virtual
math::Vector3d
LocalScale
()
const override
= 0;
107
108
// Documentation inherited
109
public
:
virtual
void
SetLocalScale
(
double
_scale)
override
;
110
111
// Documentation inherited
112
public
:
virtual
void
SetLocalScale
(
double
_x,
double
_y,
double
_z)
113
override
;
114
115
// Documentation inherited
116
public
:
virtual
void
SetLocalScale
(
const
math::Vector3d
&_scale)
override
;
117
118
// Documentation inherited
119
public
:
virtual
math::Vector3d
WorldScale
()
const override
;
120
121
// Documentation inherited
122
public
:
virtual
void
SetWorldScale
(
double
_scale)
override
;
123
124
// Documentation inherited
125
public
:
virtual
void
SetWorldScale
(
double
_x,
double
_y,
double
_z)
126
override
;
127
128
// Documentation inherited
129
public
:
virtual
void
SetWorldScale
(
const
math::Vector3d
&_scale)
override
;
130
131
// Documentation inherited
132
public
:
virtual
void
Scale
(
double
_scale)
override
;
133
134
// Documentation inherited
135
public
:
virtual
void
Scale
(
double
_x,
double
_y,
double
_z)
override
;
136
137
// Documentation inherited
138
public
:
virtual
void
Scale
(
const
math::Vector3d
&_scale)
override
;
139
140
// Documentation inherited
141
public
:
virtual
bool
InheritScale
()
const override
= 0;
142
143
public
:
virtual
void
Destroy
()
override
;
144
145
public
:
virtual
unsigned
int
ChildCount
()
const override
;
146
147
public
:
virtual
bool
HasChild
(
ConstNodePtr
_child)
const override
;
148
149
public
:
virtual
bool
HasChildId
(
unsigned
int
_id)
const override
;
150
151
public
:
virtual
bool
HasChildName
(
const
std::string
&_name)
const
152
override
;
153
154
public
:
virtual
NodePtr
ChildById
(
unsigned
int
_id)
const override
;
155
156
public
:
virtual
NodePtr
ChildByName
(
const
std::string
&_name)
const
157
override
;
158
159
public
:
virtual
NodePtr
ChildByIndex
(
unsigned
int
_index)
const override
;
160
161
public
:
virtual
void
AddChild
(
NodePtr
_child)
override
;
162
163
public
:
virtual
NodePtr
RemoveChild
(
NodePtr
_child)
override
;
164
165
public
:
virtual
NodePtr
RemoveChildById
(
unsigned
int
_id)
override
;
166
167
public
:
virtual
NodePtr
RemoveChildByName
(
const
std::string
&_name)
168
override
;
169
170
public
:
virtual
NodePtr
RemoveChildByIndex
(
unsigned
int
_index)
override
;
171
172
public
:
virtual
void
RemoveChildren
()
override
;
173
174
public
:
virtual
void
PreRender
()
override
;
175
176
// Documentation inherited
177
public
:
virtual
void
SetUserData
(
const
std::string
&_key,
Variant
_value)
178
override
;
179
180
// Documentation inherited
181
public
:
virtual
Variant
UserData
(
const
std::string
&_key)
const override
;
182
183
// Documentation inherited
184
public
:
virtual
bool
HasUserData
(
const
std::string
&_key)
const override
;
185
186
protected
:
virtual
void
PreRenderChildren
();
187
188
protected
:
virtual
math::Pose3d
RawLocalPose
()
const
= 0;
189
190
protected
:
virtual
void
SetRawLocalPose
(
const
math::Pose3d
&_pose) = 0;
191
192
protected
:
virtual
NodeStorePtr
Children
()
const
= 0;
193
194
protected
:
virtual
bool
AttachChild
(
NodePtr
_child) = 0;
195
196
protected
:
virtual
bool
DetachChild
(
NodePtr
_child) = 0;
197
200
protected
:
virtual
void
SetLocalScaleImpl
(
201
const
math::Vector3d
&_scale) = 0;
202
203
protected
:
math::Vector3d
origin
;
204
207
protected
:
bool
initialLocalPoseSet =
false
;
208
210
protected
:
gz::math::Pose3d
initialLocalPose =
211
gz::math::Pose3d::Zero
;
212
214
protected
:
std::map<std::string, Variant>
userData
;
215
};
216
218
template
<
class
T>
219
BaseNode<T>::BaseNode
()
220
{
221
}
222
224
template
<
class
T>
225
BaseNode<T>::~BaseNode
()
226
{
227
}
228
230
template
<
class
T>
231
void
BaseNode<T>::RemoveParent
()
232
{
233
NodePtr
parent = this->Parent();
234
235
if
(parent)
236
{
237
auto
baseShared = this->shared_from_this();
238
auto
thisShared =
std::dynamic_pointer_cast<BaseNode<T>
>(baseShared);
239
parent->RemoveChild(thisShared);
240
}
241
}
242
243
245
template
<
class
T>
246
void
BaseNode<T>::AddChild
(
NodePtr
_child)
247
{
248
if
(_child->Id() == this->Id())
249
{
250
gzerr
<<
"Cannot add self as a child node"
<<
std::endl
;
251
return
;
252
}
253
254
if
(this->AttachChild(_child))
255
{
256
this->Children()->Add(_child);
257
}
258
}
259
261
template
<
class
T>
262
NodePtr
BaseNode<T>::RemoveChild
(
NodePtr
_child)
263
{
264
NodePtr
child = this->Children()->Remove(_child);
265
if
(child) this->DetachChild(child);
266
return
child;
267
}
268
270
template
<
class
T>
271
NodePtr
BaseNode<T>::RemoveChildById
(
unsigned
int
_id)
272
{
273
NodePtr
child = this->Children()->RemoveById(_id);
274
if
(child) this->DetachChild(child);
275
return
child;
276
}
277
279
template
<
class
T>
280
NodePtr
BaseNode<T>::RemoveChildByName
(
const
std::string
&_name)
281
{
282
NodePtr
child = this->Children()->RemoveByName(_name);
283
if
(child) this->DetachChild(child);
284
return
child;
285
}
286
288
template
<
class
T>
289
NodePtr
BaseNode<T>::RemoveChildByIndex
(
unsigned
int
_index)
290
{
291
NodePtr
child = this->Children()->RemoveByIndex(_index);
292
if
(child) this->DetachChild(child);
293
return
child;
294
}
295
297
template
<
class
T>
298
void
BaseNode<T>::RemoveChildren
()
299
{
300
for
(
unsigned
int
i = this->ChildCount(); i > 0; --i)
301
{
302
this->RemoveChildByIndex(i - 1);
303
}
304
}
305
307
template
<
class
T>
308
void
BaseNode<T>::PreRender
()
309
{
310
T::PreRender();
311
this->PreRenderChildren();
312
}
313
315
template
<
class
T>
316
void
BaseNode<T>::PreRenderChildren
()
317
{
318
unsigned
int
count = this->ChildCount();
319
320
for
(
unsigned
int
i = 0; i < count; ++i)
321
{
322
this->ChildByIndex(i)->PreRender();
323
}
324
}
325
327
template
<
class
T>
328
math::Pose3d
BaseNode<T>::LocalPose
()
const
329
{
330
math::Pose3d
pose = this->RawLocalPose();
331
pose.
Pos
() += pose.
Rot
() * this->origin;
332
return
pose;
333
}
334
336
template
<
class
T>
337
void
BaseNode<T>::SetLocalPose
(
const
math::Pose3d
&_pose)
338
{
339
if
(!_pose.
IsFinite
())
340
{
341
gzerr
<<
"Unable to set non-finite pose ["
<< _pose
342
<<
"] to node ["
<< this->Name() <<
"]"
<<
std::endl
;
343
return
;
344
}
345
346
math::Pose3d
pose = _pose;
347
pose.
Pos
() = pose.
Pos
() - pose.
Rot
() * this->origin;
348
349
if
(!initialLocalPoseSet)
350
{
351
this->initialLocalPose = pose;
352
this->initialLocalPoseSet =
true
;
353
}
354
355
this->SetRawLocalPose(pose);
356
}
357
359
template
<
class
T>
360
math::Pose3d
BaseNode<T>::InitialLocalPose
()
const
361
{
362
return
this->initialLocalPose;
363
}
364
366
template
<
class
T>
367
math::Vector3d
BaseNode<T>::LocalPosition
()
const
368
{
369
return
this->LocalPose().Pos();
370
}
371
373
template
<
class
T>
374
void
BaseNode<T>::SetLocalPosition
(
double
_x,
double
_y,
double
_z)
375
{
376
this->SetLocalPosition(
math::Vector3d
(_x, _y, _z));
377
}
378
380
template
<
class
T>
381
void
BaseNode<T>::SetLocalPosition
(
const
math::Vector3d
&_position)
382
{
383
if
(!_position.
IsFinite
())
384
{
385
gzerr
<<
"Unable to set non-finite position ["
<< _position
386
<<
"] to node ["
<< this->Name() <<
"]"
<<
std::endl
;
387
return
;
388
}
389
390
math::Pose3d
pose = this->LocalPose();
391
pose.
Pos
() = _position;
392
this->SetLocalPose(pose);
393
}
394
396
template
<
class
T>
397
math::Quaterniond
BaseNode<T>::LocalRotation
()
const
398
{
399
return
this->LocalPose().Rot();
400
}
401
403
template
<
class
T>
404
void
BaseNode<T>::SetLocalRotation
(
double
_r,
double
_p,
double
_y)
405
{
406
this->SetLocalRotation(
math::Quaterniond
(_r, _p, _y));
407
}
408
410
template
<
class
T>
411
void
BaseNode<T>::SetLocalRotation
(
double
_w,
double
_x,
double
_y,
412
double
_z)
413
{
414
this->SetLocalRotation(
math::Quaterniond
(_w, _x, _y, _z));
415
}
416
418
template
<
class
T>
419
void
BaseNode<T>::SetLocalRotation
(
const
math::Quaterniond
&_rotation)
420
{
421
if
(!_rotation.
IsFinite
())
422
{
423
gzerr
<<
"Unable to set non-finite rotation ["
<< _rotation
424
<<
"] to node ["
<< this->Name() <<
"]"
<<
std::endl
;
425
return
;
426
}
427
428
math::Pose3d
pose = this->LocalPose();
429
pose.
Rot
() = _rotation;
430
this->SetLocalPose(pose);
431
}
432
434
template
<
class
T>
435
math::Pose3d
BaseNode<T>::WorldPose
()
const
436
{
437
NodePtr
parent = this->Parent();
438
math::Pose3d
pose = this->LocalPose();
439
440
if
(!parent)
441
{
442
return
pose;
443
}
444
445
return
parent->WorldPose() * pose;
446
}
447
449
template
<
class
T>
450
void
BaseNode<T>::SetWorldPose
(
const
math::Pose3d
&_pose)
451
{
452
math::Pose3d
pose = this->WorldToLocal(_pose);
453
this->SetLocalPose(pose);
454
}
455
457
template
<
class
T>
458
void
BaseNode<T>::SetWorldPosition
(
double
_x,
double
_y,
double
_z)
459
{
460
this->SetWorldPosition(
math::Vector3d
(_x, _y, _z));
461
}
462
464
template
<
class
T>
465
math::Vector3d
BaseNode<T>::WorldPosition
()
const
466
{
467
return
this->WorldPose().Pos();
468
}
469
471
template
<
class
T>
472
void
BaseNode<T>::SetWorldPosition
(
const
math::Vector3d
&_position)
473
{
474
math::Pose3d
pose = this->WorldPose();
475
pose.
Pos
() = _position;
476
this->SetWorldPose(pose);
477
}
478
480
template
<
class
T>
481
math::Quaterniond
BaseNode<T>::WorldRotation
()
const
482
{
483
return
this->WorldPose().Rot();
484
}
485
487
template
<
class
T>
488
void
BaseNode<T>::SetWorldRotation
(
double
_r,
double
_p,
double
_y)
489
{
490
this->SetWorldRotation(
math::Quaterniond
(_r, _p, _y));
491
}
492
494
template
<
class
T>
495
void
BaseNode<T>::SetWorldRotation
(
double
_w,
double
_x,
double
_y,
496
double
_z)
497
{
498
this->SetWorldRotation(
math::Quaterniond
(_w, _x, _y, _z));
499
}
500
502
template
<
class
T>
503
void
BaseNode<T>::SetWorldRotation
(
const
math::Quaterniond
&_rotation)
504
{
505
math::Pose3d
pose = this->WorldPose();
506
pose.
Rot
() = _rotation;
507
this->SetWorldPose(pose);
508
}
509
511
template
<
class
T>
512
math::Pose3d
BaseNode<T>::WorldToLocal
(
const
math::Pose3d
&_pose)
const
513
{
514
NodePtr
parent = this->Parent();
515
516
if
(!parent)
517
{
518
return
_pose;
519
}
520
521
return
parent->WorldPose().Inverse() * _pose;
522
}
523
525
template
<
class
T>
526
math::Vector3d
BaseNode<T>::Origin
()
const
527
{
528
return
this->origin;
529
}
530
532
template
<
class
T>
533
void
BaseNode<T>::SetOrigin
(
double
_x,
double
_y,
double
_z)
534
{
535
this->SetOrigin(
math::Vector3d
(_x, _y, _z));
536
}
537
539
template
<
class
T>
540
void
BaseNode<T>::SetOrigin
(
const
math::Vector3d
&_origin)
541
{
542
if
(!_origin.
IsFinite
())
543
{
544
gzerr
<<
"Unable to set non-finite origin ["
<< _origin
545
<<
"] to node ["
<< this->Name() <<
"]"
<<
std::endl
;
546
return
;
547
}
548
this->origin = _origin;
549
}
550
552
template
<
class
T>
553
void
BaseNode<T>::SetLocalScale
(
double
_scale)
554
{
555
this->SetLocalScale(
math::Vector3d
(_scale, _scale, _scale));
556
}
557
559
template
<
class
T>
560
void
BaseNode<T>::SetLocalScale
(
double
_x,
double
_y,
double
_z)
561
{
562
this->SetLocalScale(
math::Vector3d
(_x, _y, _z));
563
}
564
566
template
<
class
T>
567
void
BaseNode<T>::SetLocalScale
(
const
math::Vector3d
&_scale)
568
{
569
math::Pose3d
rawPose = this->LocalPose();
570
this->SetLocalScaleImpl(_scale);
571
this->SetLocalPose(rawPose);
572
}
573
575
template
<
class
T>
576
math::Vector3d
BaseNode<T>::WorldScale
()
const
577
{
578
math::Vector3d
scale = this->LocalScale();
579
580
if
(!this->InheritScale() || !this->HasParent())
581
{
582
return
scale;
583
}
584
585
return
scale * this->Parent()->WorldScale();
586
}
587
589
template
<
class
T>
590
void
BaseNode<T>::SetWorldScale
(
double
_scale)
591
{
592
this->SetWorldScale(
math::Vector3d
(_scale, _scale, _scale));
593
}
594
596
template
<
class
T>
597
void
BaseNode<T>::SetWorldScale
(
double
_x,
double
_y,
double
_z)
598
{
599
this->SetWorldScale(
math::Vector3d
(_x, _y, _z));
600
}
601
603
template
<
class
T>
604
void
BaseNode<T>::SetWorldScale
(
const
math::Vector3d
&_scale)
605
{
606
math::Vector3d
toScale =
math::Vector3d::One
;
607
if
(this->InheritScale() && this->HasParent())
608
toScale = this->Parent()->WorldScale();
609
610
this->SetLocalScale(_scale / toScale);
611
}
612
614
template
<
class
T>
615
void
BaseNode<T>::Scale
(
double
_scale)
616
{
617
this->Scale(
math::Vector3d
(_scale, _scale, _scale));
618
}
619
621
template
<
class
T>
622
void
BaseNode<T>::Scale
(
double
_x,
double
_y,
double
_z)
623
{
624
this->Scale(
math::Vector3d
(_x, _y, _z));
625
}
626
628
template
<
class
T>
629
void
BaseNode<T>::Scale
(
const
math::Vector3d
&_scale)
630
{
631
this->SetLocalScale(_scale * this->LocalScale());
632
}
633
635
template
<
class
T>
636
void
BaseNode<T>::Destroy
()
637
{
638
T::Destroy();
639
this->RemoveParent();
640
}
641
643
template
<
class
T>
644
unsigned
int
BaseNode<T>::ChildCount
()
const
645
{
646
return
this->Children()->Size();
647
}
648
650
template
<
class
T>
651
bool
BaseNode<T>::HasChild
(
ConstNodePtr
_child)
const
652
{
653
return
this->Children()->Contains(_child);
654
}
655
657
template
<
class
T>
658
bool
BaseNode<T>::HasChildId
(
unsigned
int
_id)
const
659
{
660
return
this->Children()->ContainsId(_id);
661
}
662
664
template
<
class
T>
665
bool
BaseNode<T>::HasChildName
(
const
std::string
&_name)
const
666
{
667
return
this->Children()->ContainsName(_name);
668
}
669
671
template
<
class
T>
672
NodePtr
BaseNode<T>::ChildById
(
unsigned
int
_id)
const
673
{
674
return
this->Children()->GetById(_id);
675
}
676
678
template
<
class
T>
679
NodePtr
BaseNode<T>::ChildByName
(
const
std::string
&_name)
const
680
{
681
return
this->Children()->GetByName(_name);
682
}
683
685
template
<
class
T>
686
NodePtr
BaseNode<T>::ChildByIndex
(
unsigned
int
_index)
const
687
{
688
return
this->Children()->GetByIndex(_index);
689
}
690
}
691
693
template
<
class
T>
694
void
BaseNode<T>::SetUserData
(
const
std::string
&_key,
Variant
_value)
695
{
696
this->userData[_key] = _value;
697
}
698
700
template
<
class
T>
701
Variant
BaseNode<T>::UserData
(
const
std::string
&_key)
const
702
{
703
Variant
value;
704
auto
it = this->userData.find(_key);
705
if
(it != this->userData.end())
706
value = it->second;
707
return
value;
708
}
709
711
template
<
class
T>
712
bool
BaseNode<T>::HasUserData
(
const
std::string
&_key)
const
713
{
714
return
this->userData.find(_key) != this->userData.end();
715
}
716
}
717
}
718
#endif