1+ #include < gz/sim/System.hh>
2+ #include < gz/sim/EntityComponentManager.hh>
3+ #include < gz/sim/components/Name.hh>
4+ #include < gz/sim/components/JointPosition.hh>
5+
6+ #include < gz/plugin/Register.hh>
7+
8+ #include < iostream>
9+
10+ using namespace gz ;
11+ using namespace sim ;
12+
13+ namespace gz_mimic_joint
14+ {
15+
16+ class MimicJoint :
17+ public System,
18+ public ISystemConfigure,
19+ public ISystemPreUpdate
20+ {
21+
22+ public:
23+
24+ void Configure (
25+ const Entity &_entity,
26+ const std::shared_ptr<const sdf::Element> &_sdf,
27+ EntityComponentManager &_ecm,
28+ EventManager &) override
29+ {
30+ std::cout << " \n [MimicJoint] Configure() START\n " ;
31+
32+ worldEntity = _entity;
33+
34+ if (_sdf->HasElement (" parent_joint" ))
35+ parent_joint_name = _sdf->Get <std::string>(" parent_joint" );
36+
37+ if (_sdf->HasElement (" mimic_joint" ))
38+ mimic_joint_name = _sdf->Get <std::string>(" mimic_joint" );
39+
40+ std::cout << " [MimicJoint] parent_joint: " << parent_joint_name << std::endl;
41+ std::cout << " [MimicJoint] mimic_joint : " << mimic_joint_name << std::endl;
42+
43+ std::cout << " [MimicJoint] Configure() END\n\n " ;
44+ }
45+
46+ void PreUpdate (
47+ const UpdateInfo &,
48+ EntityComponentManager &_ecm) override
49+ {
50+ // Buscar joints solo una vez
51+ if (parentJoint == kNullEntity )
52+ {
53+ parentJoint = FindJoint (_ecm, parent_joint_name);
54+
55+ if (parentJoint != kNullEntity )
56+ std::cout << " [MimicJoint] Parent joint found\n " ;
57+ }
58+
59+ if (mimicJoint == kNullEntity )
60+ {
61+ mimicJoint = FindJoint (_ecm, mimic_joint_name);
62+
63+ if (mimicJoint != kNullEntity )
64+ std::cout << " [MimicJoint] Mimic joint found\n " ;
65+ }
66+
67+ if (parentJoint != kNullEntity && mimicJoint != kNullEntity )
68+ {
69+ auto parentPos = _ecm.Component <components::JointPosition>(parentJoint);
70+
71+ if (parentPos && !parentPos->Data ().empty ())
72+ {
73+ _ecm.SetComponentData (
74+ mimicJoint,
75+ components::JointPosition ({parentPos->Data ()[0 ]})
76+ );
77+ }
78+ }
79+ }
80+
81+ private:
82+
83+ Entity FindJoint (EntityComponentManager &_ecm, const std::string &jointName)
84+ {
85+ Entity result{kNullEntity };
86+
87+ _ecm.Each <components::Name>(
88+ [&](const Entity &_entity, const components::Name *_name)
89+ {
90+ if (_name->Data () == jointName)
91+ {
92+ result = _entity;
93+ return false ;
94+ }
95+ return true ;
96+ });
97+
98+ if (result == kNullEntity )
99+ {
100+ std::cout << " [MimicJoint] Joint NOT found: " << jointName << std::endl;
101+ }
102+
103+ return result;
104+ }
105+
106+ private:
107+
108+ Entity worldEntity{kNullEntity };
109+
110+ std::string parent_joint_name;
111+ std::string mimic_joint_name;
112+
113+ Entity parentJoint{kNullEntity };
114+ Entity mimicJoint{kNullEntity };
115+
116+ };
117+
118+ }
119+
120+ GZ_ADD_PLUGIN (
121+ gz_mimic_joint::MimicJoint,
122+ gz::sim::System,
123+ gz::sim::ISystemConfigure,
124+ gz::sim::ISystemPreUpdate
125+ )
0 commit comments