From d251f086707c5162d0f904184b02db79760c1f51 Mon Sep 17 00:00:00 2001 From: spdis Date: Sat, 13 Jun 2026 14:00:34 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=9B=9B=E4=B8=AA=E5=85=B3?= =?UTF-8?q?=E9=94=AEbug:=20dest=5Ffps=E9=99=90=E9=80=9F/=E5=BA=95=E8=A1=8C?= =?UTF-8?q?=E8=B6=8A=E7=95=8C/255=E5=BA=94=E4=B8=BA-1/=E5=88=A0=E9=99=A4de?= =?UTF-8?q?bug=E6=96=87=E4=BB=B6=E9=87=8D=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main/main.cpp | 19 ++++++++--------- pack_code.sh | 53 ++++++++++++++++++++++++++++++++++++++++++++++++ src/camera.cpp | 2 +- src/image_cv.cpp | 17 +++++++++++++++- 4 files changed, 78 insertions(+), 13 deletions(-) create mode 100644 pack_code.sh diff --git a/main/main.cpp b/main/main.cpp index 8b0f2a7..a3e5425 100644 --- a/main/main.cpp +++ b/main/main.cpp @@ -33,27 +33,24 @@ int main(void) if (avoid_range_val > 0) g_cfg.cone_avoid_range = avoid_range_val; if (hold_frames_val > 0) g_cfg.cone_hold_frames = hold_frames_val; - if (CameraInit(0, dest_fps, 320, 240) < 0) { + int frame_delay = CameraInit(0, dest_fps, 320, 240); + if (frame_delay < 0) { std::cerr << "CameraInit failed" << std::endl; return -1; } ControlInit(); std::cout << "All services started" << std::endl; - int tick = 0; while (running.load()) { + auto t_start = std::chrono::steady_clock::now(); CameraHandler(); - - if (++tick % 7 == 0) { - g_cfg.debug = readFlag(debug_file); - } - - if (g_cfg.debug) { - cfg_load_all(); - } - target_speed = g_cfg.speed; + + auto elapsed = std::chrono::steady_clock::now() - t_start; + auto remain = std::chrono::milliseconds(frame_delay) - elapsed; + if (remain > std::chrono::milliseconds(1)) + std::this_thread::sleep_for(remain); } std::cout << "Stopping..." << std::endl; diff --git a/pack_code.sh b/pack_code.sh new file mode 100644 index 0000000..13e8c87 --- /dev/null +++ b/pack_code.sh @@ -0,0 +1,53 @@ +#!/bin/bash +# pack_code.sh — 将所有代码源文件打包为单个 txt +# 用法: bash pack_code.sh [输出文件名] +# 默认输出: smartcar2_code.txt + +OUT="${1:-smartcar2_code.txt}" +> "$OUT" + +# 分隔符 +sep() { echo "" >> "$OUT"; echo "============================================================" >> "$OUT"; } + +# 逐个追入,带文件路径头 +append_file() { + local f="$1" + if [ ! -f "$f" ]; then return; fi + sep + echo "// FILE: $f" >> "$OUT" + sep + cat "$f" >> "$OUT" +} + +# ── src/ 源文件 ── +for f in src/*.cpp src/*.hpp; do + [ -f "$f" ] && append_file "$f" +done + +# ── lib/ 头文件 ── +for f in lib/*.h; do + [ -f "$f" ] && append_file "$f" +done + +# ── main/ ── +append_file main/main.cpp +append_file main/CMakeLists.txt + +# ── 顶层构建/配置 ── +append_file CMakeLists.txt +append_file cross.cmake +append_file ctl.sh +append_file start.sh +append_file .gitignore + +# ── 独立 demo ── +append_file encoder_brake_demo.cpp + +# ── 统计 ── +LINES=$(wc -l < "$OUT") +FILES=$(grep -c "// FILE:" "$OUT") +echo "" +echo "=== 打包完成 ===" +echo " 输出: $OUT" +echo " 文件数: $FILES" +echo " 总行数: $LINES" diff --git a/src/camera.cpp b/src/camera.cpp index 8be4b30..354ac42 100644 --- a/src/camera.cpp +++ b/src/camera.cpp @@ -437,7 +437,7 @@ int CameraHandler(void) if (g_cfg.start) { int foresee = (int)g_cfg.foresee; int check_row = foresee / calc_scale; - if (check_row >= 0 && check_row < line_tracking_height && mid_line[check_row] != 255) { + if (check_row >= 0 && check_row < line_tracking_height && mid_line[check_row] != -1) { double deviation = mid_line[check_row] * calc_scale - newWidth / 2; deviation -= g_cfg.center_bias; g_steer_deviation = deviation / (newWidth / 2.0); diff --git a/src/image_cv.cpp b/src/image_cv.cpp index 9ab62af..bbe4b63 100644 --- a/src/image_cv.cpp +++ b/src/image_cv.cpp @@ -261,7 +261,8 @@ void image_main() } // ── 6. 中线计算 + 丢线补全 ───── - for (int row = line_tracking_height - 1; row >= 10; --row) + // 从倒数第二行开始向上,底行(row=height-1)单独兜底避免 mid_line[row+1] 越界 + for (int row = line_tracking_height - 2; row >= 10; --row) { // ── 6a. 丢线补全 ────────────────────────────── if (left_line[row] == -1 && right_line[row] == -1) @@ -290,4 +291,18 @@ void image_main() mid_line[row] = (left_line[row] + right_line[row]) / 2; } } + // 底行兜底:正常计算,丢线时用图像中心 + { + const int row = line_tracking_height - 1; + if (left_line[row] == -1 && right_line[row] == -1) + { + mid_line[row] = line_tracking_width / 2; + left_line[row] = 0; + right_line[row] = line_tracking_width - 1; + } + else + { + mid_line[row] = (left_line[row] + right_line[row]) / 2; + } + } }