mirror of https://github.com/ArduPilot/ardupilot
133 lines
3.4 KiB
Matlab
133 lines
3.4 KiB
Matlab
clc
|
|
clear
|
|
close all
|
|
|
|
% ArduCopter SITL example vehicle
|
|
% This sets up the vehicle properties that are used in the simulation
|
|
% simple 450 size x quad based on Hexsoon
|
|
|
|
% setup the motors
|
|
|
|
% locations (xyz) in m
|
|
motor(1).location = [[sind(45),cosd(45)]*450*0.5,0] * 0.001; % front right
|
|
motor(2).location = [[sind(135),cosd(135)]*450*0.5,0] * 0.001; % rear right
|
|
motor(3).location = [[sind(225),cosd(225)]*450*0.5,0] * 0.001; % rear left
|
|
motor(4).location = [[sind(315),cosd(315)]*450*0.5,0] * 0.001; % front left
|
|
|
|
% PWM output to use
|
|
motor(1).channel = 1;
|
|
motor(2).channel = 4;
|
|
motor(3).channel = 2;
|
|
motor(4).channel = 3;
|
|
|
|
% rotation direction: 1 = cw, -1 = ccw
|
|
motor(1).direction = -1;
|
|
motor(2).direction = 1;
|
|
motor(3).direction = -1;
|
|
motor(4).direction = 1;
|
|
|
|
% motor properties
|
|
electrical.kv = 880; % (rpm/volt)
|
|
electrical.no_load_current = [0.7,10]; % (A) @ (V)
|
|
electrical.resistance = 0.115; % (ohms)
|
|
|
|
% ESC properties
|
|
esc.resistance = 0.01; % (ohms)
|
|
|
|
% Propeller properties
|
|
prop.diameter = 245 * 0.001; % (m)
|
|
prop.pitch = 114.3 * 0.001; % (m)
|
|
prop.num_blades = 2;
|
|
prop.PConst = 1.13;
|
|
prop.TConst = 1;
|
|
prop.mass = 12.5*0.001; % (kg) (only used for inertia)
|
|
prop.inertia = (1/12)*prop.mass*prop.diameter^2; % rotational inertia (kgm^2) (rod about center)
|
|
|
|
% assign properties to motors
|
|
for i = 1:4
|
|
motor(i).electrical = electrical;
|
|
motor(i).esc = esc;
|
|
motor(i).prop = prop;
|
|
end
|
|
|
|
% Setup battery
|
|
battery.voltage = 4*4.2; % (volts)
|
|
battery.resistance = 0.0034; % (ohms)
|
|
battery.capacity = 5.2; % (ah)
|
|
|
|
% Add all to vehicle
|
|
copter.motors = motor;
|
|
copter.battery = battery;
|
|
copter.mass = 2; % (kg)
|
|
inertia = (2/5) * copter.mass * (0.45*0.2)^2; % (sphere)
|
|
copter.inertia = diag(ones(3,1)*inertia); % rotational inertia matrix (kgm^2)
|
|
copter.cd = [0.5;0.5;0.5];
|
|
copter.cd_ref_area = [1;1;1] * pi * (0.45*0.5)^2;
|
|
|
|
save('Hexsoon','copter')
|
|
|
|
% Plot motor curves
|
|
% http://www.bavaria-direct.co.za/constants/
|
|
% http://www.stefanv.com/rcstuff/qf200204.html
|
|
% Some calculators estimate heat and increase resistance with temp
|
|
% But then we have to estimate the power dissipation
|
|
% Max power for plot only
|
|
max_power = 260;
|
|
battery.voltage = battery.voltage * 0.50;
|
|
|
|
Kt = 1/(electrical.kv * ((2*pi)/60) ); % Convert Kv to rads/second
|
|
|
|
% plot the current from 0 to max power
|
|
amps = 0:0.1:max_power/battery.voltage;
|
|
power_in = amps * battery.voltage;
|
|
|
|
% voltage drop due to copper and esc
|
|
copper_drop = amps * electrical.resistance;
|
|
esc_drop = amps * esc.resistance;
|
|
|
|
ideal_voltage = battery.voltage - copper_drop - esc_drop;
|
|
power_out = ideal_voltage .* (amps - electrical.no_load_current(1));
|
|
efficiency = power_out ./ power_in;
|
|
|
|
torque = Kt * amps;
|
|
rpm = ideal_voltage * electrical.kv;
|
|
|
|
% Plot motor characteristics
|
|
figure('name',sprintf('motor characteristics at %0.2f volts',battery.voltage))
|
|
subplot(2,2,1)
|
|
hold all
|
|
title('RPM')
|
|
plot(amps,rpm)
|
|
xlabel('Current (A)')
|
|
ylabel('RPM')
|
|
xlim([0,amps(end)])
|
|
|
|
|
|
subplot(2,2,2)
|
|
hold all
|
|
title('torque')
|
|
plot(amps,torque)
|
|
xlabel('Current (A)')
|
|
ylabel('torque (NM)')
|
|
xlim([0,amps(end)])
|
|
|
|
subplot(2,2,3)
|
|
hold all
|
|
title('power')
|
|
plot(amps,power_in)
|
|
plot(amps,power_out)
|
|
xlabel('Current (A)')
|
|
ylabel('power (W)')
|
|
ylim([0,inf])
|
|
xlim([0,amps(end)])
|
|
legend('Power in','Power out','location','northwest')
|
|
|
|
subplot(2,2,4)
|
|
hold all
|
|
title('efficiency')
|
|
plot(amps,efficiency)
|
|
xlabel('Current (A)')
|
|
ylabel('efficiency (%)')
|
|
ylim([0,inf])
|
|
xlim([0,amps(end)])
|