1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
|
% Copyright (C) 2024, Naoki Sean Pross, ETH Zürich
%
% Retrieve / compute parameters for UAV.
function [params] = uav_params()
% Unit of measurements unless specified otherwise are
% Mass in kg
% Lenghts in m
% Time in s
% Frequencies in Hz
% Angular velocities in rad / s
params = struct();
% ------------------------------------------------------------------------
% Physical constants
params.physics = struct(...
'Gravity', 9.81, ...
'AirDensity', 1.204 ... % kg / m^3
);
% ------------------------------------------------------------------------
% Mechanical measurements
params.mechanical = struct(...
'Mass', 4.0, ...
'DuctRadius', 46e-3, ...
'DuctHeight', 171e-3, ...
'FlapZDistance', 98e-3, ... % flap distance along z from center of mass
'InertiaTensor', 5e-3 * eye(3), ... % TODO true values, assume diagonal
'GyroscopicInertiaZ', 0 ... % assume no gyroscopic effects for now
);
% ------------------------------------------------------------------------
% Actuator limits
% Cheap servos usually give a "speed" in seconds / 60 degrees without load
servo_speed = 0.19; % seconds per 60 deg
servo_angular_velocity = (pi / 3) / servo_speed;
params.actuators = struct(...
'TurbineMaxSpeed', 620.7, ... % In Hz
'ServoAbsMaxAngleDeg', 25, ... % in Degrees
'ServoNominalAngularVelocity', servo_angular_velocity, ...
'MeasurementDelay', 8e-3 ... % delay caused by sensor fusion algorithm
);
% ------------------------------------------------------------------------
% Aerodynamics modelling
% Compute thrust proportionality factor from actuator limits
% from thrust relation F = k * omega^2.
% FIXME: this is not ideal, need better measurements
omega_max = params.actuators.TurbineMaxSpeed;
F_max = 38.637; % in N (measured)
k_T = sqrt(F_max / omega_max);
params.aerodynamics = struct(...
'ThrustOmegaProp', k_T, ... % in s^2 / (rad * N)
'FlapArea', 23e-3 * 10e-3 * 1.5, ... % FIXME factor 150% was chosen at random
'DragCoefficients', [1, 4] .* 1e-3, ... % TODO
'LiftCoefficient', 1e-3 ... % TODO
);
% ------------------------------------------------------------------------
% Linearization point of non-linear dynamics.
% Compute theoretical thrust required to make the UAV hover
% from the relation mg = k * omega^2
g = params.physics.Gravity;
m = params.mechanical.Mass;
k = params.aerodynamics.ThrustOmegaProp;
omega_hover = sqrt(m * g / k);
params.linearization = struct(...
'Position', [0; 0; -3], ... % in inertial frame, z points down
'Velocity', [0; 0; 0], ... % in inertial frame
'Angles', [0; 0; 0], ... % in body frame
'AngularVelocities', [0; 0; 0], ... % in body frame
'Inputs', [0; 0; 0; 0; omega_hover] ... % Flaps at rest and turbine at X
);
% ------------------------------------------------------------------------
% Performance requirements
params.performance = struct(...
'MaxHorizontalSpeed', 1, ...
);
end
% vim: ts=2 sw=2 et:
|