48 const std::vector<double> &duty_cycles,
49 const std::vector<double> &phase_offsets);
67 double grf_weight,
double standing_error_threshold,
68 std::shared_ptr<quad_utils::QuadKD> kinematics,
69 double foothold_search_radius,
70 double foothold_obj_threshold,
71 std::string obj_fun_layer,
double toe_radius);
81 const Eigen::VectorXd &foot_positions_world,
82 Eigen::VectorXd &foot_positions_body);
91 const Eigen::MatrixXd &foot_positions_world,
92 Eigen::MatrixXd &foot_positions_body);
104 void updateMap(
const grid_map::GridMap &terrain);
115 const Eigen::MatrixXd &body_plan,
116 const Eigen::VectorXi &ref_primitive_plan_,
118 std::vector<std::vector<bool>> &contact_schedule);
138 const std::vector<std::vector<bool>> &contact_schedule,
139 const Eigen::MatrixXd &body_plan,
140 const Eigen::MatrixXd &grf_plan,
141 const Eigen::MatrixXd &ref_body_plan,
142 const Eigen::VectorXd &foot_positions_current,
143 const Eigen::VectorXd &foot_velocities_current,
144 double first_element_duration,
145 quad_msgs::MultiFootState &past_footholds_msg,
146 Eigen::MatrixXd &foot_positions,
147 Eigen::MatrixXd &foot_velocities,
148 Eigen::MatrixXd &foot_accelerations);
165 const std::vector<std::vector<bool>> &contact_schedule,
166 int current_plan_index,
double first_element_duration,
167 const Eigen::MatrixXd &foot_positions,
168 const Eigen::MatrixXd &foot_velocities,
169 const Eigen::MatrixXd &foot_accelerations,
170 quad_msgs::MultiFootPlanDiscrete &future_footholds_msg,
171 quad_msgs::MultiFootPlanContinuous &foot_plan_continuous_msg);
173 inline void printContactSchedule(
174 const std::vector<std::vector<bool>> &contact_schedule) {
175 for (
int i = 0; i < contact_schedule.size(); i++) {
176 for (
int j = 0; j < contact_schedule.at(i).size(); j++) {
177 if (contact_schedule[i][j]) {
187 inline double getTerrainHeight(
double x,
double y) {
188 grid_map::Position pos = {x, y};
191 grid_map::InterpolationMethods::INTER_LINEAR);
195 inline double getTerrainSlope(
double x,
double y,
double dx,
double dy) {
196 std::array<double, 3> surf_norm =
199 double denom = dx * dx + dy * dy;
200 if (denom <= 0 || surf_norm[2] <= 0) {
201 double default_pitch = 0;
202 return default_pitch;
204 double v_proj = (dx * surf_norm[0] + dy * surf_norm[1]) / sqrt(denom);
205 double pitch = atan2(v_proj, surf_norm[2]);
211 inline void getTerrainSlope(
double x,
double y,
double yaw,
double &roll,
213 std::array<double, 3> surf_norm =
216 Eigen::Vector3d norm_vec(surf_norm.data());
217 Eigen::Vector3d axis = Eigen::Vector3d::UnitZ().cross(norm_vec);
219 std::max(std::min(Eigen::Vector3d::UnitZ().dot(norm_vec), 1.), -1.));
226 Eigen::Matrix3d rot(Eigen::AngleAxisd(yaw, Eigen::Vector3d::UnitZ()));
227 axis = rot.transpose() * (axis / axis.norm());
228 tf2::Quaternion quat(tf2::Vector3(axis(0), axis(1), axis(2)), ang);
229 tf2::Matrix3x3 m(quat);
231 m.getRPY(roll, pitch, tmp);
235 inline void setTerrainMap(
const grid_map::GridMap &grid_map) {
241 inline Eigen::VectorXd computeFutureBodyPlan(
242 double step,
const Eigen::VectorXd &body_plan) {
244 Eigen::VectorXd future_body_plan = body_plan;
247 future_body_plan.segment(0, 3) =
248 future_body_plan.segment(0, 3) + body_plan.segment(6, 3) * step *
dt_;
250 return future_body_plan;
272 double vel_next,
double phase,
double duration,
273 double &pos,
double &vel,
double &acc);
282 const Eigen::Vector3d &foot_position,
283 const Eigen::Vector3d &foot_position_prev_solve)
const;
292 std::vector<Eigen::Vector2d> R);
303 const Eigen::Vector3d &foot_position_prev,
304 const Eigen::Vector3d &foot_position_next);
309 inline Eigen::Vector3d
getFootData(
const Eigen::MatrixXd &foot_state_vars,
310 int horizon_index,
int foot_index) {
311 return foot_state_vars.block<1, 3>(horizon_index, 3 * foot_index);
317 inline bool isContact(
const std::vector<std::vector<bool>> &contact_schedule,
318 int horizon_index,
int foot_index) {
319 return (contact_schedule.at(horizon_index).at(foot_index));
326 const std::vector<std::vector<bool>> &contact_schedule,
int horizon_index,
328 if (horizon_index == 0)
return false;
330 return (!
isContact(contact_schedule, horizon_index - 1, foot_index) &&
331 isContact(contact_schedule, horizon_index, foot_index));
338 const std::vector<std::vector<bool>> &contact_schedule,
int horizon_index,
340 if (horizon_index == 0)
return false;
342 return (
isContact(contact_schedule, horizon_index - 1, foot_index) &&
343 !
isContact(contact_schedule, horizon_index, foot_index));
351 const std::vector<std::vector<bool>> &contact_schedule,
int horizon_index,
357 if (
isNewContact(contact_schedule, i_touchdown, foot_index)) {
371 const std::vector<std::vector<bool>> &contact_schedule,
int horizon_index,
377 if (
isNewLiftoff(contact_schedule, i_liftoff, foot_index)) {