海陵人脸识别模块串口通信+ROS

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""" 
人脸识别窗口程序:
作者:FFD
版本:1.0
"""
import serial
# import crcmod
import threading
import rospy
from std_msgs.msg import Int32
import binascii
import time

# pub = rospy.Publisher('/Face_Detection_Topic', Int32, queue_size=10) 
port=rospy.get_param('port',"/dev/ttyUSB0")
bps=rospy.get_param('bps',"115200")
# port="/dev/ttyUSB0"
# bps=115200
pub_data=rospy.Publisher("/Face_Detection_Topic",Int32,queue_size=10)
ser = serial.Serial(port, bps, timeout=0.5)
sigin=False

def read_data():
    while not rospy.is_shutdown():
        # data = ser.read(1024)
        list_data = []
        data =str(binascii.b2a_hex(ser.read(1024)))
        # print(len(data))
        # 字符转列表
        if len(data)>10:

            for i in range(1,len(data)) :
                if (i%2==0):
                    # print(data[i:i+2])
                    list_data.append(data[i:i+2])
            # print(list_data)
            # 判断是否为有效数据
            if list_data[0]=='ef'and list_data[1]=='aa' :
                # print('有效数据')

                # 识别指令返回
                if list_data[7]=='12':
                    # print("获取到识别指令")
                    id_pub=Int32()
                    if list_data[8]=='00':
                        id=int(list_data[11])-16
                        print("人脸识别成功,ID:",id)
                        global sigin
                        sigin=True
                        id_pub.data=int(id)
                        pub_data.publish(id)

                    elif list_data[8]=='01':
                        id_pub.data=99
                        # pub_data.publish(id_pub)
                        # print("检测无人脸")
                    elif list_data[8]=='03':
                        id_pub.data=99
                        pub_data.publish(id_pub)
                        print("未找到该用户信息")
                    elif list_data[8]=='06':
                        id_pub.data=99
                        pub_data.publish(id_pub)
                        print("未找到该用户信息")
                    elif list_data[8]=='07':
                        id_pub.data=99
                        pub_data.publish(id_pub)
                        print("未找到该用户信息")
                    elif list_data[8]=='08':
                        id_pub.data=99
                        pub_data.publish(id_pub)
                        print("未找到该用户信息")
                # 注册指令
                if list_data[7]=='13':
                    print("获取到注册指令返回")
                    if list_data[8]=='00':
                        login_id=data[9]
                        print("添加人脸成功,ID:",login_id)
                    elif list_data[8]=='09':
                        print("重复注册")
                    elif list_data[8]=='0a':
                        print("保存ID失败")

                # 删除指令
                if list_data[7]=='20':
                    print("获取到删除指令返回")
                    if list_data[8]=='00':
                        del_id=data[9]
                        print("删除人脸成功,ID:",del_id)
                    else:
                        print("删除人脸失败")
                # 删除全部人脸指令
                if list_data[7]=='21':
                    print("获取到删除全部人脸指令返回")
                    if list_data[8]=='00':
                        print("删除全部人脸成功")
                    else:
                        print("删除全部人脸失败")
                # 背光控制指令
                if list_data[7]=='c0':
                    print("获取到背光控制指令返回")
                    if list_data[8]=='00':
                        print("背光控制成功")
                    else:
                        print("背光控制失败")
                # 显示控制指令
                if list_data[7]=='c1':
                    print("获取到显示控制指令返回")
                    if list_data[8]=='00':
                        print("显示控制成功")
                    else:
                        print("显示控制失败")
                # 白光灯控制指令
                if list_data[7]=='c2':
                    print("获取到白光灯控制指令返回")
                    if list_data[8]=='00':
                        print("白光灯控制成功")
                    else:
                        print("白光灯控制失败")
                # 版本查询指令
                if list_data[7]=='30':
                    print("获取到版本查询指令返回")
                    print("版本号:",data)
                # 重启指令
                if list_data[7]=='c3':
                    print("获取到重启指令返回")
                    if list_data[8]=='00':
                        print("重启成功")
                    else:
                        print("重启失败")
                # 波特率设置指令
                if list_data[7]=='51':
                    print("获取到波特率设置指令返回")
                    if list_data[8]=='00':
                        print("波特率设置成功")
                    else:
                        print("波特率设置失败")
                # 读取已注册用户数量指令
                if list_data[7]=='c4':
                    print("获取到读取已注册用户数量指令返回")
                    if list_data[8]=='00':
                        print("读取已注册用户数量成功")
                        user_num = list_data[10]
                        print("已注册用户数量:",user_num)
                    else:
                        print("读取已注册用户数量失败")

def send_data(data):
    ser.write(data)
    # print("发送数据成功")
    
def Callback(msg):
    if msg.data == 1:
        print("单次识别模式")
        data=bytes.fromhex('ef aa 12 00 00 00 00 12')
        send_data(data)
    if msg.data ==2:
        print("连续识别模式")
        for i in range(1,10):
            data=bytes.fromhex('ef aa 12 00 00 00 00 12')
            send_data(data)
            # print("第%识别",i)
            time.sleep(1)

def sub_data():
    rospy.Subscriber("/Onece_Detection_CMD",Int32,Callback)
    # print("订阅成功")
    rospy.spin()
# 输入:ID
def data_to_hex(data):
    test=['ef','aa','20','00','00','00','02','00','00','22']
    data=hex(data)
    data_1=hex(0x22+data)
    if len(data_1)==4:
        test[-1]=data_1[2:4]
    else:
        test[-1]=data_1[2:5]
    if len(data)==3:
        data='0'+data[2]
    elif len(data)==4:
        data=data[2:4]
    elif len(data)==5:
        data=data[2:5]
    test[-2]=data
    test=' '.join(test)
    return test

# 输入是初试命令:
#  删除用户指令:['ef','aa','20','00','00','00','02','00','00','22']

def delet_user_id(data):
    test=['ef','aa','20','00','00','00','02','00','00','22']
    new_list=test[2:-2]
    data_1=0

    for i in range(0,len(new_list)):
        data_2=int(new_list[i],16)
        data_1=data_1+data_2#转换成10进制再相加
    # 校验位数据处理
    data_1=hex(data_1+data)

    if len(data_1)==4:
        test[-1]=data_1[2:4]
    else:
        test[-1]=data_1[2:5]
    # 识别位数据处理
    data=hex(data)
    if len(data)==3:
        data='0'+data[2]
    elif len(data)==4:
        data=data[2:4]
    elif len(data)==5:
        data=data[2:5]

    test[-2]=data
    test=' '.join(test)
    return test
# 一直识别
def send_face_data():
    while (rospy.is_shutdown()==False):
        
        data=bytes.fromhex('ef aa 12 00 00 00 00 12')
        send_data(data)
        time.sleep(2)
    


if __name__ == "__main__":
    rospy.init_node("serial_node")

    if ser.isOpen():
        # print("串口打开成功")
        # 读取串口数据线程
        t1=threading.Thread(target=read_data)
        # 订阅数据线程
        t2=threading.Thread(target=sub_data)
        # 发送人脸识别数据线程
        t3=threading.Thread(target=send_face_data)
        t2.start()
        t1.start()
        t3.start()
        # 终端交互
        while (rospy.is_shutdown()==False):
            print("\n------------管理小助手------------")
            print("请输入一下数字:")
            print("1:添加新成员 2:删除成员 3:删除全部成员 ")
            print("----------------------------------")
            data=int(input("请输入数字:"))
            if data == 1:
                sigin=False
                print("请对准摄像头设备,录入信息")
                for i in range(15):
                    if sigin==False:
                        data=bytes.fromhex('ef aa 13 00 00 00 00 13')
                        send_data(data)
                        time.sleep(2)
                    else:
                        break

            elif data == 2:
                print("请输入需要的ID号,并按下enter确认")
                id=int(input())
                print("确定删除该用户信息?3:继续 4:退出,并按下enter确认\r\n")
                get_input=int(input())
                if get_input==3:
                    data=bytes.fromhex(delet_user_id(id))
                    send_data(data)
                    print("删除成功")
                elif get_input==4:
                    print("退出")
            elif data==3:
                data=bytes.fromhex('ef aa 21 00 00 00 00 21')
                send_data(data)
                print("成功删除全部成员")

            time.sleep(2)
        print("退出")
        ser.close()

    else:
        print("串口打开失败")
        ser.close()


  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值