首页 > 解决方案 > 启动时的 pygame 程序被杀死,没有错误

问题描述

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

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

外壳脚本是:

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 工作得很好。

标签: pythoncronraspberry-pi

解决方案


推荐阅读