1

I´m working on a project including brickpi and i would like to have a live video feed from a camera on my robot. I tried using pygame because i already used it for the controls, but if i try to start the camera, I get the following error:

SystemError: ioctl(VIDIOC_S_FMT) failure: no supported formats

I already looked for ways to solve this but none would work.

Here is my code:

#Kompatibilität von python3 und python2
from __future__ import print_function
from __future__ import division

#Importieren der gebrauchten Bibliotheken
import os
import sys
import time
import pygame
import pygame.camera
from pygame.locals import *
import brickpi3
pygame.init() #the error is here
pygame.camera.init()

#brickpi Instanz
BP = brickpi3.BrickPi3()

#Setzen von Variablen
größe = (800,600)
FPS = 60
vorwärts = 0
rückwärts = 0
links = 0
rechts = 0
arm_auf = 0
arm_zu = 0

#Neues Fenster öffnen
fenster = pygame.display.set_mode((größe))
pygame.display.set_caption("Steuerung")
clock = pygame.time.Clock()

#Kamera
cam = pygame.camera.Camera(pygame.camera.list_cameras()[0])
cam.start()


#Hauptprogramm
steuerungaktiv = True
while steuerungaktiv:
    
    #Variable zum Beenden ohne error
    keinerror = True

    #Überprüfen auf Aktion
    for event in pygame.event.get():
        
        #überprüfen auf beenden des Programms
        if event.type == QUIT:
            steuerungaktiv = False
            keinerror = False
            kamera.stop()
            pygame.quit()

        #Steuerung
        if event.type == KEYDOWN:
            if event.key == K_UP:
                vorwärts = 25
            elif event.key == K_DOWN:
                rückwärts = -25
            elif event.key == K_LEFT:
                links = 25
            elif event.key == K_RIGHT:
                rechts = 25
            elif event.key == K_RETURN:
                arm_zu = -5
            elif event.key == K_BACKSPACE:
                arm_auf = 5

            #Möglichkeit zum beenden über Escape
            elif event.key == K_ESCAPE:
                steuerungaktiv = False
                keinerror = False
                kamera.stop()
                pygame.quit()

        if event.type == KEYUP:
            if event.key == K_UP:
                vorwärts = 0
            elif event.key == K_DOWN:
                rückwärts = 0
            elif event.key == K_LEFT:
                links = 0
            elif event.key == K_RIGHT:
                rechts = 0
            elif event.key == K_RETURN:
                arm_zu = 0
            elif event.key == K_BACKSPACE:
                arm_auf = 0



    #Aktionen des Roboters
    if keinerror == True:
        if vorwärts != 0:
            BP.set_motor_power(BP.PORT_A + BP.PORT_B, vorwärts)
        elif rückwärts != 0:
            BP.set_motor_power(BP.PORT_A + BP.PORT_B, rückwärts)
        elif rechts != 0:
            BP.set_motor_power(BP.PORT_A, rechts)
        elif links != 0:
            BP.set_motor_power(BP.PORT_B, links)
        elif arm_auf != 0:
            BP.set_motor_power(BP.PORT_C, arm_auf)
        elif arm_zu != 0:
            BP.set_motor_power(BP.PORT_C, arm_zu)
        else:
            BP.set_motor_power(BP.PORT_A + BP.PORT_B + BP.PORT_C, 0)


    #aktualisieren des Fensters
    if keinerror == True:
        snapshot = cam.get_image()
        snapshot = pygame.transform.scale(snapshot,(größe))
        fenster.blit(snapshot)
        pygame.display.update()
        clock.tick(FPS)


    #Reduzieren der cpu auslastung
    time.sleep(0.02)

#Abschalten der Motoren
BP.reset_all()

Does someone have an idea how to solve this?

0 Answers0