model-generator.hpp
Go to the documentation of this file.
1 //
2 // Copyright (c) 2015-2020 CNRS
3 // Copyright (c) 2018-2025 INRIA
4 //
5 
9 #include <iostream>
10 
11 namespace pinocchio
12 {
13 
14  template<typename D>
16  Model & model,
17  const JointModelBase<D> & jmodel,
19  const SE3 & joint_placement,
20  const std::string & name,
21  const Inertia & Y)
22  {
24  typedef typename D::TangentVector_t TV;
25  typedef typename D::ConfigVector_t CV;
26 
27  idx = model.addJoint(
28  parent_id, jmodel, joint_placement, name + "_joint", TV::Zero(),
29  1e3 * (TV::Random() + TV::Constant(1)), 1e3 * (CV::Random() - CV::Constant(1)),
30  1e3 * (CV::Random() + CV::Constant(1)));
31 
32  model.appendBodyToJoint(idx, Y, SE3::Identity());
33  }
34 
36  {
38  model, JointModelFreeFlyer(), model.getJointId("universe"), SE3::Identity(), "freeflyer",
39  Inertia::Random());
41  model, JointModelSpherical(), model.getJointId("freeflyer_joint"), SE3::Identity(),
42  "spherical", Inertia::Random());
44  model, JointModelPlanar(), model.getJointId("spherical_joint"), SE3::Identity(), "planar",
45  Inertia::Random());
47  model, JointModelRX(), model.getJointId("planar_joint"), SE3::Identity(), "rx",
48  Inertia::Random());
50  model, JointModelPX(), model.getJointId("rx_joint"), SE3::Identity(), "px",
51  Inertia::Random());
53  model, JointModelHX(1.0), model.getJointId("px_joint"), SE3::Identity(), "hx",
54  Inertia::Random());
56  model, JointModelPrismaticUnaligned(SE3::Vector3(1, 0, 0)), model.getJointId("hx_joint"),
57  SE3::Identity(), "pu", Inertia::Random());
59  model, JointModelRevoluteUnaligned(SE3::Vector3(0, 0, 1)), model.getJointId("pu_joint"),
60  SE3::Identity(), "ru", Inertia::Random());
62  model, JointModelHelicalUnaligned(SE3::Vector3(0, 0, 1), 1.0), model.getJointId("ru_joint"),
63  SE3::Identity(), "hu", Inertia::Random());
65  model, JointModelSphericalZYX(), model.getJointId("hu_joint"), SE3::Identity(),
66  "sphericalZYX", Inertia::Random());
68  model, JointModelTranslation(), model.getJointId("sphericalZYX_joint"), SE3::Identity(),
69  "translation", Inertia::Random());
70  }
71 
72  void toFull(
73  const Model & model_full,
74  const Model & model_mimic,
75  const std::vector<pinocchio::JointIndex> & mimicking_ids,
76  const std::vector<double> & ratio,
77  const std::vector<double> & offset,
78  const Eigen::VectorXd & q,
79  Eigen::VectorXd & q_full)
80  {
81  for (int n = 1; n < model_full.njoints; n++)
82  {
83  double joint_ratio = 1.0;
84  double joint_offset = 0.0;
85  auto it = std::find(mimicking_ids.begin(), mimicking_ids.end(), n);
86  if (it != mimicking_ids.end()) // If n was found
87  {
88  joint_ratio = ratio[size_t(std::distance(mimicking_ids.begin(), it))];
89  joint_offset = offset[size_t(std::distance(mimicking_ids.begin(), it))];
90  }
91  model_full.joints[size_t(n)].JointMappedConfigSelector(q_full) =
92  joint_ratio * model_mimic.joints[size_t(n)].JointMappedConfigSelector(q)
93  + joint_offset * Eigen::VectorXd::Ones(model_full.joints[size_t(n)].nq());
94  }
95  }
96 
98  const Model & model_full,
99  const Model & model_mimic,
100  const std::vector<pinocchio::JointIndex> & /*mimicked_ids*/,
101  const std::vector<pinocchio::JointIndex> & mimicking_ids,
102  const std::vector<double> & ratios,
103  Eigen::MatrixXd & G)
104  {
105  // Initialize G as a zero matrix
106  G.resize(model_full.nv, model_mimic.nv);
107  G.setZero();
108  // Set ones on the pseudo-diagonal
109  for (int j = 1; j < model_full.njoints; ++j)
110  {
111  if (std::find(mimicking_ids.begin(), mimicking_ids.end(), j) == mimicking_ids.end())
112  G.block(
113  model_full.joints[size_t(j)].idx_v(), model_mimic.joints[size_t(j)].idx_v(),
114  model_full.joints[size_t(j)].nv(), model_mimic.joints[size_t(j)].nv())
115  .setIdentity();
116  }
117 
118  // Set specific values for mimicked-mimicking joint pairs
119  for (size_t i = 0; i < mimicking_ids.size(); ++i)
120  {
121  G(model_full.idx_vs[mimicking_ids[i]], model_mimic.idx_vs[mimicking_ids[i]]) = ratios[i];
122  }
123  }
124 
126  {
127  public:
128  static const int N_CASES = 6;
129 
132  std::vector<pinocchio::JointIndex> mimicked_ids;
133  std::vector<pinocchio::JointIndex> mimicking_ids;
134  Eigen::MatrixXd G;
135  std::vector<double> ratios;
136  std::vector<double> offsets;
137 
138  MimicTestCases(int case_i, bool verbose = false)
139  : mimicked_ids()
140  , mimicking_ids()
141  , ratios()
142  , offsets()
143  {
145  model_full.lowerPositionLimit.head<3>().fill(-1.);
146  model_full.upperPositionLimit.head<3>().fill(1.);
147 
148  // Select mimic joints based on test case
149  if (verbose)
150  {
151  std::cout << "Mimic test case : ";
152  }
153  switch (case_i)
154  {
155  case 0:
156  if (verbose)
157  {
158  std::cout << "Mimicked/mimicking parent/child";
159  }
160  mimicked_ids.push_back(model_full.getJointId("rleg1_joint"));
161  mimicking_ids.push_back(model_full.getJointId("rleg2_joint"));
162  ratios.push_back(2.5);
163  offsets.push_back(0.75);
164  break;
165  case 1:
166  if (verbose)
167  {
168  std::cout << "Spaced mimicked/mimicking";
169  }
170  mimicked_ids.push_back(model_full.getJointId("rleg1_joint"));
171  mimicking_ids.push_back(model_full.getJointId("rleg4_joint"));
172  ratios.push_back(2.5);
173  offsets.push_back(0.75);
174  break;
175  case 2:
176  if (verbose)
177  {
178  std::cout << "Parallel mimic";
179  }
180  mimicked_ids.push_back(model_full.getJointId("lleg1_joint"));
181  mimicking_ids.push_back(model_full.getJointId("rleg1_joint"));
182  ratios.push_back(2.5);
183  offsets.push_back(0.75);
184  break;
185  case 3:
186  if (verbose)
187  {
188  std::cout << "Double mimic, not same mimicked";
189  }
190  mimicked_ids.push_back(model_full.getJointId("lleg1_joint"));
191  mimicking_ids.push_back(model_full.getJointId("rleg1_joint"));
192  ratios.push_back(2.5);
193  offsets.push_back(0.75);
194 
195  mimicked_ids.push_back(model_full.getJointId("rarm1_joint"));
196  mimicking_ids.push_back(model_full.getJointId("larm1_joint"));
197  ratios.push_back(3.2);
198  offsets.push_back(8);
199  break;
200  case 4:
201  if (verbose)
202  {
203  std::cout << "Double mimic, same mimicked";
204  }
205  mimicked_ids.push_back(model_full.getJointId("lleg1_joint"));
206  mimicking_ids.push_back(model_full.getJointId("rleg1_joint"));
207  ratios.push_back(2.5);
208  offsets.push_back(0.75);
209 
210  mimicked_ids.push_back(model_full.getJointId("lleg1_joint"));
211  mimicking_ids.push_back(model_full.getJointId("lleg2_joint"));
212  ratios.push_back(3.2);
213  offsets.push_back(8);
214  break;
215  case 5:
216  if (verbose)
217  {
218  std::cout << "Mimicking terminal joint";
219  }
220  mimicked_ids.push_back(model_full.getJointId("larm5_joint"));
221  mimicking_ids.push_back(model_full.getJointId("larm6_joint"));
222  ratios.push_back(2.5);
223  offsets.push_back(0.75);
224 
225  break;
226  default:
228  std::invalid_argument,
229  "No mimic test case number " << case_i << ". Max number " << N_CASES - 1);
230  }
231 
232  if (verbose)
233  {
234  std::cout << std::endl;
235  }
236 
239  }
240 
241  void toFull(const Eigen::VectorXd & q, Eigen::VectorXd & q_full) const
242  {
244  }
245  };
246 } // namespace pinocchio
pinocchio::addJointAndBody
void addJointAndBody(Model &model, const JointModelBase< D > &jmodel, const Model::JointIndex parent_id, const SE3 &joint_placement, const std::string &name, const Inertia &Y)
Definition: model-generator.hpp:15
pinocchio::JointModelFreeFlyer
JointModelFreeFlyerTpl< context::Scalar > JointModelFreeFlyer
Definition: multibody/joint/fwd.hpp:110
pinocchio::JointModelTranslation
JointModelTranslationTpl< context::Scalar > JointModelTranslation
Definition: multibody/joint/fwd.hpp:126
pinocchio::MimicTestCases::toFull
void toFull(const Eigen::VectorXd &q, Eigen::VectorXd &q_full) const
Definition: model-generator.hpp:241
model.hpp
pinocchio::JointModelHX
JointModelHelicalTpl< context::Scalar, context::Options, 0 > JointModelHX
Definition: joint-helical.hpp:964
pinocchio::JointModelBase
Definition: joint-model-base.hpp:78
pinocchio::ModelTpl::lowerPositionLimit
ConfigVectorType lowerPositionLimit
Lower joint configuration limit.
Definition: multibody/model.hpp:187
pinocchio::SE3
context::SE3 SE3
Definition: spatial/fwd.hpp:59
inverse-kinematics.i
int i
Definition: inverse-kinematics.py:17
pinocchio::name
std::string name(const LieGroupGenericTpl< LieGroupCollection > &lg)
Visit a LieGroupVariant to get the name of it.
pinocchio::buildMimicModel
void buildMimicModel(const ModelTpl< Scalar, Options, JointCollectionTpl > &input_model, const std::vector< JointIndex > &index_mimicked, const std::vector< JointIndex > &index_mimicking, const std::vector< Scalar > &scaling, const std::vector< Scalar > &offset, ModelTpl< Scalar, Options, JointCollectionTpl > &output_model)
Transform joints of a model into mimic joints.
model.hpp
pinocchio::JointModelRX
JointModelRevoluteTpl< context::Scalar, context::Options, 0 > JointModelRX
Definition: joint-revolute.hpp:877
pinocchio::JointModelSpherical
JointModelSphericalTpl< context::Scalar > JointModelSpherical
Definition: multibody/joint/fwd.hpp:73
pinocchio::MimicTestCases::G
Eigen::MatrixXd G
Definition: model-generator.hpp:134
pinocchio::MimicTestCases::N_CASES
static const int N_CASES
Definition: model-generator.hpp:128
pinocchio::buildModels::humanoidRandom
void humanoidRandom(ModelTpl< Scalar, Options, JointCollectionTpl > &model, bool usingFF=true, bool mimic=false)
Create a humanoid kinematic tree with 6-DOF limbs and random joint placements.
mimic_dynamics.model_full
model_full
Definition: mimic_dynamics.py:9
pinocchio::JointModelPlanar
JointModelPlanarTpl< context::Scalar > JointModelPlanar
Definition: multibody/joint/fwd.hpp:118
pinocchio::ModelTpl< context::Scalar, context::Options >::JointIndex
pinocchio::JointIndex JointIndex
Definition: multibody/model.hpp:67
append-urdf-model-with-another-model.parent_id
int parent_id
Definition: append-urdf-model-with-another-model.py:28
pinocchio::MimicTestCases::ratios
std::vector< double > ratios
Definition: model-generator.hpp:135
PINOCCHIO_THROW_PRETTY
#define PINOCCHIO_THROW_PRETTY(exception, message)
Definition: include/pinocchio/macros.hpp:168
pinocchio::MimicTestCases::model_mimic
pinocchio::Model model_mimic
Definition: model-generator.hpp:130
pinocchio::Inertia
context::Inertia Inertia
Definition: spatial/fwd.hpp:64
pinocchio::MimicTestCases::mimicking_ids
std::vector< pinocchio::JointIndex > mimicking_ids
Definition: model-generator.hpp:133
mimic_dynamics.model_mimic
model_mimic
Definition: mimic_dynamics.py:19
pinocchio::MimicTestCases::offsets
std::vector< double > offsets
Definition: model-generator.hpp:136
pinocchio::buildAllJointsModel
void buildAllJointsModel(Model &model)
Definition: model-generator.hpp:35
pinocchio::MimicTestCases::mimicked_ids
std::vector< pinocchio::JointIndex > mimicked_ids
Definition: model-generator.hpp:132
inverse-kinematics-3d.it
int it
Definition: inverse-kinematics-3d.py:17
pinocchio::q
JointCollectionTpl const Eigen::MatrixBase< ConfigVectorType > & q
Definition: joint-configuration.hpp:1083
pinocchio::JointModelHelicalUnaligned
JointModelHelicalUnalignedTpl< context::Scalar > JointModelHelicalUnaligned
Definition: multibody/joint/fwd.hpp:65
distance
FCL_REAL distance(const KDOP< N > &other, Vec3f *P=NULL, Vec3f *Q=NULL) const
pinocchio::ModelTpl::getJointId
JointIndex getJointId(const std::string &name) const
Return the index of a joint given by its name.
mimic_dynamics.q_full
q_full
Definition: mimic_dynamics.py:46
pinocchio::mimicTransformMatrix
void mimicTransformMatrix(const Model &model_full, const Model &model_mimic, const std::vector< pinocchio::JointIndex > &, const std::vector< pinocchio::JointIndex > &mimicking_ids, const std::vector< double > &ratios, Eigen::MatrixXd &G)
Definition: model-generator.hpp:97
pinocchio::MimicTestCases::MimicTestCases
MimicTestCases(int case_i, bool verbose=false)
Definition: model-generator.hpp:138
fill
fill
append-urdf-model-with-another-model.joint_placement
joint_placement
Definition: append-urdf-model-with-another-model.py:29
mimic_dynamics.G
G
Definition: mimic_dynamics.py:27
pinocchio::MimicTestCases
Definition: model-generator.hpp:125
Y
Y
pinocchio::JointModelPX
JointModelPrismaticTpl< context::Scalar, context::Options, 0 > JointModelPX
Definition: joint-prismatic.hpp:781
pinocchio::JointModelSphericalZYX
JointModelSphericalZYXTpl< context::Scalar > JointModelSphericalZYX
Definition: multibody/joint/fwd.hpp:81
pinocchio::JointModelRevoluteUnaligned
JointModelRevoluteUnalignedTpl< context::Scalar > JointModelRevoluteUnaligned
Definition: multibody/joint/fwd.hpp:38
pinocchio::toFull
void toFull(const Model &model_full, const Model &model_mimic, const std::vector< pinocchio::JointIndex > &mimicking_ids, const std::vector< double > &ratio, const std::vector< double > &offset, const Eigen::VectorXd &q, Eigen::VectorXd &q_full)
Definition: model-generator.hpp:72
pinocchio::JointModelPrismaticUnaligned
JointModelPrismaticUnalignedTpl< context::Scalar > JointModelPrismaticUnaligned
Definition: multibody/joint/fwd.hpp:94
sample-models.hpp
pinocchio::ModelTpl< context::Scalar, context::Options >
pinocchio::MimicTestCases::model_full
pinocchio::Model model_full
Definition: model-generator.hpp:131
verbose
bool verbose
pinocchio::ModelTpl::upperPositionLimit
ConfigVectorType upperPositionLimit
Upper joint configuration limit.
Definition: multibody/model.hpp:190
n
Vec3f n
pinocchio::model
JointCollectionTpl & model
Definition: joint-configuration.hpp:1082
pinocchio
Main pinocchio namespace.
Definition: timings.cpp:33


pinocchio
Author(s):
autogenerated on Thu Apr 10 2025 02:42:20