Skip to content

Commit b8cd6b1

Browse files
committed
Variable duration implemented
1 parent 53249d0 commit b8cd6b1

17 files changed

+697
-415
lines changed

bindings/expose-footsteps.cpp

+7-6
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,9 @@ void exposeFootsteps()
2929
.def("support_polygon", &FootstepsPlanner::Footstep::support_polygon)
3030
.def("overlap", &FootstepsPlanner::Footstep::overlap)
3131
.def("polygon_contains", &FootstepsPlanner::Footstep::polygon_contains)
32-
.staticmethod("polygon_contains")
33-
.add_property("kick", &FootstepsPlanner::Footstep::kick, &FootstepsPlanner::Footstep::kick);
32+
.staticmethod("polygon_contains");
3433

35-
class__<FootstepsPlanner::Support>("Support")
34+
class__<FootstepsPlanner::Support>("Support", init<std::vector<FootstepsPlanner::Footstep>>())
3635
.def("support_polygon", &FootstepsPlanner::Support::support_polygon)
3736
.def("frame", &FootstepsPlanner::Support::frame)
3837
.def("footstep_frame", &FootstepsPlanner::Support::footstep_frame)
@@ -42,14 +41,16 @@ void exposeFootsteps()
4241
"set_start", +[](FootstepsPlanner::Support& support, bool b) { support.start = b; })
4342
.def(
4443
"set_end", +[](FootstepsPlanner::Support& support, bool b) { support.end = b; })
45-
.def("kick", &FootstepsPlanner::Support::kick)
4644
.add_property("footsteps", &FootstepsPlanner::Support::footsteps)
45+
.add_property("t_start", &FootstepsPlanner::Support::t_start, &FootstepsPlanner::Support::t_start)
46+
.add_property("elapsed_ratio", &FootstepsPlanner::Support::elapsed_ratio, &FootstepsPlanner::Support::elapsed_ratio)
47+
.add_property("time_ratio", &FootstepsPlanner::Support::time_ratio, &FootstepsPlanner::Support::time_ratio)
4748
.add_property("start", &FootstepsPlanner::Support::start, &FootstepsPlanner::Support::start)
48-
.add_property("end", &FootstepsPlanner::Support::end, &FootstepsPlanner::Support::end);
49+
.add_property("end", &FootstepsPlanner::Support::end, &FootstepsPlanner::Support::end)
50+
.add_property("replanned", &FootstepsPlanner::Support::replanned, &FootstepsPlanner::Support::replanned);
4951

5052
class__<FootstepsPlanner, boost::noncopyable>("FootstepsPlanner", no_init)
5153
.def("make_supports", &FootstepsPlanner::make_supports)
52-
.def("add_first_support", &FootstepsPlanner::add_first_support)
5354
.def("opposite_footstep", &FootstepsPlanner::opposite_footstep);
5455

5556
class__<FootstepsPlannerNaive, bases<FootstepsPlanner>>("FootstepsPlannerNaive", init<HumanoidParameters&>())

bindings/expose-parameters.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,8 @@ void exposeParameters()
4747
&HumanoidParameters::walk_dtheta_spacing)
4848
.def("dt", &HumanoidParameters::dt)
4949
.def("double_support_timesteps", &HumanoidParameters::double_support_timesteps)
50-
.def("double_support_duration", &HumanoidParameters::double_support_duration)
5150
.def("startend_double_support_timesteps", &HumanoidParameters::startend_double_support_timesteps)
51+
.def("double_support_duration", &HumanoidParameters::double_support_duration)
5252
.def("startend_double_support_duration", &HumanoidParameters::startend_double_support_duration)
5353
.def("has_double_support", &HumanoidParameters::has_double_support)
5454
.def("ellipsoid_clip", &HumanoidParameters::ellipsoid_clip);

bindings/expose-walk-pattern-generator.cpp

+28-8
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,22 @@ using namespace placo::humanoid;
2222

2323
void exposeWalkPatternGenerator()
2424
{
25-
class__<WalkPatternGenerator::Trajectory>("WalkTrajectory")
25+
class__<WalkPatternGenerator::TrajectoryPart>("WPGTrajectoryPart", init<FootstepsPlanner::Support, double>())
26+
.add_property("t_start", &WalkPatternGenerator::TrajectoryPart::t_start)
27+
.add_property("t_end", &WalkPatternGenerator::TrajectoryPart::t_end, &WalkPatternGenerator::TrajectoryPart::t_end)
28+
.add_property("support", &WalkPatternGenerator::TrajectoryPart::support);
29+
30+
class__<WalkPatternGenerator::Trajectory>("WPGTrajectory", init<double, double, double>())
2631
.add_property("t_start", &WalkPatternGenerator::Trajectory::t_start)
2732
.add_property("t_end", &WalkPatternGenerator::Trajectory::t_end)
33+
.add_property("com_target_z", &WalkPatternGenerator::Trajectory::com_target_z)
34+
.add_property("trunk_pitch", &WalkPatternGenerator::Trajectory::trunk_pitch)
35+
.add_property("trunk_roll", &WalkPatternGenerator::Trajectory::trunk_roll)
36+
.add_property("kept_ts", &WalkPatternGenerator::Trajectory::kept_ts)
2837
.def("get_T_world_left", &WalkPatternGenerator::Trajectory::get_T_world_left)
29-
.def("get_supports", &WalkPatternGenerator::Trajectory::get_supports)
3038
.def("get_T_world_right", &WalkPatternGenerator::Trajectory::get_T_world_right)
39+
.def("get_v_world_right", &WalkPatternGenerator::Trajectory::get_v_world_right)
40+
.def("get_v_world_foot", &WalkPatternGenerator::Trajectory::get_v_world_foot)
3141
.def("get_p_world_CoM", &WalkPatternGenerator::Trajectory::get_p_world_CoM)
3242
.def("get_v_world_CoM", &WalkPatternGenerator::Trajectory::get_v_world_CoM)
3343
.def("get_a_world_CoM", &WalkPatternGenerator::Trajectory::get_a_world_CoM)
@@ -37,11 +47,13 @@ void exposeWalkPatternGenerator()
3747
.def("get_R_world_trunk", &WalkPatternGenerator::Trajectory::get_R_world_trunk)
3848
.def("support_side", &WalkPatternGenerator::Trajectory::support_side)
3949
.def("support_is_both", &WalkPatternGenerator::Trajectory::support_is_both)
50+
.def("get_supports", &WalkPatternGenerator::Trajectory::get_supports)
4051
.def("get_support", &WalkPatternGenerator::Trajectory::get_support)
4152
.def("get_next_support", &WalkPatternGenerator::Trajectory::get_next_support)
4253
.def("get_prev_support", &WalkPatternGenerator::Trajectory::get_prev_support)
4354
.def("get_part_t_start", &WalkPatternGenerator::Trajectory::get_part_t_start)
44-
.def("apply_transform", &WalkPatternGenerator::Trajectory::apply_transform);
55+
.def("apply_transform", &WalkPatternGenerator::Trajectory::apply_transform)
56+
.def("print_parts_timings", &WalkPatternGenerator::Trajectory::print_parts_timings);
4557

4658
class__<WalkPatternGenerator>("WalkPatternGenerator", init<HumanoidRobot&, HumanoidParameters&>())
4759
.def("plan", &WalkPatternGenerator::plan)
@@ -124,16 +136,24 @@ void exposeWalkPatternGenerator()
124136
.def("dzmp", &LIPM::Trajectory::dzmp)
125137
.def("dcm", &LIPM::Trajectory::dcm);
126138

127-
class__<LIPM>("LIPM", init<problem::Problem&, int, double, Eigen::Vector2d, Eigen::Vector2d, Eigen::Vector2d>())
139+
class__<LIPM>("LIPM", init<problem::Problem&, double, int, double, Eigen::Vector2d, Eigen::Vector2d, Eigen::Vector2d>())
140+
.def("compute_omega", &LIPM::compute_omega)
141+
.def("get_trajectory", &LIPM::get_trajectory)
128142
.def("pos", &LIPM::pos)
129143
.def("vel", &LIPM::vel)
130144
.def("acc", &LIPM::acc)
131145
.def("jerk", &LIPM::jerk)
146+
.def("dcm", &LIPM::dcm)
132147
.def("zmp", &LIPM::zmp)
133148
.def("dzmp", &LIPM::dzmp)
134-
.def("dcm", &LIPM::dcm)
135-
.def("compute_omega", &LIPM::compute_omega)
149+
.def("build_LIPM_from_previous", &LIPM::build_LIPM_from_previous)
136150
.def("get_trajectory", &LIPM::get_trajectory)
137-
.add_property("x", &LIPM::x)
138-
.add_property("y", &LIPM::y);
151+
.add_property("dt", &LIPM::dt, &LIPM::dt)
152+
.add_property("timesteps", &LIPM::timesteps, &LIPM::timesteps)
153+
.add_property("t_start", &LIPM::t_start, &LIPM::t_start)
154+
.add_property("t_end", &LIPM::t_end, &LIPM::t_end)
155+
.add_property("x_var", &LIPM::x_var, &LIPM::x_var)
156+
.add_property("y_var", &LIPM::y_var, &LIPM::y_var)
157+
.add_property("x", &LIPM::x, &LIPM::x)
158+
.add_property("y", &LIPM::y, &LIPM::y);
139159
}

src/placo/humanoid/footsteps_planner.cpp

+41-58
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,16 @@ bool FootstepsPlanner::Footstep::overlap(Footstep& other, double margin)
9393
return false;
9494
}
9595

96+
bool FootstepsPlanner::Footstep::operator==(const Footstep& other)
97+
{
98+
return side == other.side && frame.isApprox(other.frame);
99+
}
100+
101+
FootstepsPlanner::Support::Support(std::vector<Footstep> footsteps)
102+
: footsteps(footsteps)
103+
{
104+
}
105+
96106
std::vector<Eigen::Vector2d> FootstepsPlanner::Support::support_polygon()
97107
{
98108
if (!computed_polygon)
@@ -122,16 +132,6 @@ std::vector<Eigen::Vector2d> FootstepsPlanner::Support::support_polygon()
122132
return polygon;
123133
}
124134

125-
bool FootstepsPlanner::Support::kick()
126-
{
127-
if (is_both())
128-
{
129-
return false;
130-
}
131-
132-
return footsteps[0].kick;
133-
}
134-
135135
Eigen::Affine3d FootstepsPlanner::Support::frame()
136136
{
137137
Eigen::Affine3d f;
@@ -167,32 +167,6 @@ Eigen::Affine3d FootstepsPlanner::Support::footstep_frame(HumanoidRobot::Side si
167167
throw std::logic_error("Asked for a frame that doesn't exist");
168168
}
169169

170-
FootstepsPlanner::FootstepsPlanner(HumanoidParameters& parameters) : parameters(parameters)
171-
{
172-
}
173-
174-
bool FootstepsPlanner::Footstep::operator==(const Footstep& other)
175-
{
176-
return side == other.side && frame.isApprox(other.frame);
177-
}
178-
179-
bool FootstepsPlanner::Support::operator==(const Support& other)
180-
{
181-
if (footsteps.size() != other.footsteps.size())
182-
{
183-
return false;
184-
}
185-
for (int k = 0; k < footsteps.size(); k++)
186-
{
187-
if (!(footsteps[k] == other.footsteps[k]))
188-
{
189-
return false;
190-
}
191-
}
192-
193-
return true;
194-
}
195-
196170
HumanoidRobot::Side FootstepsPlanner::Support::side()
197171
{
198172
if (footsteps.size() > 1)
@@ -222,8 +196,29 @@ FootstepsPlanner::Support operator*(Eigen::Affine3d T, const FootstepsPlanner::S
222196
return new_support;
223197
}
224198

199+
bool FootstepsPlanner::Support::operator==(const Support& other)
200+
{
201+
if (footsteps.size() != other.footsteps.size())
202+
{
203+
return false;
204+
}
205+
for (int k = 0; k < footsteps.size(); k++)
206+
{
207+
if (!(footsteps[k] == other.footsteps[k]))
208+
{
209+
return false;
210+
}
211+
}
212+
213+
return true;
214+
}
215+
216+
FootstepsPlanner::FootstepsPlanner(HumanoidParameters& parameters) : parameters(parameters)
217+
{
218+
}
219+
225220
std::vector<FootstepsPlanner::Support>
226-
FootstepsPlanner::make_supports(std::vector<FootstepsPlanner::Footstep> footsteps, bool start, bool middle, bool end)
221+
FootstepsPlanner::make_supports(std::vector<FootstepsPlanner::Footstep> footsteps, double t_start, bool start, bool middle, bool end)
227222
{
228223
std::vector<Support> supports;
229224

@@ -232,40 +227,36 @@ FootstepsPlanner::make_supports(std::vector<FootstepsPlanner::Footstep> footstep
232227
if (start)
233228
{
234229
// Creating the first (double-support) initial state
235-
Support support;
230+
Support support({footsteps[0], footsteps[1]});
236231
support.start = true;
237-
support.footsteps = { footsteps[0], footsteps[1] };
232+
support.t_start = t_start;
238233
supports.push_back(support);
239234
}
240235
else
241236
{
242-
Support support;
243-
support.footsteps = { footsteps[0] };
237+
Support support({footsteps[0]});
238+
support.t_start = t_start;
244239
supports.push_back(support);
245240

246241
if (middle)
247242
{
248-
Support double_support;
249-
double_support.footsteps = { footsteps[0], footsteps[1] };
250-
243+
Support double_support({footsteps[0], footsteps[1]});
244+
double_support.t_start = t_start;
251245
supports.push_back(double_support);
252246
}
253247
}
254248

255249
// Adding single/double support phases
256250
for (int step = 1; step < footsteps.size() - 1; step++)
257251
{
258-
Support single_support;
259-
single_support.footsteps = { footsteps[step] };
252+
Support single_support({footsteps[step]});
260253
supports.push_back(single_support);
261254

262255
bool is_end = (step == footsteps.size() - 2);
263256

264257
if ((!is_end && middle))
265258
{
266-
Support double_support;
267-
double_support.footsteps = { footsteps[step], footsteps[step + 1] };
268-
259+
Support double_support({footsteps[step], footsteps[step + 1]});
269260
supports.push_back(double_support);
270261
}
271262
}
@@ -274,22 +265,14 @@ FootstepsPlanner::make_supports(std::vector<FootstepsPlanner::Footstep> footstep
274265
if (end)
275266
{
276267
// Creating the first (double-support) initial state
277-
Support support;
268+
Support support({footsteps[footsteps.size() - 2], footsteps[footsteps.size() - 1]});
278269
support.end = true;
279-
support.footsteps = { footsteps[footsteps.size() - 2], footsteps[footsteps.size() - 1] };
280270
supports.push_back(support);
281271
}
282272

283273
return supports;
284274
}
285275

286-
void FootstepsPlanner::add_first_support(std::vector<Support>& supports, Support support)
287-
{
288-
supports[0].start = false;
289-
supports.insert(supports.begin(), support);
290-
supports[0].start = true;
291-
}
292-
293276
FootstepsPlanner::Footstep FootstepsPlanner::create_footstep(HumanoidRobot::Side side, Eigen::Affine3d T_world_foot)
294277
{
295278
FootstepsPlanner::Footstep footstep(parameters.foot_width, parameters.foot_length);

src/placo/humanoid/footsteps_planner.h

+17-10
Original file line numberDiff line numberDiff line change
@@ -17,19 +17,21 @@ class FootstepsPlanner
1717
struct Footstep
1818
{
1919
Footstep(double foot_width, double foot_length);
20+
2021
double foot_width;
2122
double foot_length;
23+
2224
HumanoidRobot::Side side;
2325
Eigen::Affine3d frame;
26+
2427
std::vector<Eigen::Vector2d> polygon;
2528
bool computed_polygon = false;
26-
bool kick = false;
27-
28-
bool operator==(const Footstep& other);
2929

3030
std::vector<Eigen::Vector2d> support_polygon();
3131
std::vector<Eigen::Vector2d> compute_polygon(double margin = 0.);
3232

33+
bool operator==(const Footstep& other);
34+
3335
bool overlap(Footstep& other, double margin = 0.);
3436

3537
static bool polygon_contains(std::vector<Eigen::Vector2d>& polygon, Eigen::Vector2d point);
@@ -41,13 +43,21 @@ class FootstepsPlanner
4143
*/
4244
struct Support
4345
{
46+
Support(std::vector<Footstep> footsteps);
47+
4448
std::vector<Footstep> footsteps;
45-
std::vector<Eigen::Vector2d> polygon;
46-
bool computed_polygon = false;
49+
50+
double t_start = -1.; // Time at which the support starts. Is set to -1 if not initialized
51+
double elapsed_ratio = 0.; // Elapsed ratio of the support phase, ranging from 0 to 1
52+
double time_ratio = 1.; // Time ratio for the remaining part of the support phase
53+
4754
bool start = false;
4855
bool end = false;
4956
bool replanned = false;
50-
bool kick();
57+
58+
std::vector<Eigen::Vector2d> polygon;
59+
bool computed_polygon = false;
60+
5161
std::vector<Eigen::Vector2d> support_polygon();
5262

5363
/**
@@ -105,16 +115,13 @@ class FootstepsPlanner
105115
* @return vector of supports to use. It starts with initial double supports,
106116
* and add double support phases between footsteps.
107117
*/
108-
static std::vector<Support> make_supports(std::vector<Footstep> footsteps, bool start = true, bool middle = false,
109-
bool end = true);
118+
static std::vector<Support> make_supports(std::vector<Footstep> footsteps, double t_start, bool start = true, bool middle = false, bool end = true);
110119

111120
/**
112121
* @brief Return the type of footsteps planner
113122
*/
114123
virtual std::string name() = 0;
115124

116-
static void add_first_support(std::vector<Support>& supports, Support support);
117-
118125
/**
119126
* @brief Return the opposite footstep in a neutral position (i.e. at a
120127
* distance parameters.feet_spacing from the given footstep)

src/placo/humanoid/humanoid_parameters.cpp

+4-4
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,14 @@ int HumanoidParameters::double_support_timesteps()
1313
return std::round(double_support_ratio * single_support_timesteps);
1414
}
1515

16-
double HumanoidParameters::double_support_duration()
16+
int HumanoidParameters::startend_double_support_timesteps()
1717
{
18-
return double_support_timesteps() * dt();
18+
return std::round(startend_double_support_ratio * single_support_timesteps);
1919
}
2020

21-
int HumanoidParameters::startend_double_support_timesteps()
21+
double HumanoidParameters::double_support_duration()
2222
{
23-
return std::round(startend_double_support_ratio * single_support_timesteps);
23+
return double_support_timesteps() * dt();
2424
}
2525

2626
double HumanoidParameters::startend_double_support_duration()

src/placo/humanoid/humanoid_parameters.h

+4-4
Original file line numberDiff line numberDiff line change
@@ -40,22 +40,22 @@ class HumanoidParameters
4040
double startend_double_support_ratio = 1.;
4141

4242
/**
43-
* @brief Duration [s] of a double support
43+
* @brief Default duration [s] of a double support
4444
*/
4545
double double_support_duration();
4646

4747
/**
48-
* @brief Duration [s] of a start/end double support
48+
* @brief Default duration [s] of a start/end double support
4949
*/
5050
double startend_double_support_duration();
5151

5252
/**
53-
* @brief Number of timesteps for one double support
53+
* @brief Default number of timesteps for one double support
5454
*/
5555
int double_support_timesteps();
5656

5757
/**
58-
* @brief Number of timesteps for one start/end double support
58+
* @brief Default number of timesteps for one start/end double support
5959
*/
6060
int startend_double_support_timesteps();
6161

0 commit comments

Comments
 (0)