v10模型集成+去抖+架构重构: 单线程+背景采集, ControlUpdate单出口电机控制, I2C音频持久fd, 斑马线接近去抖
This commit is contained in:
+35
-124
@@ -4,14 +4,12 @@
|
||||
#include <string>
|
||||
#include <csignal>
|
||||
#include <atomic>
|
||||
#include <chrono>
|
||||
#include <thread>
|
||||
|
||||
#include "global.h"
|
||||
#include "camera.h"
|
||||
#include "control.h"
|
||||
#include "Timer.h"
|
||||
#include "serial.h"
|
||||
#include "encoder.h"
|
||||
#include "video.h"
|
||||
|
||||
std::atomic<bool> running(true);
|
||||
void signalHandler(int signal)
|
||||
@@ -21,129 +19,42 @@ void signalHandler(int signal)
|
||||
|
||||
int main(void)
|
||||
{
|
||||
// Video video("test.mp4", 30);
|
||||
|
||||
// // 获取帧缓冲区设备信息
|
||||
// int fb = open("/dev/fb0", O_RDWR);
|
||||
// if (fb == -1)
|
||||
// {
|
||||
// std::cerr << "无法打开帧缓冲区设备" << std::endl;
|
||||
// return -1;
|
||||
// }
|
||||
// struct fb_var_screeninfo vinfo;
|
||||
// ioctl(fb, FBIOGET_VSCREENINFO, &vinfo);
|
||||
|
||||
// // 设置屏幕参数
|
||||
// int screenWidth = 160;
|
||||
// int screenHeight = 128;
|
||||
|
||||
// int newWidth, newHeight;
|
||||
|
||||
// // 创建帧缓冲区
|
||||
// uint16_t *fb_buffer = new uint16_t[screenWidth * screenHeight];
|
||||
|
||||
// int frameCount = 0;
|
||||
|
||||
// cv::Mat frame, resizedFrame, fbImage(screenHeight, screenWidth, CV_8UC3, cv::Scalar(0, 0, 0)); // 帧缓冲区图像
|
||||
|
||||
// int frame_count = 0;
|
||||
|
||||
// video.timer.start();
|
||||
|
||||
// while(1) {
|
||||
// video.frameMutex.lock();
|
||||
// if(newWidth == 0)
|
||||
// {
|
||||
// // 保持视频长宽比
|
||||
// int videoWidth = video.frame.cols;
|
||||
// int videoHeight = video.frame.rows;
|
||||
// double aspectRatio = static_cast<double>(videoWidth) / videoHeight;
|
||||
// // 根据屏幕大小计算缩放后的宽度和高度
|
||||
// if (screenWidth / static_cast<double>(screenHeight) > aspectRatio)
|
||||
// {
|
||||
// // 屏幕更宽,以高度为基准
|
||||
// newHeight = screenHeight;
|
||||
// newWidth = static_cast<int>(newHeight * aspectRatio);
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// // 屏幕更高,以宽度为基准
|
||||
// newWidth = screenWidth;
|
||||
// newHeight = static_cast<int>(newWidth / aspectRatio);
|
||||
// }
|
||||
// }
|
||||
|
||||
// // 缩放视频到新尺寸
|
||||
// cv::resize(video.frame, resizedFrame, cv::Size(newWidth, newHeight));
|
||||
// video.frameMutex.unlock();
|
||||
|
||||
// // 将缩放后的图像居中放置在帧缓冲区图像中,填充黑色边框
|
||||
// fbImage.setTo(cv::Scalar(0, 0, 0)); // 清空缓冲区(填充黑色)
|
||||
// cv::Rect roi((screenWidth - newWidth) / 2, (screenHeight - newHeight) / 2, newWidth, newHeight);
|
||||
// resizedFrame.copyTo(fbImage(roi));
|
||||
|
||||
// // 将帧缓冲区图像转换为RGB565格式
|
||||
// convertMatToRGB565(fbImage, fb_buffer, screenWidth, screenHeight);
|
||||
|
||||
// // 写入帧缓冲区
|
||||
// lseek(fb, 0, SEEK_SET);
|
||||
// write(fb, fb_buffer, screenWidth * screenHeight * 2);
|
||||
// std::this_thread::sleep_for(std::chrono::milliseconds(30));
|
||||
// }
|
||||
std::signal(SIGINT, signalHandler);
|
||||
|
||||
double dest_fps = readDoubleFromFile(destfps_file);
|
||||
int dest_frame_duration = CameraInit(0, dest_fps, 320, 240);
|
||||
printf("%d\n", dest_frame_duration);
|
||||
if (dest_frame_duration != -1)
|
||||
{
|
||||
streamCaptureRunning = true;
|
||||
std::thread camworker = std::thread(streamCapture);
|
||||
std::cout << "Stream Capture Service started!\n";
|
||||
ControlInit();
|
||||
std::cout << "Control Initialized!\n";
|
||||
if (dest_fps <= 0) dest_fps = 30.0;
|
||||
|
||||
Timer CameraTimer(dest_frame_duration, std::bind(CameraHandler));
|
||||
Timer MortorTimer(8, std::bind(ControlMain));
|
||||
CameraTimer.start();
|
||||
std::cout << "Camera Service started!\n";
|
||||
MortorTimer.start();
|
||||
std::cout << "Control Service started!\n";
|
||||
|
||||
// 主循环,直到用户输入 Ctrl+C
|
||||
while (running.load())
|
||||
{
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(500));
|
||||
target_speed = readDoubleFromFile(speed_file);
|
||||
|
||||
mortor_kp = readDoubleFromFile(mortor_kp_file);
|
||||
mortor_ki = readDoubleFromFile(mortor_ki_file);
|
||||
mortor_kd = readDoubleFromFile(mortor_kd_file);
|
||||
|
||||
kp = readDoubleFromFile(kp_file);
|
||||
ki = readDoubleFromFile(ki_file);
|
||||
kd = readDoubleFromFile(kd_file);
|
||||
// vofa_image(1, 160*120, 160, 120, Format_Grayscale8, (char*)IMG);
|
||||
}
|
||||
std::cout << "Stopping!\n";
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(500));
|
||||
|
||||
CameraTimer.stop();
|
||||
std::cout << "Camera Timer stopped!\n";
|
||||
MortorTimer.stop();
|
||||
std::cout << "Control Timer stopped!\n";
|
||||
|
||||
ControlExit();
|
||||
std::cout << "Control Service stopped!\n";
|
||||
|
||||
streamCaptureRunning = false;
|
||||
if (camworker.joinable())
|
||||
{
|
||||
camworker.join();
|
||||
}
|
||||
|
||||
cameraDeInit();
|
||||
std::cout << "Camera Service stopped!\n";
|
||||
if (CameraInit(0, dest_fps, 320, 240) < 0) {
|
||||
std::cerr << "CameraInit failed" << std::endl;
|
||||
return -1;
|
||||
}
|
||||
ControlInit();
|
||||
std::cout << "All services started (single-thread mode)" << std::endl;
|
||||
|
||||
int tick = 0;
|
||||
while (running.load())
|
||||
{
|
||||
if (CameraHandler() < 0) {
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(5));
|
||||
continue;
|
||||
}
|
||||
|
||||
if (++tick % 15 == 0)
|
||||
{
|
||||
target_speed = readDoubleFromFile(speed_file);
|
||||
mortor_kp = readDoubleFromFile(mortor_kp_file);
|
||||
mortor_ki = readDoubleFromFile(mortor_ki_file);
|
||||
mortor_kd = readDoubleFromFile(mortor_kd_file);
|
||||
kp = readDoubleFromFile(kp_file);
|
||||
ki = readDoubleFromFile(ki_file);
|
||||
kd = readDoubleFromFile(kd_file);
|
||||
}
|
||||
}
|
||||
|
||||
std::cout << "Stopping..." << std::endl;
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(500));
|
||||
ControlExit();
|
||||
cameraDeInit();
|
||||
std::cout << "Stopped." << std::endl;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user