ardupilot/Tools/autotest/fakepos.py

131 lines
2.8 KiB
Python
Raw Normal View History

#!/usr/bin/env python
import errno
import socket
import struct
import sys
import time
from math import cos, fabs, radians, sin, sqrt
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 [errno.EAGAIN, errno.EWOULDBLOCK]:
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
speedD = 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 = 0x4c56414f
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))
yAccel = -sin(radians(rollDeg)) * cos(radians(pitchDeg))
zAccel = -cos(radians(rollDeg)) * cos(radians(pitchDeg))
scale = 9.81 / sqrt((xAccel*xAccel) + (yAccel*yAccel) + (zAccel*zAccel))
xAccel *= scale
yAccel *= scale
zAccel *= scale
struc_buf = struct.pack('<17dI',
latitude, longitude, altitude, heading,
speedN, speedE, speedD,
xAccel, yAccel, zAccel,
rollRate, pitchRate, yawRate,
rollDeg, pitchDeg, yawDeg,
airspeed, magic)
udp.write(struc_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