#!/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()
海陵人脸识别模块串口通信+ROS
于 2023-09-12 17:29:52 首次发布