2012-03-22 08:50:47 -03:00
|
|
|
import math, util, rotmat
|
|
|
|
from rotmat import Vector3, Matrix3
|
2011-12-02 00:13:50 -04:00
|
|
|
|
|
|
|
class Aircraft(object):
|
|
|
|
'''a basic aircraft class'''
|
|
|
|
def __init__(self):
|
|
|
|
self.home_latitude = 0
|
|
|
|
self.home_longitude = 0
|
|
|
|
self.home_altitude = 0
|
|
|
|
self.ground_level = 0
|
|
|
|
self.frame_height = 0.0
|
|
|
|
|
|
|
|
self.latitude = self.home_latitude
|
|
|
|
self.longitude = self.home_longitude
|
|
|
|
self.altitude = self.home_altitude
|
|
|
|
|
2012-03-22 08:50:47 -03:00
|
|
|
self.dcm = Matrix3()
|
2011-12-05 02:44:04 -04:00
|
|
|
|
2012-03-22 08:50:47 -03:00
|
|
|
# rotation rate in body frame
|
|
|
|
self.gyro = Vector3(0,0,0) # rad/s
|
2011-12-05 02:44:04 -04:00
|
|
|
|
2012-03-22 08:50:47 -03:00
|
|
|
self.velocity = Vector3(0, 0, 0) # m/s, North, East, Down
|
|
|
|
self.position = Vector3(0, 0, 0) # m North, East, Down
|
2011-12-02 00:13:50 -04:00
|
|
|
self.mass = 0.0
|
|
|
|
self.update_frequency = 50 # in Hz
|
|
|
|
self.gravity = 9.8 # m/s/s
|
2012-03-23 02:24:52 -03:00
|
|
|
self.accelerometer = Vector3(0, 0, -self.gravity)
|
2011-12-02 00:13:50 -04:00
|
|
|
|
2011-12-12 19:11:10 -04:00
|
|
|
self.wind = util.Wind('0,0,0')
|
|
|
|
|
2012-03-23 02:24:52 -03:00
|
|
|
def on_ground(self, position=None):
|
|
|
|
'''return true if we are on the ground'''
|
|
|
|
if position is None:
|
|
|
|
position = self.position
|
|
|
|
return (-position.z) + self.home_altitude <= self.ground_level + self.frame_height
|
|
|
|
|
2012-03-22 08:50:47 -03:00
|
|
|
def update_position(self, delta_time):
|
2011-12-02 00:13:50 -04:00
|
|
|
'''update lat/lon/alt from position'''
|
|
|
|
|
2012-06-04 22:18:45 -03:00
|
|
|
bearing = math.degrees(math.atan2(self.position.y, self.position.x))
|
|
|
|
distance = math.sqrt(self.position.x**2 + self.position.y**2)
|
|
|
|
|
|
|
|
(self.latitude, self.longitude) = util.gps_newpos(self.home_latitude, self.home_longitude,
|
|
|
|
bearing, distance)
|
2011-12-02 00:13:50 -04:00
|
|
|
|
2012-03-22 08:50:47 -03:00
|
|
|
self.altitude = self.home_altitude - self.position.z
|
|
|
|
|
2012-03-23 02:24:52 -03:00
|
|
|
velocity_body = self.dcm.transposed() * self.velocity
|
|
|
|
|
2012-03-23 02:44:11 -03:00
|
|
|
# force the acceleration to mostly be from gravity. We should be using 100% accel_body,
|
|
|
|
# but right now that flies very badly as the AHRS system can't do centripetal correction
|
|
|
|
# for multicopters. This is a compromise until we get that sorted out
|
|
|
|
accel_true = self.accel_body
|
|
|
|
accel_fake = self.dcm.transposed() * Vector3(0, 0, -self.gravity)
|
|
|
|
self.accelerometer = (accel_true * 0.5) + (accel_fake * 0.5)
|