10 Commits

4 changed files with 27 additions and 16 deletions
+1 -1
View File
@@ -14,7 +14,7 @@ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O3 -Wall")
project(smartcar_demo2 VERSION 0.1.0 LANGUAGES C CXX)
# OpenCV 设备端路径
set(OpenCV_DIR /home/spdis/loongson/opencv-4.13.0/loongson/lib/cmake/opencv4)
set(OpenCV_DIR /mnt/D/PPPProgram/smartcar/opencv-4.13.0/loongson/lib/cmake/opencv4)
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
message(STATUS "OpenCV Include Directories: ${OpenCV_INCLUDE_DIRS}")
+1 -1
View File
@@ -5,7 +5,7 @@ SET(CROSS_COMPILE 1)
IF(CROSS_COMPILE)
SET(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR loongson)
SET(TOOLCHAIN_DIR "/opt/loongson-gnu-toolchain-8.3-x86_64-loongarch64-linux-gnu-rc1.6")
SET(TOOLCHAIN_DIR "/home/spdis/loongson-gnu-toolchain-8.3-x86_64-loongarch64-linux-gnu-rc1.6")
set(CMAKE_CXX_COMPILER ${TOOLCHAIN_DIR}/bin/loongarch64-linux-gnu-g++)
set(CMAKE_C_COMPILER ${TOOLCHAIN_DIR}/bin/loongarch64-linux-gnu-gcc)
+15 -9
View File
@@ -962,12 +962,15 @@ static void steering_update()
}
}
if (std::abs(deviation) < g_cfg.deadband) {
// 死区内 → 直行
// 平滑线性转向: 偏差从死区边界开始缩放,消除死区断崖
double effective = std::abs(deviation) - g_cfg.deadband;
if (effective <= 0) {
servo.setDutyCycle(1500000);
} else {
// 比例控制: 偏差 → 归一化 → × 增益 × 满偏占空比差
double offset = deviation / (newWidth / 2.0) * g_cfg.steer_gain * 300000;
double half_w = newWidth / 2.0;
double norm = effective / (half_w - g_cfg.deadband);
double sign = (deviation > 0) ? 1.0 : -1.0;
double offset = norm * g_cfg.steer_gain * 300000.0 * sign;
double duty_ns = std::clamp(1500000.0 + offset, 1200000.0, 1800000.0);
servo.setDutyCycle((unsigned int)duty_ns);
}
@@ -1031,13 +1034,16 @@ static void motor_update(bool zebra_block, bool tl_block)
prev_zstate = g_zstate;
prev_tlstate = g_tl_state;
double spd = target_speed * boost_factor();
// 斑马线起步后 3.3~5s 降速走稳
if (g_zstate == Z_COOLDOWN) {
double spd;
if (boost_factor() > 1.0) {
spd = 26.0; // 起步弹射
} else if (g_zstate == Z_COOLDOWN) {
spd = 16.0; // 冷却期基础速度
time_t elapsed = time(nullptr) - g_ztime;
if (elapsed >= 3.3 && elapsed < 5)
spd = std::min(spd, 13.0);
spd = std::min(spd, 13.0); // 3.3~5s 降速
} else {
spd = target_speed; // 正常行驶
}
// 弯道减速: 舵机偏差越大 → 速度越低
+10 -5
View File
@@ -69,10 +69,12 @@ cv::Mat image_binerize(cv::Mat &frame)
cv::cvtColor(frame, hsvImage, cv::COLOR_BGR2HSV);
cv::split(hsvImage, hsvChannels);
cv::threshold(hsvChannels[0], binarizedFrame,
0, 255, cv::THRESH_BINARY_INV | cv::THRESH_OTSU);
cv::threshold(hsvChannels[1], output,
0, 255, cv::THRESH_BINARY_INV | cv::THRESH_OTSU);
cv::adaptiveThreshold(hsvChannels[0], binarizedFrame, 255,
cv::ADAPTIVE_THRESH_GAUSSIAN_C,
cv::THRESH_BINARY_INV, 11, 2);
cv::adaptiveThreshold(hsvChannels[1], output, 255,
cv::ADAPTIVE_THRESH_GAUSSIAN_C,
cv::THRESH_BINARY_INV, 11, 2);
cv::bitwise_or(output, binarizedFrame, output);
@@ -104,7 +106,7 @@ cv::Mat image_binerize(cv::Mat &frame)
// ============================================================
cv::Mat find_road(cv::Mat &frame)
{
static cv::Mat kernel = cv::getStructuringElement(cv::MORPH_CROSS, cv::Size(3, 3));
static cv::Mat kernel = cv::getStructuringElement(cv::MORPH_CROSS, cv::Size(7, 7));
cv::morphologyEx(binarizedFrame, morphologyExFrame, cv::MORPH_OPEN, kernel);
static cv::Mat mask;
@@ -173,6 +175,9 @@ void image_main()
cv::merge(labCh, labFrame);
cv::cvtColor(labFrame, resizedFrame, cv::COLOR_Lab2BGR);
// ── 1.6 高斯模糊 → 融合反光噪点 ────────────────────
cv::GaussianBlur(resizedFrame, resizedFrame, cv::Size(5, 5), 0);
// ── 2. HSV 双通道 Otsu 二值化 ─────────────────────
// 赛道区域 = 白色(255),背景/边界 = 黑色(0)
binarizedFrame = image_binerize(resizedFrame);