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

一、前言

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_OBJECTpublic: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 1024int 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;  // 500msunsigned int period_time = 100000;  // 100mssnd_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.hqwc.cn/news/509181.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RAC集群日常维护

RAC的启停 cd /u01/app/19.3.0/grid/bin 停止 ./crsctl stop crs 检查 ./crsctl check crs 启动&#xff0c;可以两个节点同时启动 ./crsctl start crs 检查 ./crsctl check crs ./crsctl status res -t oracle的RAC日常维命令 集群状态检查命令 cractl status res …

nginx主动检测后端健康模块

一、前言 nginx也有自带的后端检测模块ngx_http_upstream_module&#xff0c;该模块可以做到基本的健康检查&#xff0c;因为该健康检查是被动的&#xff0c;当nginx有请求后&#xff0c;才会对后端服务进行健康检测&#xff0c;当检测到有故障时会将这个请求转发到正常的后端服…

基于springboot的助农管理系统的设计与实现

** &#x1f345;点赞收藏关注 → 私信领取本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345;** 一 、设计说明 1.1研究背…

yolov8-更换卷积模块-ContextGuidedBlock_Down

源码解读 class ContextGuidedBlock_Down(nn.Module):"""the size of feature map divided 2, (H,W,C)---->(H/2, W/2, 2C)"""def __init__(self, nIn, dilation_rate2, reduction16):"""args:nIn: the channel of input fea…

保护模式笔记九 中断门和IDT(中断描述符表)

保护模式笔记九 中断门和IDT(中断描述符表) https://www.52pojie.cn/thread-1455684-1-1.html (出处: 吾爱破解论坛) 前言 所有保护模式索引链接&#xff1a;保护模式笔记一 保护模式介绍 前面学习了调用门之后继续学习中断门 中断门 中断门的作用 先前学习的调用门在实际…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《基于条件风险价值的虚拟电厂参与能量及备用市场的双层随机优化》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 这篇文章的标题涉及到以下几个关键点…

SQL入门教程参考

参考 SQL视频教程 LintCode 炼码 - ChatGPT&#xff01;更高效的学习体验&#xff01; SQL基础教程 SQL 教程 SQL 教程2 SQL教程 - 廖雪峰的官方网站 史上最全SQL基础知识总结(理论举例)-CSDN博客 数据库表基础操作 首先数据库表必掌握的基础操作&#xff0c;建表、删表、…

PyTorch-神经网络

神经网络&#xff0c;这也是深度学习的基石&#xff0c;所谓的深度学习&#xff0c;也可以理解为很深层的神经网络。说起这里&#xff0c;有一个小段子&#xff0c;神经网络曾经被打入了冷宫&#xff0c;因为SVM派的崛起&#xff0c;SVM不了解的同学可以去google一下&#xff0…

OpenCV 4基础篇| OpenCV图像的拆分和合并

目录 1. 通道拆分1.1 cv2.split1.1.1 语法结构1.1.2 注意事项1.1.3 代码示例 1.2 NumPy切片1.2.1 代码示例 2. 通道合并2.1 cv2.merge2.1.1 语法结构2.1.2 注意事项2.1.3 代码示例 1. 通道拆分 1.1 cv2.split 1.1.1 语法结构 b,g,r cv2.split(img[, mv]) #图像拆分为 BGR 通…

【Simulink系列】——控制系统仿真基础

声明&#xff1a;本系列博客参考有关专业书籍&#xff0c;截图均为自己实操&#xff0c;仅供交流学习&#xff01; 一、控制系统基本概念 这里就不再介绍类似于开环系统、闭环系统等基本概念了&#xff01; 1、数学模型 控制系统的数学模型是指动态数学模型&#xff0c;大致…

程序员的金三银四求职宝典:如何在关键时期脱颖而出?

个人主页&#xff1a;17_Kevin-CSDN博客 随着春天的脚步渐近&#xff0c;程序员们的求职热潮也随之而来。在这个被称为“金三银四”的招聘季&#xff0c;如何从众多求职者中脱颖而出&#xff0c;成为了许多程序员关注的焦点。本文将为你提供一份全面的求职宝典&#xff0c;助你…

【JMeter】 二次开发插件开发 Dubbo 接口测试插件浅析

概述 在一些企业中&#xff0c;各类业务系统非常丰富&#xff0c;相互之间或对外提供很多的服务或接口这些服务或接口中&#xff0c;有很多是需要强契约约束的&#xff0c;服务的提供方、服务的使用方必须遵守相同契约这类服务最典型的就是RPC&#xff0c;其中应用广泛的有Dub…