Python 数据流中的延迟
我正在使用一个名为KRPC的插件和一个python脚本从游戏ksp中传输数据。这是KRPC的文档: 我的程序显示的数据和游戏结束时的数据之间从来没有延迟,直到我将我的程序多线程化,现在我得到了第二次延迟。多线程我的python程序很重要,因为它似乎阻止了脚本挂起或崩溃。我不知道是什么原因造成了延误。我的python脚本是在raspberry pi上运行的,所以我试图保持低CPU使用率Python 数据流中的延迟,python,multithreading,networking,raspberry-pi,rpc,Python,Multithreading,Networking,Raspberry Pi,Rpc,我正在使用一个名为KRPC的插件和一个python脚本从游戏ksp中传输数据。这是KRPC的文档: 我的程序显示的数据和游戏结束时的数据之间从来没有延迟,直到我将我的程序多线程化,现在我得到了第二次延迟。多线程我的python程序很重要,因为它似乎阻止了脚本挂起或崩溃。我不知道是什么原因造成了延误。我的python脚本是在raspberry pi上运行的,所以我试图保持低CPU使用率 from threading import Thread import time import Adafruit
from threading import Thread
import time
import Adafruit_Nokia_LCD as LCD
import Adafruit_GPIO.SPI as SPI
import krpc
import RPi.GPIO as GPIO
from pad4pi import rpi_gpio
from UUGear import *
from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont
GPIO.setwarnings(False)
try:
device = UUGearDevice('UUGear-Arduino-5343-9628')
if not device.isValid():
exit()
KEYPAD = [
[1,2,3],
[4,5,6],
[7,8,9],
["*",0,"#"]
]
ROW_PINS = [4,5,12,16] # BCM numbering
COL_PINS = [26,6,13] # BCM numbering
global pressedkey
pressedkey = '0'
factory = rpi_gpio.KeypadFactory()
# Try factory.create_4_by_3_keypad
# and factory.create_4_by_4_keypad for reasonable defaults
keypad = factory.create_keypad(keypad=KEYPAD, row_pins=ROW_PINS, col_pins=COL_PINS)
def procKey(key):
print(key)
global pressedkey
pressedkey = str(key)
# printKey will be called each time a keypad button is pressed
keypad.registerKeyPressHandler(procKey)
# Raspberry Pi hardware SPI config:
DC = 23
RST = 24
SPI_PORT = 0
SPI_DEVICE = 0
# Hardware SPI usage:
disp = LCD.PCD8544(DC, RST, spi=SPI.SpiDev(SPI_PORT, SPI_DEVICE, max_speed_hz=4000000))
# Software SPI usage (defaults to bit-bang SPI interface):
#disp = LCD.PCD8544(DC, RST, SCLK, DIN, CS)
# Initialize library.
disp.begin(contrast=60)
disp.clear()
disp.display()
image = Image.new('1', (LCD.LCDWIDTH, LCD.LCDHEIGHT))
draw = ImageDraw.Draw(image)
# Load default font.
font = ImageFont.load_default()
draw.rectangle((0,0,83,47), outline=255, fill=255)
draw.text((15,0), 'Loading...', font=font)
disp.image(image)
disp.display()
conn = krpc.connect(name='rpi', address='192.168.0.10', rpc_port=50000, stream_port=50001)
vessel = conn.space_center.active_vessel
draw.rectangle((0,0,83,47), outline=255, fill=255)
draw.text((0,0), '--FLIGHT SYS--', font=font)
draw.text((3,10), '1 - Surface', font=font)
draw.text((3,20), '2 - Orbit', font=font)
disp.image(image)
disp.display()
device.setPinModeAsInput(9)
device.setPinModeAsInput(2)
device.setPinModeAsInput(3)
device.setPinModeAsInput(4)
device.setPinModeAsOutput(12)
vessel.control.sas = False
prev_input_stage = 0
prev_input_parachute = 0
input_stage = '0'
input_parachute = '0'
def screen():
global apoapsis
global periapsis
global altitude
global pressedkey
global draw
global font
global disp
global conn
global vessel
ut = conn.add_stream(getattr, conn.space_center, 'ut')
altitude = conn.add_stream(getattr, vessel.flight(), 'mean_altitude')
apoapsis = conn.add_stream(getattr, vessel.orbit, 'apoapsis_altitude')
periapsis = conn.add_stream(getattr, vessel.orbit, 'periapsis_altitude')
while True:
print 'AP:', apoapsis()
print 'Pe:', periapsis()
print 'Alt:', altitude()
#for parachute in vessel.parts.parachutes:
# print parachute.state
if pressedkey == '2':
draw.rectangle((0,0,83,47), outline=255, fill=255)
if abs(apoapsis()) < 1000:
draw.text((0,0), 'Ap:' + str(round(apoapsis(), 2)) + 'M', font=font)
else:
draw.text((0,0), 'Ap:' + str(round(apoapsis()/1000, 2)) + 'KM', font=font)
if abs(periapsis()) < 1000:
draw.text((0,10), 'Pe:' + str(round(periapsis(), 2)) + 'M', font=font)
else:
draw.text((0,10), 'Pe:' + str(round(periapsis()/1000, 2)) + 'KM', font=font)
if pressedkey == '1':
draw.rectangle((0,0,83,47), outline=255, fill=255)
if abs(altitude()) < 1000:
draw.text((0,0), 'Alt:' + str(round(altitude(), 2)) + 'M', font=font)
else:
draw.text((0,0), 'Alt:' + str(round(altitude()/1000, 2)) + 'KM', font=font)
if pressedkey == '#':
draw.rectangle((0,0,83,47), outline=255, fill=255)
draw.text((0,0), '--FLIGHT SYS--', font=font)
draw.text((3,10), '1 - Surface', font=font)
draw.text((3,20), '2 - Orbit', font=font)
disp.image(image)
disp.display()
def hardware():
global input_stage
global prev_input_stage
global vessel
global device
global input_parachute
global prev_input_parachute
while True:
input_stage = not device.getPinStatus(9)
if ((not prev_input_stage) and input_stage):
vessel.control.activate_next_stage()
print("stage")
print 'Pin 9 status=', device.getPinStatus(9)
prev_input_stage = input_stage
input_parachute = not device.getPinStatus(2)
if ((not prev_input_parachute) and input_parachute):
for parachute in vessel.parts.parachutes:
parachute.deploy()
print("Parachute")
print 'Pin 2 status=', device.getPinStatus(2)
#print(device.analogRead(3))
prev_input_parachute = input_parachute
vessel.control.sas = not device.getPinStatus(4)
if vessel.control.sas == True:
device.setPinHigh(12)
else:
device.setPinLow(12)
for engines in vessel.parts.engines:
if engines.gimballed == True:
engines.gimbal_locked = bool(device.getPinStatus(3))
time.sleep(0.2)
t1 = Thread(target = screen)
t2 = Thread(target = hardware)
t1.start()
t2.start()
t1.join()
t2.join()
except:
print 'Interrupted'
print 'Cleaning up'
GPIO.cleanup()
device.detach()
device.stopDaemon()
keypad.cleanup()
从线程导入线程
导入时间
进口Adafruit_诺基亚_液晶显示器作为液晶显示器
将Adafruitgpio.SPI作为SPI导入
进口krpc
将RPi.GPIO导入为GPIO
从pad4pi导入rpi\gpio
从UUGear进口*
从PIL导入图像
从PIL导入ImageDraw
从PIL导入ImageFont
GPIO.setwarnings(False)
尝试:
设备=UUGear设备('UUGear-Arduino-5343-9628')
如果不是设备。isValid():
退出()
键盘=[
[1,2,3],
[4,5,6],
[7,8,9],
["*",0,"#"]
]
行引脚=[4,5,12,16]#BCM编号
COL_引脚=[26,6,13]#BCM编号
全局按键
按按键='0'
factory=rpi\u gpio.KeypadFactory()
#尝试factory.create_4_by_3_键盘
#和factory.create_4_by_4_键盘以获得合理的默认值
键盘=工厂。创建键盘(键盘=键盘,行针=行针,列针=列针)
def procKey(钥匙):
打印(键)
全局按键
按下键=str(键)
#每次按下键盘按钮时都会调用printKey
键盘。注册表按键处理程序(procKey)
#Raspberry Pi硬件SPI配置:
DC=23
RST=24
SPI_端口=0
SPI_设备=0
#硬件SPI使用:
disp=LCD.PCD8544(DC、RST、spi=spi.SpiDev(spi_端口、spi_设备、最大速度_hz=4000000))
#软件SPI使用(默认为bit bang SPI接口):
#disp=LCD.PCD8544(直流、RST、SCLK、DIN、CS)
#初始化库。
显示开始(对比度=60)
disp.clear()
disp.display()
image=image.new('1',(LCD.LCDWIDTH,LCD.lcdhight))
draw=ImageDraw.draw(图像)
#加载默认字体。
font=ImageFont.load\u default()
绘制矩形((0,0,83,47),轮廓=255,填充=255)
draw.text((15,0),“正在加载…”,font=font)
显示图像(图像)
disp.display()
conn=krpc.connect(名称='rpi',地址='192.168.0.10',rpc_端口=50000,流_端口=50001)
容器=连接空间中心活动容器
绘制矩形((0,0,83,47),轮廓=255,填充=255)
draw.text((0,0),'--FLIGHT SYS--',font=font)
draw.text((3,10),“1-表面”,font=font)
draw.text((3,20),'2-Orbit',font=font)
显示图像(图像)
disp.display()
设备。设置PINMode输入(9)
设备。设置PINMode输入(2)
设备。设置PINMode输入(3)
设备。设置PINMode输入(4)
设备。SetPinModeA输出(12)
Vesser.control.sas=错误
上一个输入阶段=0
上一个输入伞=0
输入阶段='0'
输入\降落伞='0'
def屏幕():
全球远点
全关节近端
全球高度
全局按键
全球抽签
全局字体
全局显示
全球康涅狄格州
全球船舶
ut=conn.add_流(getattr,conn.space_中心,'ut')
高度=连接添加高度流(getattr,船只飞行(),“平均高度”)
apoapsis=conn.add_流(getattr,Vesser.orbit,“apoapsis_高度”)
近空=连接添加流(getattr,Vesser.orbit,“近空高度”)
尽管如此:
打印“AP:”,apoapsis()
打印“Pe:”,近中点()
打印“高度:”,高度()
#对于船上的降落伞。零件。降落伞:
#打印降落伞状态
如果按键=='2':
绘制矩形((0,0,83,47),轮廓=255,填充=255)
如果abs(apoapsis())<1000:
draw.text((0,0),'Ap:'+str(round(apoapsis(),2))+'M',font=font)
其他:
draw.text((0,0),'Ap:'+str(round(apoapsis()/1000,2))+'KM',font=font)
如果abs(periapsis())<1000:
draw.text((0,10),'Pe:'+str(round(periapsis(),2))+'M',font=font)
其他:
draw.text((0,10),'Pe:'+str(round(periapsis()/1000,2))+'KM',font=font)
如果按按键=='1':
绘制矩形((0,0,83,47),轮廓=255,填充=255)
如果abs(高度())小于1000:
draw.text((0,0),'Alt:'+str(round(altitude(),2))+'M',font=font)
其他:
draw.text((0,0),'Alt:'+str(圆形(高度()/1000,2))+'KM',font=font)
如果按键=='#':
绘制矩形((0,0,83,47),轮廓=255,填充=255)
draw.text((0,0),'--FLIGHT SYS--',font=font)
draw.text((3,10),“1-表面”,font=font)
draw.text((3,20),'2-Orbit',font=font)
显示图像(图像)
disp.display()
def硬件():
全局输入级
全局上一输入级
全球船舶
全球设备
全局输入伞
全局前置输入降落伞
尽管如此:
输入阶段=非设备。getPinStatus(9)
如果((不是上一个输入阶段)和输入阶段):
船舶。控制。激活下一阶段()
印刷品(“舞台”)
打印“引脚9状态=”,设备。getPinStatus(9)
上一个输入阶段=输入阶段
输入\降落伞=非设备。getPinStatus(2)
如果((不是上一个输入伞)和输入伞):
对于船上的降落伞。零件。降落伞:
降落伞部署
打印(“降落伞”)
打印“引脚2状态=”,设备。getPinStatus(2)
#打印(设备模拟读取(3))
上一个输入伞=输入伞