基于嵌入式的车载导航定位系统设计

news2024/11/15 8:22:17

一、前言

1.1 项目介绍

【1】项目背景

随着汽车工业的飞速发展和智能化技术的不断突破,车载导航系统作为现代汽车不可或缺的一部分,在人们的日常生活中扮演着越来越重要的角色。它不仅能够提供精确的路线导航,还能提供丰富的地理信息和娱乐服务,为驾驶者带来了极大的便利和乐趣。

传统的车载导航系统主要依赖于内置的地图数据和GPS定位技术,但随着移动互联网的普及和智能设备的快速发展,用户对车载导航系统的要求也在不断提高。希望车载导航系统能够具备更高的定位精度、更丰富的地图信息、更便捷的操作体验以及更强的可扩展性。

开发一款基于嵌入式技术的车载导航定位系统,以满足现代用户对高效、智能、个性化导航服务的需求,成为了当前行业发展的一个重要方向。本项目就是通过集成高性能的主控开发板、精准的GPS定位模块以及强大的Qt开发框架,实现一个功能丰富、性能稳定、用户体验优越的车载导航系统。

image-20240222002328664

【2】设计实现的功能

(1)实时定位与地图显示:通过外接的北斗GPS模块,系统能够实时接收并解析卫星信号,获取车辆的精确位置信息。这些信息将实时显示在基于Qt开发的主界面上,与百度地图API无缝对接,为用户呈现清晰、准确的地图画面。

(2)路线规划与导航:用户可以通过主界面输入目的地信息,系统根据百度地图API提供的路径规划服务,计算出最优的行驶路线,并在地图上进行高亮显示。在导航过程中,系统能够实时追踪车辆位置,提供转向、距离等导航指令,确保用户能够准确、快速地到达目的地。

(3)地图预览与缩放:系统支持地图的缩放和拖动功能,用户可以根据需要调整地图的显示范围,查看不同级别的地理细节。同时,系统还提供了多种地图视图模式(如白天模式、夜间模式等),以满足用户在不同场景下的使用需求。

(4)语音提示与交互:为了提升用户体验,系统集成了语音提示功能,能够在关键导航节点(如转弯、路口等)给予用户语音指令,减少用户操作干扰。此外,系统还支持通过语音指令进行简单的交互操作,如查询附近的餐饮、加油站等设施。

(5)个性化设置与偏好管理:用户可以根据自己的使用习惯,在系统设置中调整界面风格、导航偏好等参数。系统还会记录用户的行驶历史,为用户提供个性化的推荐和服务。

(6)系统稳定性与扩展性:基于嵌入式Linux系统的开发框架,保证了系统的稳定性和可靠性。同时,开放式的架构设计使得系统易于扩展和升级,能够随时集成新的功能模块和服务,满足用户不断增长的需求。

本项目设计的基于嵌入式的车载导航定位系统,通过集成高性能硬件和先进的软件开发技术,实现了实时定位、路线规划、地图预览、语音提示、个性化设置等多项功能,为用户提供了高效、智能、个性化的导航服务体验。

【3】项目硬件模块组成

(1)主控开发板:采用GEC6818开发板,该开发板搭载了三星Cortex-A53系列高性能八核处理器S5P6818,最高主频高达1.4GHz。主控开发板作为整个系统的核心,负责处理导航定位系统的所有运算和控制任务,确保系统的稳定运行。

(2)GPS模块:采用北斗GPS模块,该模块负责接收并解析卫星信号,获取车辆的精确位置信息。通过与主控开发板的连接,将位置数据实时传输给系统进行处理和显示。

(3)显示屏:用于呈现地图、导航指令以及其他相关信息。显示屏与主控开发板相连,通过Qt开发的界面,将系统的各项功能直观地展示给用户。

(4)网卡: 用于上网,调用百度地图,这是开发板本身自带。

(5)语音播报模块: 利用开发板本身的声卡播放导航提示。

1.2 设计思路

(1)需求分析:对车载导航定位系统的需求进行深入分析。确定系统需要具备的功能,如实时定位、路线规划、地图显示、语音提示等。同时,考虑到用户的操作习惯和驾驶过程中的安全性,对界面的设计、交互的流畅性等方面也进行了充分考虑。

(2)硬件选型:根据需求分析的结果,选择适合的硬件组件。主控开发板选用GEC6818开发板,其高性能的处理器和嵌入式Linux系统为系统的稳定运行提供了有力支持。GPS模块选用北斗GPS模块,以确保定位的准确性和稳定性。同时,选择高质量的显示屏和其他辅助模块,以满足系统的各项需求。

(3)软件架构设计:采用Qt作为软件开发框架,利用其强大的图形界面开发能力和跨平台特性,实现系统的主界面和各项功能。通过集成百度地图API,实现地图的加载、显示和路径规划等功能。同时,设计合理的软件架构,确保各个模块之间的协同工作和数据传输的高效性。

(4)功能模块划分:将系统划分为多个功能模块,如定位模块、导航模块、地图显示模块、语音提示模块等。每个模块负责实现特定的功能,并通过接口与其他模块进行交互。这种模块化的设计方式便于后期的维护和扩展。

1.3 系统功能总结

功能模块功能描述技术实现与特点
实时定位通过北斗GPS模块获取车辆精确位置信息。利用北斗卫星导航系统,提供高精度、稳定的定位服务。
地图显示在显示屏上呈现百度地图,展示地理信息。集成百度地图API,实现地图的加载、缩放、拖动等功能。
路线规划根据用户输入的目的地,计算最优行驶路线。利用百度地图API的路径规划服务,提供多种路线选择。
导航指引提供转向、距离等导航指令,辅助用户驾驶。实时追踪车辆位置,根据规划路线提供准确的导航指引。
语音提示通过语音输出导航指令和其他相关信息。集成语音合成技术,实现人性化的交互体验。
地图预览与缩放支持地图的预览、缩放和拖动操作。提供多种地图视图模式,满足不同场景下的使用需求。
个性化设置用户可根据喜好设置系统界面和导航偏好。提供丰富的设置选项,满足用户的个性化需求。
系统稳定性确保系统在各种环境下的稳定运行。基于嵌入式Linux系统开发,具备高度的稳定性和可靠性。
扩展性系统设计易于扩展和升级,适应未来需求变化。开放的架构设计,支持新功能模块和服务的集成。

1.4 原理图

image-20240224095142392

二、Linux下Qt开发环境搭建

养老院出行管理系统项目是在Linux下开发,接下来需要搭建Linux下的开发环境。

(1)第一步,安装VM虚拟机

(2)第二步,在VM虚拟机里安装Ubuntu18.04系统

(3)第三步,在Ubuntu18.04系统里安装QT开发环境

2.1 安装VMware虚拟机软件

VMware软件下载地址: https://www.vmware.com/products/workstation-pro/workstation-pro-evaluation.html

当前电脑使用的vmware版本为: 15.5

image-20240205162313501

2.2 安装Ubuntu18.04系统

18.04最新长期支持版本: http://mirrors.aliyun.com/ubuntu-releases/18.04/

image-20240205162406327

image-20240205162418812

image-20240205162452705

image-20240205162507037

image-20240205162520986

image-20240205162533703

image-20240205162544451

image-20240205162556440

image-20240205162608758

image-20240205162623952

image-20240205162633827

image-20240205162645202

image-20240205162655339

image-20240205162706047

image-20240205162716100

image-20240205162726036

image-20240205162736685

image-20240205162748243

image-20240205162757955

image-20240205162807976

image-20240205162819018

image-20240205162831845

image-20240205162841321

image-20240205162858578

image-20240205162909134

image-20240205162921012

image-20240205162931958

image-20240205162942440

image-20240205162952897

image-20240205163003468

image-20240205163014317

image-20240205163024165

image-20240205163035879

image-20240205163046478

image-20240205163059301

image-20240205163110399

image-20240205163121392

image-20240205163131914

image-20240205163141754

img

image-20240205163210052

image-20240205163222326

image-20240205163234751

image-20240205163246513

image-20240205163259836

image-20240205163310741

image-20240205163321782

image-20240205163332654

image-20240205163344839

image-20240205163354976

image-20240205163408346

image-20240205163419297

image-20240205163431510

image-20240205163443352

image-20240205163454992

image-20240205163506311

image-20240205163516202

image-20240205163526824

image-20240205163536313

image-20240205163547324

image-20240205163557066

image-20240205163606514

image-20240205163616405

image-20240205163626445

2.3 安装Qt5.12开发环境

注意,安装Qt之前要先安装以下工具(如果之前安装了就不用再安装了):

sudo apt install make
sudo apt install gcc
sudo apt install g++

Qt安装包下载地址:http://download.qt.io/archive/qt/5.12/5.12.6/

image-20240205164026610

image-20240205164039076

image-20240205164049641

image-20240205164101564

image-20240205164112776

image-20240205164124127

image-20240205164134320

image-20240205164148279

2.4 Qt编译常见问题解决

如果在编译运行程序时, 提示缺少 cannot find -lGL 库报错, 可以按照下面方法解决:
在命令行执行: locate libGL.so //这一步是查看本地系统里有没有这个库
/usr/lib/x86_64-linux-gnu/mesa/libGL.so.1 //如果提示这两行, 说明系统有这个库
/usr/lib/x86_64-linux-gnu/mesa/libGL.so.1.2.0
下面只需要做一个链接即可:
sudo ln -s /usr/lib/x86_64-linux-gnu/mesa/libGL.so.1 /usr/lib/libGL.so
如果系统里没有查找到库, 就在命令行敲下面命令进行在线安装:
sudo apt-get install libgl1-mesa-dev

三、代码设计

3.1 地图API调用

下面使用Qt的网络模块来发送HTTP请求,并使用Qt的GUI模块来显示地图图片。 需要在百度地图开放平台上注册应用程序,并获取到百度地图API密钥(AK)。

// mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QImage>
#include <QLabel>

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void onMapImageReceived(QNetworkReply *reply);

private:
    QLabel *mapLabel;
    QNetworkAccessManager *networkManager;
};

#endif // MAINWINDOW_H
cppCopy Code// mainwindow.cpp
#include "mainwindow.h"
#include <QUrl>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    mapLabel = new QLabel(this);
    mapLabel->setGeometry(10, 10, 600, 400);  // 设置地图图片显示位置和大小

    networkManager = new QNetworkAccessManager(this);
    connect(networkManager, &QNetworkAccessManager::finished, this, &MainWindow::onMapImageReceived);

    QString mapUrl = "http://api.map.baidu.com/staticimage/v2";
    QUrl url(mapUrl);
    url.addQueryItem("ak", "your_baidu_map_api_key");  // 替换为你的百度地图API密钥
    url.addQueryItem("center", "北京");  // 地图中心位置
    url.addQueryItem("width", "600");  // 图片宽度
    url.addQueryItem("height", "400");  // 图片高度
    url.addQueryItem("zoom", "11");  // 缩放级别

    QNetworkRequest request(url);
    networkManager->get(request);
}

MainWindow::~MainWindow()
{
}

void MainWindow::onMapImageReceived(QNetworkReply *reply)
{
    if (reply->error() == QNetworkReply::NoError) {
        QByteArray imageData = reply->readAll();
        QImage mapImage;
        mapImage.loadFromData(imageData);
        mapLabel->setPixmap(QPixmap::fromImage(mapImage));
    } else {
        qDebug() << "Error: " << reply->errorString();
    }

    reply->deleteLater();
}

创建了一个MainWindow类,其中包含一个用于显示地图图片的QLabel和一个QNetworkAccessManager用于发送HTTP请求。在构造函数中,通过QUrl构建了百度地图API接口的URL,并添加了必要的参数,例如地图中心位置、图片大小和缩放级别。使用QNetworkRequest发送了一个GET请求,并在onMapImageReceived槽函数中处理收到的地图图片数据,并将其显示在QLabel上。

3.2 导航提示音播放

使用alsa-lib库在Linux下调用声卡驱动来播放声音。

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <alsa/asoundlib.h>

#define BUFFER_SIZE 1024

int main(int argc, char *argv[])
{
    int err;
    int fd;
    snd_pcm_t *pcm_handle;
    snd_pcm_hw_params_t *hw_params;
    unsigned int rate = 44100;
    unsigned int channels = 2;
    unsigned int buffer_time = 500000;  // 500ms
    unsigned int period_time = 100000;  // 100ms
    snd_pcm_uframes_t buffer_size;
    snd_pcm_uframes_t period_size;
    char *buffer;

    buffer = (char *)malloc(BUFFER_SIZE);
    if (!buffer) {
        printf("Error: Failed to allocate memory.\n");
        return -1;
    }

    // 打开PCM设备
    err = snd_pcm_open(&pcm_handle, "default", SND_PCM_STREAM_PLAYBACK, 0);
    if (err < 0) {
        printf("Error: Failed to open PCM device. %s\n", snd_strerror(err));
        return -1;
    }

    // 配置PCM设备参数
    snd_pcm_hw_params_alloca(&hw_params);
    err = snd_pcm_hw_params_any(pcm_handle, hw_params);
    if (err < 0) {
        printf("Error: Failed to get PCM device parameters. %s\n", snd_strerror(err));
        return -1;
    }
    err = snd_pcm_hw_params_set_access(pcm_handle, hw_params, SND_PCM_ACCESS_RW_INTERLEAVED);
    if (err < 0) {
        printf("Error: Failed to set PCM device access mode. %s\n", snd_strerror(err));
        return -1;
    }
    err = snd_pcm_hw_params_set_format(pcm_handle, hw_params, SND_PCM_FORMAT_S16_LE);
    if (err < 0) {
        printf("Error: Failed to set PCM device sample format. %s\n", snd_strerror(err));
        return -1;
    }
    err = snd_pcm_hw_params_set_channels(pcm_handle, hw_params, channels);
    if (err < 0) {
        printf("Error: Failed to set PCM device channel count. %s\n", snd_strerror(err));
        return -1;
    }
    err = snd_pcm_hw_params_set_rate_near(pcm_handle, hw_params, &rate, 0);
    if (err < 0) {
        printf("Error: Failed to set PCM device sample rate. %s\n", snd_strerror(err));
        return -1;
    }
    err = snd_pcm_hw_params_set_buffer_time_near(pcm_handle, hw_params, &buffer_time, 0);
    if (err < 0) {
        printf("Error: Failed to set PCM device buffer time. %s\n", snd_strerror(err));
        return -1;
    }
    err = snd_pcm_hw_params_set_period_time_near(pcm_handle, hw_params, &period_time, 0);
    if (err < 0) {
        printf("Error: Failed to set PCM device period time. %s\n", snd_strerror(err));
        return -1;
    }
    err = snd_pcm_hw_params(pcm_handle, hw_params);
    if (err < 0) {
        printf("Error: Failed to set PCM device parameters. %s\n", snd_strerror(err));
        return -1;
    }

    // 获取PCM设备缓冲区大小和周期大小
    err = snd_pcm_get_params(pcm_handle, &buffer_size, &period_size);
    if (err < 0) {
        printf("Error: Failed to get PCM device buffer and period sizes. %s\n", snd_strerror(err));
        return -1;
    }

    // 打开音频文件
    fd = open(argv[1], O_RDONLY);
    if (fd < 0) {
        printf("Error: Failed to open audio file.\n");
        return -1;
    }

    // 播放音频
    while (1) {
        long frames = read(fd, buffer, BUFFER_SIZE);
        if (frames == 0) {  // 播放完成
            break;
        } else if (frames < 0) {  // 读取错误
            printf("Error: Failed to read audio data.\n");
            break;
        }
        while (frames > 0) {
            long n = snd_pcm_writei(pcm_handle, buffer, frames);
            if (n < 0) {  // 发生错误,重新配置PCM设备
                printf("Error: Failed to write audio data to PCM device. %s\n", snd_strerror(n));
                snd_pcm_prepare(pcm_handle);
            } else {
                frames -= n;
                buffer += n * channels * 2;  // 每个采样点为16位(2字节),乘以通道数
            }
        }
    }

    // 关闭PCM设备和音频文件
    snd_pcm_close(pcm_handle);
    close(fd);
    free(buffer);

    return 0;
}

使用alsa-lib库来调用Linux声卡驱动来播放声音。

(1)打开PCM设备并配置参数,然后通过snd_pcm_get_params函数获取缓冲区大小和周期大小。

(2)打开音频文件并循环读取文件中的数据,每次将一定数量的数据写入PCM设备进行播放。在播放过程中,如果发生错误们需要重新配置PCM设备并重新开始播放。

3.3 GPS导航模块

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <libserialport.h>

void parse_gps_data(char *data) {
    char *token;
    token = strtok(data, ",");
    int count = 0;
    double latitude, longitude;

    while (token != NULL) {
        if (count == 2) { // 纬度数据在第3个字段
            latitude = atof(token);
        } else if (count == 4) { // 经度数据在第5个字段
            longitude = atof(token);
        }

        token = strtok(NULL, ",");
        count++;
    }

    printf("Latitude: %f, Longitude: %f\n", latitude, longitude);
}

int main() {
    struct sp_port *port;
    int err;

    // 打开串口
    err = sp_get_port_by_name("/dev/ttyUSB0", &port);
    if (err != SP_OK) {
        fprintf(stderr, "Error: Failed to open serial port\n");
        return -1;
    }

    err = sp_open(port, SP_MODE_READ);
    if (err != SP_OK) {
        fprintf(stderr, "Error: Failed to open serial port for reading\n");
        sp_free_port(port);
        return -1;
    }

    // 设置串口参数
    struct sp_port_config *config;
    sp_new_config(&config);
    sp_set_config_baudrate(config, 9600);
    sp_set_config_bits(config, 8);
    sp_set_config_parity(config, SP_PARITY_NONE);
    sp_set_config_stopbits(config, 1);
    sp_set_config(port, config);

    // 读取GPS数据
    char data[256];
    int bytes_read;
    while (1) {
        bytes_read = sp_input_waiting(port);
        if (bytes_read > 0) {
            sp_blocking_read(port, data, sizeof(data), 0);
            parse_gps_data(data);
        }
        usleep(100000); // 延时100ms
    }

    // 关闭串口
    sp_close(port);
    sp_free_port(port);

    return 0;
}

四、总结

随着智能化和移动互联网技术的飞速发展,车载导航定位系统已经成为现代驾驶不可或缺的一部分。本项目通过集成高性能的GEC6818开发板、北斗GPS模块以及百度地图API,成功设计并实现了一个功能全面、性能稳定的车载导航定位系统。

在项目实施过程中,注重用户体验和系统稳定性,通过Qt开发框架打造了直观易用的操作界面,并实现了实时定位、地图显示、路线规划、导航指引以及语音提示等核心功能。同时,系统的模块化设计和开放式架构保证了其易于维护和扩展,能够随时适应市场和用户需求的变化。

通过本项目的实施,不仅提升了车载导航系统的技术水平,也为用户提供了更加便捷、智能的出行体验。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1487330.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java:JVM基础

文章目录 参考JVM内存区域程序计数器虚拟机栈本地方法栈堆方法区符号引用与直接引用运行时常量池字符串常量池直接内存 参考 JavaGuide JVM内存区域 程序计数器 程序计数器是一块较小的内存空间&#xff0c;可以看做是当前线程所执行的字节码的行号指示器&#xff0c;各线程…

mprpc分布式RPC网络通信框架

mprpc 项目介绍 该项目是一个基于muduo、Protobuf和Zookeeper实现的轻量级分布式RPC网络通信框架。 可以把任何单体架构系统的本地方法调用&#xff0c;重构成基于TCP网络通信的RPC远程方法调用&#xff0c;实现同一台机器的不同进程之间的服务调用&#xff0c;或者不同机器…

[ai笔记14] 周鸿祎的ai公开课笔记1

欢迎来到文思源想的ai空间&#xff0c;这是技术老兵重学ai以及成长思考的第14篇分享&#xff01; 本周二月的最后一周&#xff0c;并不是闲下来了&#xff0c;反而是开始进行一些更多的深入实践&#xff0c;关于gpt的主体架构、关于prompt&#xff0c;同时也看了不少书和直播&…

【Linux】基本指令(中)

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:Linux ⚙️操作环境:Xshell (操作系统:CentOS 7.9 64位) 目录 man指令 cp指令 mv指令 cat指令 more指令 less指令 head指令 …

Go语言中的时间控制:定时器技术详细指南

Go语言中的时间控制&#xff1a;定时器技术详细指南 引言定时器基础创建和使用time.Timer使用time.Ticker实现周期性任务定时器的内部机制小结 使用time.Timer实现简单的定时任务创建和启动定时器停止和重置定时器定时器的实际应用小结 利用time.Ticker处理重复的定时任务创建和…

PHP【swoole】

前言 Swoole官方文档&#xff1a;Swoole 文档 Swoole 使 PHP 开发人员可以编写高性能高并发的 TCP、UDP、Unix Socket、HTTP、 WebSocket 等服务&#xff0c;让 PHP 不再局限于 Web 领域。Swoole4 协程的成熟将 PHP 带入了前所未有的时期&#xff0c; 为性能的提升提供了独一无…

[晓理紫]CCF系列会议截稿时间订阅

CCF系列会议截稿时间订阅 关注{晓理紫|小李子}&#xff0c;每日更新最新CCF系列会议信息&#xff0c;如感兴趣&#xff0c;请转发给有需要的同学&#xff0c;谢谢支持&#xff01;&#xff01; 如果你感觉对你有所帮助&#xff0c;请关注我&#xff0c;每日准时为你推送最新CCF…

学习使用paddle来构造hrnet网络模型

1、首先阅读了hrnet的网络结构分析&#xff0c;了解到了网络构造如下&#xff1a; 参考博文姿态估计之2D人体姿态估计 - &#xff08;HRNet&#xff09;Deep High-Resolution Representation Learning for Human Pose Estimation&#xff08;多家综合&#xff09;-CSDN博客 最…

3、Redis Cluster集群运维与核心原理剖析

Redis集群方案比较 哨兵模式 在redis3.0以前的版本要实现集群一般是借助哨兵sentinel工具来监控master节点的状态&#xff0c;如果master节点异常&#xff0c;则会做主从切换&#xff0c;将某一台slave作为master&#xff0c;哨兵的配置略微复杂&#xff0c;并且性能和高可用性…

用numpy搭建自己的神经网络

搭建之前的基础与思考 构建模型的基本思想&#xff1a; 构建深度学习的过程&#xff1a;产生idea&#xff0c;将idea转化成code&#xff0c;最后进行experiment&#xff0c;之后根据结果修改idea&#xff0c;继续idea–>code–>experiment的循环&#xff0c;直到最终训练…

前后端分离vue+nodejs高校体育运动会比赛系统08fv2-python-php-java

实现了一个完整的高校体育运动会比赛系统系统&#xff0c;其中主要有运动项目模块、学生模块、项目类型模块、用户表模块、token表模块、关于我们模块、收藏表模块、公告信息模块、留言板模块、运动论坛模块、配置文件模块、裁判员模块、比赛成绩模块、比赛报名模块、关于我们模…

Java网络通信TCP

目录 TCP两个核心类 服务端 1.用ServerSocker类创建对象并且手动指定端口号 2.accept阻塞连接服务端与客户端 3.给客户端提供处理业务方法 4.处理业务 整体代码 客户端 1.创建Socket对象&#xff0c;并连接服务端的ip与端口号 2.获取Socket流对象&#xff0c;写入数据…

uniapp 部署h5,pdf预览

1.hubuilderx 打包h5。 2.上传部署包到服务器。 解压部署包&#xff1a;unzip h5.zip 。 3.nginx配置。 user root; worker_processes 1; #worker_cpu_affinity 0001 0010 0100 1000; #error_log logs/error.log; #error_log logs/error.log notice; error_log /var/l…

C#/.NET/.NET Core优秀项目和框架2024年2月简报

前言 公众号每月定期推广和分享的C#/.NET/.NET Core优秀项目和框架&#xff08;每周至少会推荐两个优秀的项目和框架当然节假日除外&#xff09;&#xff0c;公众号推文中有项目和框架的介绍、功能特点、使用方式以及部分功能截图等&#xff08;打不开或者打开GitHub很慢的同学…

Java基础 - 6 - 面向对象(二)

Java基础 - 6 - 面向对象&#xff08;一&#xff09;-CSDN博客 二. 面向对象高级 2.1 static static叫做静态&#xff0c;可以修饰成员变量、成员方法 2.1.1 static修饰成员变量 成员变量按照有无static修饰&#xff0c;分为两种&#xff1a;类变量、实例变量&#xff08;对象…

项目设计:基于Qt和百度AI的车牌识别系统(嵌入式ARM)

基于Qt和百度AI智能云实现的智能车牌识别系统&#xff0c;具体可实现为停车场管理系统、智能计费停车系统…等。 1.系统实现思路及框架 1.1实现思路 要实现一个车牌识别系统&#xff0c;有多种方法&#xff0c;例如用opencv图像算法实现&#xff0c;或用第三方算法接口&#x…

【每日一题】找到字符串中所有字母异位词

目录 题目&#xff1a;思路&#xff1a;暴力枚举&#xff1a;滑动窗口&#xff1a; 代码实现&#xff1a;一些优化&#xff1a;代码实现&#xff1a; 题目&#xff1a; 找到字符串中所有字母异位词 思路&#xff1a; 暴力枚举&#xff1a; 对于有关子串的题目我们使用暴力枚…

H12-821_113

113.如图所示是路由器现ATE输出的部分信息&#xff0c;以下关于这部分信息的描述&#xff0c;错误的是哪一项&#xff1f; A.display pim rp-info命令用来查看组播组对应的RP信息 B.RP地址是2.2.2.2 C.组地址是225.0.0.0 D.RP的优先级是0 答案&#xff1a;C 注释&#xff1a; …

C语言-柔性数组成员的使用

文章目录 摘要柔性数组成员基本使用细节探究 零长度数组-定长数组-变长数组 摘要 本文先介绍柔性数组成员(flexible array member)的基本使用&#xff0c;然后介绍其内存结构。最后&#xff0c;补充了一些数组相关的其他概念。 柔性数组成员 基本使用 参考: 【C语言内功修炼…

有趣的CSS - 一串乱码

大家好&#xff0c;我是 Just&#xff0c;这里是「设计师工作日常」&#xff0c;今天分享的是通过 css 来实现一段不停变化的 bug 乱码效果。 《有趣的css》系列最新实例通过公众号「设计师工作日常」发布。 目录 整体效果核心代码html 代码css 部分代码 完整代码如下html 页面…