回到首页 返回首页
回到顶部 回到顶部
返回上一页 返回上一页
best-icon

行空板M10扩展板--纷争系统智能武器 简单

头像 Anders项勇 2025.06.29 29 0

image.png
image.png

步骤1 【制作背景】

DF为行空板M10推出新品 —— 行空板M10扩展板组合(含电机IO扩展板、金手指扩展板、800mAh电池扩展板),强大的M10计算能力加上M10扩展板组合丰富的扩展口和便携的电源为我们创客们创作时消除了各种取舍障碍,极大的激发了创客的奇思妙想,只要想的到就能办得到:)那么我们能做什么呢?

image.png

步骤2 【项目介绍】

夏天到了,想起了小时候的打水枪游戏,现在儿子的玩具水枪沦落到给小鹦鹉洗澡了。

image.png

就不能搞点好玩的东西吗?这不M10超强组合就在边上吗?两个碰撞下能产生啥?纷争游戏系统智能武器就此诞生!:)一般的纷争激光系统是一种专为战术冲突、军事演习及特种部队训练设计的激光设备。它能够模拟真实战场环境,通过发射和接收红外激光信号,识别并模拟交战结果。士兵和装备都配备了相应的激光发射器和接收器,当激光击中接收器时,系统会实时记录并计算损伤,显示在相关设备上。这种系统不仅能够追踪每个士兵的行动和表现,还能够根据设定的规则进行评估。但激光对于民用游戏,如果选择的激光管能量有问题或者质量不好还是对人体有一定的危险,而且打击到身上没有太多感觉,最多搞点震动传感,烟雾。民用娱乐的纷争系统一般是真人CS彩弹qiang,相信大部分男生都玩过,但缺乏智能系统,也有一定的危险性,要穿戴各种护具。那么我们能不能设计一个可以尽情玩耍又带有实感,还有各种高科技加持的纷争游戏系统呢?当然可以,有M10三剑客组合,啥都可以!对了,还要加上我们的水枪!:)

步骤3 【解决方案】

1.击打传感:行空板M10作为核心控制,利用M10扩展板组合扩展口多的特点加上多个水分传感器作为击打的传感器(关键部位放置,比如头、胸等)

2.血量显示:接上全彩灯带,利用彩灯的数量模拟剩余的血量,被对方水qiang击中后血量减少。

3.敌人探测:利用微波传感器的微波对建筑物墙体有穿透能力,探测躲避在障碍物后的敌人,发现障碍物后的敌人移动时,屏幕上会提示发现敌人。

4.敌我识别:执行任务前下发根据敌人照片训练的模型到M10,利用摄像头识别敌人人脸,匹配到模型中的人脸目标时屏幕上会出现可以攻击字样。

步骤4 【作品演示】

步骤5 【制作过程】--材料清单

材料清单

  • 行空板M10 X1 链接
  • 行空板M10扩展板组合 X1 链接
  • 水分传感器 X多个 链接
  • 微波运动传感器 X1 链接
  • WS2812 RGB 全彩灯带(7灯珠) X1 链接
  • usb笔记本摄像头 X1
  • 玩具水枪 X1

步骤6 【制作过程】--搭建连接

M10和M10扩展板组合穿起来后扩展口多达16个,利用M10配的两头PH2.0-3P把水分传感器、全彩灯带、微波传感器接到M10、M10扩展板上,usb笔记本摄像头插上USB口,用双面胶贴在微波运动传感器前面。M10扩展板上还可以加入更多的水分传感器作为更多击打部位的判断。

image.png
image.png
image.png

步骤7 【制作过程】--编程

编程思路:
1.通过变量累加统计记录中枪数:水分传感器的模拟值要测试设为多少阈值合适,防止误报,这里设置为>1000判定为击中,同时更新血条数和彩灯数。
2.微波传感器低电平代表探测到移动人体进行报警。
3.人脸识别比对训练模型中训练过的人脸,匹配后显示可以攻击。

4.血量归零显示战败。

A.这是人脸采集程序,把任务目标人脸采集到目标目录:

image.png

B.这是模型训练程序,根据采集的人脸图片生成人脸识别模型,放到指定目录:

image.png

C.这是图形化编程主程序:

Q1.png

D.这是主程序进一步修改的程序:

人脸识别的图形窗口显示由于需要修改显示位置和显示大小而不是全屏,但mind+图形化编程里面人脸识别库还没有加入相关功能,这时可以把上面图形化生成的代码拷贝到一个新文件,然后进行修改人脸识别显示窗口大小和显示位置部分。程序如下:

代码
#  -*- coding: UTF-8 -*-

# MindPlus
# Python
import time
from unihiker import GUI
from pinpong.board import Board
from pinpong.board import NeoPixel
from pinpong.board import Board,Pin
from pinpong.extension.unihiker import *
import time
import cv2
import numpy as np
from PIL import ImageFont, ImageDraw, Image

# 事件回调函数
def button_click1():
    Q1 = 0
    b.config(text=(str("击中枪数:") + str(Q1)))
    d.config(text=(str("血条数:") + str((7 - Q1))))


u_gui=GUI()
Board().begin()
p_p21_analog=Pin(Pin.P21, Pin.ANALOG)
p_p24_in=Pin(Pin.P24, Pin.IN)
global Q1
Q1 = 0
u_gui.clear()
k=u_gui.add_button(text="GO",x=45,y=50,w=40,h=50,onclick=button_click1)
a=u_gui.draw_text(text="纷争系统智能武器",x=220,y=80,font_size=20, color="#0000FF")
a.config(angle=-90)
b=u_gui.draw_text(text=(str("击中枪数:") + str(Q1)),x=190,y=50,font_size=15, color="#FF0000")
b.config(angle=-90)
c=u_gui.draw_text(text="穿透探测敌人:",x=170,y=50,font_size=15, color="#FF0000")
c.config(angle=-90)
f=u_gui.draw_text(text="识别攻击对象:",x=150,y=50,font_size=15, color="#FF0000")
f.config(angle=-90)
d=u_gui.draw_text(text=(str("血条数:") + str((7 - Q1))),x=130,y=50,font_size=15, color="#FF0000")
d.config(angle=-90)
e=u_gui.draw_text(text=(str("对战结果:") + str(Q1)),x=110,y=50,font_size=15, color="#FF0000")
e.config(angle=-90)
np1 = NeoPixel(Pin((Pin.P22)),7)
np1.brightness(128)
np1.brightness(100)
np1.range_color(0,6,0xFF0000)
def numberMap(x, in_min, in_max, out_min, out_max):
    return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min

def drawChinese(text,x,y,size,r, g, b, a,img):
    font = ImageFont.truetype("HYQiHei_50S.ttf", size)
    img_pil = Image.fromarray(img)
    draw = ImageDraw.Draw(img_pil)
    draw.text((x,y), text, font=font, fill=(b, g, r, a))
    frame = np.array(img_pil)
    return frame

cap = cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 240)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 320)
cap.set(cv2.CAP_PROP_BUFFERSIZE, 1)
cv2.namedWindow('cvwindow',cv2.WND_PROP_FULLSCREEN)
cv2.setWindowProperty('cvwindow', cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN)
pic_counta = 0
pic_countb = 0
faces = 0
font = cv2.FONT_HERSHEY_SIMPLEX
while not cap.isOpened():
    continue
detector=cv2.CascadeClassifier(cv2.data.haarcascades+ 'haarcascade_frontalface_default.xml')
recognizer = cv2.face.LBPHFaceRecognizer_create()
recognizer.read("/root/face_recognition/model/model.yml")
global img_id, confidence
img_id, confidence = 0,0
while True:

    cvimg_success, img_src = cap.read()
    if cvimg_success:
        cvimg_h, cvimg_w, cvimg_c = img_src.shape
        cvimg_w1 = cvimg_h*240//320
        cvimg_x1 = (cvimg_w-cvimg_w1)//2
        img_src = img_src[:, cvimg_x1:cvimg_x1+cvimg_w1]
        img_src = cv2.resize(img_src, (240, 320))
        gray = cv2.cvtColor(img_src, cv2.COLOR_BGR2GRAY)
        faces = detector.detectMultiScale(gray, 1.3, 5)
        cv2.resizeWindow('cvwindow', 100, 100)  # 设置窗口大小(宽度,高度)
        cv2.moveWindow('cvwindow', 10, 200)    # 设置窗口位置(x,y)
        cv2.imshow('cvwindow', img_src)

    if len(faces)>0:
        img_id, confidence = 0,0
        for (x, y, cvimg_w, cvimg_h) in faces:
            cv2.rectangle(img_src, (x - 10, y - 10), (x + cvimg_w + 10, y + cvimg_h + 10), (0, 255, 0), 2)
            img_array = gray[y:y + cvimg_h, x:x + cvimg_w]
            img_id, confidence = recognizer.predict(img_array)
            confidence   = (numberMap(confidence, 150, 0,0,100))
            if confidence ==100:
                confidence = 0

        if (confidence > 90):
            f.config(text=(str("识别攻击对象:") + str("可以攻击!!")))
            img_src = drawChinese(text=str("可以攻击!!"),x=10, y=20,size=25,r= 50,g=200,b=0,a=0,img=img_src)
    cv2.resizeWindow('cvwindow', 100, 100)  # 设置窗口大小(宽度,高度)
    cv2.moveWindow('cvwindow', 10, 200)    # 设置窗口位置(x,y)
    cv2.imshow('cvwindow', img_src)
    cv2.waitKey(5)
    if (p_p21_analog.read_analog() > 1000):
        Q1 = (Q1 + 1)
        np1.clear()
        np1.range_color(0,(6 - Q1),0xFF0000)
        b.config(text=(str("击中枪数:") + str(Q1)))
        d.config(text=(str("血条数:") + str((7 - Q1))))
        time.sleep(3)
    if ((p_p24_in.read_digital()==True) == 0):
        c.config(text=(str("穿透探测敌人:") + str("前方有敌人!!!")))
        time.sleep(1)
        c.config(text="穿透探测敌人:")
    if (Q1 >= 7):
        e.config(text="对战结果:战败!!!")

步骤8 【项目总结】

本项目实现了纷争系统的主要功能,利用M10和M10扩展板组合的多扩展口的特点接入了众多传感器,对信息进行综合分析、判断显示,后备电池也使得游戏可以长时间进行,实现了智能的纷争系统。在发现、比对、打击敌人,动态显示各种敌战信息、显示自身血量方面做到了信息的综合集成,配合水枪的打击,使传统游戏得到了信息化的改造。让学生在娱乐的同时学到了军事信息化的知识。

头脑风暴一下后续还可以进行的改进,如:

1.如果水枪的水一直留在水分传感器,而阈值没设置的合理会造成中qiang数重复计算,可以配合水分传感器设置舵机,在集中后自动擦除水分。或者把水分传感器做成镂空,配置压力传感器在水分传感器后面,判定探测到有水分和压力的同时存在才为击中。

2.增加多个M10的通信功能,己方人员可进行语音、文字通讯。并可同时了解我方其他队员的伤亡情况,根据综合态势判定胜负,评价队员技战术水平。

步骤9 附件代码

评论

user-avatar