-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathCMPC_Locomotion_cv.h
157 lines (122 loc) · 4.31 KB
/
CMPC_Locomotion_cv.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
#pragma once
#include "FloatingBaseModel.h"
#include "Gait_contact.h"
#include "Utilities/SpiralIterator.hpp"
#include "cppTypes.h"
#include "grid_map_ros/grid_map_ros.hpp"
#include <ControlFSMData.h>
#include <FootSwingTrajectory.h>
#include <SparseCMPC/SparseCMPC.h>
#include <geometry_msgs/PoseStamped.h>
#include <nav_msgs/Path.h>
#include <ros/ros.h>
#include <tf2_ros/buffer.h>
#include <tf2_ros/transform_listener.h>
#include <tf_conversions/tf_eigen.h>
#include <visualization_msgs/Marker.h>
#include <cstdio>
using Eigen::Array4f;
using Eigen::Array4i;
#define MAX_STEP_HEIGHT 0.17
class CMPCLocomotion_Cv
{
public:
EIGEN_MAKE_ALIGNED_OPERATOR_NEW
CMPCLocomotion_Cv(float _dt, int _iterations_between_mpc, ControlFSMData<float>* data);
void initialize();
void run(ControlFSMData<float>& data);
void original(ControlFSMData<float>& data);
void myVersion(ControlFSMData<float>& data);
void setGridMapRaw(const grid_map::GridMap& map) { _grid_map_raw = map; }
void setGridMapFilter(const grid_map::GridMap& map) { _grid_map_filter = map; }
void setGridMapPlane(const grid_map::GridMap& map) { _grid_map_plane = map; }
Vec3<float> pBody_des;
Vec3<float> vBody_des;
Vec3<float> aBody_des;
Vec3<float> pBody_RPY_des;
Vec3<float> vBody_Ori_des;
Vec3<float> pFoot_des[4];
Vec3<float> vFoot_des[4];
Vec3<float> aFoot_des[4];
Vec3<float> Fr_des[4];
Vec4<float> contact_state;
private:
void _SetupCommand(float cmd_vel_x, float cmd_vel_y);
void _recompute_timing(int iterations_per_mpc);
void _updateMPCIfNeeded(int* mpcTable, ControlFSMData<float>& data, bool omniMode);
void _solveDenseMPC(int* mpcTable, ControlFSMData<float>& data);
void _solveSparseMPC(int* mpcTable, ControlFSMData<float>& data);
void _initSparseMPC();
void _updateModel(const StateEstimate<float>& state_est, const LegControllerData<float>* leg_data);
void _updateFoothold(Vec3<float>& pf, const Vec3<float>& body_pos, const int& leg);
void _idxMapChecking(Vec3<float>& Pf, int x_idx, int y_idx, int& x_idx_selected, int& y_idx_selected, const int& leg);
void _findPF(Vec3<float>& v_des_world, size_t foot);
void _body_height_heuristics(std::string type);
float _updateTrajHeight(size_t foot);
double _findMaxInMapByLine(const grid_map::GridMap& map,
grid_map::Index start,
grid_map::Index end,
const grid_map::Index* cell_idx = nullptr);
void _longStep(const grid_map::GridMap& map, int foot);
void _hipSefetyCircle(Vec3<float>& pDesLeg, Vec3<float>& pDesFootWorld, const int& foot);
std::vector<float> calcDesVel();
// Parameters
ControlFSMData<float>* _data;
be2r_cmpc_unitree::ros_dynamic_paramsConfig* _parameters = nullptr;
// Gait
Gait_contact* _gait;
int _gait_period;
int _gait_period_long;
OffsetDurationGaitContact trotting, trot_long, standing, walking;
int current_gait;
int _gait_des;
bool _doorstep_case;
Vec4<float> swingTimes;
FootSwingTrajectory<float> footSwingTrajectories[4];
float swingTimeRemaining[4];
float _swing_trajectory_hight = 0.09;
float _body_height = 0.29;
float _yaw_turn_rate;
float _yaw_des = 0;
float _roll_des;
float _pitch_des;
float _pitch_cmd = 0;
Vec3<float> world_position_desired;
float _x_vel_des = 0.;
float _y_vel_des = 0.;
Vec3<float> rpy_int;
Vec3<float> rpy_comp;
FloatingBaseModel<float> _model;
FBModelState<float> _state;
DMat<float> _A;
DMat<float> _Ainv;
DVec<float> _grav;
DVec<float> _coriolis;
int iterationCounter = 0;
int iterationsBetweenMPC;
int horizonLength;
int default_iterations_between_mpc;
float dt;
float dtMPC;
Vec3<float> f_ff[4];
Mat3<float> Kp, Kd, Kp_stance, Kd_stance;
bool firstRun = true;
bool firstSwing[4];
float stand_traj[6];
float x_comp_integral = 0;
Vec3<float> pFoot[4];
float trajAll[12 * 36];
ros::NodeHandle _nh;
vectorAligned<Vec12<double>> _sparseTrajectory;
SparseCMPC _sparseCMPC;
double _max_cell;
bool long_step_run = false;
bool long_step_trigger = false;
bool long_step_vel = false;
grid_map::GridMap _grid_map_raw;
grid_map::GridMap _grid_map_filter;
grid_map::GridMap _grid_map_plane;
tf2_ros::Buffer _tf_buffer;
tf2_ros::TransformListener _tf_listener;
};
Eigen::Array2i checkBoundariess(const grid_map::GridMap& map, int col, int row);