mirror of https://github.com/ArduPilot/ardupilot
autotest: useful script for testing gyro and accel calculations
This commit is contained in:
parent
8743b3d0eb
commit
a0de9d31a9
|
@ -0,0 +1,121 @@
|
|||
#!/usr/bin/env python
|
||||
|
||||
import socket, struct, time
|
||||
from math import *
|
||||
|
||||
class udp_out(object):
|
||||
'''a UDP output socket'''
|
||||
def __init__(self, device):
|
||||
a = device.split(':')
|
||||
if len(a) != 2:
|
||||
print("UDP ports must be specified as host:port")
|
||||
sys.exit(1)
|
||||
self.port = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
||||
self.destination_addr = (a[0], int(a[1]))
|
||||
self.port.setblocking(0)
|
||||
self.last_address = None
|
||||
|
||||
def recv(self,n=None):
|
||||
try:
|
||||
data, self.last_address = self.port.recvfrom(300)
|
||||
except socket.error as e:
|
||||
if e.errno in [ 11, 35 ]:
|
||||
return ""
|
||||
raise
|
||||
return data
|
||||
|
||||
def write(self, buf):
|
||||
try:
|
||||
self.port.sendto(buf, self.destination_addr)
|
||||
except socket.error:
|
||||
pass
|
||||
|
||||
|
||||
def ft2m(x):
|
||||
return x * 0.3048
|
||||
|
||||
def m2ft(x):
|
||||
return x / 0.3048
|
||||
|
||||
def kt2mps(x):
|
||||
return x * 0.514444444
|
||||
|
||||
def mps2kt(x):
|
||||
return x / 0.514444444
|
||||
|
||||
udp = udp_out("127.0.0.1:5501")
|
||||
|
||||
latitude = -35
|
||||
longitude = 149
|
||||
altitude = 600.0
|
||||
heading = 0.0
|
||||
speedN = 0
|
||||
speedE = 0.0
|
||||
xAccel = 0.0
|
||||
yAccel = 0.0
|
||||
zAccel = 0.0
|
||||
rollRate = 0.0
|
||||
pitchRate = 0.0
|
||||
yawRate = 0.0
|
||||
rollDeg = 0.0
|
||||
pitchDeg = 0.0
|
||||
yawDeg = 0.0
|
||||
airspeed = 0
|
||||
magic = 0x4c56414d
|
||||
|
||||
deltaT = 0.005
|
||||
rollDeg = 45
|
||||
pitchDeg = 0
|
||||
|
||||
pitchMax = None
|
||||
rollMax = None
|
||||
|
||||
if True:
|
||||
pitchRate = 1
|
||||
pitchMax = 45
|
||||
rollMax = 45
|
||||
|
||||
while True:
|
||||
|
||||
xAccel = sin(radians(pitchDeg)) * cos(radians(rollDeg))
|
||||
yAccel = -sin(radians(rollDeg)) * cos(radians(pitchDeg))
|
||||
zAccel = -cos(radians(rollDeg)) * cos(radians(pitchDeg))
|
||||
scale = m2ft(9.81 / sqrt((xAccel*xAccel)+(yAccel*yAccel)+(zAccel*zAccel)))
|
||||
xAccel *= scale;
|
||||
yAccel *= scale;
|
||||
zAccel *= scale;
|
||||
|
||||
buf = struct.pack('>ddddddddddddddddI',
|
||||
latitude, longitude, altitude, heading,
|
||||
speedN, speedE,
|
||||
xAccel, yAccel, zAccel,
|
||||
rollRate, pitchRate, yawRate,
|
||||
rollDeg, pitchDeg, yawDeg,
|
||||
airspeed, magic)
|
||||
udp.write(buf)
|
||||
time.sleep(deltaT)
|
||||
|
||||
yawDeg += yawRate * deltaT
|
||||
if yawDeg > 180:
|
||||
yawDeg -= 360
|
||||
if yawDeg < -180:
|
||||
yawDeg += 360
|
||||
heading = yawDeg
|
||||
|
||||
if pitchMax is not None and fabs(pitchDeg) > pitchMax:
|
||||
pitchRate = -pitchRate
|
||||
|
||||
if rollMax is not None and fabs(rollDeg) > rollMax:
|
||||
rollRate = -rollRate
|
||||
|
||||
pitchDeg += pitchRate * deltaT
|
||||
if pitchDeg > 180:
|
||||
pitchDeg -= 360
|
||||
if pitchDeg < -180:
|
||||
pitchDeg += 360
|
||||
|
||||
rollDeg += rollRate * deltaT
|
||||
if rollDeg > 180:
|
||||
rollDeg -= 360
|
||||
if rollDeg < -180:
|
||||
rollDeg += 360
|
Loading…
Reference in New Issue