Directory: | ./ |
---|---|
File: | unittest/test_multiple_contacts.cpp |
Date: | 2025-02-24 23:41:29 |
Exec | Total | Coverage | |
---|---|---|---|
Lines: | 331 | 387 | 85.5% |
Branches: | 652 | 1408 | 46.3% |
Line | Branch | Exec | Source |
---|---|---|---|
1 | /////////////////////////////////////////////////////////////////////////////// | ||
2 | // BSD 3-Clause License | ||
3 | // | ||
4 | // Copyright (C) 2019-2021, University of Edinburgh | ||
5 | // Copyright note valid unless otherwise stated in individual files. | ||
6 | // All rights reserved. | ||
7 | /////////////////////////////////////////////////////////////////////////////// | ||
8 | |||
9 | #define BOOST_TEST_NO_MAIN | ||
10 | #define BOOST_TEST_ALTERNATIVE_INIT_API | ||
11 | |||
12 | #include <pinocchio/algorithm/frames.hpp> | ||
13 | #include <pinocchio/algorithm/kinematics-derivatives.hpp> | ||
14 | |||
15 | #include "factory/contact.hpp" | ||
16 | #include "unittest_common.hpp" | ||
17 | |||
18 | using namespace boost::unit_test; | ||
19 | using namespace crocoddyl::unittest; | ||
20 | |||
21 | //----------------------------------------------------------------------------// | ||
22 | |||
23 | /** | ||
24 | * These methods modify the return type of the model function in | ||
25 | * order to use the boost::execution_monitor::execute method which catch the | ||
26 | * assert signal | ||
27 | */ | ||
28 | ✗ | int calc(crocoddyl::ContactModelMultiple& model, | |
29 | std::shared_ptr<crocoddyl::ContactDataMultiple> data, | ||
30 | Eigen::VectorXd& dx) { | ||
31 | ✗ | model.calc(data, dx); | |
32 | ✗ | return 0; | |
33 | } | ||
34 | |||
35 | ✗ | int calcDiff(crocoddyl::ContactModelMultiple& model, | |
36 | std::shared_ptr<crocoddyl::ContactDataMultiple> data, | ||
37 | Eigen::VectorXd& dx) { | ||
38 | ✗ | model.calcDiff(data, dx); | |
39 | ✗ | return 0; | |
40 | } | ||
41 | |||
42 | ✗ | int updateForce(crocoddyl::ContactModelMultiple& model, | |
43 | std::shared_ptr<crocoddyl::ContactDataMultiple> data, | ||
44 | Eigen::VectorXd& dx) { | ||
45 | ✗ | model.updateForce(data, dx); | |
46 | ✗ | return 0; | |
47 | } | ||
48 | |||
49 | ✗ | int updateAccelerationDiff(crocoddyl::ContactModelMultiple& model, | |
50 | std::shared_ptr<crocoddyl::ContactDataMultiple> data, | ||
51 | const Eigen::MatrixXd& ddv_dx) { | ||
52 | ✗ | model.updateAccelerationDiff(data, ddv_dx); | |
53 | ✗ | return 0; | |
54 | } | ||
55 | |||
56 | ✗ | int updateForceDiff(crocoddyl::ContactModelMultiple& model, | |
57 | std::shared_ptr<crocoddyl::ContactDataMultiple> data, | ||
58 | const Eigen::MatrixXd& df_dx, | ||
59 | const Eigen::MatrixXd& df_du) { | ||
60 | ✗ | model.updateForceDiff(data, df_dx, df_du); | |
61 | ✗ | return 0; | |
62 | } | ||
63 | |||
64 | //----------------------------------------------------------------------------// | ||
65 | |||
66 | 1 | void test_constructor() { | |
67 | // Setup the test | ||
68 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | StateModelFactory state_factory; |
69 | crocoddyl::ContactModelMultiple model( | ||
70 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
2 | std::static_pointer_cast<crocoddyl::StateMultibody>(state_factory.create( |
71 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | StateModelTypes::StateMultibody_RandomHumanoid))); |
72 | |||
73 | // Run the print function | ||
74 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | std::ostringstream tmp; |
75 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | tmp << model; |
76 | |||
77 | // Test the initial size of the map | ||
78 |
6/12✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 1 times.
|
1 | BOOST_CHECK(model.get_contacts().size() == 0); |
79 | 1 | } | |
80 | |||
81 | 1 | void test_addContact() { | |
82 | // Setup the test | ||
83 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | StateModelFactory state_factory; |
84 | crocoddyl::ContactModelMultiple model( | ||
85 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
2 | std::static_pointer_cast<crocoddyl::StateMultibody>(state_factory.create( |
86 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | StateModelTypes::StateMultibody_RandomHumanoid))); |
87 | |||
88 | // add an active contact | ||
89 | std::shared_ptr<crocoddyl::ContactModelAbstract> rand_contact_1 = | ||
90 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | create_random_contact(); |
91 |
2/4✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
|
1 | model.addContact("random_contact_1", rand_contact_1); |
92 |
6/12✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
✗ Branch 25 not taken.
✓ Branch 26 taken 1 times.
|
1 | BOOST_CHECK(model.get_nc() == rand_contact_1->get_nc()); |
93 |
6/12✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
✗ Branch 25 not taken.
✓ Branch 26 taken 1 times.
|
1 | BOOST_CHECK(model.get_nc_total() == rand_contact_1->get_nc()); |
94 | |||
95 | // add an inactive contact | ||
96 | std::shared_ptr<crocoddyl::ContactModelAbstract> rand_contact_2 = | ||
97 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | create_random_contact(); |
98 |
2/4✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
|
1 | model.addContact("random_contact_2", rand_contact_2, false); |
99 |
6/12✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
✗ Branch 25 not taken.
✓ Branch 26 taken 1 times.
|
1 | BOOST_CHECK(model.get_nc() == rand_contact_1->get_nc()); |
100 |
6/12✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 1 times.
✗ Branch 23 not taken.
✗ Branch 27 not taken.
✓ Branch 28 taken 1 times.
|
1 | BOOST_CHECK(model.get_nc_total() == |
101 | rand_contact_1->get_nc() + rand_contact_2->get_nc()); | ||
102 | |||
103 | // change the random contact 2 status | ||
104 |
2/4✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
|
1 | model.changeContactStatus("random_contact_2", true); |
105 |
6/12✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 1 times.
✗ Branch 23 not taken.
✗ Branch 27 not taken.
✓ Branch 28 taken 1 times.
|
1 | BOOST_CHECK(model.get_nc() == |
106 | rand_contact_1->get_nc() + rand_contact_2->get_nc()); | ||
107 |
6/12✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 1 times.
✗ Branch 23 not taken.
✗ Branch 27 not taken.
✓ Branch 28 taken 1 times.
|
1 | BOOST_CHECK(model.get_nc_total() == |
108 | rand_contact_1->get_nc() + rand_contact_2->get_nc()); | ||
109 | |||
110 | // change the random contact 1 status | ||
111 |
2/4✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
|
1 | model.changeContactStatus("random_contact_1", false); |
112 |
6/12✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
✗ Branch 25 not taken.
✓ Branch 26 taken 1 times.
|
1 | BOOST_CHECK(model.get_nc() == rand_contact_2->get_nc()); |
113 |
6/12✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 1 times.
✗ Branch 23 not taken.
✗ Branch 27 not taken.
✓ Branch 28 taken 1 times.
|
1 | BOOST_CHECK(model.get_nc_total() == |
114 | rand_contact_1->get_nc() + rand_contact_2->get_nc()); | ||
115 | 1 | } | |
116 | |||
117 | 1 | void test_addContact_error_message() { | |
118 | // Setup the test | ||
119 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | StateModelFactory state_factory; |
120 | crocoddyl::ContactModelMultiple model( | ||
121 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
2 | std::static_pointer_cast<crocoddyl::StateMultibody>(state_factory.create( |
122 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | StateModelTypes::StateMultibody_RandomHumanoid))); |
123 | |||
124 | // create an contact object | ||
125 | std::shared_ptr<crocoddyl::ContactModelAbstract> rand_contact = | ||
126 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | create_random_contact(); |
127 | |||
128 | // add twice the same contact object to the container | ||
129 |
2/4✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
|
1 | model.addContact("random_contact", rand_contact); |
130 | |||
131 | // test error message when we add a duplicate contact | ||
132 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | CaptureIOStream capture_ios; |
133 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | capture_ios.beginCapture(); |
134 |
2/4✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
|
1 | model.addContact("random_contact", rand_contact); |
135 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | capture_ios.endCapture(); |
136 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | std::stringstream expected_buffer; |
137 | expected_buffer << "Warning: we couldn't add the random_contact contact " | ||
138 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | "item, it already existed." |
139 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | << std::endl; |
140 |
8/16✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 22 not taken.
✓ Branch 24 taken 1 times.
✗ Branch 25 not taken.
✗ Branch 31 not taken.
✓ Branch 32 taken 1 times.
|
1 | BOOST_CHECK(capture_ios.str() == expected_buffer.str()); |
141 | |||
142 | // test error message when we change the contact status of an inexistent | ||
143 | // contact | ||
144 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | capture_ios.beginCapture(); |
145 |
2/4✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
|
1 | model.changeContactStatus("no_exist_contact", true); |
146 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | capture_ios.endCapture(); |
147 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | expected_buffer.clear(); |
148 | expected_buffer << "Warning: we couldn't change the status of the " | ||
149 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | "no_exist_contact contact item, it doesn't exist." |
150 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | << std::endl; |
151 |
8/16✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 22 not taken.
✓ Branch 24 taken 1 times.
✗ Branch 25 not taken.
✗ Branch 31 not taken.
✓ Branch 32 taken 1 times.
|
1 | BOOST_CHECK(capture_ios.str() == expected_buffer.str()); |
152 | 1 | } | |
153 | |||
154 | 1 | void test_removeContact() { | |
155 | // Setup the test | ||
156 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | StateModelFactory state_factory; |
157 | crocoddyl::ContactModelMultiple model( | ||
158 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
2 | std::static_pointer_cast<crocoddyl::StateMultibody>(state_factory.create( |
159 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | StateModelTypes::StateMultibody_RandomHumanoid))); |
160 | |||
161 | // add an active contact | ||
162 | std::shared_ptr<crocoddyl::ContactModelAbstract> rand_contact = | ||
163 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | create_random_contact(); |
164 |
2/4✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
|
1 | model.addContact("random_contact", rand_contact); |
165 |
6/12✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
✗ Branch 25 not taken.
✓ Branch 26 taken 1 times.
|
1 | BOOST_CHECK(model.get_nc() == rand_contact->get_nc()); |
166 |
6/12✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
✗ Branch 25 not taken.
✓ Branch 26 taken 1 times.
|
1 | BOOST_CHECK(model.get_nc_total() == rand_contact->get_nc()); |
167 | |||
168 | // remove the contact | ||
169 |
2/4✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
|
1 | model.removeContact("random_contact"); |
170 |
6/12✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✗ Branch 23 not taken.
✓ Branch 24 taken 1 times.
|
1 | BOOST_CHECK(model.get_nc() == 0); |
171 |
6/12✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✗ Branch 23 not taken.
✓ Branch 24 taken 1 times.
|
1 | BOOST_CHECK(model.get_nc_total() == 0); |
172 | 1 | } | |
173 | |||
174 | 1 | void test_removeContact_error_message() { | |
175 | // Setup the test | ||
176 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | StateModelFactory state_factory; |
177 | crocoddyl::ContactModelMultiple model( | ||
178 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
2 | std::static_pointer_cast<crocoddyl::StateMultibody>(state_factory.create( |
179 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | StateModelTypes::StateMultibody_RandomHumanoid))); |
180 | |||
181 | // remove a none existing contact form the container, we expect a cout message | ||
182 | // here | ||
183 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | CaptureIOStream capture_ios; |
184 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | capture_ios.beginCapture(); |
185 |
2/4✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
|
1 | model.removeContact("random_contact"); |
186 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | capture_ios.endCapture(); |
187 | |||
188 | // Test that the error message is sent. | ||
189 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | std::stringstream expected_buffer; |
190 | expected_buffer << "Warning: we couldn't remove the random_contact contact " | ||
191 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | "item, it doesn't exist." |
192 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | << std::endl; |
193 |
8/16✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 22 not taken.
✓ Branch 24 taken 1 times.
✗ Branch 25 not taken.
✗ Branch 31 not taken.
✓ Branch 32 taken 1 times.
|
1 | BOOST_CHECK(capture_ios.str() == expected_buffer.str()); |
194 | 1 | } | |
195 | |||
196 | 1 | void test_calc() { | |
197 | // Setup the test | ||
198 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | StateModelFactory state_factory; |
199 | crocoddyl::ContactModelMultiple model( | ||
200 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
2 | std::static_pointer_cast<crocoddyl::StateMultibody>(state_factory.create( |
201 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | StateModelTypes::StateMultibody_RandomHumanoid))); |
202 | // create the corresponding data object | ||
203 | 1 | pinocchio::Model& pinocchio_model = *model.get_state()->get_pinocchio().get(); | |
204 |
1/2✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
|
1 | pinocchio::Data pinocchio_data(*model.get_state()->get_pinocchio().get()); |
205 | |||
206 | // create and add some contact objects | ||
207 | 1 | std::vector<std::shared_ptr<crocoddyl::ContactModelAbstract> > models; | |
208 | 1 | std::vector<std::shared_ptr<crocoddyl::ContactDataAbstract> > datas; | |
209 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 1 times.
|
6 | for (std::size_t i = 0; i < 5; ++i) { |
210 |
1/2✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
|
5 | std::ostringstream os; |
211 |
2/4✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5 times.
✗ Branch 5 not taken.
|
5 | os << "random_contact_" << i; |
212 | const std::shared_ptr<crocoddyl::ContactModelAbstract>& m = | ||
213 |
1/2✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
|
5 | create_random_contact(); |
214 |
2/4✓ Branch 2 taken 5 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 5 times.
✗ Branch 6 not taken.
|
5 | model.addContact(os.str(), m); |
215 |
1/2✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
|
5 | models.push_back(m); |
216 |
2/4✓ Branch 2 taken 5 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 5 times.
✗ Branch 6 not taken.
|
5 | datas.push_back(m->createData(&pinocchio_data)); |
217 | 5 | } | |
218 | |||
219 | // create the data of the multiple-contacts | ||
220 | std::shared_ptr<crocoddyl::ContactDataMultiple> data = | ||
221 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | model.createData(&pinocchio_data); |
222 | |||
223 | // compute the multiple contact data for the case when all contacts are | ||
224 | // defined as active | ||
225 |
1/2✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
|
1 | Eigen::VectorXd x1 = model.get_state()->rand(); |
226 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | crocoddyl::unittest::updateAllPinocchio(&pinocchio_model, &pinocchio_data, |
227 | x1); | ||
228 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | model.calc(data, x1); |
229 | |||
230 | // check that only the Jacobian has been filled | ||
231 |
7/14✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 1 times.
✗ Branch 23 not taken.
✗ Branch 27 not taken.
✓ Branch 28 taken 1 times.
|
1 | BOOST_CHECK(!data->Jc.isZero()); |
232 |
7/14✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 1 times.
✗ Branch 23 not taken.
✗ Branch 27 not taken.
✓ Branch 28 taken 1 times.
|
1 | BOOST_CHECK(!data->a0.isZero()); |
233 |
7/14✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 1 times.
✗ Branch 23 not taken.
✗ Branch 27 not taken.
✓ Branch 28 taken 1 times.
|
1 | BOOST_CHECK(data->da0_dx.isZero()); |
234 | |||
235 | // check Jc and a0 against single contact computations | ||
236 | 1 | std::size_t nc = 0; | |
237 | 1 | const std::size_t nv = model.get_state()->get_nv(); | |
238 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 1 times.
|
6 | for (std::size_t i = 0; i < 5; ++i) { |
239 | 5 | const std::size_t nc_i = models[i]->get_nc(); | |
240 |
2/4✓ Branch 3 taken 5 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 5 times.
✗ Branch 8 not taken.
|
5 | models[i]->calc(datas[i], x1); |
241 |
8/16✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 5 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 5 times.
✗ Branch 12 not taken.
✓ Branch 17 taken 5 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 5 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 5 times.
✗ Branch 24 not taken.
✓ Branch 26 taken 5 times.
✗ Branch 27 not taken.
✗ Branch 31 not taken.
✓ Branch 32 taken 5 times.
|
5 | BOOST_CHECK(data->Jc.block(nc, 0, nc_i, nv) == datas[i]->Jc); |
242 |
8/16✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 5 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 5 times.
✗ Branch 12 not taken.
✓ Branch 17 taken 5 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 5 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 5 times.
✗ Branch 24 not taken.
✓ Branch 26 taken 5 times.
✗ Branch 27 not taken.
✗ Branch 31 not taken.
✓ Branch 32 taken 5 times.
|
5 | BOOST_CHECK(data->a0.segment(nc, nc_i) == datas[i]->a0); |
243 | 5 | nc += nc_i; | |
244 | } | ||
245 | 1 | nc = 0; | |
246 | |||
247 | // compute the multiple contact data for the case when the first three | ||
248 | // contacts are defined as active | ||
249 |
2/4✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
|
1 | model.changeContactStatus("random_contact_3", false); |
250 |
2/4✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
|
1 | model.changeContactStatus("random_contact_4", false); |
251 |
1/2✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
|
1 | Eigen::VectorXd x2 = model.get_state()->rand(); |
252 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | crocoddyl::unittest::updateAllPinocchio(&pinocchio_model, &pinocchio_data, |
253 | x2); | ||
254 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | model.calc(data, x2); |
255 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 1 times.
|
6 | for (std::size_t i = 0; i < 5; ++i) { |
256 | 5 | const std::size_t nc_i = models[i]->get_nc(); | |
257 |
2/2✓ Branch 0 taken 3 times.
✓ Branch 1 taken 2 times.
|
5 | if (i < 3) { // we need to update data because this contacts are active |
258 |
2/4✓ Branch 3 taken 3 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 8 not taken.
|
3 | models[i]->calc(datas[i], x2); |
259 | } | ||
260 |
8/16✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 5 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 5 times.
✗ Branch 12 not taken.
✓ Branch 17 taken 5 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 5 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 5 times.
✗ Branch 24 not taken.
✓ Branch 26 taken 5 times.
✗ Branch 27 not taken.
✗ Branch 31 not taken.
✓ Branch 32 taken 5 times.
|
5 | BOOST_CHECK(data->Jc.block(nc, 0, nc_i, nv) == datas[i]->Jc); |
261 |
8/16✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 5 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 5 times.
✗ Branch 12 not taken.
✓ Branch 17 taken 5 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 5 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 5 times.
✗ Branch 24 not taken.
✓ Branch 26 taken 5 times.
✗ Branch 27 not taken.
✗ Branch 31 not taken.
✓ Branch 32 taken 5 times.
|
5 | BOOST_CHECK(data->a0.segment(nc, nc_i) == datas[i]->a0); |
262 | 5 | nc += nc_i; | |
263 | } | ||
264 | 1 | } | |
265 | |||
266 | 1 | void test_calc_diff() { | |
267 | // Setup the test | ||
268 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | StateModelFactory state_factory; |
269 | crocoddyl::ContactModelMultiple model( | ||
270 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
2 | std::static_pointer_cast<crocoddyl::StateMultibody>(state_factory.create( |
271 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | StateModelTypes::StateMultibody_RandomHumanoid))); |
272 | // create the corresponding data object | ||
273 | 1 | pinocchio::Model& pinocchio_model = *model.get_state()->get_pinocchio().get(); | |
274 |
1/2✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
|
1 | pinocchio::Data pinocchio_data(*model.get_state()->get_pinocchio().get()); |
275 | |||
276 | // create and add some contact objects | ||
277 | 1 | std::vector<std::shared_ptr<crocoddyl::ContactModelAbstract> > models; | |
278 | 1 | std::vector<std::shared_ptr<crocoddyl::ContactDataAbstract> > datas; | |
279 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 1 times.
|
6 | for (std::size_t i = 0; i < 5; ++i) { |
280 |
1/2✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
|
5 | std::ostringstream os; |
281 |
2/4✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5 times.
✗ Branch 5 not taken.
|
5 | os << "random_contact_" << i; |
282 | const std::shared_ptr<crocoddyl::ContactModelAbstract>& m = | ||
283 |
1/2✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
|
5 | create_random_contact(); |
284 |
2/4✓ Branch 2 taken 5 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 5 times.
✗ Branch 6 not taken.
|
5 | model.addContact(os.str(), m); |
285 |
1/2✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
|
5 | models.push_back(m); |
286 |
2/4✓ Branch 2 taken 5 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 5 times.
✗ Branch 6 not taken.
|
5 | datas.push_back(m->createData(&pinocchio_data)); |
287 | 5 | } | |
288 | |||
289 | // create the data of the multiple-contacts | ||
290 | std::shared_ptr<crocoddyl::ContactDataMultiple> data = | ||
291 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | model.createData(&pinocchio_data); |
292 | |||
293 | // compute the multiple contact data for the case when all contacts are | ||
294 | // defined as active | ||
295 |
1/2✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
|
1 | Eigen::VectorXd x1 = model.get_state()->rand(); |
296 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | crocoddyl::unittest::updateAllPinocchio(&pinocchio_model, &pinocchio_data, |
297 | x1); | ||
298 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | model.calc(data, x1); |
299 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | model.calcDiff(data, x1); |
300 | |||
301 | // check that nothing has been computed and that all value are initialized to | ||
302 | // 0 | ||
303 |
7/14✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 1 times.
✗ Branch 23 not taken.
✗ Branch 27 not taken.
✓ Branch 28 taken 1 times.
|
1 | BOOST_CHECK(!data->Jc.isZero()); |
304 |
7/14✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 1 times.
✗ Branch 23 not taken.
✗ Branch 27 not taken.
✓ Branch 28 taken 1 times.
|
1 | BOOST_CHECK(!data->a0.isZero()); |
305 |
7/14✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 1 times.
✗ Branch 23 not taken.
✗ Branch 27 not taken.
✓ Branch 28 taken 1 times.
|
1 | BOOST_CHECK(!data->da0_dx.isZero()); |
306 | |||
307 | // check Jc and a0 against single contact computations | ||
308 | 1 | std::size_t nc = 0; | |
309 | 1 | const std::size_t nv = model.get_state()->get_nv(); | |
310 | 1 | const std::size_t ndx = model.get_state()->get_ndx(); | |
311 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 1 times.
|
6 | for (std::size_t i = 0; i < 5; ++i) { |
312 | 5 | const std::size_t nc_i = models[i]->get_nc(); | |
313 |
2/4✓ Branch 3 taken 5 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 5 times.
✗ Branch 8 not taken.
|
5 | models[i]->calc(datas[i], x1); |
314 |
2/4✓ Branch 3 taken 5 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 5 times.
✗ Branch 8 not taken.
|
5 | models[i]->calcDiff(datas[i], x1); |
315 |
8/16✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 5 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 5 times.
✗ Branch 12 not taken.
✓ Branch 17 taken 5 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 5 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 5 times.
✗ Branch 24 not taken.
✓ Branch 26 taken 5 times.
✗ Branch 27 not taken.
✗ Branch 31 not taken.
✓ Branch 32 taken 5 times.
|
5 | BOOST_CHECK(data->Jc.block(nc, 0, nc_i, nv) == datas[i]->Jc); |
316 |
8/16✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 5 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 5 times.
✗ Branch 12 not taken.
✓ Branch 17 taken 5 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 5 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 5 times.
✗ Branch 24 not taken.
✓ Branch 26 taken 5 times.
✗ Branch 27 not taken.
✗ Branch 31 not taken.
✓ Branch 32 taken 5 times.
|
5 | BOOST_CHECK(data->a0.segment(nc, nc_i) == datas[i]->a0); |
317 |
8/16✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 5 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 5 times.
✗ Branch 12 not taken.
✓ Branch 17 taken 5 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 5 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 5 times.
✗ Branch 24 not taken.
✓ Branch 26 taken 5 times.
✗ Branch 27 not taken.
✗ Branch 31 not taken.
✓ Branch 32 taken 5 times.
|
5 | BOOST_CHECK(data->da0_dx.block(nc, 0, nc_i, ndx) == datas[i]->da0_dx); |
318 | 5 | nc += nc_i; | |
319 | } | ||
320 | 1 | nc = 0; | |
321 | |||
322 | // compute the multiple contact data for the case when the first three | ||
323 | // contacts are defined as active | ||
324 |
2/4✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
|
1 | model.changeContactStatus("random_contact_3", false); |
325 |
2/4✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
|
1 | model.changeContactStatus("random_contact_4", false); |
326 |
1/2✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
|
1 | Eigen::VectorXd x2 = model.get_state()->rand(); |
327 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | crocoddyl::unittest::updateAllPinocchio(&pinocchio_model, &pinocchio_data, |
328 | x2); | ||
329 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | model.calc(data, x2); |
330 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | model.calcDiff(data, x2); |
331 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 1 times.
|
6 | for (std::size_t i = 0; i < 5; ++i) { |
332 | 5 | const std::size_t nc_i = models[i]->get_nc(); | |
333 |
2/2✓ Branch 0 taken 3 times.
✓ Branch 1 taken 2 times.
|
5 | if (i < 3) { // we need to update data because this contacts are active |
334 |
2/4✓ Branch 3 taken 3 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 8 not taken.
|
3 | models[i]->calc(datas[i], x2); |
335 |
2/4✓ Branch 3 taken 3 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 8 not taken.
|
3 | models[i]->calcDiff(datas[i], x2); |
336 | } | ||
337 |
8/16✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 5 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 5 times.
✗ Branch 12 not taken.
✓ Branch 17 taken 5 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 5 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 5 times.
✗ Branch 24 not taken.
✓ Branch 26 taken 5 times.
✗ Branch 27 not taken.
✗ Branch 31 not taken.
✓ Branch 32 taken 5 times.
|
5 | BOOST_CHECK(data->Jc.block(nc, 0, nc_i, nv) == datas[i]->Jc); |
338 |
8/16✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 5 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 5 times.
✗ Branch 12 not taken.
✓ Branch 17 taken 5 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 5 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 5 times.
✗ Branch 24 not taken.
✓ Branch 26 taken 5 times.
✗ Branch 27 not taken.
✗ Branch 31 not taken.
✓ Branch 32 taken 5 times.
|
5 | BOOST_CHECK(data->a0.segment(nc, nc_i) == datas[i]->a0); |
339 |
8/16✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 5 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 5 times.
✗ Branch 12 not taken.
✓ Branch 17 taken 5 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 5 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 5 times.
✗ Branch 24 not taken.
✓ Branch 26 taken 5 times.
✗ Branch 27 not taken.
✗ Branch 31 not taken.
✓ Branch 32 taken 5 times.
|
5 | BOOST_CHECK(data->da0_dx.block(nc, 0, nc_i, ndx) == datas[i]->da0_dx); |
340 | 5 | nc += nc_i; | |
341 | } | ||
342 | 1 | } | |
343 | |||
344 | 1 | void test_calc_diff_no_recalc() { | |
345 | // Setup the test | ||
346 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | StateModelFactory state_factory; |
347 | crocoddyl::ContactModelMultiple model( | ||
348 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
2 | std::static_pointer_cast<crocoddyl::StateMultibody>(state_factory.create( |
349 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | StateModelTypes::StateMultibody_RandomHumanoid))); |
350 | // create the corresponding data object | ||
351 | 1 | pinocchio::Model& pinocchio_model = *model.get_state()->get_pinocchio().get(); | |
352 |
1/2✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
|
1 | pinocchio::Data pinocchio_data(*model.get_state()->get_pinocchio().get()); |
353 | |||
354 | // create and add some contact objects | ||
355 | 1 | std::vector<std::shared_ptr<crocoddyl::ContactModelAbstract> > models; | |
356 | 1 | std::vector<std::shared_ptr<crocoddyl::ContactDataAbstract> > datas; | |
357 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 1 times.
|
6 | for (std::size_t i = 0; i < 5; ++i) { |
358 |
1/2✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
|
5 | std::ostringstream os; |
359 |
2/4✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5 times.
✗ Branch 5 not taken.
|
5 | os << "random_contact_" << i; |
360 | const std::shared_ptr<crocoddyl::ContactModelAbstract>& m = | ||
361 |
1/2✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
|
5 | create_random_contact(); |
362 |
2/4✓ Branch 2 taken 5 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 5 times.
✗ Branch 6 not taken.
|
5 | model.addContact(os.str(), m); |
363 |
1/2✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
|
5 | models.push_back(m); |
364 |
2/4✓ Branch 2 taken 5 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 5 times.
✗ Branch 6 not taken.
|
5 | datas.push_back(m->createData(&pinocchio_data)); |
365 | 5 | } | |
366 | |||
367 | // create the data of the multiple-contacts | ||
368 | std::shared_ptr<crocoddyl::ContactDataMultiple> data = | ||
369 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | model.createData(&pinocchio_data); |
370 | |||
371 | // compute the multiple contact data for the case when all contacts are | ||
372 | // defined as active | ||
373 |
1/2✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
|
1 | Eigen::VectorXd x1 = model.get_state()->rand(); |
374 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | crocoddyl::unittest::updateAllPinocchio(&pinocchio_model, &pinocchio_data, |
375 | x1); | ||
376 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | model.calcDiff(data, x1); |
377 | |||
378 | // check that nothing has been computed and that all value are initialized to | ||
379 | // 0 | ||
380 |
7/14✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 1 times.
✗ Branch 23 not taken.
✗ Branch 27 not taken.
✓ Branch 28 taken 1 times.
|
1 | BOOST_CHECK(data->Jc.isZero()); |
381 |
7/14✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 1 times.
✗ Branch 23 not taken.
✗ Branch 27 not taken.
✓ Branch 28 taken 1 times.
|
1 | BOOST_CHECK(data->a0.isZero()); |
382 |
7/14✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 1 times.
✗ Branch 23 not taken.
✗ Branch 27 not taken.
✓ Branch 28 taken 1 times.
|
1 | BOOST_CHECK(!data->da0_dx.isZero()); |
383 | |||
384 | // check Jc and a0 against single contact computations | ||
385 | 1 | std::size_t nc = 0; | |
386 | 1 | const std::size_t nv = model.get_state()->get_nv(); | |
387 | 1 | const std::size_t ndx = model.get_state()->get_ndx(); | |
388 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 1 times.
|
6 | for (std::size_t i = 0; i < 5; ++i) { |
389 | 5 | const std::size_t nc_i = models[i]->get_nc(); | |
390 |
2/4✓ Branch 3 taken 5 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 5 times.
✗ Branch 8 not taken.
|
5 | models[i]->calcDiff(datas[i], x1); |
391 |
8/16✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 5 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 5 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 5 times.
✗ Branch 16 not taken.
✓ Branch 19 taken 5 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 5 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 5 times.
✗ Branch 26 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 5 times.
|
5 | BOOST_CHECK(data->Jc.block(nc, 0, nc_i, nv).isZero()); |
392 |
8/16✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 5 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 5 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 5 times.
✗ Branch 16 not taken.
✓ Branch 19 taken 5 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 5 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 5 times.
✗ Branch 26 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 5 times.
|
5 | BOOST_CHECK(data->a0.segment(nc, nc_i).isZero()); |
393 |
8/16✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 5 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 5 times.
✗ Branch 12 not taken.
✓ Branch 17 taken 5 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 5 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 5 times.
✗ Branch 24 not taken.
✓ Branch 26 taken 5 times.
✗ Branch 27 not taken.
✗ Branch 31 not taken.
✓ Branch 32 taken 5 times.
|
5 | BOOST_CHECK(data->da0_dx.block(nc, 0, nc_i, ndx) == datas[i]->da0_dx); |
394 | 5 | nc += nc_i; | |
395 | } | ||
396 | 1 | nc = 0; | |
397 | |||
398 | // compute the multiple contact data for the case when the first three | ||
399 | // contacts are defined as active | ||
400 |
2/4✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
|
1 | model.changeContactStatus("random_contact_3", false); |
401 |
2/4✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
|
1 | model.changeContactStatus("random_contact_4", false); |
402 |
1/2✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
|
1 | Eigen::VectorXd x2 = model.get_state()->rand(); |
403 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | crocoddyl::unittest::updateAllPinocchio(&pinocchio_model, &pinocchio_data, |
404 | x2); | ||
405 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | model.calcDiff(data, x2); |
406 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 1 times.
|
6 | for (std::size_t i = 0; i < 5; ++i) { |
407 | 5 | const std::size_t nc_i = models[i]->get_nc(); | |
408 |
2/2✓ Branch 0 taken 3 times.
✓ Branch 1 taken 2 times.
|
5 | if (i < 3) { // we need to update data because this contacts are active |
409 |
2/4✓ Branch 3 taken 3 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 8 not taken.
|
3 | models[i]->calcDiff(datas[i], x2); |
410 | } | ||
411 |
8/16✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 5 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 5 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 5 times.
✗ Branch 16 not taken.
✓ Branch 19 taken 5 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 5 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 5 times.
✗ Branch 26 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 5 times.
|
5 | BOOST_CHECK(data->Jc.block(nc, 0, nc_i, nv).isZero()); |
412 |
8/16✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 5 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 5 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 5 times.
✗ Branch 16 not taken.
✓ Branch 19 taken 5 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 5 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 5 times.
✗ Branch 26 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 5 times.
|
5 | BOOST_CHECK(data->a0.segment(nc, nc_i).isZero()); |
413 |
8/16✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 5 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 5 times.
✗ Branch 12 not taken.
✓ Branch 17 taken 5 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 5 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 5 times.
✗ Branch 24 not taken.
✓ Branch 26 taken 5 times.
✗ Branch 27 not taken.
✗ Branch 31 not taken.
✓ Branch 32 taken 5 times.
|
5 | BOOST_CHECK(data->da0_dx.block(nc, 0, nc_i, ndx) == datas[i]->da0_dx); |
414 | 5 | nc += nc_i; | |
415 | } | ||
416 | 1 | } | |
417 | |||
418 | 1 | void test_updateForce() { | |
419 | // Setup the test | ||
420 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | StateModelFactory state_factory; |
421 | crocoddyl::ContactModelMultiple model( | ||
422 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
2 | std::static_pointer_cast<crocoddyl::StateMultibody>(state_factory.create( |
423 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | StateModelTypes::StateMultibody_RandomHumanoid))); |
424 | |||
425 | // create the corresponding data object | ||
426 | const pinocchio::Model& pinocchio_model = | ||
427 | 1 | *model.get_state()->get_pinocchio().get(); | |
428 |
1/2✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
|
1 | pinocchio::Data pinocchio_data(*model.get_state()->get_pinocchio().get()); |
429 | |||
430 | // create and add some contact objects | ||
431 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 1 times.
|
6 | for (unsigned i = 0; i < 5; ++i) { |
432 |
1/2✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
|
5 | std::ostringstream os; |
433 |
2/4✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5 times.
✗ Branch 5 not taken.
|
5 | os << "random_contact_" << i; |
434 |
3/6✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 5 times.
✗ Branch 8 not taken.
|
5 | model.addContact(os.str(), create_random_contact()); |
435 | 5 | } | |
436 | |||
437 | // create the data of the multiple-contacts | ||
438 | std::shared_ptr<crocoddyl::ContactDataMultiple> data = | ||
439 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | model.createData(&pinocchio_data); |
440 | |||
441 | // Compute the jacobian and check that the contact model fetch it. | ||
442 | Eigen::VectorXd q = | ||
443 |
3/6✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
|
1 | model.get_state()->rand().segment(0, model.get_state()->get_nq()); |
444 |
2/4✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
|
1 | Eigen::VectorXd v = Eigen::VectorXd::Random(model.get_state()->get_nv()); |
445 |
2/4✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
|
1 | Eigen::VectorXd a = Eigen::VectorXd::Random(model.get_state()->get_nv()); |
446 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | pinocchio::computeJointJacobians(pinocchio_model, pinocchio_data, q); |
447 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | pinocchio::updateFramePlacements(pinocchio_model, pinocchio_data); |
448 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | pinocchio::computeForwardKinematicsDerivatives(pinocchio_model, |
449 | pinocchio_data, q, v, a); | ||
450 | |||
451 | // create random forces | ||
452 |
2/4✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
|
1 | Eigen::VectorXd forces = Eigen::VectorXd::Random(model.get_nc()); |
453 | |||
454 | // update forces | ||
455 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | model.updateForce(data, forces); |
456 | |||
457 | // Check that nothing has been computed and that all value are initialized to | ||
458 | // 0 | ||
459 |
7/14✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 1 times.
✗ Branch 23 not taken.
✗ Branch 27 not taken.
✓ Branch 28 taken 1 times.
|
1 | BOOST_CHECK(data->Jc.isZero()); |
460 |
7/14✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 1 times.
✗ Branch 23 not taken.
✗ Branch 27 not taken.
✓ Branch 28 taken 1 times.
|
1 | BOOST_CHECK(data->a0.isZero()); |
461 |
7/14✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 1 times.
✗ Branch 23 not taken.
✗ Branch 27 not taken.
✓ Branch 28 taken 1 times.
|
1 | BOOST_CHECK(data->da0_dx.isZero()); |
462 | 1 | crocoddyl::ContactModelMultiple::ContactDataContainer::iterator it_d, end_d; | |
463 | 1 | for (it_d = data->contacts.begin(), end_d = data->contacts.end(); | |
464 |
2/2✓ Branch 2 taken 5 times.
✓ Branch 3 taken 1 times.
|
6 | it_d != end_d; ++it_d) { |
465 |
8/16✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 5 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 5 times.
✗ Branch 12 not taken.
✓ Branch 16 taken 5 times.
✗ Branch 17 not taken.
✓ Branch 20 taken 5 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 5 times.
✗ Branch 24 not taken.
✓ Branch 26 taken 5 times.
✗ Branch 27 not taken.
✗ Branch 31 not taken.
✓ Branch 32 taken 5 times.
|
5 | BOOST_CHECK(!it_d->second->f.toVector().isZero()); |
466 | } | ||
467 | 1 | } | |
468 | |||
469 | 1 | void test_updateAccelerationDiff() { | |
470 | // Setup the test | ||
471 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | StateModelFactory state_factory; |
472 | crocoddyl::ContactModelMultiple model( | ||
473 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
2 | std::static_pointer_cast<crocoddyl::StateMultibody>(state_factory.create( |
474 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | StateModelTypes::StateMultibody_RandomHumanoid))); |
475 | // create the corresponding data object | ||
476 |
1/2✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
|
1 | pinocchio::Data pinocchio_data(*model.get_state()->get_pinocchio().get()); |
477 | |||
478 | // create and add some contact objects | ||
479 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 1 times.
|
6 | for (unsigned i = 0; i < 5; ++i) { |
480 |
1/2✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
|
5 | std::ostringstream os; |
481 |
2/4✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5 times.
✗ Branch 5 not taken.
|
5 | os << "random_contact_" << i; |
482 |
3/6✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 5 times.
✗ Branch 8 not taken.
|
5 | model.addContact(os.str(), create_random_contact()); |
483 | 5 | } | |
484 | |||
485 | // create the data of the multiple-contacts | ||
486 | std::shared_ptr<crocoddyl::ContactDataMultiple> data = | ||
487 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | model.createData(&pinocchio_data); |
488 | |||
489 | // create the velocity diff | ||
490 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | Eigen::MatrixXd ddv_dx = Eigen::MatrixXd::Random( |
491 |
1/2✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
|
2 | model.get_state()->get_nv(), model.get_state()->get_ndx()); |
492 | |||
493 | // call the update | ||
494 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | model.updateAccelerationDiff(data, ddv_dx); |
495 | |||
496 | // Test | ||
497 |
8/16✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 22 not taken.
✓ Branch 24 taken 1 times.
✗ Branch 25 not taken.
✗ Branch 29 not taken.
✓ Branch 30 taken 1 times.
|
1 | BOOST_CHECK((data->ddv_dx - ddv_dx).isZero(1e-9)); |
498 | 1 | } | |
499 | |||
500 | ✗ | void test_updateForceDiff() { | |
501 | // Setup the test | ||
502 | ✗ | StateModelFactory state_factory; | |
503 | crocoddyl::ContactModelMultiple model( | ||
504 | ✗ | std::static_pointer_cast<crocoddyl::StateMultibody>(state_factory.create( | |
505 | ✗ | StateModelTypes::StateMultibody_RandomHumanoid))); | |
506 | // create the corresponding data object | ||
507 | ✗ | pinocchio::Data pinocchio_data(*model.get_state()->get_pinocchio().get()); | |
508 | |||
509 | // create and add some contact objects | ||
510 | ✗ | for (unsigned i = 0; i < 5; ++i) { | |
511 | ✗ | std::ostringstream os; | |
512 | ✗ | os << "random_contact_" << i; | |
513 | ✗ | model.addContact(os.str(), create_random_contact()); | |
514 | } | ||
515 | |||
516 | // create the data of the multiple-contacts | ||
517 | std::shared_ptr<crocoddyl::ContactDataMultiple> data = | ||
518 | ✗ | model.createData(&pinocchio_data); | |
519 | |||
520 | // create force diff | ||
521 | Eigen::MatrixXd df_dx = | ||
522 | ✗ | Eigen::MatrixXd::Random(model.get_nc(), model.get_state()->get_nv()); | |
523 | Eigen::MatrixXd df_du = | ||
524 | ✗ | Eigen::MatrixXd::Random(model.get_nc(), model.get_state()->get_nv()); | |
525 | |||
526 | // call update force diff | ||
527 | ✗ | model.updateForceDiff(data, df_dx, df_du); | |
528 | |||
529 | // Test | ||
530 | ✗ | crocoddyl::ContactModelMultiple::ContactDataContainer::iterator it_d, end_d; | |
531 | ✗ | for (it_d = data->contacts.begin(), end_d = data->contacts.end(); | |
532 | ✗ | it_d != end_d; ++it_d) { | |
533 | ✗ | BOOST_CHECK(!it_d->second->df_dx.isZero()); | |
534 | } | ||
535 | } | ||
536 | |||
537 | ✗ | void test_assert_updateForceDiff_assert_mismatch_model_data() { | |
538 | // Setup the test | ||
539 | ✗ | StateModelFactory state_factory; | |
540 | crocoddyl::ContactModelMultiple model1( | ||
541 | ✗ | std::static_pointer_cast<crocoddyl::StateMultibody>(state_factory.create( | |
542 | ✗ | StateModelTypes::StateMultibody_RandomHumanoid))); | |
543 | crocoddyl::ContactModelMultiple model2( | ||
544 | ✗ | std::static_pointer_cast<crocoddyl::StateMultibody>(state_factory.create( | |
545 | ✗ | StateModelTypes::StateMultibody_RandomHumanoid))); | |
546 | // create the corresponding data object | ||
547 | ✗ | pinocchio::Data pinocchio_data(*model1.get_state()->get_pinocchio().get()); | |
548 | |||
549 | // create and add some contact objects | ||
550 | ✗ | for (unsigned i = 0; i < 5; ++i) { | |
551 | std::shared_ptr<crocoddyl::ContactModelAbstract> rand_contact = | ||
552 | ✗ | create_random_contact(); | |
553 | { | ||
554 | ✗ | std::ostringstream os; | |
555 | ✗ | os << "random_contact1_" << i; | |
556 | ✗ | model1.addContact(os.str(), rand_contact); | |
557 | } | ||
558 | { | ||
559 | ✗ | std::ostringstream os; | |
560 | ✗ | os << "random_contact2_" << i; | |
561 | ✗ | model2.addContact(os.str(), rand_contact); | |
562 | } | ||
563 | } | ||
564 | |||
565 | // create the data of the multiple-contacts | ||
566 | std::shared_ptr<crocoddyl::ContactDataMultiple> data1 = | ||
567 | ✗ | model1.createData(&pinocchio_data); | |
568 | std::shared_ptr<crocoddyl::ContactDataMultiple> data2 = | ||
569 | ✗ | model2.createData(&pinocchio_data); | |
570 | |||
571 | // create force diff | ||
572 | Eigen::MatrixXd df_dx = | ||
573 | ✗ | Eigen::MatrixXd::Random(model1.get_nc(), model1.get_state()->get_nv()); | |
574 | Eigen::MatrixXd df_du = | ||
575 | ✗ | Eigen::MatrixXd::Random(model1.get_nc(), model1.get_state()->get_nv()); | |
576 | |||
577 | // call that trigger assert | ||
578 | std::string error_message = GetErrorMessages( | ||
579 | ✗ | boost::bind(&updateForceDiff, model1, data2, df_dx, df_du)); | |
580 | |||
581 | // expected error message content | ||
582 | std::string function_name = | ||
583 | "void crocoddyl::ContactModelMultiple::updateForceDiff(" | ||
584 | "const std::shared_ptr<crocoddyl::ContactDataMultiple>&," | ||
585 | ✗ | " const MatrixXd&) const"; | |
586 | std::string assert_argument = | ||
587 | "it_m->first == it_d->first && \"it doesn't match" | ||
588 | ✗ | " the contact name between data and model\""; | |
589 | |||
590 | // Perform the checks | ||
591 | #ifndef __APPLE__ | ||
592 | ✗ | BOOST_CHECK(error_message.find(function_name) != std::string::npos); | |
593 | #endif | ||
594 | ✗ | BOOST_CHECK(error_message.find(assert_argument) != std::string::npos); | |
595 | } | ||
596 | |||
597 | 1 | void test_get_contacts() { | |
598 | // Setup the test | ||
599 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | StateModelFactory state_factory; |
600 | crocoddyl::ContactModelMultiple model( | ||
601 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
2 | std::static_pointer_cast<crocoddyl::StateMultibody>(state_factory.create( |
602 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | StateModelTypes::StateMultibody_RandomHumanoid))); |
603 | // create the corresponding data object | ||
604 |
1/2✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
|
1 | pinocchio::Data pinocchio_data(*model.get_state()->get_pinocchio().get()); |
605 | |||
606 | // create and add some contact objects | ||
607 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 1 times.
|
6 | for (unsigned i = 0; i < 5; ++i) { |
608 |
1/2✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
|
5 | std::ostringstream os; |
609 |
2/4✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5 times.
✗ Branch 5 not taken.
|
5 | os << "random_contact_" << i; |
610 |
3/6✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 5 times.
✗ Branch 8 not taken.
|
5 | model.addContact(os.str(), create_random_contact()); |
611 | 5 | } | |
612 | |||
613 | // get the contacts | ||
614 | const crocoddyl::ContactModelMultiple::ContactModelContainer& contacts = | ||
615 | 1 | model.get_contacts(); | |
616 | |||
617 | // test | ||
618 | 1 | crocoddyl::ContactModelMultiple::ContactModelContainer::const_iterator it_m, | |
619 | 1 | end_m; | |
620 | unsigned i; | ||
621 |
2/2✓ Branch 3 taken 5 times.
✓ Branch 4 taken 1 times.
|
6 | for (i = 0, it_m = contacts.begin(), end_m = contacts.end(); it_m != end_m; |
622 | 5 | ++it_m, ++i) { | |
623 |
1/2✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
|
5 | std::ostringstream os; |
624 |
2/4✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5 times.
✗ Branch 5 not taken.
|
5 | os << "random_contact_" << i; |
625 |
7/14✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 5 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 5 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 5 times.
✗ Branch 15 not taken.
✓ Branch 19 taken 5 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 5 times.
✗ Branch 23 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 5 times.
|
5 | BOOST_CHECK(it_m->first == os.str()); |
626 | 5 | } | |
627 | 1 | } | |
628 | |||
629 | 1 | void test_get_nc() { | |
630 | // Setup the test | ||
631 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | StateModelFactory state_factory; |
632 | crocoddyl::ContactModelMultiple model( | ||
633 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
2 | std::static_pointer_cast<crocoddyl::StateMultibody>(state_factory.create( |
634 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | StateModelTypes::StateMultibody_RandomHumanoid))); |
635 | |||
636 | // create the corresponding data object | ||
637 |
1/2✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
|
1 | pinocchio::Data pinocchio_data(*model.get_state()->get_pinocchio().get()); |
638 | |||
639 | // create and add some contact objects | ||
640 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 1 times.
|
6 | for (unsigned i = 0; i < 5; ++i) { |
641 |
1/2✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
|
5 | std::ostringstream os; |
642 |
2/4✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5 times.
✗ Branch 5 not taken.
|
5 | os << "random_contact_" << i; |
643 |
3/6✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 5 times.
✗ Branch 8 not taken.
|
5 | model.addContact(os.str(), create_random_contact()); |
644 | 5 | } | |
645 | |||
646 | // compute ni | ||
647 | 1 | std::size_t ni = 0; | |
648 | 1 | crocoddyl::ContactModelMultiple::ContactModelContainer::const_iterator it_m, | |
649 | 1 | end_m; | |
650 | 1 | for (it_m = model.get_contacts().begin(), end_m = model.get_contacts().end(); | |
651 |
2/2✓ Branch 1 taken 5 times.
✓ Branch 2 taken 1 times.
|
6 | it_m != end_m; ++it_m) { |
652 | 5 | ni += it_m->second->contact->get_nc(); | |
653 | } | ||
654 | |||
655 |
6/12✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✗ Branch 23 not taken.
✓ Branch 24 taken 1 times.
|
1 | BOOST_CHECK(ni == model.get_nc()); |
656 | 1 | } | |
657 | |||
658 | //----------------------------------------------------------------------------// | ||
659 | |||
660 | 1 | void register_unit_tests() { | |
661 | 1 | framework::master_test_suite().add( | |
662 |
4/8✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
|
1 | BOOST_TEST_CASE(boost::bind(&test_constructor))); |
663 | 1 | framework::master_test_suite().add( | |
664 |
4/8✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
|
1 | BOOST_TEST_CASE(boost::bind(&test_addContact))); |
665 | 1 | framework::master_test_suite().add( | |
666 |
4/8✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
|
1 | BOOST_TEST_CASE(boost::bind(&test_addContact_error_message))); |
667 | 1 | framework::master_test_suite().add( | |
668 |
4/8✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
|
1 | BOOST_TEST_CASE(boost::bind(&test_removeContact))); |
669 | 1 | framework::master_test_suite().add( | |
670 |
4/8✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
|
1 | BOOST_TEST_CASE(boost::bind(&test_removeContact_error_message))); |
671 |
4/8✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
|
1 | framework::master_test_suite().add(BOOST_TEST_CASE(boost::bind(&test_calc))); |
672 | 1 | framework::master_test_suite().add( | |
673 |
4/8✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
|
1 | BOOST_TEST_CASE(boost::bind(&test_calc_diff))); |
674 | 1 | framework::master_test_suite().add( | |
675 |
4/8✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
|
1 | BOOST_TEST_CASE(boost::bind(&test_calc_diff_no_recalc))); |
676 | 1 | framework::master_test_suite().add( | |
677 |
4/8✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
|
1 | BOOST_TEST_CASE(boost::bind(&test_updateForce))); |
678 | 1 | framework::master_test_suite().add( | |
679 |
4/8✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
|
1 | BOOST_TEST_CASE(boost::bind(&test_updateAccelerationDiff))); |
680 | 1 | framework::master_test_suite().add( | |
681 |
4/8✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
|
1 | BOOST_TEST_CASE(boost::bind(&test_get_contacts))); |
682 | 1 | framework::master_test_suite().add( | |
683 |
4/8✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
|
1 | BOOST_TEST_CASE(boost::bind(&test_get_nc))); |
684 | 1 | } | |
685 | |||
686 | 1 | bool init_function() { | |
687 | 1 | register_unit_tests(); | |
688 | 1 | return true; | |
689 | } | ||
690 | |||
691 | 1 | int main(int argc, char** argv) { | |
692 | 1 | return ::boost::unit_test::unit_test_main(&init_function, argc, argv); | |
693 | } | ||
694 |