ich bin noch Python Anfänger und bin dabei einen Roboter zu Programmieren. Ich möchte mehrere Funktionen parallel laufen lassen und verwende hier für threading.
Ich habe ein Programm mit threading erstell wo zwei Funktionen control und sensoren parallel laufen. Dies hat auch soweit Funktioniert.
Für den Roboter habe ich dann das Programm Megapi() importiert.
https://github.com/Makeblock-official/P ... /megapi.py
Nachdem ich dies gemacht habe und in den jeweiligen Funktionen Befehle eingefügt habe erhalte ich einige Fehlermeldungen. In der Megapi Class wir ebenfalls threading verwendet.
Programm
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: cp1252 -*-
# Autor:
# Datum: 20170317
# Version: 1.0
#Megapi import
from megapi import *
import time, os, random
# Threads Bibliothek importieren.
from threading import Thread
# stopp Bedingung für die While Schleifen der Threads.
global stopp_turn
global time_stopp
global leftSpeed
global rigthSpeet
Ultraschall = 0;
Kompass = 0;
z = 0;
#Funktion Fahren in welche Richtung
def move(direction,speed):
if direction == 1:
#Vorwärz
leftSpeed = -speed
rigthSpeet = speed
elif direction == 2:
#Rückwärz
leftSpeed = speed
rigthSpeet = -speed
elif direction == 3:
#Rückwärz
leftSpeed = speed
rigthSpeet = speed
elif direction == 4:
#Rückwärz
leftSpeed = -speed
rigthSpeet = -speed
else:
leftSpeed = 0
rigthSpeet = 0
bot.encoderMotorRun(1,rigthSpeet);
bot.encoderMotorRun(2,leftSpeed);
print("move",direction)
def printscreen():
# der Befehl os.system('clear') leert den Bildschirmihalt vor
# jeder Aktualisierung der Anzeige. So bleibt das Menue stehen
# und die Bildschirmanzeige im Terminal Fenster steht still.
os.system('clear')
print("========== Geschwindigkeitsanzeige ==========")
#print "Geschwindigkeit linker Motor: ", leftSpeed
#print "Geschwindigkeit rechter Motor: ", rigthSpeet
print("move",direction)
print "distance:"+str(Ultraschall)+" cm";
def onRead(v):
global Ultraschall;
Ultraschall = v;
#print "distance:"+str(Ultraschall)+" cm";
# So lange stopp = 0 arbeitet dieser Thread in der
# Endlosschleife.
def control():
global stopp_control
global time_stopp
stopp_control = 0
turn_degree = 0
bot = MegaPi()
bot.start()
sleep(1);
while stopp_control == 0:
#sleep(1);
#move(1,100)
time.sleep( 1 )
print "vorwärz"
time.sleep( 1 )
#sleep(1);
print "Rückwerz"
time.sleep( 1 )
#sleep(2);
#move(1,0)
print "links"
time.sleep( 1 )
#sleep(2);
#move(2,100)
print "rechts"
#sleep(2);
#move(1,0)
if time_stopp < time.time():
stopp_control = 1
print "Programm Ende";
def sensoren():
global stopp_control
global time_stopp
stopp_control = 0
bot = MegaPi()
bot.start()
sleep(1);
while stopp_control == 0:
bot.ultrasonicSensorRead(7,onRead);
#print "Thread Sensor Run";
print "distance:"+str(Ultraschall)+" cm";
#sleep(1);
time.sleep( 1 )
if time_stopp < time.time():
stopp_control = 1
print "Programm Ende";
laufzeit=input("Bitte die Zeit in Minuten eingeben die das Roboter-Auto fahren soll: ")
time_stopp = laufzeit*60 + time.time()
t_control = Thread(target=control)
t_sensoren = Thread(target=sensoren)
t_control.start()
t_sensoren.start()
Code: Alles auswählen
pi@raspberrypi:~/robot $ python Auto.py
Bitte die Zeit in Minuten eingeben die das Roboter-Auto fahren soll: 1
init MegaPi
init MegaPi
Exception in thread Thread-1:
Traceback (most recent call last):
File "/usr/lib/python2.7/threading.py", line 810, in __bootstrap_inner
self.run()
File "/usr/lib/python2.7/threading.py", line 763, in run
self.__target(*self.__args, **self.__kwargs)
File "Auto.py", line 74, in control
bot = MegaPi()
File "/usr/local/lib/python2.7/dist-packages/megapi.py", line 69, in __init__
signal.signal(signal.SIGINT, self.exit)
ValueError: signal only works in main thread
Exception in thread Thread-2:
Traceback (most recent call last):
File "/usr/lib/python2.7/threading.py", line 810, in __bootstrap_inner
self.run()
File "/usr/lib/python2.7/threading.py", line 763, in run
self.__target(*self.__args, **self.__kwargs)
File "Auto.py", line 104, in sensoren
bot = MegaPi()
File "/usr/local/lib/python2.7/dist-packages/megapi.py", line 69, in __init__
signal.signal(signal.SIGINT, self.exit)
ValueError: signal only works in main thread
pi@raspberrypi:~/robot $