QUATERNION ORIENTIATION IS WORKING!!

This commit is contained in:
cs-powell
2025-03-31 23:33:05 -04:00
parent ff32f69292
commit 89991c248a
3 changed files with 169 additions and 129 deletions

View File

@@ -359,7 +359,6 @@ class AircraftLandingModel(pyactr.ACTRModel):
self.phaseFlags["flare"] = True self.phaseFlags["flare"] = True
self.Ki = 0.01 ## Increase Control Authority to compensate for decreasing airspeed self.Ki = 0.01 ## Increase Control Authority to compensate for decreasing airspeed
print("Altitude < 500; Flare Set True") print("Altitude < 500; Flare Set True")
print("*******FLAG*******")
if(self.dictionaryAccess(self.destinations,"wheelWeight") > 0.01 if(self.dictionaryAccess(self.destinations,"wheelWeight") > 0.01
and self.dictionaryAccess(self.destinations,"wheelSpeed") < 1 and self.dictionaryAccess(self.destinations,"wheelSpeed") < 1
@@ -377,11 +376,6 @@ class AircraftLandingModel(pyactr.ACTRModel):
Faster Method Faster Method
""" """
self.getAndLoadDREFS() self.getAndLoadDREFS()
print("midpoint")
self.conditionChecks() self.conditionChecks()
# def logData(self): # def logData(self):

View File

@@ -1,155 +1,195 @@
import datetime import datetime
from math import cos, pi, sin, sqrt
import os import os
import time import time
from time import sleep from time import sleep
import xpc import xpc
from cognitiveModel import AircraftLandingModel from cognitiveModel import AircraftLandingModel
import shutil import shutil
def experimentSetUp(client):
def eulerToQuat(psiInput,thetaInput,phiInput):
psi = float(pi / 360 * psiInput)
theta = float(pi / 360 * thetaInput)
phi = float(pi / 360 * phiInput)
q0 = cos(psi) * cos(theta) * cos(phi) + sin(psi) * sin(theta) * sin(phi)
q1 = cos(psi) * cos(theta) * sin(phi) - sin(psi) * sin(theta) * cos(phi)
q2 = cos(psi) * sin(theta) * cos(phi) + sin(psi) * cos(theta) * sin(phi)
q3 = -cos(psi) * sin(theta) * sin(phi) + sin(psi) * cos(theta) * cos(phi)
e = sqrt(q0 * q0 + q1 * q1 + q2 * q2 + q3 * q3)
def runExperiment(title): quat = [q0/e,q1/e,q2/e,q3/e]
return quat
def experimentSetUp(client,altitudeInput):
print("Entered: EXPERIMENTSETUP")
if(True):
#Location:
groundLevel = 5434
offset = altitudeInput
altitudeFEET = groundLevel + offset
altitudeMETERS = altitudeFEET/3.281
altitude = altitudeMETERS
print(str(altitude))
location1 = [20, -998, 39.96239, -104.69713, altitude, -998, -998, -998, -998]
# testLocation = [20, -998, 27.20579, -80.08621, altitude, -998, -998, -998, -998] # 27.20579°N/80.08621°W
data = [
location1\
]
client.sendDATA(data)
print("Zero velocities")
x = "sim/flightmodel/position/local_vx"
y = "sim/flightmodel/position/local_vy"
z = "sim/flightmodel/position/local_vz"
client.sendDREF(x,0)
client.sendDREF(y,0)
client.sendDREF(z,0)
print("Zero rotation")
p = "sim/flightmodel/position/P"
q = "sim/flightmodel/position/Q"
r = "sim/flightmodel/position/R"
client.sendDREF(p,0)
client.sendDREF(q,0)
client.sendDREF(r,0)
print("set heading")
# client.pauseSim(True)
orient = "sim/flightmodel/position/q"
# orientCommand = [1,0.0,0.0,0.0]
pitch = client.getDREF("sim/flightmodel/position/true_theta")
roll = client.getDREF("sim/flightmodel/position/true_phi")
orientCommand = eulerToQuat(179,0,0) # heading, pitch,Roll
orientTest = [1.0,1.0,1.0,1.0] # heading, pitch,Roll
print("ORIENT TO: " + str(orientCommand))
client.sendDREF(orient,orientCommand)
orientResult = client.getDREF(orient)
print(str(orientResult))
# client.pauseSim(False)
#Weather:
windLayer = "sim/weather/wind_altitude_msl_m[0]"
windLayer2 = "sim/weather/wind_altitude_msl_m[1]"
windLayer3 = "sim/weather/wind_altitude_msl_m[2]"
windDirection = "sim/weather/wind_direction_degt[0]"
windSpeed = "sim/weather/wind_speed_kt[0]"
# windDirections = [50.0,50.0,50.0,50.0,50.0,50.0,50.0,50.0,50.0,50.0,50.0,50.0,50.0]
# client.sendDREF(windDirection,windDirections)
# winds = [50.0,50.0,50.0,50.0,50.0,50.0,50.0,50.0,50.0,50.0,50.0,50.0,50.0]
# client.sendDREF(windSpeed,winds)
# result = client.getDREF(windLayer)
# print("Wind:" + str(result))
print("Setting Wind Layers")
client.sendDREF(windLayer,6000)
client.sendDREF(windLayer2,15000)
client.sendDREF(windLayer3,15000)
print("Setting Wind Direction and Speed")
client.sendDREF(windDirection,170)
print("Set 1")
client.sendDREF(windSpeed,0)
print("Set 2")
# client.sendDREF(turbulence,turbulencePercentage)
# preset = "sim/weather/region/weather_preset"
# value = 8
# client.sendDREF(preset,value)
client.pauseSim(True)
input("Press Enter to finish setting up Simulation")
client.pauseSim(False)
print("Setting initial velocity")
zInit = "sim/flightmodel/position/local_vx"
client.sendDREF(zInit, 0)
print("setup complete")
"""
Set orientation and Position
1 - Time
3- Speeds: [3, V-indicated, 3, 2, 2, -998, VindMPH, V trueMPHas, vtrue MPHgs],\
16 - Angular Velocities
17 - PitchRoll and Headings: [17, Pitch, Roll, Heading True, -998, -998, -998, -998, -998],\
18 - Angle of Attack
20 - Latitude and Longitude
"""
kias = -998
keas = -998
ktas = -998
ktgs = -998
mph = -998
mphas = 80
mphgs = 80
print("Setting orientation for test")
# client.sendDREF("sim/operation/override/override_planepath",1)
# client.pauseSim(True)
# client.sendDREF("sim/flightmodel/position/local_y",2000)
# client.sendDREFs(["sim/flightmodel/position/P","sim/flightmodel/position/Q","sim/flightmodel/position/R"],[0,0,0])
# client.sendDREF("sim/flightmodel/position/q",[0.3, 0, 0, 0.6])
# data = [\
# [3, -998, -998, -998, -998, -998, -998, mphas, mphgs],\
# [16, 0, 0, 0, -998, -998, -998, -998, -998],\
# [17, 0, 0, 0, -998, -998, -998, -998, -998],\
# [18, -998, -998, -998, -998, -998, -998, -998, -998],\
# [19, -998, -998, -998, -998, -998, -998, -998, -998],\
# testLocation\
# ]
# client.sendDATA(data)
# client.sendDREF("sim/operation/override/override_planepath",0)
# Set control surfaces and throttle of the player aircraft using sendCTRL
# print("Setting controls")
# ctrl = [0.0, 0.0, 0.0, 0.0]
# cogModel.client.sendCTRL(ctrl)
# print("past setting controls")
else:
print("Experiment currently in progress, not resetting position and environmental conditions")
def runExperiment(title,printFlag,experimentStart):
print("Model Test: Xplane setting up connection") print("Model Test: Xplane setting up connection")
print("Setting up simulation") print("Setting up simulation")
startTime = 0 startTime = 0
endTime = 0 endTime = 0
difference = endTime - startTime difference = endTime - startTime
experimentLive = True experimentLive = True
while(difference < 3 and experimentLive): timeoutLimit = 1
newExperiment = experimentStart
while(difference < timeoutLimit and experimentLive):
print("Time Elapsed: -----> " + str(difference)) print("Time Elapsed: -----> " + str(difference))
try: try:
with xpc.XPlaneConnect() as client: with xpc.XPlaneConnect() as client:
# Verify connection # Verify connection
# try:
# If X-Plane does not respond to the request, a timeout error
# will beff raised.
client.getDREF("sim/test/test_float") client.getDREF("sim/test/test_float")
# except: cogModel = AircraftLandingModel(client,printFlag)
# print("Error establishing connection to X-Plane.") experimentSetUp(cogModel.client,3000)
# print("Exiting...") cogModel.client.pauseSim(False)
# return
cogModel = AircraftLandingModel(client,True)
experimentSetUp(cogModel.client)
# # Set position of the player aircraft
# print("Setting position")
# # Lat Lon Alt Pitch Roll Yaw Gear
# posi = [37.524, -122.06899, 2500, 0, 0, 0, 1]
# client.sendPOSI(posi)
# # Set position of a non-player aircraft
# print("Setting NPC position")
# # Lat Lon Alt Pitch Roll Yaw Gear
# posi = [37.52465, -122.06899, 2500, 0, 20, 0, 1]
# client.sendPOSI(posi, 1)
# # Set angle of attack, velocity, and orientation using the DATA command
# print("Setting orientation")
# data = [\
# [18, 0, -998, 0, -998, -998, -998, -998, -998],\
# [ 3, 130, 130, 130, 130, -998, -998, -998, -998],\
# [16, 0, 0, 0, -998, -998, -998, -998, -998]\
# ]
# client.sendDATA(data)
# client.pauseSim(True)
# # Set position of the player aircraft
# print("Setting Experiment Position: Denver Airport Runway")
# # Lat Lon Alt Pitch Roll Yaw Gear
# posi = [39.945, -104.70, 2500, 0, 0, 0, 1] #3NM Approach for Denver Intl Runway 16R (16,000 feet)
# client.sendPOSI(posi)
# quat = (1.0,0.0,0.0,173.0)
# quatDref = "sim/flightmodel/position/q"
# client.sendDREF(quatDref,quat)
# speed = (1.0,0.0,0.0,173.0)
# client.sendDREF("sim/flightmodel/position/indicated_airspeed",speed)
# client.pauseSim(False)
# # Set angle of attack, velocity, and orientation using the DATA command
# print("Setting orientation")
# data = [\
# [18, 0, -998, 0, -998, -998, -998, -998, -998],\
# [ 3, 130, 130, 130, 130, -998, -998, -998, -998],\
# [16, 0, 0, 0, -998, -998, -998, -998, -998]\
# ]
# client.sendDATA(data)
groundLevel = 5434
offset = 4000
altitudeFEET = groundLevel + offset
altitudeMETERS = altitudeFEET/3.281
altitude = altitudeMETERS
"""
Set orientation and Position
1 - Time
3- Speeds: [3, V-indicated, 3, 2, 2, -998, VindMPH, V trueMPHas, vtrue MPHgs],\
16 - Angular Velocities
17 - PitchRoll and Headings: [17, Pitch, Roll, Heading True, -998, -998, -998, -998, -998],\
18 - Angle of Attack
20 - Latitude and Longitude
"""
location1 = [20, groundLevel + 3000, 39.96239, -104.69713, -998, -998, -998, -998, -998]
testLocation = [20, -998, 27.20579, -80.08621, altitude, -998, -998, -998, -998] # 27.20579°N/80.08621°W
kias = -998
keas = -998
ktas = -998
ktgs = -998
mph = -998
mphas = 80
mphgs = 80
print("Setting orientation for test")
# client.sendDREF("sim/operation/override/override_planepath",1)
# client.pauseSim(True)
# client.sendDREF("sim/flightmodel/position/local_y",2000)
# client.sendDREFs(["sim/flightmodel/position/P","sim/flightmodel/position/Q","sim/flightmodel/position/R"],[0,0,0])
# client.sendDREF("sim/flightmodel/position/q",[0.3, 0, 0, 0.6])
# data = [\
# [3, -998, -998, -998, -998, -998, -998, mphas, mphgs],\
# [16, 0, 0, 0, -998, -998, -998, -998, -998],\
# [17, 0, 0, 0, -998, -998, -998, -998, -998],\
# [18, -998, -998, -998, -998, -998, -998, -998, -998],\
# [19, -998, -998, -998, -998, -998, -998, -998, -998],\
# testLocation\
# ]
# client.sendDATA(data)
# client.sendDREF("sim/operation/override/override_planepath",0)
client.pauseSim(False)
# Set control surfaces and throttle of the player aircraft using sendCTRL
print("Setting controls")
ctrl = [0.0, 0.0, 0.0, 0.0]
client.sendCTRL(ctrl)
print("past setting controls")
# Pitch, Roll, Rudder, Throttle
# Pause the sim
# client.pauseSim(False)
count = 0 count = 0
innercount = 0 innercount = 0
clockStart = time.time() clockStart = time.time()
retry = 0 retry = 0
while(cogModel.simulationStatus()): newExperment = False
# print("Start of innerwhile loop") while(cogModel.simulationStatus()):
clockStart = time.time() #START TIMER clockStart = time.time() #START TIMER
# client.pauseSim(True) # Pause Simulator
#Run Model #Run Model
# print("----------------> 1 <")
cogModel.update_aircraft_state() cogModel.update_aircraft_state()
# print("----------------> 2 <")
cogModel.update_controls_simultaneously() cogModel.update_controls_simultaneously()
client.pauseSim(False) #Unpause Simulator client.pauseSim(False) #Unpause Simulator
clockEnd = time.time() # STOP TIMER clockEnd = time.time() # STOP TIMER
count+=1 count+=1
# print("Clock Time: " + str(clockEnd - clockStart)) ## LOG TIME TAKEN # print("Clock Time: " + str(clockEnd - clockStart)) ## LOG TIME TAKEN
sleep(0.05) # LET Simulator Run 50 Milliseconds sleep(0.05) # LET Simulator Run 50 Milliseconds
startTime = time.time() startTime = time.time()
experimentLive = cogModel.simulationStatus() experimentLive = cogModel.simulationStatus()
except: except:
@@ -159,8 +199,7 @@ def runExperiment(title):
print("End Time:" + str(endTime)) print("End Time:" + str(endTime))
difference = endTime - startTime difference = endTime - startTime
continue continue
if(difference >= timeoutLimit):
if(difference >= 3):
print("Timeout[" + str(difference) +"]:"+"Error, please run test again") print("Timeout[" + str(difference) +"]:"+"Error, please run test again")
else: else:
print("Model has finished running") print("Model has finished running")
@@ -171,7 +210,12 @@ def runExperiment(title):
# print("CLEAN UP: Data File Copied and saved") # print("CLEAN UP: Data File Copied and saved")
# os.remove("/Users/flyingtopher/X-Plane 11/Data.txt") # os.remove("/Users/flyingtopher/X-Plane 11/Data.txt")
print("CLEAN UP: Data File Deleted and Reset") print("CLEAN UP: Data File Deleted and Reset")
input("Press any key to exit...") exit = input("Press 'y' or any key to continue, press 'n' to exit...")
if(exit == "n"):
exit = True
else:
exit = False
return exit
##Reset the sim with the keyboard shortcut (wrapper around model that waits for reconnection) ##Reset the sim with the keyboard shortcut (wrapper around model that waits for reconnection)
def ex(): def ex():
@@ -185,7 +229,9 @@ def ex():
input("Press Enter to Start Experiment #" + str(count) + ": ") input("Press Enter to Start Experiment #" + str(count) + ": ")
print("Data File Reset") print("Data File Reset")
f = open("/Users/flyingtopher/X-Plane 11/Data.txt", 'w') f = open("/Users/flyingtopher/X-Plane 11/Data.txt", 'w')
runExperiment(title) exit = runExperiment(title,False,True)
if(exit):
break
count+=1 count+=1
print("Experiment Battery Complete") print("Experiment Battery Complete")

View File

@@ -311,7 +311,7 @@ class XPlaneConnect(object):
raise ValueError("value must have less than 256 items.") raise ValueError("value must have less than 256 items.")
fmt = "<B{0:d}sB{1:d}f".format(len(dref), len(value)) fmt = "<B{0:d}sB{1:d}f".format(len(dref), len(value))
# buffer += struct.pack(fmt.encode(), len(dref), dref.encode(), len(value), value) # buffer += struct.pack(fmt.encode(), len(dref), dref.encode(), len(value), value)
buffer += struct.pack(fmt.encode(), len(dref), dref.encode(), 2, *value) buffer += struct.pack(fmt.encode(), len(dref), dref.encode(), len(value), *value)
else: else:
fmt = "<B{0:d}sBf".format(len(dref)) fmt = "<B{0:d}sBf".format(len(dref))