имя функции определено ранее, но не может вызвать - PullRequest
0 голосов
/ 12 июня 2018

Я довольно новичок в Python, хотя понимаю, что мне нужно знать.За исключением этой части.Я пытался протестировать свою программу на Raspberry Pi 2B некоторое время, но независимо от того, что я пытаюсь сделать, он продолжает выдавать эту ошибку:

Traceback (most recent call last):
  File "/home/pi/Tester.py", line 1, in <module>
    import Solve
  File "/home/pi/Solve.py", line 7, in <module>
    class Solve:
  File "/home/pi/Solve.py", line 185, in Solve
    motions = {"D"  : bottomFace(1),
  File "/home/pi/Solve.py", line 103, in bottomFace
    grab()
NameError: name 'grab' is not defined

Я понятия не имею, как это исправить, просто потому, что он говорит, что «захват» не был определен, но он был определен как функция ранее в коде.Вот код для тех из вас, кто хочет мне помочь:

import cv2 as cv
import time
import colorsys
import RPi.GPIO as gpio
import kociemba as solver

class Solve:

    def __init__(self):
        #create a video stream
        self.cap = cv.VideoCapture(0)

        self.flipperMotorA = 23
        self.flipperMotorB = 24
        self.flipperMotorE = 25

        self.platformMotorA = 12
        self.platformMotorB = 6
        self.platformMotorE = 5

        #To be passed to the solver code
        self.colors = ""

        #To store the solution
        self.solution=""

        self.pixelsToScan = [[50,50],[320,50],[590,50],[50,240],[320,240],[590,240],[50,430],[320,430],[590,430]]


    def setup():
        #setup the GPIO ports
        gpio.setmode(gpio.BCM)

        gpio.setup(platformMotorA, gpio.OUT)
        gpio.setup(platformMotorB, gpio.OUT)
        gpio.setup(platformMotorE, gpio.OUT)

        gpio.setup(flipperMotorA, gpio.OUT)
        gpio.setup(flipperMotorB, gpio.OUT)
        gpio.setup(flipperMotorE, gpio.OUT)


    #Turn the platform clockwise
    def platformClockwise():
        gpio.output(platformMotorA, gpio.HIGH)
        gpio.output(platformMotorB, gpio.LOW)
        gpio.output(platformMotorE, gpio.HIGH)
        time.sleep(.25)

        gpio.output(platformMotorA, gpio.LOW)
        gpio.output(platformMotorB, gpio.LOW)
        gpio.output(platformMotorE, gpio.LOW)
        time.sleep(.5)


    #Flip the cube's face
    def flip():
        gpio.output(flipperMotorA, gpio.LOW)
        gpio.output(flipperMotorB, gpio.HIGH)
        gpio.output(flipperMotorE, gpio.HIGH)
        time.sleep(1.25)

        gpio.output(flipperMotorA, gpio.HIGH)
        gpio.output(flipperMotorB, gpio.LOW)
        gpio.output(flipperMotorE, gpio.HIGH)
        time.sleep(1.25)

        gpio.output(flipperMotorA, gpio.LOW)
        gpio.output(flipperMotorB, gpio.LOW)
        gpio.output(flipperMotorE, gpio.LOW)
        time.sleep(.5)


    #Grab the cube to turn one face
    def grab():
        gpio.output(flipperMotorA, gpio.LOW)
        gpio.output(flipperMotorB, gpio.HIGH)
        gpio.output(flipperMotorE, gpio.HIGH)
        time.sleep(.8)

        gpio.output(flipperMotorA, gpio.LOW)
        gpio.output(flipperMotorB, gpio.LOW)
        gpio.output(flipperMotorE, gpio.LOW)
        time.sleep(.5)


    #release the cube
    def release():
        gpio.output(flipperMotorA, gpio.HIGH)
        gpio.output(flipperMotorB, gpio.LOW)
        gpio.output(flipperMotorE, gpio.HIGH)
        time.sleep(.8)

        gpio.output(flipperMotorA, gpio.LOW)
        gpio.output(flipperMotorB, gpio.LOW)
        gpio.output(flipperMotorE, gpio.LOW)
        time.sleep(1)


    #rotate the bottom face
    def bottomFace(amount):
        grab()
        for i in range(1,amount):
            platformClockwise()

        release()


    #rotate the back face
    def backFace(amount):
        flip()
        grab()
        for i in range(1,amount):
            platformClockwise()

        release()
        platformClockwise()
        platformClockwise()
        flip()
        platformClockwise()
        platformClockwise()


    #rotate the front face
    def frontFace(amount):
        platformClockwise()
        platformClockwise()
        flip()
        grab()
        for i in range(1,amount):
            platformClockwise()

        release()
        platformClockwise()
        platformClockwise()
        flip()


    #rotate the left face
    def leftFace(amount):
        platformClockwise()
        flip()
        grab()
        for i in range(1,amount):
            platformClockwise()

        release()
        platformClockwise()
        platformClockwise()
        flip()
        platformClockwise()


    #rotate the right face
    def rightFace(amount):
        platformClockwise()
        platformClockwise()
        platformClockwise()
        flip()
        grab()
        for i in range(1,amount):
            platformClockwise()

        release()
        platformClockwise()
        platformClockwise()
        flip()
        platformClockwise()
        platformClockwise()
        platformClockwise()


    #rotate the top face
    def topFace(amount):
        flip()
        flip()
        for i in range(1,amount):
            platformClockwise()

        flip()
        flip()


    motions = {"D"  : bottomFace(1),
               "D2" : bottomFace(2),
               "D'" : bottomFace(3),

               "B"  : backFace(1),
               "B2" : backFace(2),
               "B'" : backFace(3),

               "U"  : topFace(1),
               "U2" : topFace(2),
               "U'" : topFace(3),

               "F"  : frontFace(1),
               "F2" : frontface(2),
               "F'" : frontFace(3),

               "L"  : leftFace(1),
               "L2" : leftFace(2),
               "L'" : leftFace(3),

               "R"  : rightFace(1),
               "R2" : rightFace(2),
               "R'" : rightFace(3)}


    #Function for scanning every side of the cube
    def scanSides():
        setup()
        for i in range(0,5): #For each side add the colors to a list
            #Get the frame with the cube
            rgbimg = cap.read()

            #scan each pixel in the list
            for a in pixelsToScan:
                hue = colorsys.rgb_to_hsv(rgbimg[a[0],a[1],0],rgbimg[a[0],a[1],1],rgbimg[a[0],a[1],2])[0]*360 #get the hue of the pixel
                sat = colorsys.rgb_to_hsv(rgbimg[a[0],a[1],0],rgbimg[a[0],a[1],1],rgbimg[a[0],a[1],2])[1]
                val = colorsys.rgb_to_hsv(rgbimg[a[0],a[1],0],rgbimg[a[0],a[1],1],rgbimg[a[0],a[1],2])[2]
                if sat==0 and val==1:
                    #WHITE
                    colors.append("U")
                elif hue<15 or hue>=295:
                    #RED
                    colors.append("F")
                elif hue>=15 and hue<40:
                    #ORANGE
                    colors.append("B")
                elif hue>=40 and hue<75:
                    #YELLOW
                    colors.append("D")
                elif hue>=75 and hue<165:
                    #GREEN
                    colors.append("L")
                elif hue>=165 and hue<295:
                    #BLUE
                    colors.append("R")
                else:
                    #BROKEN
                    colors.append("E")

            if i<=2:
                platformClockwise()
            elif i==3:
                flip()
            elif i==4:
                flip()
                flip()
            else:
                flip()
                solution = solver.solve(colors)

        for move in solution.split(" "):
            #RUN the solution
            motions[move]

Я серьезно надеюсь, что кто-то может мне помочь.Я пытался поставить себя перед всем, только ставить себя на переменные, а не ставить себя на что-либо.Я действительно в растерянности.Если кто-нибудь из вас сможет мне помочь, это будет с благодарностью.Заранее спасибо!

1 Ответ

0 голосов
/ 12 июня 2018

Добавьте self в качестве аргумента к вашим методам, а затем при вызове метода из другого метода вызывайте их следующим образом: self.grab().Взгляните на Какова цель себя? и другие документы.

Пример:

def setup(self):
    #setup the GPIO ports
    gpio.setmode(gpio.BCM)

    gpio.setup(self.platformMotorA, gpio.OUT) # notice self.platformMotorA

def grab(self):
    gpio.output(self.flipperMotorA, gpio.LOW)
    gpio.output(self.flipperMotorB, gpio.HIGH)
    gpio.output(self.flipperMotorE, gpio.HIGH)
    time.sleep(.8)

    gpio.output(self.flipperMotorA, gpio.LOW)
    gpio.output(self.flipperMotorB, gpio.LOW)
    gpio.output(self.flipperMotorE, gpio.LOW)
    time.sleep(.5)


#release the cube
def release(self):
    gpio.output(self.flipperMotorA, gpio.HIGH)
    gpio.output(self.flipperMotorB, gpio.LOW)
    gpio.output(self.flipperMotorE, gpio.HIGH)
    time.sleep(.8)

    gpio.output(self.flipperMotorA, gpio.LOW)
    gpio.output(self.flipperMotorB, gpio.LOW)
    gpio.output(self.flipperMotorE, gpio.LOW)
    time.sleep(1)


#rotate the bottom face
def bottomFace(self, amount):
    self.grab()
    for i in range(1, amount):
        self.platformClockwise()

    self.release()
...