I wrote a Blender script that rotates a monkey head based on this serial output. I’m using have a cheap Arduino Nano with a Gyro module. It outputs Yaw, Pitch and Roll in text via serial interface. I capture and parse that text to extract values and use them to control the head. Everything works but I’m getting just 2 FPS with nothing other in the scene then Suzanne.
import bge
import sys
sys.path.append("/usr/local/lib/python3.7/dist-packages/")
import serial
from bge import logic
from bge import events
controller = logic.getCurrentController()
head = controller.owner
# HMD Arduino with gyro + magnetometer module
gyro_tty = "/dev/ttyUSB0"
gyro_baud = 115200
gyroInputScale = 5000 #Adjust this value if head rotation is too slow or fast
#below funcion is used for splicing strings.
#Pasted from: http://www.dotnetperls.com/between-before-after-python
def between(value, a, b):
# Find and validate before-part.
pos_a = value.find(a)
if pos_a == -1: return ""
# Find and validate after part.
pos_b = value.rfind(b)
if pos_b == -1: return ""
# Return middle part.
adjusted_pos_a = pos_a + len(a)
if adjusted_pos_a >= pos_b: return ""
return value[adjusted_pos_a:pos_b]
def main():
flopIterator = 0
global oldYaw
global newYaw
global relativeYaw
cont = bge.logic.getCurrentController()
ser = serial.Serial(gyro_tty, gyro_baud)
#The format of the GYRO output is "GY0.75GP-4.48GR8.29GEND" for every new line where: GY - Yaw, GP - Pitch, GR - Roll
#Load line into a string variable
data = str(ser.readline()) #stores: b'GY-0.05GP-4.15GR61.50GEND
if data.find("GEND") == -1: #Check data from serial port makes sense before running with it
print("No gyro data found in serial output. Not connected? Wrong tty? Wrong baud rate?")
else:
# Split string and assign values to vairables
Yaw = float(between(data, "GY", "GP")) / gyroInputScale
Pitch = float(between(data, "GP", "GR")) / gyroInputScale
Roll = float(between(data, "GR", "GEND")) / gyroInputScale
print("Yaw: ", Yaw, "Pitch: ", Pitch, "Roll: ", Roll)
# x y z
head.applyRotation((Pitch, Yaw, -Roll),1) #1 for local, 0 for global coord
main()
I’m a GNU/Linux user with a GTX970. CUDA is installed and in use. My other games run in at least 30 fps.
Am I missing something?