diff --git a/v1.1/Shibo-main-TOMMY/src/main.cpp b/v1.1/Shibo-main-TOMMY/src/main.cpp index dc47cd7..5416cda 100644 --- a/v1.1/Shibo-main-TOMMY/src/main.cpp +++ b/v1.1/Shibo-main-TOMMY/src/main.cpp @@ -433,7 +433,7 @@ void setup() motor2.init(); motor2.initFOC(); - resetToDefault(); // 重置到默认参数状态 + // resetToDefault(); // 重置到默认参数状态 // FastLED初始化 FastLED.addLeds(leds, NUM_LEDS); @@ -448,7 +448,7 @@ void loop() { // 处理LED闪烁 - handleLEDBlink(); + // handleLEDBlink(); // 检测小车状态变化 坐 -> 站 if (robot_enabled && !last_robot_enabled) { @@ -483,28 +483,16 @@ void loop() } // 大仰角到底,轮子就不要转了 - if (abs(LQR_angle) > 70.0f) { - motor1.target = 0; - motor2.target = 0; - } + // if (abs(LQR_angle) > 70.0f) { + // motor1.target = 0; + // motor2.target = 0; + // } // 达到平衡角度后,重置重置计数器 if( abs(LQR_angle) < 25.0f){ resetToDefaultCounter = 0; } - // target目标电压 0~8V, 0为不转, 8为最大转速 - // Serial.print("LQR_angle:"); // 屁股向后倒 -33~-34度,舵机2047的时候-42度,头向前到底 75度,完全垂直88度 - // Serial.print(LQR_angle); - // Serial.print(",loopCounter:"); - // Serial.print(loopCounter); - // Serial.print(",resetToDefaultCounter:"); - // Serial.print(resetToDefaultCounter); - // Serial.print(",motor1.target:"); - // Serial.print(motor1.target); - // Serial.print(",motor2.target:"); - // Serial.print(motor2.target); - // 向前跳跃 if(forward_jump_flag){ if(forward_jump_flag == 1){ @@ -629,15 +617,13 @@ void lqr_balance_loop() }else{ speed_target_coeff = 0.1; } - + speed_control = pid_speed(LQR_speed - speed_target_coeff * lpf_joyy(wrobot.joyy)); // 最大8v // 检测轮子差速,判断轮子是否离地 unsigned long current_time = millis(); if (current_time - last_speed_record_time >= SPEED_RECORD_INTERVAL) { robot_speed_diff = LQR_speed - last_lqr_speed; - // Serial.print("LQR_angle:"); - // Serial.print(LQR_angle); ; // 就等于LQR_speed,离地速度绝对值大于15左右,在地面只有5 // Serial.print(",robot_speed_last:"); // Serial.print(last_lqr_speed); // Serial.print(",robot_speed_diff:"); @@ -664,6 +650,7 @@ void lqr_balance_loop() // Serial.print(robot_speed_diff); // Serial.print(",jump_flag:"); // Serial.println(jump_flag); // 120左右 + if( jump_flag ){ // 落地点作为新的位移零点 distance_zeropoint = LQR_distance; pid_lqr_u.error_prev = 0; @@ -677,21 +664,23 @@ void lqr_balance_loop() // 判断摇杆是否没有前后左右运动指令 if ((wrobot.joyx_last != 0 && wrobot.joyx == 0) || (wrobot.joyy_last != 0 && wrobot.joyy == 0)) { - wrobot_move_stop_flag = 1; + // wrobot_move_stop_flag = 1; + distance_zeropoint = LQR_distance; // 位移零点重置 + pid_lqr_u.error_prev = 0; // 输出积分清零 测试 } // 没有摇杆指令,小车微微移动,需要重置位移零点,让小车自己回来 - if ((wrobot_move_stop_flag == 1) && (abs(LQR_speed) < 0.5)) - { - distance_zeropoint = LQR_distance; // 位移零点重置 - // pid_lqr_u.error_prev = 0; // 输出积分清零 如果有这个会前后漂移 - wrobot_move_stop_flag = 0; - } + // if ((wrobot_move_stop_flag == 1) && (abs(LQR_speed) < 0.5)) + // { + // distance_zeropoint = LQR_distance; // 位移零点重置 + // pid_lqr_u.error_prev = 0; // 输出积分清零 测试 + // wrobot_move_stop_flag = 0; + // } // 实时重置位移零点和积分情形 // if (abs(robot_speed_diff) > 10 || (abs(LQR_speed) > 15) // || jump_flag > 0 || wrobot.joyy != 0 || sitting_down ) if (abs(robot_speed_diff) > 10 || (abs(LQR_speed) > 15) - || wrobot.joyy != 0 || sitting_down ) + || wrobot.joyy != 0 || sitting_down ) { distance_zeropoint = LQR_distance; pid_lqr_u.error_prev = 0; // 输出积分清零 @@ -700,11 +689,10 @@ void lqr_balance_loop() distance_control = pid_distance(LQR_distance - distance_zeropoint); // 计算 LQR_u - // 轮部离地情况下 LQR_u=角度控制量+角速度控制量 - // if (abs(robot_speed_diff) > 10 || (jump_flag > 0 and jump_flag < 100)) - if (abs(robot_speed_diff) > 10 || (jump_flag > 0 and jump_flag < 120)) // jump_flag:100离地 120着地 + // 必须是在跳跃时,LQR_u= 角度控制量 + 角速度控制量 + if ( (jump_flag > 0 && abs(robot_speed_diff) > 10) || (jump_flag > 0 and jump_flag < 120)) // jump_flag:100离地 120着地 { - LQR_u = angle_control + gyro_control; // 位移和速度控制分量被忽略 + LQR_u = angle_control + gyro_control; // 角度控制量 + 角速度控制,位移和速度控制分量被忽略 } else // 当轮部未离地时,LQR_u:4个参数 { @@ -966,6 +954,7 @@ void resetToDefault() { angle_zeropoint = original_angle_zeropoint; LQR_speed = 0; LQR_distance = 0; + last_lqr_speed = 0; speed_control = 0; distance_control = 0; // 需要将位移零点设置为当前位置 @@ -979,10 +968,11 @@ void resetToDefault() { YAW_angle = 0; YAW_output = 0; - last_lqr_speed = 0; jump_flag = 0; leg_position_add = 0; + wrobot_move_stop_flag = 0; + } // 添加LED闪烁处理函数