Skip to content

Commit 90ec57a

Browse files
author
earlaud
committed
Revert templatisation of interpolator
1 parent 120feaa commit 90ec57a

File tree

3 files changed

+61
-36
lines changed

3 files changed

+61
-36
lines changed

bindings/expose-interpolate.cpp

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,22 @@ namespace simple_mpc
4444
return v_interp;
4545
}
4646

47+
std::vector<bool> interpolateContactsProxy(
48+
Interpolator & self, const double delay, const double timestep, const std::vector<std::vector<bool>> & cs)
49+
{
50+
std::vector<bool> c_interp(cs[0].size());
51+
self.interpolateContacts(delay, timestep, cs, c_interp);
52+
53+
return c_interp;
54+
}
55+
4756
void exposeInterpolator()
4857
{
4958
bp::class_<Interpolator>("Interpolator", bp::init<const Model &>(bp::args("self", "model")))
5059
.def("interpolateConfiguration", &interpolateConfigurationProxy)
5160
.def("interpolateState", &interpolateStateProxy)
52-
.def("interpolateLinear", &interpolateLinearProxy);
61+
.def("interpolateLinear", &interpolateLinearProxy)
62+
.def("interpolateContacts", &interpolateContactsProxy);
5363
}
5464
} // namespace python
5565
} // namespace simple_mpc

include/simple-mpc/interpolator.hxx

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,11 @@ namespace simple_mpc
2525
explicit Interpolator(const Model & model)
2626
: model_(model) {};
2727

28-
template<typename T>
29-
void interpolateConfiguration(const double delay, const double timestep, const std::vector<T> & qs, T & q_interp)
28+
void interpolateConfiguration(
29+
const double delay,
30+
const double timestep,
31+
const std::vector<Eigen::VectorXd> & qs,
32+
Eigen::Ref<Eigen::VectorXd> q_interp)
3033
{
3134
assert(("Configuration is not of the right size", qs[0].size() == model_.nq));
3235

@@ -43,8 +46,11 @@ namespace simple_mpc
4346
}
4447
}
4548

46-
template<typename T>
47-
void interpolateState(const double delay, const double timestep, const std::vector<T> & xs, T & x_interp)
49+
void interpolateState(
50+
const double delay,
51+
const double timestep,
52+
const std::vector<Eigen::VectorXd> & xs,
53+
Eigen::Ref<Eigen::VectorXd> x_interp)
4854
{
4955
assert(("State is not of the right size", xs[0].size() == model_.nq + model_.nv));
5056

@@ -64,8 +70,11 @@ namespace simple_mpc
6470
}
6571
}
6672

67-
template<typename T>
68-
void interpolateLinear(const double delay, const double timestep, const std::vector<T> & vs, T & v_interp)
73+
void interpolateLinear(
74+
const double delay,
75+
const double timestep,
76+
const std::vector<Eigen::VectorXd> & vs,
77+
Eigen::Ref<Eigen::VectorXd> v_interp)
6978
{
7079
// Compute the time knot corresponding to the current delay
7180
size_t step_nb = static_cast<size_t>(delay / timestep);
@@ -80,15 +89,18 @@ namespace simple_mpc
8089
}
8190
}
8291

83-
template<typename T>
84-
void interpolateDiscrete(const double delay, const double timestep, const std::vector<T> & vs, T & v_interp)
92+
void interpolateContacts(
93+
const double delay,
94+
const double timestep,
95+
const std::vector<std::vector<bool>> & cs,
96+
std::vector<bool> & c_interp)
8597
{
8698
// Compute the time knot corresponding to the current delay
8799
size_t step_nb = static_cast<size_t>(delay / timestep);
88-
step_nb = std::clamp(step_nb, 0UL, vs.size() - 1);
100+
step_nb = std::clamp(step_nb, 0UL, cs.size() - 1);
89101

90102
// Set the output arg
91-
v_interp = vs[step_nb];
103+
c_interp = cs[step_nb];
92104
}
93105

94106
// Pinocchio model

tests/interpolator.cpp

Lines changed: 28 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11

22
#include <boost/test/unit_test.hpp>
3+
#include <vector>
34

45
#include "simple-mpc/interpolator.hxx"
56
#include "test_utils.cpp"
@@ -137,46 +138,48 @@ BOOST_AUTO_TEST_CASE(interpolate)
137138
BOOST_CHECK(vs2[0].isApprox(v_interp));
138139
}
139140

140-
// Test discrete interpolation method
141+
// Test contacts interpolation method
141142
{
142-
std::vector<Eigen::VectorXd> vs;
143-
for (std::size_t i = 0; i < 4; i++)
143+
const size_t n_contacts = 4;
144+
145+
std::vector<std::vector<bool>> cs;
146+
for (std::size_t i = 0; i < n_contacts; i++)
144147
{
145-
Eigen::VectorXd v0(model.nv);
146-
v0.setRandom();
147-
vs.push_back(v0);
148+
std::vector<bool> c(n_contacts, false);
149+
c[i] = true;
150+
cs.push_back(c);
148151
}
149-
Eigen::VectorXd v_interp(model.nv);
152+
std::vector<bool> c_interp(n_contacts);
150153

151154
// First element
152-
interpolator.interpolateDiscrete(-0.001, 0.1, vs, v_interp);
153-
BOOST_CHECK(vs[0].isApprox(v_interp));
155+
interpolator.interpolateContacts(-0.001, 0.1, cs, c_interp);
156+
BOOST_CHECK(std::equal(c_interp.begin(), c_interp.end(), cs[0].begin()));
154157

155-
interpolator.interpolateDiscrete(0, 0.1, vs, v_interp);
156-
BOOST_CHECK(vs[0].isApprox(v_interp));
158+
interpolator.interpolateContacts(0, 0.1, cs, c_interp);
159+
BOOST_CHECK(std::equal(c_interp.begin(), c_interp.end(), cs[0].begin()));
157160

158-
interpolator.interpolateDiscrete(0.001, 0.1, vs, v_interp);
159-
BOOST_CHECK(vs[0].isApprox(v_interp));
161+
interpolator.interpolateContacts(0.001, 0.1, cs, c_interp);
162+
BOOST_CHECK(std::equal(c_interp.begin(), c_interp.end(), cs[0].begin()));
160163

161164
// Middle element
162-
interpolator.interpolateDiscrete(0.1, 0.1, vs, v_interp);
163-
BOOST_CHECK(vs[1].isApprox(v_interp));
165+
interpolator.interpolateContacts(0.1, 0.1, cs, c_interp);
166+
BOOST_CHECK(std::equal(c_interp.begin(), c_interp.end(), cs[1].begin()));
164167

165-
interpolator.interpolateDiscrete(0.15, 0.1, vs, v_interp);
166-
BOOST_CHECK(vs[1].isApprox(v_interp));
168+
interpolator.interpolateContacts(0.15, 0.1, cs, c_interp);
169+
BOOST_CHECK(std::equal(c_interp.begin(), c_interp.end(), cs[1].begin()));
167170

168-
interpolator.interpolateDiscrete(0.2, 0.1, vs, v_interp);
169-
BOOST_CHECK(vs[2].isApprox(v_interp));
171+
interpolator.interpolateContacts(0.2, 0.1, cs, c_interp);
172+
BOOST_CHECK(std::equal(c_interp.begin(), c_interp.end(), cs[2].begin()));
170173

171174
// Last element
172-
interpolator.interpolateDiscrete(0.39, 0.1, vs, v_interp);
173-
BOOST_CHECK(vs[3].isApprox(v_interp));
175+
interpolator.interpolateContacts(0.39, 0.1, cs, c_interp);
176+
BOOST_CHECK(std::equal(c_interp.begin(), c_interp.end(), cs[3].begin()));
174177

175-
interpolator.interpolateDiscrete(0.4, 0.1, vs, v_interp);
176-
BOOST_CHECK(vs[3].isApprox(v_interp));
178+
interpolator.interpolateContacts(0.4, 0.1, cs, c_interp);
179+
BOOST_CHECK(std::equal(c_interp.begin(), c_interp.end(), cs[3].begin()));
177180

178-
interpolator.interpolateDiscrete(0.5, 0.1, vs, v_interp);
179-
BOOST_CHECK(vs[3].isApprox(v_interp));
181+
interpolator.interpolateContacts(0.5, 0.1, cs, c_interp);
182+
BOOST_CHECK(std::equal(c_interp.begin(), c_interp.end(), cs[3].begin()));
180183
}
181184
}
182185

0 commit comments

Comments
 (0)