2024年3月30日,四川省西昌市突发森林大火,宁南县森林草原防灭火专业扑火队员紧急奔赴现场救援。3月31日凌晨,21名消防队员和一名当地向导在救火途中突遇风向大变,火借风势,一行人被熊熊烈火团团围困,只有3人幸存,19人不幸遇难。此次森林火灾与2019年凉山木里森林火灾仅相隔一年,2019年火灾致27名消防员和4名地方干部群众共31人牺牲。同一季节,同是凉山,悲剧重演,令人无比痛心。全世界范围内,消防员几乎都是和平年代里牺牲最多的职业。在我国,消防部队纳入中国人民武装警察部队序列,所以每次任务叫“出警”。他们一次次“逆行”,赴汤蹈火,用身躯筑起“防火线”。山东省泰安市消防支队原支队长许传升告诉《生命时报》记者,培养一名合格的消防员至少需要1159小时,也就是145天的时间。消防员的日常训练包括单兵训练、班组训练、中队合成训练等,其中单兵训练又包括体能训练、技能训练、心理训练、战术训练、理论学习。在现代灭火救援任务中,无论是先进的装备,还是完备的战术,最终都得依靠作战主体—消防员去操纵、实施,因此体能是消防员的第一素质,也是有效完成各类灭火救援任务的根本保障。消防战士们每天都要进行大量训练,如百米负重跑、10层负重登楼操、搬运重物折返跑等,提高自身速度、耐力、力量、爆发力、协调性等,以支撑他们在救援现场的体能。
我们不希望再看到消防员因山风突变等原因被火海吞噬,所以我们设计了一款四足仿生巡山灭火一体机器人。
四足仿生是为了更好的在复杂的山地环境行走。我们设想着机器人从天而降扑灭火海的画面。
3D建模并打印了机器人外壳
设计单片机程序,使用8舵机驱动机器人,下面展示核心代码。
#include "conf.h"
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include "vkml.h"
#include <Series.h>
#include <Ticker.h>
#include <DNSServer.h>
#include <WiFiUdp.h>
#include <Servo.h>
int servoOffsets[8] = {0, 0, 0, 0, 0, 0, 0, 0};
// Servos matrix
const int ALLMATRIX = 9; // GPIO14 + GPIO12 + GPIO13 + GPIO15 + GPIO16 + GPIO5 + GPIO4 + GPIO2 + Run Time
const int ALLSERVOS = 8; // GPIO14 + GPIO12 + GPIO13 + GPIO15 + GPIO16 + GPIO5 + GPIO4 + GPIO2
// MG90S servo PWM pulse traveling
const int PWMRES_Min = 1; // PWM Resolution 1
const int PWMRES_Max = 180; // PWM Resolution 180
const int SERVOMIN = 400; // 400
const int SERVOMAX = 2400; // 2400
// Servo delay base time
const int BASEDELAYTIME = 10; // 10 ms
// Motion data index
int Servo_PROGRAM;
// Servo ID
int GPIO_ID;
int GPIO14_PWM;
int GPIO12_PWM;
int GPIO13_PWM;
int GPIO15_PWM;
int GPIO16_PWM;
int GPIO5_PWM;
int GPIO4_PWM;
int GPIO2_PWM;
// Backup servo value
int Running_Servo_POS [ALLMATRIX];
Servo GPIO14SERVO;
Servo GPIO12SERVO;
Servo GPIO13SERVO;
Servo GPIO15SERVO;
Servo GPIO16SERVO;
Servo GPIO5SERVO;
Servo GPIO4SERVO;
Servo GPIO2SERVO;
VKML vkml;
WiFiUDP Udp;
char udpPacketBuffer[UDP_TX_PACKET_MAX_SIZE + 1];
DNSServer dnsServer;
Ticker ticker;
CONF conf;
WiFiClient wifiClient;
PubSubClient MQTT(wifiClient);
void (*resetFunc)(void) = 0;
String ssid = conf.get("ssid"), pwd = conf.get("pwd"), sn = conf.get("sn"), sk = conf.get("sk");
Series fastLoopTasks;
Series slowLoopTasks;
Series mqttCallbackTasks;
bool slowLoopReady = false;
void setup() {
Serial.begin(115200);
delay(1000);
Serial.println();
//初始化spider
spiderSetup();
//检测是否被设置过
if (conf.get("status") == "") {
WiFi.mode(WIFI_AP_STA);
//没有配网,开启热点
Serial.print("Setting soft-AP ... ");
Serial.println(WiFi.softAP("rabbit-chameleon", "") ? "Ready" : "Failed!");
Serial.println("IP address: ");
Serial.println(WiFi.softAPIP());
//开启dns服务器
dnsServer.start(53, "rabbit.com", WiFi.softAPIP());
fastLoopTasks.add([]() {
dnsServer.processNextRequest();
});
//开启udp
Udp.begin(8888);
fastLoopTasks.add([]() {
udpServerLoop();
});
} else {
//已经配网连接wifi
connectWiFi();
//开启mqtt
connectMQTT();
slowLoopTasks.add([]() {
//定时检测wifi连接状态
if (WiFi.status() != WL_CONNECTED) {
connectWiFi();
}
//定时检测mqtt连接状态
if (!MQTT.connected()) {
Servo_PROGRAM_Lie();
connectMQTT();
}
});
//servoSetup();
//dhtSetup();
//smeSetup();
//waterSetup();
}
ticker.attach(1, []() {
slowLoopReady = true;
});
}
void loop() {
fastLoopTasks.run();
if (slowLoopReady) {
//slowLoop
slowLoopTasks.run();
slowLoopReady = false;
}
}
采用WiFi控制,编写上位机,下面展示上位机核心代码。
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>操控系统</title>
<style>
* {
margin: 0;
padding: 0;
webkit-user-select: none;
-webkit-touch-callout: none;
}
</style>
<link rel="stylesheet" href="./function.min.css">
<link rel="stylesheet" href="./handsome.min.css">
</head>
<body>
<!-- 摄像头 -->
<div>
<video id="huamian" style="width: 100vw;height: 100vh;object-fit: fill;" autoplay>
<source src="./huoqingshipin.mp4" type="video/mp4">
</video>
</div>
<!-- 地图 -->
<div style="position: fixed;top: 10px; left: 10px;border-style: solid; border-radius: 9%;overflow: hidden;">
<div id="map" style="width: 150px;height: 130px;"></div>
</div>
<div style="position: fixed;top: 10px; left: 200px;">
<p id="tip" style="color: red;"></p>
<a href="./xunhang.html">
<button>设置巡航</button>
</a>
</div>
<!-- 操作 -->
<div style="position: fixed;bottom: 150px;right: 100px;">
<a id="water">
<img style="width: 50px; display: inline-block; border-style:solid;border-radius:33px;overflow: hidden;" src="./flow.png" alt="喷水">
</a>
</div>
<!-- package -->
<script src="https://cdn.jsdelivr.net/gh/jquery/jquery@3.6.4/dist/jquery.min.js"></script>
<script src="./function.js"></script>
<script src="./vkml.js"></script>
<!-- js -->
<script src="joy.js"></script>
<div id="joyDiv" style="position: fixed; bottom: 50px; left: 50px; width:100px;height:100px;"></div>
<script src="yaogan.js"></script>
<script type="text/javascript" src="https://api.map.baidu.com/api?v=1.0&type=webgl&ak=znq4fk9w4xce6yZ3juZogmzpIM1M8gkV"></script>
<script src="ditu.js"></script>
<script src="./mqtt.js"></script>
<script src="tongxin.js"></script>
<script type="text/javascript">
window.addEventListener('contextmenu', function(e) {
e.preventDefault();
})
</script>
<!-- <script>
$.message({
title: "通知",
message: "提交失败,检查网络问题",
type: 'warning'
})
</script> -->
</body>
</html>
使用esp-cam作为图传模块。
使用火焰红外传感器作为探火模块。
使用ATGM332D GPS北斗双模定位模块提供gps信息。
各位评委老师好,很荣幸能够参加本次决赛答辩。我们的参赛作品是四足仿生巡山灭火一体机器人。
整体展示:我们的产品采用的是四足仿生结构。采用八个舵机灵活控制行走,可在复杂崎岖路面行走。使用esp32-cam图传模块将图像传至上位机实时显示。上位机与机器人主控采用mqtt协议通讯进行数据上报与远程控制。上位机采用了轮盘摇杆控制机器人行走。机器人可利用gps按设置的点阵定点巡航,发现火情后及时上报。通过人工远程操控喷射灭火剂进行灭火。
产品整体创新点:集四足仿生,图像传递,火情探测,位置定位,远程控制于一体。
创新点1:传统轮式机器人难以适应森林环境的复杂路面,我们采用四足仿生结构,自由度提高,可在复杂地形行走。
创新点2:基于esp-cam的图传模块,将路况进行实时传递给操作者。esp32获取图像数据后首先发送到服务器上 , 然后由服务器转发到对应的APP上 . 此方法可实现 "多对多"的数据传输.。
创新点3:使用火焰红外传感器作为探火模块,了解着火点,对其进行准确灭火。火焰传感器利用红外线对对火焰非常敏感的特点,使用特制的红外线接受管来检测火焰,然后把火焰的亮度转化为高低变化的电平信号,输入到 中央处理器 中,中央处理器根据信号的变化做出相应的程序处理。
创新点4:采用WiFi控制,编写上位机,进行低延迟操纵。
请各位评委老师和专家批评指正。