@@ -56,8 +56,8 @@ static Chassis_s CHASSIS = {
56
56
.k = {{1.0f , 1.0f , 1.0f , 1.0f , 1.0f , 1.0f },
57
57
{1.0f , 1.0f , 1.0f , 1.0f , 1.0f , 1.0f }},
58
58
// clang-format on
59
- .Tp = 0.3f ,
60
- .T = 0.5f ,
59
+ .Tp = TP_RATIO ,
60
+ .T = T_RATIO ,
61
61
.length = 1.0f ,
62
62
},
63
63
.dyaw = 0.0f ,
@@ -175,7 +175,7 @@ void ChassisHandleException(void)
175
175
}
176
176
177
177
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 ) {
179
179
CHASSIS .error_code |= JOINT_ERROR_OFFSET ;
180
180
break ;
181
181
}
@@ -550,11 +550,12 @@ void ChassisReference(void)
550
550
/*-------------------- Console --------------------*/
551
551
552
552
static void LocomotionController (float Tp [2 ], float T_w [2 ]);
553
- #ifdef LOCATION_CONTROL
553
+ #if LOCATION_CONTROL
554
554
static void LegController (double joint_pos_l [2 ], double joint_pos_r [2 ]);
555
555
#else
556
556
static void LegController (float F [2 ]);
557
557
#endif
558
+ static float LegFeedForward (float theta );
558
559
static void SetK (float leg_length , float k [2 ][6 ]);
559
560
static void LQRFeedbackCalc (float k [2 ][6 ], float x [6 ], float t [2 ]);
560
561
@@ -640,6 +641,13 @@ static void LocomotionController(float Tp[2], float T_w[2])
640
641
Tp [1 ] = tp - CHASSIS .pid .leg_angle_angle .out ;
641
642
}
642
643
644
+ /**
645
+ * @brief 前馈控制
646
+ * @param[in] theta 当前腿与竖直方向夹角
647
+ * @return 前馈量
648
+ */
649
+ static float LegFeedForward (float theta ) { return BODY_MASS * GRAVITY * cosf (theta ) / 2 ; }
650
+
643
651
/**
644
652
* @brief 设置LQR的反馈矩阵K
645
653
* @param[in] leg_length 当前腿长
@@ -681,15 +689,15 @@ static void LQRFeedbackCalc(float k[2][6], float x[6], float t[2])
681
689
*/
682
690
static void LegController (double joint_pos_l [2 ], double joint_pos_r [2 ])
683
691
{
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 );
687
695
// float dAngle_2 = PID_calc(&CHASSIS.pid.pitch_vel, CHASSIS.fdb.phi_dot, CHASSIS.ref.phi_dot);
688
696
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 );
691
699
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);
693
701
694
702
CHASSIS .ref .leg [0 ].rod .Angle = M_PI_2 + delta_Angle ;
695
703
CHASSIS .ref .leg [1 ].rod .Angle = M_PI_2 + delta_Angle ;
@@ -724,19 +732,19 @@ static void LegController(float F[2])
724
732
& CHASSIS .pid .leg_length_length [0 ], CHASSIS .fdb .leg [0 ].rod .Length ,
725
733
CHASSIS .ref .leg [0 ].rod .Length );
726
734
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 ;
728
736
729
737
PID_calc (
730
738
& CHASSIS .pid .leg_length_length [1 ], CHASSIS .fdb .leg [1 ].rod .Length ,
731
739
CHASSIS .ref .leg [1 ].rod .Length );
732
740
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 ;
734
742
735
743
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);
737
745
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 ;
740
748
}
741
749
#endif
742
750
@@ -807,8 +815,8 @@ static void ConsoleNormal(void)
807
815
{
808
816
float tp [2 ], t [2 ];
809
817
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 ];
812
820
813
821
#if LOCATION_CONTROL
814
822
double joint_pos_l [2 ], joint_pos_r [2 ];
@@ -855,6 +863,11 @@ static void ConsoleNormal(void)
855
863
856
864
CHASSIS .joint_motor [2 ].set .tor = - joint_torque [0 ] * (J2_DIRECTION );
857
865
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 );
858
871
#endif
859
872
860
873
// QUESTION: 排查电机发送的力矩要反向的问题,这种情况下控制正常
0 commit comments