読者です 読者をやめる 読者になる 読者になる

WELCOME TO EASTWORLD

Eastworld でドロイド遊び Rapiro が主人公 ラズパイが好物

Rapiro 免停に奮発するの巻

Rapiro Python Pi Camera Raspberry Pi PS4 コントローラー

Rapiro 君、免許皆伝を得たものと思いきや、聞くも涙、語るも涙、実は師匠が偽伝道師だったと判明。

敢え無く免停、というか免取。な~む~

 

どうりでまともに撮影ができず、尻切れになっていたわけだ。

尻切れじゃあ恰好がつかないし、この際だから、ネコ型ロボットのような尻尾をつけちゃおうか、Rapiro 君?

 

 

さて、簡単にはめげない Rapiro 君。

トイレは無用の身でありながら、クソッタレと発奮し、えせ師匠の尻拭いをしたのでありました。

尻切れ解消には、優しく拭いてあげるのがポイントだそうですが、その指導書は目には優しくない蛇文ならぬ駄文なようで:

 

from __future__ import print_function

import picamera
camera = picamera.PiCamera()
camera.framerate = 10
camera.hflip = True
camera.vflip = True
from time import time
from datetime import datetime
cammode = 1   # Camera mode 1:Picture, 2:Movie
import sys

import serial
ser = serial.Serial('/dev/ttyS0', 57600, timeout = 10)

import pygame
pygame.init()
pygame.joystick.init()
joystick = pygame.joystick.Joystick(0)
joystick.init()
buttons = joystick.get_numbuttons()
axes = joystick.get_numaxes()

done = False

while done==False:
    try:
        for event in pygame.event.get():
            print("\r" + "Rec: " + str(camera.recording) + "> ", end="") 
            if event.type == pygame.QUIT:
                done=True

            if event.type == pygame.JOYBUTTONDOWN:
                #print("Joystick button pressed.")

                 for i in range( buttons ):
                    button = joystick.get_button( i )
                    if button == 1:
                        if i == 0:              # Square
                            ser.write("#M6")
                        elif i == 1:            # X
                            ser.write("#M0")
                        elif i == 2:            # Circle
                            ser.write("#M8")
                        elif i == 3:            # Triangle
                            ser.write("#M5")
                        elif i == 9:            # OPTIONS
                            cammode *= -1
                            if cammode == 1:
                                print("Picture mode")
                                raise Exception
                            else:
                                print("Movie mode")
                                raise Exception
                        elif i == 10:           # Left Stick push
                            t = str(datetime.now())
                            if cammode == 1:
                                picn = "rapiro_pic_" + t + ".jpg"
                                camera.capture(picn)
                                print("Snapshot " + picn + " taken")
                            else:
                                vidn = "rapiro_vid_" + t + ".h264"
                                try:
                                    camera.start_recording(vidn)
                                    start = time()
                                    print("Started video recording " + vidn)
                                except Exception as e:
                                    sys.exc_clear()   #or print(e)
                        elif i == 12:
                            print("PS button pressed. Goodbye!")
                            ser.write("#M0")
                            done=True

            elif event.type == pygame.JOYBUTTONUP:
                #print("Joystick button released.")

                try:
                    if joystick.get_button( 10 ) < 1:
                        print(time() - start)
                        camera.stop_recording()
                        print("Stopped recording video")
                except Exception as e:
                    sys.exc_clear()   #or print(e)

            elif event.type == pygame.JOYAXISMOTION:

                for i in range( axes ):
                    axis = joystick.get_axis(i)
                    if axis < -0.9:
                        if i == 0:           # Axis 0: Left Joystick horizontal
                            print("Left")
                            ser.write("#M3")
                        elif i == 1:         # Axis 1: Left Joystick vertical
                            print("Forward")
                            ser.write("#M1")
                    elif axis > 0.9:
                        if i == 0:
                            print("Right")
                            ser.write("#M4")
                        elif i == 1:
                            print("Backward")
                            ser.write("#M2")

            elif event.type == pygame.JOYHATMOTION:
                #print("Hat motion detected")
                hat = joystick.get_hat( 0 )

                if hat == ( -1, 0 ):
                    print("Hat Left")
                    ser.write("#PS05A050T005")
                elif hat == ( 0, -1 ):
                    print("Hat Down")
                    ser.write("#PS05A180S02A000T005")
                elif hat == ( 1, 0 ):
                    print("Hat Right")
                    ser.write("#PS02A130T005")
                elif hat == ( 0, 1 ):
                    print("Hat Up")
                    ser.write("#PS06A100S05A030S03A070S02A150T005")
    except Exception:
        sys.exc_clear()   #or print(e)

 

pygame.quit ()

camera.close()

 

 

<メモ>

お尻の痛みに耐え切れず、応急処置を施した Rapiro 君。

camera.recording を 吐き出し続けることで、なんとか切れずにお尻がきれいになりました。

 

さてさて、根本治療を探るためには、まずは PiCamera の Documentation に目を通すべきか。

ds4drv での教訓を思い出すべき。

 

また、Python やプログラミングの基本についてもよく分かっていないので、こちらも蛇の道を這い行くが如く、にゅるにゅるとお勉強が必要。

そして、multiprocessing を活用すればうまいことやれそうな気もするが、どうだろう?

 

基本書を前からぼちぼちとと潰していきながら、同時に、思いつくままに各個バトルを楽しむのがいいかも。

 

なお、framerate = 10 など、他にもプチ追加修正を施した。

 

以上、今夜はおしまい。

お疲れさん!

 

P.S. 

camera.recording を吐き出すところを、上記コードのようにちょいと凝って、

print("\r" + "Rec: " + str(camera.recording) + "> ", end="") 

としているが(なお、冒頭の from __future__ import print_function)、これだとしょっちゅう尻切れになることが判明。

当初のように、

print(camera.recording)

というふうに単純に吐き出せば、カメラにより力を注げているせいか切れない模様。(それでも、レコーディングオフとプログラム終了のタイミングの兼ね合いのせいか、多少は切れることがある。)

コンソールにダダ漏れ吐き出しまくり状態になるが。