From c5f6782f6b2f8066d9cbe39c2e354c3918712d25 Mon Sep 17 00:00:00 2001 From: Lizongdi <1210855344@qq.com> Date: Fri, 18 Sep 2026 10:01:35 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90=E5=BE=85=E4=BC=98=E5=8C=96=E3=80=91?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=85=B3=E6=9E=AA=E5=BB=B6=E8=BF=9F=E5=81=9C?= =?UTF-8?q?=E8=BD=A6=E9=80=BB=E8=BE=91=EF=BC=8C=E5=BD=93=E5=89=8D=E6=97=A0?= =?UTF-8?q?=E8=AE=BA=E5=BC=80=E4=B8=8D=E5=BC=80=E6=8A=A2=E5=9D=87=E7=94=9F?= =?UTF-8?q?=E6=95=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- RBcore/include/BHBF.h | 2 + project/paint_robot_new/paint_robot_new.c | 10 +++- .../paint_robot_new/paint_robot_new_motors.c | 50 ++++++++++++++----- 3 files changed, 48 insertions(+), 14 deletions(-) diff --git a/RBcore/include/BHBF.h b/RBcore/include/BHBF.h index 0ffb18f..511f876 100644 --- a/RBcore/include/BHBF.h +++ b/RBcore/include/BHBF.h @@ -81,6 +81,8 @@ typedef enum { MOTOR_SET_SPEED, // 设置速度 MOTOR_POWER_ENABLE, // 电机上电 MOTOR_POWER_DISABLE, // 电机失电 + MOTOR_GET_VEHICLE_SPEED, // 获取机器人速度(内部速度归一化) + MOTOR_CMD_STOP_AFTER, // 先关枪后停车 RBCORE_START = 0x0200, // *机器人共性命令开始* RBCORE_CMD_STOP_ALL, // 此命令统一调用机器人各个模块的COMMON_CMD_STOP_ALL diff --git a/project/paint_robot_new/paint_robot_new.c b/project/paint_robot_new/paint_robot_new.c index c386ea1..e881fb2 100644 --- a/project/paint_robot_new/paint_robot_new.c +++ b/project/paint_robot_new/paint_robot_new.c @@ -315,6 +315,7 @@ static void Custom_ModuleHandler(const Msg_t *pstMsg) } g_stIV.RobotMoveSpeed = iVehicleSpeed; MsgCenter_SendTo(MODULE_NAME_RBCORE, RBCORE_GET_VEHICLE_SPEED, (void *)&iVehicleSpeed, sizeof(int)); + MsgCenter_SendTo(MODULE_NAME_MOTOR, MOTOR_GET_VEHICLE_SPEED, (void *)&iVehicleSpeed, sizeof(int)); Move_Halt_AngleError(); @@ -438,7 +439,14 @@ static void Custom_ModuleHandler(const Msg_t *pstMsg) // 【注意!!!】摇杆行程死区判断开始,除摇杆以外按键在上边都处理完,不然走不下去 if (abs(g_stMK32.CH2_LY_V) <= g_stCV.Joy_Sticker_Value_Allowance && abs(g_stMK32.CH3_LY_H) <= g_stCV.Joy_Sticker_Value_Allowance) { - MsgCenter_SendTo(MODULE_NAME_MOTOR, COMMON_CMD_STOP_ALL, NULL, 0); + if (g_stPV.RunMode == 2 || g_stPV.RunMode == 3) + { + MsgCenter_SendTo(MODULE_NAME_MOTOR, MOTOR_CMD_STOP_AFTER, NULL, 0); + } + else + { + MsgCenter_SendTo(MODULE_NAME_MOTOR, COMMON_CMD_STOP_ALL, NULL, 0); + } break; } // 【注意!!!】摇杆行程死区判断结束,摇杆处理都放在这以后,否则行程死区可能不生效 diff --git a/project/paint_robot_new/paint_robot_new_motors.c b/project/paint_robot_new/paint_robot_new_motors.c index aca475a..089e494 100644 --- a/project/paint_robot_new/paint_robot_new_motors.c +++ b/project/paint_robot_new/paint_robot_new_motors.c @@ -61,7 +61,7 @@ static void Motor_ModuleHandler(const Msg_t *pstMsg) return; } - static int iVehicleMove = 0; + int iSpeed = 1; switch (pstMsg->m_uiMsgID) { case MOTOR_SET_SPEED: @@ -75,18 +75,12 @@ static void Motor_ModuleHandler(const Msg_t *pstMsg) g_aiMotorSpeed[1] = MotorMgr_SpeedConvert(g_apstMotors[1], aiMotorSpeed[1]); if (0 == g_aiMotorSpeed[0] && 0 == g_aiMotorSpeed[1]) { - iVehicleMove = 0; + g_iLastVehicleMove = 0; } else { - iVehicleMove = 1; + g_iLastVehicleMove = 1; } - if (0 == iVehicleMove && 1 == g_iLastVehicleMove) - { - MsgCenter_SendTo(MODULE_NAME_CUSTOM, CUSTOM_SET_STOP_OFF_PAINT, NULL, 0); - MsgCenter_SendTo(MODULE_NAME_CUSTOM, COMMON_CMD_STOP_ALL, NULL, 0);//先关枪 - } - g_iLastVehicleMove = iVehicleMove; break; } case MOTOR_POWER_ENABLE: @@ -99,18 +93,48 @@ static void Motor_ModuleHandler(const Msg_t *pstMsg) HAL_GPIO_WritePin(OUT_0_GPIO_Port, OUT_0_Pin, 1); break; } - case COMMON_CMD_STOP_ALL: + case MOTOR_GET_VEHICLE_SPEED: + { + if (pstMsg->m_uiDataLen >= sizeof(int)) + { + RD_MEMCPY(&iSpeed, pstMsg->m_aucData, sizeof(int)); + } + break; + } + case MOTOR_CMD_STOP_AFTER: { - memset(g_aiMotorSpeed, 0, sizeof(g_aiMotorSpeed)); - iVehicleMove = 0; - if (1 == g_iLastVehicleMove) + static uint32_t uiLastTime = 0; + static int iIsDelayStop = 0; + + if (1 == g_iLastVehicleMove) { MsgCenter_SendTo(MODULE_NAME_CUSTOM, CUSTOM_SET_STOP_OFF_PAINT, NULL, 0); MsgCenter_SendTo(MODULE_NAME_CUSTOM, COMMON_CMD_STOP_ALL, NULL, 0);//先关枪 + iIsDelayStop = 1; } + g_iLastVehicleMove = 0; + + if (1 == iIsDelayStop) + { + if (Rd_GetTime() - uiLastTime >= 600 * g_stCV.Paint_Gun_Shutdown_Distance / iSpeed) + { + memset(g_aiMotorSpeed, 0, sizeof(g_aiMotorSpeed)); + iIsDelayStop = 0; + } + break; + } + else + { + uiLastTime = Rd_GetTime(); + } break; } + case COMMON_CMD_STOP_ALL: + { + memset(g_aiMotorSpeed, 0, sizeof(g_aiMotorSpeed)); + break; + } default: break; }