Skip to content

Commit ff40886

Browse files
committed
尝试改为力控
1 parent a1dedeb commit ff40886

File tree

3 files changed

+96
-81
lines changed

3 files changed

+96
-81
lines changed

application/chassis/chassis_balance.c

+30-17
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,8 @@ static Chassis_s CHASSIS = {
5656
.k = {{1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f},
5757
{1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f}},
5858
// clang-format on
59-
.Tp = 0.3f,
60-
.T = 0.5f,
59+
.Tp = TP_RATIO,
60+
.T = T_RATIO,
6161
.length = 1.0f,
6262
},
6363
.dyaw = 0.0f,
@@ -175,7 +175,7 @@ void ChassisHandleException(void)
175175
}
176176

177177
for (uint8_t i = 0; i < 4; i++) {
178-
if (fabs(CHASSIS.joint_motor[i].fdb.tor) > MAX_JOINT_TORQUE) {
178+
if (fabs(CHASSIS.joint_motor[i].fdb.tor) > MAX_TORQUE_PROTECT) {
179179
CHASSIS.error_code |= JOINT_ERROR_OFFSET;
180180
break;
181181
}
@@ -550,11 +550,12 @@ void ChassisReference(void)
550550
/*-------------------- Console --------------------*/
551551

552552
static void LocomotionController(float Tp[2], float T_w[2]);
553-
#ifdef LOCATION_CONTROL
553+
#if LOCATION_CONTROL
554554
static void LegController(double joint_pos_l[2], double joint_pos_r[2]);
555555
#else
556556
static void LegController(float F[2]);
557557
#endif
558+
static float LegFeedForward(float theta);
558559
static void SetK(float leg_length, float k[2][6]);
559560
static void LQRFeedbackCalc(float k[2][6], float x[6], float t[2]);
560561

@@ -640,6 +641,13 @@ static void LocomotionController(float Tp[2], float T_w[2])
640641
Tp[1] = tp - CHASSIS.pid.leg_angle_angle.out;
641642
}
642643

644+
/**
645+
* @brief 前馈控制
646+
* @param[in] theta 当前腿与竖直方向夹角
647+
* @return 前馈量
648+
*/
649+
static float LegFeedForward(float theta) { return BODY_MASS * GRAVITY * cosf(theta) / 2; }
650+
643651
/**
644652
* @brief 设置LQR的反馈矩阵K
645653
* @param[in] leg_length 当前腿长
@@ -681,15 +689,15 @@ static void LQRFeedbackCalc(float k[2][6], float x[6], float t[2])
681689
*/
682690
static void LegController(double joint_pos_l[2], double joint_pos_r[2])
683691
{
684-
// static float delta_Angle = 0;
685-
// float dAngle = CHASSIS.fdb.phi_dot * PITCH_VEL_RATIO;
686-
// float dAngle_1 = PID_calc(&CHASSIS.pid.pitch_angle, CHASSIS.fdb.phi, CHASSIS.ref.phi);
692+
static float delta_Angle = 0;
693+
float dAngle = CHASSIS.fdb.phi_dot * PITCH_VEL_RATIO;
694+
float dAngle_1 = PID_calc(&CHASSIS.pid.pitch_angle, CHASSIS.fdb.phi, CHASSIS.ref.phi);
687695
// float dAngle_2 = PID_calc(&CHASSIS.pid.pitch_vel, CHASSIS.fdb.phi_dot, CHASSIS.ref.phi_dot);
688696

689-
// delta_Angle += (dAngle + dAngle_1) * CHASSIS_CONTROL_TIME_S;
690-
// delta_Angle = fp32_constrain(delta_Angle, MIN_DELTA_ROD_ANGLE, MAX_DELTA_ROD_ANGLE);
697+
delta_Angle += (dAngle + dAngle_1) * CHASSIS_CONTROL_TIME_S;
698+
delta_Angle = fp32_constrain(delta_Angle, MIN_DELTA_ROD_ANGLE, MAX_DELTA_ROD_ANGLE);
691699

692-
float delta_Angle = PID_calc(&CHASSIS.pid.pitch_angle, CHASSIS.fdb.phi, CHASSIS.ref.phi);
700+
// float delta_Angle = PID_calc(&CHASSIS.pid.pitch_angle, CHASSIS.fdb.phi, CHASSIS.ref.phi);
693701

694702
CHASSIS.ref.leg[0].rod.Angle = M_PI_2 + delta_Angle;
695703
CHASSIS.ref.leg[1].rod.Angle = M_PI_2 + delta_Angle;
@@ -724,19 +732,19 @@ static void LegController(float F[2])
724732
&CHASSIS.pid.leg_length_length[0], CHASSIS.fdb.leg[0].rod.Length,
725733
CHASSIS.ref.leg[0].rod.Length);
726734
float theta_l = CHASSIS.fdb.leg[0].rod.Angle - M_PI_2 - CHASSIS.imu->pitch;
727-
float fdf_left = 0; // LegFeedforward(theta_l);
735+
float fdf_left = LegFeedForward(theta_l) * FF_RATIO;
728736

729737
PID_calc(
730738
&CHASSIS.pid.leg_length_length[1], CHASSIS.fdb.leg[1].rod.Length,
731739
CHASSIS.ref.leg[1].rod.Length);
732740
float theta_r = CHASSIS.fdb.leg[1].rod.Angle - M_PI_2 - CHASSIS.imu->pitch;
733-
float fdf_right = 0; // LegFeedforward(theta_r);
741+
float fdf_right = LegFeedForward(theta_r) * FF_RATIO;
734742

735743
PID_calc(&CHASSIS.pid.roll_angle, CHASSIS.fdb.roll, CHASSIS.ref.roll);
736-
PID_calc(&CHASSIS.pid.roll_velocity, CHASSIS.fdb.roll_velocity, CHASSIS.pid.roll_angle.out);
744+
// PID_calc(&CHASSIS.pid.roll_velocity, CHASSIS.fdb.roll_velocity, CHASSIS.pid.roll_angle.out);
737745

738-
F[0] = CHASSIS.pid.leg_length_length[0].out + fdf_left + CHASSIS.pid.roll_velocity.out;
739-
F[1] = CHASSIS.pid.leg_length_length[1].out + fdf_right - CHASSIS.pid.roll_velocity.out;
746+
F[0] = CHASSIS.pid.leg_length_length[0].out + fdf_left + CHASSIS.pid.roll_angle.out;
747+
F[1] = CHASSIS.pid.leg_length_length[1].out + fdf_right - CHASSIS.pid.roll_angle.out;
740748
}
741749
#endif
742750

@@ -807,8 +815,8 @@ static void ConsoleNormal(void)
807815
{
808816
float tp[2], t[2];
809817
LocomotionController(tp, t);
810-
CHASSIS.ref.leg[0].rod.Tp = tp[0];
811-
CHASSIS.ref.leg[1].rod.Tp = tp[1];
818+
CHASSIS.ref.leg[0].rod.Tp = -tp[0];
819+
CHASSIS.ref.leg[1].rod.Tp = -tp[1];
812820

813821
#if LOCATION_CONTROL
814822
double joint_pos_l[2], joint_pos_r[2];
@@ -855,6 +863,11 @@ static void ConsoleNormal(void)
855863

856864
CHASSIS.joint_motor[2].set.tor = -joint_torque[0] * (J2_DIRECTION);
857865
CHASSIS.joint_motor[3].set.tor = -joint_torque[1] * (J3_DIRECTION);
866+
867+
CHASSIS.joint_motor[0].set.tor = fp32_constrain(CHASSIS.joint_motor[0].set.tor, MIN_JOINT_TORQUE, MAX_JOINT_TORQUE);
868+
CHASSIS.joint_motor[1].set.tor = fp32_constrain(CHASSIS.joint_motor[1].set.tor, MIN_JOINT_TORQUE, MAX_JOINT_TORQUE);
869+
CHASSIS.joint_motor[2].set.tor = fp32_constrain(CHASSIS.joint_motor[2].set.tor, MIN_JOINT_TORQUE, MAX_JOINT_TORQUE);
870+
CHASSIS.joint_motor[3].set.tor = fp32_constrain(CHASSIS.joint_motor[3].set.tor, MIN_JOINT_TORQUE, MAX_JOINT_TORQUE);
858871
#endif
859872

860873
// QUESTION: 排查电机发送的力矩要反向的问题,这种情况下控制正常

application/robot_param_balanced_infantry.h

+30-28
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515

1616
// clang-format off
1717
/*-------------------- Chassis --------------------*/
18-
#define LOCATION_CONTROL 1 // 位置控制
18+
#define LOCATION_CONTROL 0 // 位置控制
1919
// 底盘任务相关宏定义
2020
#define CHASSIS_TASK_INIT_TIME 357 // 任务开始空闲一段时间
2121
#define CHASSIS_CONTROL_TIME_MS 2 // 底盘任务控制间隔 2ms
@@ -35,8 +35,12 @@
3535
#define WHEEL_DEADZONE (0.01f) // (m/s)轮子速度死区
3636

3737
// ratio parameters ---------------------
38-
#define VEL_ADD_RATIO (0.008f) // 速度增量比例系数
39-
#define PITCH_VEL_RATIO (0.9f) // pitch轴速度比例系数
38+
#define VEL_ADD_RATIO (0.008f) // 速度增量比例系数
39+
#define PITCH_VEL_RATIO (0.9f) // pitch轴速度比例系数
40+
#define FF_RATIO (0.25f) // 前馈比例系数
41+
42+
#define TP_RATIO (0.08f)
43+
#define T_RATIO (0.5f)
4044

4145
// motor parameters ---------------------
4246
#define JOINT_CAN (1)
@@ -51,6 +55,7 @@
5155
#define W1_DIRECTION (-1)
5256

5357
//physical parameters ---------------------
58+
#define BODY_MASS (12.65813f) // (kg)机身重量
5459
#define LEG_MASS (0.4f) // (kg)腿重量
5560
#define WHEEL_MASS (1.74f) // (kg)轮子重量
5661
#define WHEEL_RADIUS (0.106f) // (m)轮子半径
@@ -66,6 +71,7 @@
6671

6772
//upper_limit parameters ---------------------
6873
#define MAX_DELTA_ROD_ANGLE (0.25f) // (rad)腿摆角最大变化量
74+
#define MAX_TORQUE_PROTECT (10.0f) // (Nm)最大扭矩保护
6975

7076
#define MAX_THETA (1.0f)
7177
#define MAX_THETA_DOT (2.0f)
@@ -92,11 +98,11 @@
9298
#define MAX_SPEED_VECTOR_VY (1.5f)
9399
#define MAX_SPEED_VECTOR_WZ (3.0f)
94100

95-
#define MAX_VEL_ADD (1.0f) // (m/s)速度增量上限
96-
#define MAX_PITCH_VEL (0.1f) // (rad/s)pitch轴速度上限
101+
#define MAX_JOINT_TORQUE (5.0f) // (Nm)关节最大扭矩
102+
#define MAX_VEL_ADD (1.0f) // (m/s)速度增量上限
103+
#define MAX_PITCH_VEL (0.1f) // (rad/s)pitch轴速度上限
97104

98105
#define MAX_TOUCH_INTERVAL (200) // (ms)最大离地时间,超过这个时间认为离地
99-
#define MAX_JOINT_TORQUE (6.0f) // (Nm)关节最大扭矩
100106
//lower_limit parameters ---------------------
101107
#define MIN_DELTA_ROD_ANGLE (-MAX_DELTA_ROD_ANGLE) // (rad)腿摆角最小变化量
102108

@@ -125,8 +131,9 @@
125131
#define MIN_SPEED_VECTOR_VY (-MAX_SPEED_VECTOR_VY)
126132
#define MIN_SPEED_VECTOR_WZ (-MAX_SPEED_VECTOR_WZ)
127133

128-
#define MIN_VEL_ADD (-MAX_VEL_ADD) // (m/s)速度增量下限
129-
#define MIN_PITCH_VEL (-MAX_PITCH_VEL) // (rad/s)pitch轴速度下限
134+
#define MIN_JOINT_TORQUE (-MAX_JOINT_TORQUE) //
135+
#define MIN_VEL_ADD (-MAX_VEL_ADD) // (m/s)速度增量下限
136+
#define MIN_PITCH_VEL (-MAX_PITCH_VEL) // (rad/s)pitch轴速度下限
130137

131138

132139
//PID parameters ---------------------
@@ -145,11 +152,11 @@
145152
#define MAX_OUT_CHASSIS_YAW_VELOCITY (1.0f)
146153

147154
//roll轴跟踪角度环PID参数
148-
#define KP_CHASSIS_ROLL_ANGLE (0.6f)
155+
#define KP_CHASSIS_ROLL_ANGLE (0.0f)
149156
#define KI_CHASSIS_ROLL_ANGLE (0.0f)
150-
#define KD_CHASSIS_ROLL_ANGLE (0.1f)
157+
#define KD_CHASSIS_ROLL_ANGLE (0.0f)
151158
#define MAX_IOUT_CHASSIS_ROLL_ANGLE (0.0f)
152-
#define MAX_OUT_CHASSIS_ROLL_ANGLE (0.12f)
159+
#define MAX_OUT_CHASSIS_ROLL_ANGLE (0.0f)
153160

154161
// //roll轴跟踪速度环PID参数
155162
// #define KP_CHASSIS_ROLL_VELOCITY 0.1f
@@ -159,30 +166,25 @@
159166
// #define MAX_OUT_CHASSIS_ROLL_VELOCITY 0.12f
160167

161168
//pitch轴跟踪角度环PID参数
162-
#define KP_CHASSIS_PITCH_ANGLE (0.8f)
169+
#define KP_CHASSIS_PITCH_ANGLE (0.0f)
163170
#define KI_CHASSIS_PITCH_ANGLE (0.0f)
164-
#define KD_CHASSIS_PITCH_ANGLE (0.3f)
165-
#define MAX_IOUT_CHASSIS_PITCH_ANGLE (0.05f)
166-
#define MAX_OUT_CHASSIS_PITCH_ANGLE (0.2f)
167-
// #define KP_CHASSIS_PITCH_ANGLE (2.0f)
168-
// #define KI_CHASSIS_PITCH_ANGLE (0.0f)
169-
// #define KD_CHASSIS_PITCH_ANGLE (0.2f)
170-
// #define MAX_IOUT_CHASSIS_PITCH_ANGLE (0.0f)
171-
// #define MAX_OUT_CHASSIS_PITCH_ANGLE (1.0f)
171+
#define KD_CHASSIS_PITCH_ANGLE (0.0f)
172+
#define MAX_IOUT_CHASSIS_PITCH_ANGLE (0.0f)
173+
#define MAX_OUT_CHASSIS_PITCH_ANGLE (0.0f)
172174

173175
//pitch轴跟踪速度环PID参数
174-
#define KP_CHASSIS_PITCH_VELOCITY (1.5f)
175-
#define KI_CHASSIS_PITCH_VELOCITY (0.0f)
176-
#define KD_CHASSIS_PITCH_VELOCITY (0.0f)
177-
#define MAX_IOUT_CHASSIS_PITCH_VELOCITY (0.0f)
178-
#define MAX_OUT_CHASSIS_PITCH_VELOCITY (0.0f)
176+
// #define KP_CHASSIS_PITCH_VELOCITY (1.5f)
177+
// #define KI_CHASSIS_PITCH_VELOCITY (0.0f)
178+
// #define KD_CHASSIS_PITCH_VELOCITY (0.0f)
179+
// #define MAX_IOUT_CHASSIS_PITCH_VELOCITY (0.0f)
180+
// #define MAX_OUT_CHASSIS_PITCH_VELOCITY (0.0f)
179181

180182
// 腿长跟踪长度环PID参数
181-
#define KP_CHASSIS_LEG_LENGTH_LENGTH (90.0f)
182-
#define KI_CHASSIS_LEG_LENGTH_LENGTH (0.1f)
183+
#define KP_CHASSIS_LEG_LENGTH_LENGTH (1.0f)
184+
#define KI_CHASSIS_LEG_LENGTH_LENGTH (0.0f)
183185
#define KD_CHASSIS_LEG_LENGTH_LENGTH (1.0f)
184186
#define MAX_IOUT_CHASSIS_LEG_LENGTH_LENGTH (0.5f)
185-
#define MAX_OUT_CHASSIS_LEG_LENGTH_LENGTH (30.0f)
187+
#define MAX_OUT_CHASSIS_LEG_LENGTH_LENGTH (10.0f)
186188

187189
// 腿长跟踪速度环PID参数
188190
// #define KP_CHASSIS_LEG_LENGTH_SPEED 0.0f

components/controller/leg_model.c

+36-36
Original file line numberDiff line numberDiff line change
@@ -289,40 +289,40 @@ void L2K(double L0, double K[12])
289289
/* 2024-03-18 11:58:20 */
290290
t2 = L0 * L0;
291291
t3 = L0 * L0 * L0;
292-
K[0] = ((L0 * -471.26895290849069 + t2 * 655.82771179456677) -
293-
t3 * 588.3102597819942) -
294-
33.946942389013763;
295-
K[1] = ((L0 * 67.93355856622631 - t2 * 299.68896582918688) +
296-
t3 * 352.052850180012) +
297-
24.146302504485291;
298-
K[2] = ((L0 * -46.558110626768539 - t2 * 59.647562966390211) +
299-
t3 * 41.70979643117) -
300-
11.33548614145108;
301-
K[3] = ((L0 * -6.3405825085466407 + t2 * 15.672601321835741) -
302-
t3 * 14.161872016176581) +
303-
7.4540007322748174;
304-
K[4] = ((L0 * -25.943755021409551 + t2 * 60.27738396726874) -
305-
t3 * 53.6960171711332) -
306-
17.613872554801819;
307-
K[5] = ((L0 * -40.635458780584571 + t2 * 60.150208570349967) -
308-
t3 * 36.579993054252192) +
309-
14.169989391295781;
310-
K[6] = ((L0 * -10.9848327194688 - t2 * 24.559200883204142) +
311-
t3 * 47.839287745993943) -
312-
37.386515524085418;
313-
K[7] = ((L0 * -91.437185828499182 + t2 * 176.47795931259941) -
314-
t3 * 146.67425720587451) +
315-
27.167894593487269;
316-
K[8] = ((L0 * -128.50060351277159 + t2 * 190.21166081747671) -
317-
t3 * 115.67609484590849) +
318-
44.809440896934881;
319-
K[9] = ((L0 * 82.041356925319178 - t2 * 190.61382473419741) +
320-
t3 * 169.80171554192819) +
321-
55.69995568908702;
322-
K[10] = ((L0 * -30.910579695490629 + t2 * 62.987841473601947) -
323-
t3 * 55.628594826648992) +
324-
9.3895495473674959;
325-
K[11] = ((L0 * 17.668378988995538 - t2 * 43.043680966815828) +
326-
t3 * 40.559039858925047) +
327-
3.506432700187557;
292+
K[0] = ((L0 * -255.00411409889119 + t2 * 277.20791430131959) -
293+
t3 * 193.628649543518) -
294+
10.663464768105079;
295+
K[1] = ((L0 * 218.04509345933951 - t2 * 698.77836229904381) +
296+
t3 * 729.49732715384755) +
297+
13.492713153034879;
298+
K[2] = ((L0 * -25.6847795144051 - t2 * 40.984568601388958) +
299+
t3 * 37.761484637897979) -
300+
2.9429417903170951;
301+
K[3] = ((L0 * 30.251977741287678 - t2 * 66.353686976052515) +
302+
t3 * 58.077092793225951) +
303+
3.1379053718892989;
304+
K[4] = ((L0 * -37.81755156273605 + t2 * 62.763299712877007) -
305+
t3 * 35.04231722810475) -
306+
13.576411971474741;
307+
K[5] = ((L0 * -61.31974658662913 - t2 * 9.5741774438885017) +
308+
t3 * 97.099511950688282) +
309+
35.7361814333234;
310+
K[6] = ((L0 * -14.1841566253297 - t2 * 29.039707775014559) +
311+
t3 * 61.309562891650579) -
312+
15.54961092745339;
313+
K[7] = ((L0 * -59.15085840928522 + t2 * 41.782414943458193) +
314+
t3 * 12.04836935795807) +
315+
30.39198488175602;
316+
K[8] = ((L0 * -30.659873293307569 - t2 * 4.7870887219700373) +
317+
t3 * 48.549755975375582) +
318+
17.868090716661069;
319+
K[9] = ((L0 * 75.6351031255065 - t2 * 125.5265994258763) +
320+
t3 * 70.084634456346024) +
321+
27.15282394294643;
322+
K[10] = ((L0 * -13.671180603046761 + t2 * 23.9054797259361) -
323+
t3 * 18.8980267722451) +
324+
4.850381218873169;
325+
K[11] = ((L0 * 22.98892399175223 - t2 * 48.223384207980708) +
326+
t3 * 39.184535619891847) +
327+
0.38551400444303008;
328328
}

0 commit comments

Comments
 (0)