随着人工智能及无人驾驶技术的发展,无人驾驶巡逻车已成为现代安全部门的一项重要装备。这种车辆可对校园公共安全实行无死角巡逻,不仅有助于缩短反应时间,增强保安效能,而且能够有效地保障校园的安全与稳定。无人巡逻车工作方式有两种,一种是设定巡逻路线,巡逻车按照规划路线巡逻;一种是人远程遥控巡逻,人通过网络遥控车辆行驶,通过摄像头查看巡逻的环境。
轮式移动机器人是移动机器人中应用最多的一种机器人,在校园平坦地面上,采用轮式移动方式让巡逻车移动速度快、高效。所以可以采用麦昆小车底盘,使用马达驱动无人车的移动。使用行空板作为小车主控,行空板带有WIFI模块,能够通过网络远程获取到实时画面,也可以实现远程控制机器人。
巡逻车要实现以下功能,能够实现无人驾驶,管理员通过网络控制的方式实现对巡逻车的远程操控,实现对校园各点的巡逻;管理员能够实时调取巡逻车的视频画面,及时发现问题;能够实现远程喊话,督促学生早点回家、禁止打闹,根据功能要求设计思维导图如下。
根据思路要求首先要设计SIOT(物联网数据平台)主题为siot/camera(存储实时图像数据)、siot/run(控制车辆移动的数据)、siot/news(实时喊话数据的传输)。
行空板连接网络,初始化MQTT协议,在这一定要让SIOT服务器与行空板连接同一个局域网内的无线网络,端口、用户名、密码默认的就可以,无需改动。这里订阅消息发送的订阅,分别是siot/run、siot/news。
控制车辆移动及语音播报
可视化平台设计
# -*- coding: UTF-8 -*-
# MindPlus
# Python
from pinpong.libs.dfrobot_dualuse_shield import DFRobot_DualuseShield
import base64
from io import BytesIO
from PIL import Image
from dfrobot_speech_synthesis import *
from pinpong.board import Board
from unihiker import GUI
import siot
import cv2
# 事件回调函数
def on_message_callback(client, userdata, msg):
if (msg.topic == "siot/run"):
if (msg.payload.decode() == "front"):
p_mbt0014_motor.run(p_mbt0014_motor.ALL, p_mbt0014_motor.CW, 100)
else:
if (msg.payload.decode() == "right"):
p_mbt0014_motor.run(p_mbt0014_motor.M1, p_mbt0014_motor.CCW, 100)
p_mbt0014_motor.run(p_mbt0014_motor.M2, p_mbt0014_motor.CW, 100)
else:
if (msg.payload.decode() == "left"):
p_mbt0014_motor.run(p_mbt0014_motor.M1, p_mbt0014_motor.CW, 100)
p_mbt0014_motor.run(p_mbt0014_motor.M2, p_mbt0014_motor.CCW, 100)
else:
if (msg.payload.decode() == "behind"):
p_mbt0014_motor.run(p_mbt0014_motor.ALL, p_mbt0014_motor.CCW, 100)
else:
p_mbt0014_motor.stop(p_mbt0014_motor.ALL)
else:
gravity_sstts.speak(msg.payload.decode())
def u_thread1_function():
while True:
if vd.grab():
ret, grab = vd.read()
siot.publish(topic="siot/camera", data=base642base64(grab))
else:
print("没有下一帧")
siot.init(client_id="2772934995473315",server="192.168.101.72",port=1883,user="siot",password="dfrobot")
Board().begin()
u_gui=GUI()
p_mbt0014_motor = DFRobot_DualuseShield()
siot.connect()
siot.loop()
gravity_sstts = DFRobot_SpeechSynthesis_I2C()
siot.set_callback(on_message_callback)
siot.getsubscribe(topic="siot/news")
siot.getsubscribe(topic="siot/run")
def frame2base64(frame):
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
img = Image.fromarray(frame) #将每一帧转为Image
output_buffer = BytesIO() #创建一个BytesIO
img.save(output_buffer, format='JPEG') #写入output_buffer
byte_data = output_buffer.getvalue() #在内存中读取
base64_data = base64.b64encode(byte_data) #转为BASE64
return base64_data #转码成功 返回base64编码
def base642base64(frame):
data=str('data:image/png;base64,')
base64data = str(frame2base64(frame))
framedata = base64data[2:(len(base64data)-1)]
base642base64_data = data + str(framedata)
return base642base64_data
vd = cv2.VideoCapture()
vd.open(0)
while not (vd.isOpened()):
print("摄像头初始化中……")
gravity_sstts.begin(gravity_sstts.V2)
gravity_sstts.speak("你好")
p1=u_gui.draw_image(image="robot.png",x=0,y=0)
p1.config(w=240)
thread1=u_gui.start_thread(u_thread1_function)
while True:
pass
quBbUXC1mN2P2024.05.04
你好!这个小车底盘在哪里购买?谢谢!
伦**2024.03.13
太厉害了!!!
许培享2024.01.20
上视频🎵