上机位电脑code
暂空(Socket数据传输,语音识别,目标识别)
下机位树莓派实现部分
(接收数据,引脚调用(小车部分))
import RPi.GPIO as GPIO
import time
import re
import socket
from PIL import Image
from xarm import *
import cv2
import os
import numpy as np
import serial
import glob
import serial.tools.list_ports
ser = serial.Serial('/dev/ttyUSB0', 9600)
GPIO.setmode(GPIO.BOARD)
# 设置ip和端口
tcp_client_Socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_ip = '192.168.43.231'
server_port = 12345
# 连接服务器
tcp_client_Socket.connect((server_ip, server_port))
# 左轮
IN1 = 33
IN3 = 35
IN4 = 37
# 右轮
IN5 = 36
IN7 = 38
IN8 = 40
# 超声波测距
GPIO_TRIGGER = 12
GPIO_ECHO = 18
# 初始化
GPIO.setup(IN1, GPIO.OUT)
GPIO.setup(IN3, GPIO.OUT)
GPIO.setup(IN4, GPIO.OUT)
GPIO.setup(IN5, GPIO.OUT)
GPIO.setup(IN7, GPIO.OUT)
GPIO.setup(IN8, GPIO.OUT)
GPIO.setup(GPIO_TRIGGER, GPIO.OUT)
GPIO.setup(GPIO_ECHO, GPIO.IN)
# 设置工作频率
PWML = GPIO.PWM(IN1, 2000)
PWMR = GPIO.PWM(IN5, 2000)
# 直行
def forward(runtime, speed_level):
GPIO.output(IN3, GPIO.LOW)
GPIO.output(IN4, GPIO.LOW)
GPIO.output(IN7, GPIO.HIGH)
GPIO.output(IN8, GPIO.LOW)
PWML.start(speed_level)
PWMR.start(speed_level + 1)
time.sleep(runtime)
GPIO.output(IN4, GPIO.HIGH)
GPIO.output(IN8, GPIO.HIGH)
PWML.stop()
PWMR.stop()
# 右转
def turn_R(d_level):
GPIO.output(IN3, GPIO.LOW)
GPIO.output(IN4, GPIO.LOW)
GPIO.output(IN7, GPIO.LOW)
GPIO.output(IN8, GPIO.LOW)
PWML.start(0.5)
PWMR.start(0.5)
time.sleep(d_level)
GPIO.output(IN4, GPIO.HIGH)
GPIO.output(IN8, GPIO.HIGH)
PWML.stop()
PWMR.stop()
# 左转
def turn_L(d_level):
GPIO.output(IN3, GPIO.HIGH)
GPIO.output(IN4, GPIO.LOW)
GPIO.output(IN7, GPIO.HIGH)
GPIO.output(IN8, GPIO.LOW)
PWML.start(0.5)
PWMR.start(0.5)
time.sleep(d_level)
GPIO.output(IN4, GPIO.HIGH)
GPIO.output(IN8, GPIO.HIGH)
PWML.stop()
PWMR.stop()
# 后退
def backward():
GPIO.output(IN3, GPIO.HIGH)
GPIO.output(IN4, GPIO.LOW)
GPIO.output(IN7, GPIO.LOW)
GPIO.output(IN8, GPIO.LOW)
PWML.start(2)
PWMR.start(2)
time.sleep(1)
GPIO.output(IN4, GPIO.HIGH)
GPIO.output(IN8, GPIO.HIGH)
PWML.stop()
PWMR.stop()
# 调头
def turn_around():
GPIO.output(IN3, GPIO.LOW)
GPIO.output(IN4, GPIO.LOW)
GPIO.output(IN7, GPIO.LOW)
GPIO.output(IN8, GPIO.LOW)
PWML.start(4)
PWMR.start(4)
time.sleep(4)
GPIO.output(IN4, GPIO.HIGH)
GPIO.output(IN8, GPIO.HIGH)
PWML.stop()
PWMR.stop()
# 设置为初始状态
def re_set():
GPIO.output(IN1, GPIO.LOW)
GPIO.output(IN3, GPIO.HIGH)
GPIO.output(IN4, GPIO.HIGH)
GPIO.output(IN5, GPIO.LOW)
GPIO.output(IN7, GPIO.HIGH)
GPIO.output(IN8, GPIO.HIGH)
# 请求获取位置信息
def ask_get():
flag = 1;
send_data = str(flag)
tcp_client_Socket.send(send_data.encode("utf-8"))
recv_data = tcp_client_Socket.recv(1024)
data = recv_data.decode("utf-8")
pattern1 = re.compile(r'(.*)\*.*')
pattern2 = re.compile(r'.*\*(.*)')
distance = pattern1.findall(data)
degree = pattern2.findall(data)
distance = int(distance[0]) / 10 # cm (20, 1000)
degree = int(degree[0]) / 100 # L(-) or R(+) degree (0, 90)
return distance, degree
# 请求人的位置
def ask_get_p():
flag = 4;
send_data = str(flag)
tcp_client_Socket.send(send_data.encode("utf-8"))
recv_data = tcp_client_Socket.recv(1024)
data = recv_data.decode("utf-8")
pattern1 = re.compile(r'(.*)\*.*')
pattern2 = re.compile(r'.*\*(.*)')
distance = pattern1.findall(data)
degree = pattern2.findall(data)
distance = int(distance[0]) / 10 # cm (20, 1000)
degree = int(degree[0]) / 100 # L(-) or R(+) degree (0, 90)
return distance, degree
# 障碍物预警
def distance_warning():
# set Trigger to HIGH
GPIO.output(GPIO_TRIGGER, True)
# set Trigger after 0.01ms to LOW
time.sleep(0.00001)
GPIO.output(GPIO_TRIGGER, False)
StartTime = time.time()
StopTime = time.time()
# save StartTime
while GPIO.input(GPIO_ECHO) == 0:
StartTime = time.time()
# save time of arrival
while GPIO.input(GPIO_ECHO) == 1:
StopTime = time.time()
# time difference between start and arrival
TimeElapsed = StopTime - StartTime
# multiply with the sonic speed (34300 cm/s)
# and divide by 2, because there and back
distance_w = (TimeElapsed * 34300) / 2
return distance_w
# 障碍物预警2
def distance_warning2():
flag = 0
distance_w2 = distance_warning()
while distance_w2 < 15:
flag = 3
send_data = str(flag)
tcp_client_Socket.send(send_data.encode("utf-8"))
recv_data = tcp_client_Socket.recv(1024)
data = recv_data.decode("utf-8")
distance_w2 = distance_warning()
#####主程序
##欢迎
##语音请求
flag = 2
send_data = str(flag)
tcp_client_Socket.send(send_data.encode("utf-8"))
# cmd1 = CMD_ACTION_GROUP_RUN(15,1)
# ser.write(cmd1)
recv_data = tcp_client_Socket.recv(1024)
data = recv_data.decode("utf-8")
cmd2 = CMD_ACTION_GROUP_RUN(18, 1)
ser.write(cmd2)
##距离预警
distance_warning2()
##向目标物移动
distance, degree = ask_get()
while distance > 55:
# degree adjust
while abs(degree) > 15:
if (degree < 0):
d_level = 0.5
turn_L(d_level)
else:
d_level = 0.5
turn_R(d_level)
re_set()
distance, degree = ask_get()
# distance adjust
if (distance > 500):
runtime = 2
speed_level = 12
forward(runtime, speed_level)
elif (distance <= 500 and distance > 300):
runtime = 2
speed_level = 8
forward(runtime, speed_level)
elif (distance <= 300 and distance > 55):
runtime = 1
speed_level = 6
forward(runtime, speed_level)
re_set()
distance_warning2()
distance, degree = ask_get()
while abs(degree) > 15:
if (degree < 0):
d_level = 0.5
turn_L(d_level)
else:
d_level = 0.5
turn_R(d_level)
re_set()
distance, degree = ask_get()
##机械臂取物体
if distance < 45:
cmd3 = CMD_ACTION_GROUP_RUN(19, 1)
ser.write(cmd3)
else:
cmd4 = CMD_ACTION_GROUP_RUN(21, 1)
ser.write(cmd4)
##掉头
time.sleep(20)
backward()
turn_around()
##向用户移动
distance, degree = ask_get_p()
while distance > 70:
# degree adjust
while abs(degree) > 15:
if (degree < 0):
d_level = 1
turn_L(d_level)
else:
d_level = 1
turn_R(d_level)
re_set()
distance, degree = ask_get_p()
# distance adjust
if (distance > 500):
runtime = 2
speed_level = 12
forward(runtime, speed_level)
elif (distance <= 500 and distance > 300):
runtime = 2
speed_level = 8
forward(runtime, speed_level)
elif (distance <= 300 and distance > 70):
runtime = 1
speed_level = 6
forward(runtime, speed_level)
re_set()
distance, degree = ask_get_p()
while abs(degree) > 20:
if (degree < 0):
d_level = 0.8
turn_L(d_level)
else:
d_level = 0.8
turn_R(d_level)
re_set()
distance, degree = ask_get_p()
cmd4 = CMD_ACTION_GROUP_RUN(20, 1)
ser.write(cmd4)
flag = 5
send_data = str(flag)
tcp_client_Socket.send(send_data.encode("utf-8"))
recv_data = tcp_client_Socket.recv(1024)
data = recv_data.decode("utf-8")