From e2da4ec4abec813d008f4c999fff64023726de65 Mon Sep 17 00:00:00 2001 From: kirl <18827922006@163.com> Date: Tue, 4 Aug 2026 03:15:27 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D:=20=E6=94=BE=E7=BD=AE?= =?UTF-8?q?=E6=AE=B5XY=E8=BF=90=E5=8A=A8=E5=90=8E=E5=BB=B6=E8=BF=9F?= =?UTF-8?q?=E6=97=8B=E8=BD=AC=E4=BB=A5=E9=98=B2=E6=AD=A2=E7=A2=B0=E6=92=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/actuator/actuator.c | 14 +++++++++++--- components/actuator/actuator.h | 7 +++++++ main/CMakeLists.txt | 2 +- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/components/actuator/actuator.c b/components/actuator/actuator.c index 25b3c64..dcb0104 100644 --- a/components/actuator/actuator.c +++ b/components/actuator/actuator.c @@ -578,7 +578,9 @@ static void _actuator_move_fragment(const edc_fragment_t *frag) /* ---- 2. 运动到 source 位置 ---- */ Emm_V5_Arrival_Reset(); /* 清掉上一段迟到/多余的到位帧, 防污染本段等待 */ - /* source Z 用相对运动转到目标朝向 (0° 基准位; 到位用 CPOS 轮询确认) */ + /* source Z 用相对运动转到目标朝向 (0° 基准位; 到位用 CPOS 轮询确认)。 + ⚠️ 保持"先旋转后 XY"(与 target 段相反): 本段尚未抓取碎片, 先旋转的 + 摆动发生在途中、到点前已转完, 边缘抓取时更安全 */ _actuator_move_angle_rel(src_z_tgt - s_cur_angle_deg, vel_angle, acc_angle); _frame_gap(); _actuator_move_abs(ACTUATOR_ADDR_X, ACTUATOR_DIR_X, @@ -635,12 +637,18 @@ static void _actuator_move_fragment(const edc_fragment_t *frag) (unsigned long)dst_dz, (unsigned long)dst_dx, (unsigned long)dst_dy, dst_mask, dst_wait_ms + ACTUATOR_SETTLE_MARGIN_MS); - _actuator_move_angle_rel(dst_z_tgt - s_cur_angle_deg, vel_angle, acc_angle); - _frame_gap(); + /* ⚠️ 时序 (2026-08-04): 放置段先发 XY、后发旋转 —— 抓取的碎片若在区域 + 边缘, 先旋转会把它甩向机械边缘碰撞; 先启动 XY, 延迟 + ACTUATOR_ROTATE_DELAY_MS (500ms) 再旋转, 让工具先把碎片带离边缘。 + source 段保持先旋转: 该段尚未抓取碎片, 先旋转的摆动发生在途中、 + 到点前已转完, 更安全。 */ _actuator_move_abs(ACTUATOR_ADDR_X, ACTUATOR_DIR_X, dst_pulses_x, vel_xy, acc_xy, false); _frame_gap(); _actuator_move_y_sync(dst_pulses_y, vel_xy, acc_xy); + /* XY 已启动并把碎片带离边缘后再旋转 */ + vTaskDelay(pdMS_TO_TICKS(ACTUATOR_ROTATE_DELAY_MS)); + _actuator_move_angle_rel(dst_z_tgt - s_cur_angle_deg, vel_angle, acc_angle); /* ---- 8. 等待运动到位 (轮询闭环到位标志, 红灯快闪) ---- */ actuator_wait_arrival(dst_wait_ms, dst_mask); diff --git a/components/actuator/actuator.h b/components/actuator/actuator.h index 311bdef..7c5d79b 100644 --- a/components/actuator/actuator.h +++ b/components/actuator/actuator.h @@ -174,6 +174,13 @@ extern "C" { #define ACTUATOR_FRAME_GAP_MS 10 #endif +/** 放置段: XY 运动启动后, 到 Z 旋转启动的额外延迟 (ms) + 2026-08-04: 碎片在区域边缘时, 先旋转会把碎片甩向机械边缘碰撞; + 延迟让 XY 先把碎片带离边缘再旋转, 防碰撞 */ +#ifndef ACTUATOR_ROTATE_DELAY_MS +#define ACTUATOR_ROTATE_DELAY_MS 350 +#endif + /** 控制模式: 2 = 闭环位置模式 */ #define ACTUATOR_CTRL_MODE 2 diff --git a/main/CMakeLists.txt b/main/CMakeLists.txt index 29c0bb4..bfb4919 100644 --- a/main/CMakeLists.txt +++ b/main/CMakeLists.txt @@ -3,4 +3,4 @@ idf_component_register(SRCS "main.c" PRIV_REQUIRES emm_v5 magnet servo key web_ctrl protocol rgb actuator buzzer) # 调试开关: 启用 WiFi + Web 服务器 (消除 IDE 未定义警告) -target_compile_definitions(${COMPONENT_LIB} PRIVATE EDC_DEBUG_WEB) +# target_compile_definitions(${COMPONENT_LIB} PRIVATE EDC_DEBUG_WEB)