基于机器视觉和语音识别的机械臂控制抓取定位导航服务型机器人(分组项目)(更中...)

上机位电脑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")










  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值