19 #ifndef PMC_PMC_SIM_H_
20 #define PMC_PMC_SIM_H_
22 #include <Eigen/Dense>
28 void Initialize(
float Kp,
float Ki,
float Kd,
float out_max,
float out_min);
32 float kp, ki, kd, omax, omin;
39 explicit Blower(
bool is_pmc1);
40 void Step(
int impeller_cmd, Eigen::Matrix<float, 6, 1> & servo_cmd, Eigen::Vector3f & omega,
float voltage);
41 Eigen::Vector3f
Force() {
return force_B_;}
42 Eigen::Vector3f
Torque() {
return torque_B_;}
49 void ServoModel(
const Eigen::Matrix<float, 6, 1> & servo_cmd, Eigen::Matrix<float, 6, 1> & nozzle_theta,
50 Eigen::Matrix<float, 6, 1> & nozzle_area);
51 void ImpellerModel(
int speed_cmd,
float voltage,
float* motor_current,
float* motor_torque);
52 Eigen::Matrix<float, 6, 1> Aerodynamics(
const Eigen::Matrix<float, 6, 1> & nozzle_area);
53 void BlowerBodyDynamics(
const Eigen::Vector3f & omega_body, Eigen::Matrix<float, 6, 1> & nozzle_thrusts,
56 Eigen::Matrix<float, 6, 1> prev_omega_, servo_thetas_, backlash_theta_, discharge_coeff_;
57 Eigen::Matrix<float, 6, 3> nozzle_offsets_, nozzle_orientations_;
58 Eigen::Vector3f center_of_mass_, impeller_orientation_;
59 PID servo_pids_[6], speed_pid_;
60 float prev_speed_rate_;
61 float zero_thrust_area_;
63 Eigen::Vector3f force_B_, torque_B_;
64 Eigen::Matrix<float, 6, 1> nozzles_theta_, servo_current_;
65 float impeller_speed_, last_speed_;
66 float impeller_current_;
76 void SetImpellerCmd(
int blower,
unsigned char cmd) {impeller_cmd_[blower] = cmd;}
77 unsigned char ImpellerCmd(
int blower) {
return impeller_cmd_[blower];}
78 void SetServoCmd(
int blower,
int index,
float value) {servo_cmd_[blower][index] = value;}
85 Eigen::Vector3f omega_;
87 unsigned char impeller_cmd_[2];
88 Eigen::Matrix<float, 6, 1> servo_cmd_[2];
93 #endif // PMC_PMC_SIM_H_