微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

启动时 pygame 程序被杀死,没有错误

如何解决启动时 pygame 程序被杀死,没有错误

我有一个在重启时通过 crontab 执行的程序。如果我自己从终端手动运行脚本,脚本和程序会按预期工作,但是在启动时运行脚本时,就好像我的 RoverDriver.py 程序被无故杀死,没有错误

@reboot sleep 15 && sh /home/pi/Desktop/Rover-Driver/launcher.sh >/home/pi/Desktop/Rover-Driver/logs/cronlog 2>&1

shell 脚本是:

cd /
cd /home/pi/Desktop/Rover-Driver
sudo python3 bluetooth.py
cd /

bluetooth.py 程序检查我们的蓝牙无线控制器是否连接到 pi,如果是,则启动驱动程序

import pexpect
import time

attempts = 0
while attempts < 30:
 
 child = pexpect.spawn('bluetoothctl')
 child.sendline('paired-devices')
 output = child.read_nonblocking(size = 200,timeout = -1).decode('utf-8')
 target = 'XBox Wireless Controller'

 if output.find(target > -1:
  print("Target Found")
  print(pexpect.run('python RoverDriver.py'))
  break
 else:
  print("No target found")
  attempts = attempts + 1
  time.sleep(1)

Roverdiver.py 是:

import pyfirmata
import pygame
import time
from pygame.locals import *

pygame.init()

# controller setup
joysticks = []

for i in range(pygame.joystick.get_count()):
    joysticks.append(pygame.joystick.Joystick(i))
    joysticks[-1].init()

controller = joysticks[0]


board = pyfirmata.ArduinoMega('/dev/ttyACM0')

# setting pins
onboard_led =       board.get_pin('d:13:o')
l_motor_pin =       board.get_pin('d:11:p')
r_motor_pin =       board.get_pin('d:12:p')
motor_toggle_pin =  board.get_pin('d:24:o')

# constantly updates statuses for example if reading analog input from potentiometer
it = pyfirmata.util.Iterator(board)
it.start()

motor_toggle_pin.write(0)
l_motor_pin.write(.49804)
r_motor_pin.write(.49804)

print("Have not entered while loop yet")

while(1):
    pygame.event.pump()

    # puts rover in "stop" state if no input,avoids rover from "running away"
    motor_toggle_pin.write(0)
    l_motor_pin.write(.49804)
    r_motor_pin.write(.49804)

    if(controller.get_button(11)):
        print("Exiting...")
        exit()

    # divider ensure only half power given unless "A" button pressed down
    divider = 0.125
    reverse = False
    right_power = controller.get_axis(4)
    left_power = controller.get_axis(5)

    # "A" button pressed,give full power
    if(controller.get_button(0)):
        divider =  0.25

    right_power =   divider * (right_power + 1)
    left_power =    divider * (left_power + 1)

    # Bumpers are pressed,go reverse. Must be doing both to avoid breaking bot
    if(controller.get_button(6) and controller.get_button(7)):
        left_power =    0.5 - left_power
        right_power =   0.5 - right_power
        reverse = True
    else:
        left_power =    0.5 + left_power
        right_power =   0.5 + right_power

    # send motors their values
    motor_toggle_pin.write(1)
    l_motor_pin.write(left_power)
    r_motor_pin.write(right_power)

    print(f"L Power:{left_power} |R Power:{right_power}")
    # avoid cpu overloading
    time.sleep(.05)

# after exiting while loop,"turn off" motors
motor_toggle_pin.write(0)
l_motor_pin.write(.49804)
r_motor_pin.write(.49804)

print("End.")

我期待日志中有相当大的文本块(因为功率级别的打印语句),或者至少是 while 循环的打印前/后语句,但是我得到的只是这个:

Target Found.
b'pygame 1.9.4post1\r\nHello from the pygame community. https://www.pygame.org/contribute.html\r\n'

我知道它的格式是那样的,因为我没有对其进行解码。我假设它与 pygame 有关,但不确定是什么?

编辑:致任何看到这篇文章的人。我完全切换了控件,甚至不再依赖 pygame。我切换到通过套接字连接到 pi 并发送命令字符串。这仍然需要在启动时进行设置,所以我尝试使用 crontab(再次失败),而是发现 systemd 运行良好。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。