You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
95 lines
3.3 KiB
95 lines
3.3 KiB
using System; |
|
using System.Collections.Generic; |
|
using System.Text; |
|
using YLScsDrawing.Drawing3d; |
|
using ArdupilotMega.HIL; |
|
|
|
namespace ArdupilotMega.HIL |
|
{ |
|
public class Aircraft : Utils |
|
{ |
|
Aircraft self; |
|
public double home_latitude = 0; |
|
public double home_longitude = 0; |
|
public double home_altitude = 0; |
|
public double ground_level = 0; |
|
public double frame_height = 0.0; |
|
|
|
public double latitude = 0; |
|
public double longitude = 0; |
|
public double altitude = 0; |
|
|
|
public Matrix3 dcm = new Matrix3(); |
|
|
|
public Vector3 gyro = new Vector3(0, 0, 0); |
|
|
|
public Vector3 accel_body = new Vector3(0, 0, 0); |
|
|
|
public Vector3 velocity = new Vector3(0, 0, 0); //# m/s, North, East, Up |
|
public Vector3 position = new Vector3(0, 0, 0); //# m North, East, Up |
|
public Vector3 accel = new Vector3(0, 0, 0); //# m/s/s North, East, Up |
|
public double mass = 0.0; |
|
public double update_frequency = 50;//# in Hz |
|
public double gravity = 9.80665;//# m/s/s |
|
public Vector3 accelerometer = new Vector3(0, 0, -9.80665); |
|
|
|
public double roll = 0; |
|
public double pitch = 0; |
|
public double yaw = 0; |
|
|
|
public Aircraft() |
|
{ |
|
self = this; |
|
} |
|
|
|
public bool on_ground(Vector3 position = null) |
|
{ |
|
// '''return true if we are on the ground''' |
|
if (position == null) |
|
position = self.position; |
|
return (-position.z) + self.home_altitude <= self.ground_level + self.frame_height; |
|
} |
|
|
|
public void update_position(double delta_time = 0) |
|
{ |
|
//'''update lat/lon/alt from position''' |
|
|
|
double bearing = degrees(atan2(self.position.y, self.position.x)); |
|
double distance = sqrt(self.position.x * self.position.x + self.position.y * self.position.y); |
|
|
|
gps_newpos(self.home_latitude, self.home_longitude, |
|
bearing, distance); |
|
|
|
self.altitude = self.home_altitude - self.position.z; |
|
|
|
Vector3 velocity_body = self.dcm.transposed() * self.velocity; |
|
|
|
self.accelerometer = self.accel_body.copy(); |
|
|
|
} |
|
|
|
public void gps_newpos(double lat, double lon, double bearing, double distance) |
|
{ |
|
// '''extrapolate latitude/longitude given a heading and distance |
|
// thanks to http://www.movable-type.co.uk/scripts/latlong.html |
|
// ''' |
|
// from math import sin, asin, cos, atan2, radians, degrees |
|
double radius_of_earth = 6378100.0;//# in meters |
|
|
|
double lat1 = radians(lat); |
|
double lon1 = radians(lon); |
|
double brng = radians(bearing); |
|
double dr = distance / radius_of_earth; |
|
|
|
double lat2 = asin(sin(lat1) * cos(dr) + |
|
cos(lat1) * sin(dr) * cos(brng)); |
|
double lon2 = lon1 + atan2(sin(brng) * sin(dr) * cos(lat1), |
|
cos(dr) - sin(lat1) * sin(lat2)); |
|
|
|
latitude = degrees(lat2); |
|
longitude = degrees(lon2); |
|
//return (degrees(lat2), degrees(lon2)); |
|
} |
|
|
|
} |
|
} |