unittest/data.cpp
Go to the documentation of this file.
1 //
2 // Copyright (c) 2019-2020 INRIA
3 //
4 
8 
10 
11 #include <boost/test/unit_test.hpp>
12 #include <boost/utility/binary.hpp>
13 
15 
16 using namespace pinocchio;
17 
18 BOOST_AUTO_TEST_SUITE(BOOST_TEST_MODULE)
19 
20 BOOST_AUTO_TEST_CASE(test_empty_model)
21 {
22  Model empty_model;
23  Data empty_data(empty_model);
24 
25  BOOST_CHECK(empty_model.check(empty_data));
26 }
27 
28 BOOST_AUTO_TEST_CASE(test_data_start_idx_v_fromRow)
29 {
30  Model model;
32 
33  Data data(model);
34 
36  {
37  const int nv_joint = model.joints[joint_id].nv();
38  const int idx_joint = model.joints[joint_id].idx_v();
39 
40  for (int k = 0; k < nv_joint; ++k)
41  {
42  BOOST_CHECK(data.start_idx_v_fromRow[(size_t)(idx_joint + k)] == idx_joint);
43  BOOST_CHECK(data.end_idx_v_fromRow[(size_t)(idx_joint + k)] == idx_joint + nv_joint - 1);
44  }
45  }
46 }
47 
48 BOOST_AUTO_TEST_CASE(test_data_supports_fromRow)
49 {
50  Model model;
52 
53  Data data(model);
54 
55  for (size_t k = 0; k < (size_t)model.nv; ++k)
56  {
57  const std::vector<int> & support = data.supports_fromRow[k];
58  const int parent_id = data.parents_fromRow[k];
59 
60  if (parent_id >= 0)
61  {
62  const std::vector<int> & support_parent = data.supports_fromRow[(size_t)parent_id];
63  BOOST_CHECK(support.size() == support_parent.size() + 1);
64  for (size_t j = 0; j < support_parent.size(); ++j)
65  {
66  BOOST_CHECK(support[j] == support_parent[j]);
67  }
68  }
69 
70  BOOST_CHECK(support.back() == (int)k);
71  }
72 }
73 
74 BOOST_AUTO_TEST_CASE(test_data_mimic_idx_vExtended_to_idx_v_fromRow)
75 {
76  for (int i = 0; i < pinocchio::MimicTestCases::N_CASES; i++)
77  {
78  const pinocchio::MimicTestCases mimic_test_case(i);
79  const pinocchio::Model & model_mimic = mimic_test_case.model_mimic;
80  const pinocchio::Model & model_full = mimic_test_case.model_full;
81 
84 
85  for (size_t joint_id = 1; joint_id < model_mimic.njoints; joint_id++)
86  {
87  const int idx_vj = model_mimic.joints[joint_id].idx_v();
88  const int idx_vExtended_j = model_mimic.joints[joint_id].idx_vExtended();
89  const int nvExtended_j = model_mimic.joints[joint_id].nvExtended();
90  for (int v = 0; v < nvExtended_j; v++)
91  {
92  BOOST_CHECK(
93  data_mimic.idx_vExtended_to_idx_v_fromRow[size_t(idx_vExtended_j + v)] == idx_vj + v);
94  BOOST_CHECK(
95  data_full.idx_vExtended_to_idx_v_fromRow[size_t(idx_vExtended_j + v)]
96  == idx_vExtended_j + v);
97  }
98  }
99  }
100 }
101 
102 BOOST_AUTO_TEST_CASE(test_data_mimic_mimic_parents_fromRow)
103 {
104  for (int i = 0; i < pinocchio::MimicTestCases::N_CASES; i++)
105  {
106  const pinocchio::MimicTestCases mimic_test_case(i);
107  const pinocchio::Model & model_mimic = mimic_test_case.model_mimic;
108 
110 
111  for (size_t joint_id = 1; joint_id < model_mimic.njoints; joint_id++)
112  {
113  const int idx_vExtended_j = model_mimic.joints[joint_id].idx_vExtended();
114  const int nvExtended_j = model_mimic.joints[joint_id].nvExtended();
115 
116  // If the parent from row is not the universe, it should be either mimic or non mimic - not
117  // both
118  const bool parent_is_universe = (data_mimic.parents_fromRow[idx_vExtended_j] == -1);
119  const bool parent_is_mimic =
120  (data_mimic.mimic_parents_fromRow[idx_vExtended_j]
121  == data_mimic.parents_fromRow[idx_vExtended_j]);
122  const bool parent_is_not_mimic =
123  (data_mimic.non_mimic_parents_fromRow[idx_vExtended_j]
124  == data_mimic.parents_fromRow[idx_vExtended_j]);
125  BOOST_CHECK(parent_is_universe || (parent_is_mimic != parent_is_not_mimic));
126 
127  for (int v = 1; v < nvExtended_j; v++)
128  {
129  BOOST_CHECK(
130  data_mimic.mimic_parents_fromRow[size_t(idx_vExtended_j + v)] == idx_vExtended_j + v - 1);
131  }
132  }
133  }
134 }
135 
136 BOOST_AUTO_TEST_CASE(test_copy_and_equal_op)
137 {
138  Model model;
140 
141  Data data(model);
142  Data data_copy = data;
143 
144  BOOST_CHECK(data == data);
145  BOOST_CHECK(data == data_copy);
146 
147  data_copy.oMi[0].setRandom();
148  BOOST_CHECK(data != data_copy);
149 }
150 
151 BOOST_AUTO_TEST_CASE(test_container_aligned_vector)
152 {
153  Model model;
155 
156  Data data(model);
157 
159  data.f[0].setRandom();
160 
161  BOOST_CHECK(data.f[0] == f[0]);
162 }
163 
164 BOOST_AUTO_TEST_CASE(test_std_vector_of_Data)
165 {
166  Model model;
168 
170  for (size_t k = 0; k < 20; ++k)
171  datas.push_back(Data(model));
172 }
173 
174 BOOST_AUTO_TEST_CASE(test_mimic_subtree)
175 {
176  Model model;
178  // Direct parent/Child
179  std::vector<pinocchio::JointIndex> mimicked = {model.getJointId("shoulder1_joint")};
180  std::vector<pinocchio::JointIndex> mimicking = {model.getJointId("shoulder2_joint")};
181 
182  const std::vector<double> ratio = {2.5};
183  const std::vector<double> offset = {0.75};
185  pinocchio::buildMimicModel(model, mimicked, mimicking, ratio, offset, model_mimic);
186 
188  Data data(model);
189 
190  // No mimic so should not be filled
191  BOOST_CHECK(data.mimic_subtree_joint.size() == 0);
192 
193  // it's a linear model with RX and RY so the joint after shoulder2 is not a mimic and is in its
194  // subtree
195  BOOST_CHECK(data_mimic.mimic_subtree_joint[0] == model_mimic.getJointId("shoulder3_joint"));
196 
197  // Test when mimic is terminal
198  Model man_mimic;
199  buildModels::manipulator(man_mimic, true);
200 
201  Data data_man_mimic(man_mimic);
202  BOOST_CHECK(data_man_mimic.mimic_subtree_joint[0] == 0);
203 }
204 
205 BOOST_AUTO_TEST_SUITE_END()
pinocchio::buildModels::manipulator
void manipulator(ModelTpl< Scalar, Options, JointCollectionTpl > &model, const bool mimic=false)
Create a 6-DOF kinematic chain shoulder-elbow-wrist.
pinocchio::DataTpl
Definition: context/generic.hpp:25
BOOST_AUTO_TEST_CASE
BOOST_AUTO_TEST_CASE(test_empty_model)
Definition: unittest/data.cpp:20
inverse-kinematics.i
int i
Definition: inverse-kinematics.py:17
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
setup.data
data
Definition: cmake/cython/setup.in.py:48
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.
autodiff-rnea.f
f
Definition: autodiff-rnea.py:24
model-generator.hpp
mimic_dynamics.model_full
model_full
Definition: mimic_dynamics.py:9
pinocchio::ModelTpl::check
bool check(const AlgorithmCheckerBase< D > &checker=AlgorithmCheckerBase< D >()) const
Check the validity of the attributes of Model with respect to the specification of some algorithms.
Definition: multibody/model.hpp:488
pinocchio::ModelTpl< Scalar >::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
data.hpp
pinocchio::MimicTestCases::model_mimic
pinocchio::Model model_mimic
Definition: model-generator.hpp:130
mimic_dynamics.model_mimic
model_mimic
Definition: mimic_dynamics.py:19
pinocchio::v
JointCollectionTpl const Eigen::MatrixBase< ConfigVectorType > const Eigen::MatrixBase< TangentVectorType > & v
Definition: joint-configuration.hpp:1084
check.hpp
pinocchio::container::aligned_vector
std::vector< T, Eigen::aligned_allocator< T > > aligned_vector
Definition: container/aligned-vector.hpp:21
pinocchio::MimicTestCases
Definition: model-generator.hpp:125
mimic_dynamics.data_full
data_full
Definition: mimic_dynamics.py:53
sample-models.hpp
append-urdf-model-with-another-model.joint_id
joint_id
Definition: append-urdf-model-with-another-model.py:34
pinocchio::DataTpl::mimic_subtree_joint
std::vector< JointIndex > mimic_subtree_joint
Store the index of the first non mimic child of each mimic joint (for CRBA). Store 0 if there is no n...
Definition: multibody/data.hpp:333
pinocchio::ModelTpl< Scalar >
pinocchio::MimicTestCases::model_full
pinocchio::Model model_full
Definition: model-generator.hpp:131
pinocchio::PINOCCHIO_ALIGNED_STD_VECTOR
typedef PINOCCHIO_ALIGNED_STD_VECTOR(JointData) JointDataVector
mimic_dynamics.data_mimic
data_mimic
Definition: mimic_dynamics.py:52
pinocchio::model
JointCollectionTpl & model
Definition: joint-configuration.hpp:1082
pinocchio
Main pinocchio namespace.
Definition: timings.cpp:33


pinocchio
Author(s):
autogenerated on Sat Apr 19 2025 02:41:32