Matrix-Dynamics
项目地址:https://gitee.com/que-haohua_admin/matrix-dynamics
此项目为北京林业大学-东方瑞通实训项目,以下为项目详情:
一、项目平台 :fa-star:
1.基本要求
- ubuntu20.04 版本云服务器 (本项目使用服务器 x 3)
- MySQL8.0 版本云数据库
- stm32
- esp32 cam s2
- openmv4 plus
2.开发软件
- vscode
- pycharm 2022专业版
- solidworks 2020
- keil5MDK
二、项目目录 :fa-th-list:
.
├── Back-end 后端代码(前端已集成)
│ ├── app.py
│ ├── blueprints
│ ├── config.py
│ ├── decorators.py
│ ├── exts.py
│ ├── migrations
│ ├── models.py
│ ├── MQTT
│ ├── Mqtt_demo
│ ├── __pycache__
│ ├── requirements.txt
│ ├── static
│ ├── templates
│ ├── test.txt
│ └── venv
├── Front-end 前端代码
│ ├── about
│ ├── devicebounded1
│ ├── devicebounded2-4
│ ├── exit
│ ├── get_back_password
│ ├── index
│ ├── purchase
│ ├── register_1
│ └── team
├── Hardware 硬件代码
│ ├── MQTTWcarV1_demo esp32cam代码
│ ├── openmv openmv4plus部分代码
│ └── WaterCar_STM32 stm32代码
├── LICENSE
├── Mqtt_demo mqtt通讯demo
│ ├── pub.py
│ ├── __pycache__
│ ├── sub.py
│ └── test.py
├── README.md
├── Solidworks-drawings 小车solidworks建模文件
│ ├── 9G舵机.SLDPRT
│ ├── 成品1
│ ├── 履带底盘.SLDPRT
│ ├── 水泵.SLDPRT
│ ├── 液位传感器.SLDPRT
│ ├── ESP32-CAM.SLDPRT
│ └── GPS天线.SLDPRT
三、服务器部署
本项目皆使用腾讯云服务器
1.mqtt服务器
2核2G即可
首先要在服务器开启1883和18083端口
打开终端执行以下命令
wget https://www.emqx.io/downloads/broker/v4.0.5/emqx-ubuntu16.04-v4.0.5.zip
解压EMQ X Broker
unzip emqx-ubuntu16.04-v4.0.5.zip
进入解压出来的emqx文件夹,使用命令启动即可
sudo ./bin/emqx start
在浏览器输入服务器公网ip加18083即可进入后端管理界面
ip:18083
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nSKNWndK-1661775470551)(img/emqx.png)]
默认账号为admin
密码为public
2.obs服务器
2核2G即可
首先要在服务器开启1935和8090端口
(1)srs搭建服务器
打开终端执行以下命令
git clone https://github.com/ossrs/srs
修改max_connections 1000;为max_connections 100;
8080端口修改为8090
注意:若不修改此值后面编译中会报错
vi srs/trunk/conf/srs.conf
cd srs/trunk
注意:在mac 系统中./configure 时需要添加 --osx
./configure --osx
启动srs服务器
./objs/srs -c conf/hls.conf
(2)使用OBS推流
打开obs studio
url为:
rtmp://ip:1935/live
流密钥为:
livestream
(3)播放m3u8流媒体
可以使用以下两种方式进行播放
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title></title>
</head>
<body>
<video src="http://ip:8090/live/livestream.m3u8" controls="controls" width="400" height="300"></video>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset=utf-8 />
<title>videojs-contrib-hls embed</title>
<link href="https://unpkg.com/video.js/dist/video-js.css" rel="stylesheet">
<script src="https://unpkg.com/video.js/dist/video.js"></script>
<script src="https://unpkg.com/videojs-contrib-hls/dist/videojs-contrib-hls.js"></script>
</head>
<body>
<h1>Video.js Example Embed</h1>
<video id="my_video_1" class="video-js vjs-default-skin" controls preload="auto" width="640" height="268"
data-setup='{}'>
<source src="http://d2zihajmogu5jn.cloudfront.net/bipbop-advanced/bipbop_16x9_variant.m3u8" type="application/x-mpegURL">
</video>
<script>
</script>
</body>
</html>
3.database服务器
租用腾讯云数据库
注意要和web服务器处于同一区域
mysql8.0版本
1核1G即可
4.web服务器(主服务器)
建议配置4核8G
服务器python版本为3.8
部署流程
首先服务器开启5000端口
在服务器中克隆仓库
git clone https://gitee.com/que-haohua_admin/matrix-dynamics.git
cd matrix-dynamics/Back-end
安装依赖
pip install -r requirements.txt
进入config.py
更改邮箱配置和数据库配置
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ckHSi15z-1661775470553)(img/mysql.png)]
进入Back-end/blueprint/user.py
更改mqtt服务器配置
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kjnO8Ebw-1661775470555)(img/mqtt.png)]
启动web端
python3 app.py
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q7WJah82-1661775470556)(img/app.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9c8eG5XT-1661775470557)(img/%E9%A6%96%E9%A1%B5.png)]
四、硬件部署
1.物料统计
小车整体采用成品改装+3D打印的方式进行,电路采用飞线,速度快。
后期制作PCB,进行封装集成。
名称 | 数量 | 价格 | 用途 |
---|
SG90舵机 | 2 | 5.43 | 喷头pitch、yaw轴 | 坦克底盘(走闲鱼二手) | 1 | 36.9 | 小车底盘 | ESP32-CAM | 1 | 27.55 | 小车视频推流+无线通信 | STM32F103C6T6 | 1 | 8 | 底盘主控(72M主频 32k内存) | 水泵 | 1 | 2.6 | 喷水 | 隔离MOS管FR120N | 1 | 1.1 | 水泵控制 | 软管 | 1 | 1.15 | 供水 | L9110S 双路H桥 | 1 | 1.5 | 驱动底盘电机 | GPS | 1 | 12.1 | 提供位置信息 | 无线通信JDY-40 | 1 | 4.5 | 遥控器遥控使用 | 动力电池3.7v2000ma | 1 | 28.99 | 考虑替换电池。 | 打印耗材等杂料费 | * | 10 | 外壳,机械结构等 | 合计145.25(不包括运费) | | | |
2.通讯协议帧
1.小车控制报文(MQTT)
以下 水泵 和 电机锁 的1 为字符1或者 数字1 均可以!
该报文至少以 1hz频率发送,以保持小车的运动,一旦停止发送,小车立刻停车
帧头 | 小车ID | 前进速度 | 转向速度 | 二值量控制 | 帧尾 |
---|
CTR | %02d | 0-9 | 0-9 | 详见下方 | \n |
按字符:
0-2 | CTR |
---|
3-4 | 控制小车的ID | 5 | char 前进速度 0停车 1-5前进 6-9 后退 | 6 | char 转向速度 0直走 1-4(慢-快)左转 6-9右转(慢-快) | 7 | char 发1(并且无其它电机操作)解除电机锁,电机上电 | 8 | char 1开水泵 0关水泵 |
2.小车回报报文(MQTT)
以下无特殊强调,均按字符串(String)处理,所有符号均为英文半角符号
其中%d表示以十进制发送(与C语言一样)
_代表下划线
帧头 | GPS信息 | 车辆状态信息 | 温湿度 | 帧尾 |
---|
ID%2d_ | GPS:%s_ | Car:%s_ | T%2.1f_H%2.1f_ | Ready/Error%2d |
说明:
● 帧头:回传小车ID(每个小车ID唯一)
● 小车MAC:车辆ESP32 MAC地址,具有全球唯一性。
● GPS信息:详见下方 GPS信息%s
● 车辆状态信息:详见下方 车辆状态信息%s
● 温湿度:车载DHT11测量的温湿度信息。
● 帧尾:返回Ready表示车辆准备完成,返回Error表示车辆硬件故障,故障代码%d详见下方 故障代码 。
GPS信息%s:
默认采用WGS84坐标系统
/代表或
经度(东/西) | 经度数据 | 纬度(南/北) | 纬度数据 | GPS授时(时:分:秒) |
---|
ON/OFF_ | ON/OFF_ | Wt:%3d_ | D:3.2f_ | GTime:%2d%2d%2d |
车辆状态信息%s:
_表示下划线
/表示或,冒号后面的字符串由/分割,表示冒号后面的字符串发送/前方或/后方字符,如车辆启动发送Power:ON或Power:OFF
车辆启动 | 水泵状态 | 剩余水位信息 | 前方距离(cm) | 云台PItch Yaw | 剩余电量 |
---|
ON/OFF_ | ON/OFF_ | Wt:%3d_ | D:3.2f_ | P%2.1fY%2.1f | B:%3d |
说明:
● 车辆启动:默认OFF,当为OFF时,车辆所有电机断电,发送任何电机控制命令均无效。需发送上电命令。
● 水泵状态:开或关。
● 水位信息:0-100,单位%,100表示满水位,0表示没水了。
● 前方距离:车辆车头测距传感器测量得到的前方距离,单位厘米。
● 云台:俯仰角、偏航角
● 剩余电量:电池剩余电量,单位%,100满电,0没电。
##### 故障代码:
故障代码: | 故障情况 | 解决 |
---|
1 | 与车辆主控STM32通信失败 | 检查ESP32与STM32连线是否正常 | 2 | 车辆温湿度传感器离线 | 检查温湿度传感器接线 | 3 | 车辆水位传感器离线 | 检查水位传感器 | 4 | 车辆电池故障(电压过高/过低 | 检查电池 | 5 | 车辆测距传感器故障 | 检查车头红外测距 |
3.ESP32 ->STM32 (UART)
115200-8-N-1 10Hz
U2_RXD 16 PB10(STM32)
U2_TXD 17 PB11(STM32)
帧头: | 前进速度 | 转向速度 | 电源控制 | 水泵控制 | 照明控制 | 帧尾 |
---|
ESP | 0-9 | 0-9 | 0/1 | 0/1 | 0/1 | \n |
按字节:
0-2 | 固定ESP |
---|
3[3:0] | 前进速度 | 3[7:4] | 转向速度 | 4[0] | 电源控制,这位发1解除电机锁 | 4[1] | 水泵控制 | 4[2] | 照明控制 | 5 | 固定\n |
4.STM32 -> ESP32(UART)
115200-8-N-1 10Hz 共40字符
B11 -> USART3 RX
B10 -> USART3 TX
帧头 | GPS经纬 | GPS 授时 | 小车状态 | 帧尾 |
---|
STM | union | uin16_t | 略 | \n |
按字节:
0-2 | 帧头STM |
---|
3 | E/W | 4 | S/N | 5-12 | double转union联合体 经度 | 13-20 | double转union联合体 纬度 | 21-22 | uin16_t GPS授时 | 23[0] | 车辆是否启动 | 23[1] | 水泵状态 | 24-27 | float转union联合体 距离 | 28-31 | float转union联合体 Pitch | 32-35 | float转union联合体 Yaw | 36 | uint8_t 水位 0-100 | 37 | 电量uint8_t | 38 | 故障代码uint8_t 0表示全部正常 | 39 | 帧尾\n |
|