Launch rod is now 0 North and decoupled from wind direction.
This commit is contained in:
parent
5e9eca3715
commit
b96277afa0
@ -366,12 +366,17 @@ simedtdlg.lbl.ttip.Altitude = <html>The launch altitude above mean sea level.<br
|
|||||||
simedtdlg.border.Launchrod = Launch rod
|
simedtdlg.border.Launchrod = Launch rod
|
||||||
simedtdlg.lbl.Length = Length:
|
simedtdlg.lbl.Length = Length:
|
||||||
simedtdlg.lbl.ttip.Length = The length of the launch rod.
|
simedtdlg.lbl.ttip.Length = The length of the launch rod.
|
||||||
|
simedtdlg.checkbox.Intowind = Always launch directly up-wind or down-wind
|
||||||
|
simedtdlg.checkbox.ttip.Intowind1 = <html>Checking this box makes the launch rod point into the wind.<br>
|
||||||
|
simedtdlg.checkbox.ttip.Intowind2 = A zero launchrod angle will point directly up. <br>
|
||||||
|
simedtdlg.checkbox.ttip.Intowind3 = A negative launchrod angle will launch with the wind.<br>If you uncheck this box you can point the launchrod any direction you please.
|
||||||
|
simedtdlg.checkbox.ttip.Intowind4 = If you uncheck this box you can point the launchrod any direction you please.
|
||||||
simedtdlg.lbl.Angle = Angle:
|
simedtdlg.lbl.Angle = Angle:
|
||||||
simedtdlg.lbl.ttip.Angle = The angle of the launch rod from vertical.
|
simedtdlg.lbl.ttip.Angle = <html>The angle of the launch rod from vertical.<br> Positive angles point upwind.
|
||||||
simedtdlg.lbl.Direction = Direction:
|
simedtdlg.lbl.Direction = Direction:
|
||||||
simedtdlg.lbl.ttip.Direction1 = <html>Direction of the launch rod relative to the wind.<br>
|
simedtdlg.lbl.ttip.Direction1 = <html>Direction of the launch rod relative to the wind.<br>
|
||||||
simedtdlg.lbl.ttip.Direction2 = = towards the wind,
|
simedtdlg.lbl.ttip.Direction2 = -
|
||||||
simedtdlg.lbl.ttip.Direction3 = = downwind.
|
simedtdlg.lbl.ttip.Direction3 = 0 is North.
|
||||||
simedtdlg.border.Simopt = Simulator options
|
simedtdlg.border.Simopt = Simulator options
|
||||||
simedtdlg.lbl.Calcmethod = Calculation method:
|
simedtdlg.lbl.Calcmethod = Calculation method:
|
||||||
simedtdlg.lbl.ttip.Calcmethod = <html>The Extended Barrowman method calculates aerodynamic forces according <br>to the Barrowman equations extended to accommodate more components.
|
simedtdlg.lbl.ttip.Calcmethod = <html>The Extended Barrowman method calculates aerodynamic forces according <br>to the Barrowman equations extended to accommodate more components.
|
||||||
@ -1485,8 +1490,8 @@ FlightDataType.TYPE_VELOCITY_Z = Vertical velocity
|
|||||||
FlightDataType.TYPE_ACCELERATION_Z = Vertical acceleration
|
FlightDataType.TYPE_ACCELERATION_Z = Vertical acceleration
|
||||||
FlightDataType.TYPE_VELOCITY_TOTAL = Total velocity
|
FlightDataType.TYPE_VELOCITY_TOTAL = Total velocity
|
||||||
FlightDataType.TYPE_ACCELERATION_TOTAL = Total acceleration
|
FlightDataType.TYPE_ACCELERATION_TOTAL = Total acceleration
|
||||||
FlightDataType.TYPE_POSITION_X = Position East-West
|
FlightDataType.TYPE_POSITION_X = Position East of launch
|
||||||
FlightDataType.TYPE_POSITION_Y = Position North-South
|
FlightDataType.TYPE_POSITION_Y = Position North of launch
|
||||||
FlightDataType.TYPE_POSITION_XY = Lateral distance
|
FlightDataType.TYPE_POSITION_XY = Lateral distance
|
||||||
FlightDataType.TYPE_POSITION_DIRECTION = Lateral direction
|
FlightDataType.TYPE_POSITION_DIRECTION = Lateral direction
|
||||||
FlightDataType.TYPE_VELOCITY_XY = Lateral velocity
|
FlightDataType.TYPE_VELOCITY_XY = Lateral velocity
|
||||||
|
@ -431,7 +431,7 @@ public class OpenRocketSaver extends RocketSaver {
|
|||||||
writeElement("configid", cond.getMotorConfigurationID());
|
writeElement("configid", cond.getMotorConfigurationID());
|
||||||
writeElement("launchrodlength", cond.getLaunchRodLength());
|
writeElement("launchrodlength", cond.getLaunchRodLength());
|
||||||
writeElement("launchrodangle", cond.getLaunchRodAngle() * 180.0 / Math.PI);
|
writeElement("launchrodangle", cond.getLaunchRodAngle() * 180.0 / Math.PI);
|
||||||
writeElement("launchroddirection", cond.getLaunchRodDirection() * 180.0 / Math.PI);
|
writeElement("launchroddirection", cond.getLaunchRodDirection() * 360.0 / (2.0 * Math.PI));
|
||||||
writeElement("windaverage", cond.getWindSpeedAverage());
|
writeElement("windaverage", cond.getWindSpeedAverage());
|
||||||
writeElement("windturbulence", cond.getWindTurbulenceIntensity());
|
writeElement("windturbulence", cond.getWindTurbulenceIntensity());
|
||||||
writeElement("launchaltitude", cond.getLaunchAltitude());
|
writeElement("launchaltitude", cond.getLaunchAltitude());
|
||||||
|
@ -70,7 +70,7 @@ class SimulationConditionsHandler extends AbstractElementHandler {
|
|||||||
if (Double.isNaN(d)) {
|
if (Double.isNaN(d)) {
|
||||||
warnings.add("Illegal launch rod direction defined, ignoring.");
|
warnings.add("Illegal launch rod direction defined, ignoring.");
|
||||||
} else {
|
} else {
|
||||||
conditions.setLaunchRodDirection(d * Math.PI / 180);
|
conditions.setLaunchRodDirection(d * 2.0 * Math.PI / 360);
|
||||||
}
|
}
|
||||||
} else if (element.equals("windaverage")) {
|
} else if (element.equals("windaverage")) {
|
||||||
if (Double.isNaN(d)) {
|
if (Double.isNaN(d)) {
|
||||||
@ -113,7 +113,7 @@ class SimulationConditionsHandler extends AbstractElementHandler {
|
|||||||
} else if (element.equals("atmosphere")) {
|
} else if (element.equals("atmosphere")) {
|
||||||
atmosphereHandler.storeSettings(conditions, warnings);
|
atmosphereHandler.storeSettings(conditions, warnings);
|
||||||
} else if (element.equals("timestep")) {
|
} else if (element.equals("timestep")) {
|
||||||
if (Double.isNaN(d) || d <= 0 ) {
|
if (Double.isNaN(d) || d <= 0) {
|
||||||
warnings.add("Illegal time step defined, ignoring.");
|
warnings.add("Illegal time step defined, ignoring.");
|
||||||
} else {
|
} else {
|
||||||
conditions.setTimeStep(d);
|
conditions.setTimeStep(d);
|
||||||
|
@ -59,24 +59,24 @@ public class RK4SimulationStepper extends AbstractSimulationStepper {
|
|||||||
|
|
||||||
private static final double MIN_TIME_STEP = 0.001;
|
private static final double MIN_TIME_STEP = 0.001;
|
||||||
|
|
||||||
|
|
||||||
private Random random;
|
private Random random;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public RK4SimulationStatus initialize(SimulationStatus original) {
|
public RK4SimulationStatus initialize(SimulationStatus original) {
|
||||||
|
|
||||||
RK4SimulationStatus status = new RK4SimulationStatus(original);
|
RK4SimulationStatus status = new RK4SimulationStatus(original);
|
||||||
// Copy the existing warnings
|
// Copy the existing warnings
|
||||||
status.setWarnings( original.getWarnings() );
|
status.setWarnings(original.getWarnings());
|
||||||
|
|
||||||
SimulationConditions sim = original.getSimulationConditions();
|
SimulationConditions sim = original.getSimulationConditions();
|
||||||
|
|
||||||
status.setLaunchRodDirection(new Coordinate(
|
status.setLaunchRodDirection(new Coordinate(
|
||||||
Math.sin(sim.getLaunchRodAngle()) * Math.cos(sim.getLaunchRodDirection()),
|
Math.sin(sim.getLaunchRodAngle()) * Math.cos(Math.PI / 2.0 - sim.getLaunchRodDirection()),
|
||||||
Math.sin(sim.getLaunchRodAngle()) * Math.sin(sim.getLaunchRodDirection()),
|
Math.sin(sim.getLaunchRodAngle()) * Math.sin(Math.PI / 2.0 - sim.getLaunchRodDirection()),
|
||||||
Math.cos(sim.getLaunchRodAngle())
|
Math.cos(sim.getLaunchRodAngle())
|
||||||
));
|
));
|
||||||
|
|
||||||
|
@ -35,7 +35,7 @@ public class SimulationConditions implements Monitorable, Cloneable {
|
|||||||
/** Launch rod angle >= 0, radians from vertical */
|
/** Launch rod angle >= 0, radians from vertical */
|
||||||
private double launchRodAngle = 0;
|
private double launchRodAngle = 0;
|
||||||
|
|
||||||
/** Launch rod direction, 0 = upwind, PI = downwind. */
|
/** Launch rod direction, 0 = north */
|
||||||
private double launchRodDirection = 0;
|
private double launchRodDirection = 0;
|
||||||
|
|
||||||
// TODO: Depreciate these and use worldCoordinate only.
|
// TODO: Depreciate these and use worldCoordinate only.
|
||||||
|
@ -59,10 +59,12 @@ public class SimulationOptions implements ChangeSource, Cloneable {
|
|||||||
|
|
||||||
private double launchRodLength = 1;
|
private double launchRodLength = 1;
|
||||||
|
|
||||||
/** Launch rod angle > 0, radians from vertical */
|
/** Keep launch rod parallel to wind*/
|
||||||
|
private boolean launchIntoWind = true;
|
||||||
|
/** Launch rod angle, |radians|<90 from vertical, positive is upwind, negative is downwind */
|
||||||
private double launchRodAngle = 0;
|
private double launchRodAngle = 0;
|
||||||
|
|
||||||
/** Launch rod direction, 0 = upwind, PI = downwind. */
|
/** Launch rod direction, 0 = north. */
|
||||||
private double launchRodDirection = 0;
|
private double launchRodDirection = 0;
|
||||||
|
|
||||||
|
|
||||||
@ -139,12 +141,20 @@ public class SimulationOptions implements ChangeSource, Cloneable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public boolean getLaunchIntoWind() {
|
||||||
|
return launchIntoWind;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLaunchIntoWind(boolean i) {
|
||||||
|
launchIntoWind = i;
|
||||||
|
}
|
||||||
|
|
||||||
public double getLaunchRodAngle() {
|
public double getLaunchRodAngle() {
|
||||||
return launchRodAngle;
|
return launchRodAngle;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setLaunchRodAngle(double launchRodAngle) {
|
public void setLaunchRodAngle(double launchRodAngle) {
|
||||||
launchRodAngle = MathUtil.clamp(launchRodAngle, 0, MAX_LAUNCH_ROD_ANGLE);
|
launchRodAngle = MathUtil.clamp(launchRodAngle, -MAX_LAUNCH_ROD_ANGLE, MAX_LAUNCH_ROD_ANGLE);
|
||||||
if (MathUtil.equals(this.launchRodAngle, launchRodAngle))
|
if (MathUtil.equals(this.launchRodAngle, launchRodAngle))
|
||||||
return;
|
return;
|
||||||
this.launchRodAngle = launchRodAngle;
|
this.launchRodAngle = launchRodAngle;
|
||||||
@ -157,7 +167,7 @@ public class SimulationOptions implements ChangeSource, Cloneable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void setLaunchRodDirection(double launchRodDirection) {
|
public void setLaunchRodDirection(double launchRodDirection) {
|
||||||
launchRodDirection = MathUtil.reduce180(launchRodDirection);
|
launchRodDirection = MathUtil.reduce360(launchRodDirection);
|
||||||
if (MathUtil.equals(this.launchRodDirection, launchRodDirection))
|
if (MathUtil.equals(this.launchRodDirection, launchRodDirection))
|
||||||
return;
|
return;
|
||||||
this.launchRodDirection = launchRodDirection;
|
this.launchRodDirection = launchRodDirection;
|
||||||
|
@ -103,12 +103,12 @@ public class SimulationStatus implements Monitorable {
|
|||||||
Quaternion o;
|
Quaternion o;
|
||||||
FlightConditions cond = new FlightConditions(this.configuration);
|
FlightConditions cond = new FlightConditions(this.configuration);
|
||||||
this.simulationConditions.getAerodynamicCalculator().getWorstCP(this.configuration, cond, null);
|
this.simulationConditions.getAerodynamicCalculator().getWorstCP(this.configuration, cond, null);
|
||||||
double angle = -cond.getTheta() - this.simulationConditions.getLaunchRodDirection();
|
double angle = -cond.getTheta() - (Math.PI / 2.0 - this.simulationConditions.getLaunchRodDirection());
|
||||||
o = Quaternion.rotation(new Coordinate(0, 0, angle));
|
o = Quaternion.rotation(new Coordinate(0, 0, angle));
|
||||||
|
|
||||||
// Launch rod angle and direction
|
// Launch rod angle and direction
|
||||||
o = o.multiplyLeft(Quaternion.rotation(new Coordinate(0, this.simulationConditions.getLaunchRodAngle(), 0)));
|
o = o.multiplyLeft(Quaternion.rotation(new Coordinate(0, this.simulationConditions.getLaunchRodAngle(), 0)));
|
||||||
o = o.multiplyLeft(Quaternion.rotation(new Coordinate(0, 0, this.simulationConditions.getLaunchRodDirection())));
|
o = o.multiplyLeft(Quaternion.rotation(new Coordinate(0, 0, Math.PI / 2.0 - this.simulationConditions.getLaunchRodDirection())));
|
||||||
|
|
||||||
this.orientation = o;
|
this.orientation = o;
|
||||||
this.rotationVelocity = Coordinate.NUL;
|
this.rotationVelocity = Coordinate.NUL;
|
||||||
|
@ -352,7 +352,19 @@ public class SimulationConditionsPanel extends JPanel {
|
|||||||
slider.setToolTipText(tip);
|
slider.setToolTipText(tip);
|
||||||
sub.add(slider, "w 75lp, wrap");
|
sub.add(slider, "w 75lp, wrap");
|
||||||
|
|
||||||
|
// Keep launch rod parallel to the wind.
|
||||||
|
|
||||||
|
BooleanModel intoWind = new BooleanModel(conditions, "LaunchIntoWind");
|
||||||
|
JCheckBox checkWind = new JCheckBox(intoWind);
|
||||||
|
//// Use International Standard Atmosphere
|
||||||
|
checkWind.setText(trans.get("simedtdlg.checkbox.Intowind"));
|
||||||
|
checkWind.setToolTipText(
|
||||||
|
trans.get("simedtdlg.checkbox.ttip.Intowind1") +
|
||||||
|
trans.get("simedtdlg.checkbox.ttip.Intowind2") +
|
||||||
|
trans.get("simedtdlg.checkbox.ttip.Intowind3") +
|
||||||
|
trans.get("simedtdlg.checkbox.ttip.Intowind4"));
|
||||||
|
sub.add(checkWind, "spanx, wrap unrel");
|
||||||
|
|
||||||
|
|
||||||
// Angle:
|
// Angle:
|
||||||
label = new JLabel(trans.get("simedtdlg.lbl.Angle"));
|
label = new JLabel(trans.get("simedtdlg.lbl.Angle"));
|
||||||
@ -362,7 +374,7 @@ public class SimulationConditionsPanel extends JPanel {
|
|||||||
sub.add(label);
|
sub.add(label);
|
||||||
|
|
||||||
m = new DoubleModel(conditions, "LaunchRodAngle", UnitGroup.UNITS_ANGLE,
|
m = new DoubleModel(conditions, "LaunchRodAngle", UnitGroup.UNITS_ANGLE,
|
||||||
0, SimulationOptions.MAX_LAUNCH_ROD_ANGLE);
|
-SimulationOptions.MAX_LAUNCH_ROD_ANGLE, SimulationOptions.MAX_LAUNCH_ROD_ANGLE);
|
||||||
|
|
||||||
spin = new JSpinner(m.getSpinnerModel());
|
spin = new JSpinner(m.getSpinnerModel());
|
||||||
spin.setEditor(new SpinnerEditor(spin));
|
spin.setEditor(new SpinnerEditor(spin));
|
||||||
@ -372,7 +384,7 @@ public class SimulationConditionsPanel extends JPanel {
|
|||||||
unit = new UnitSelector(m);
|
unit = new UnitSelector(m);
|
||||||
unit.setToolTipText(tip);
|
unit.setToolTipText(tip);
|
||||||
sub.add(unit, "growx");
|
sub.add(unit, "growx");
|
||||||
slider = new BasicSlider(m.getSliderModel(0, Math.PI / 9,
|
slider = new BasicSlider(m.getSliderModel(-SimulationOptions.MAX_LAUNCH_ROD_ANGLE, 0,
|
||||||
SimulationOptions.MAX_LAUNCH_ROD_ANGLE));
|
SimulationOptions.MAX_LAUNCH_ROD_ANGLE));
|
||||||
slider.setToolTipText(tip);
|
slider.setToolTipText(tip);
|
||||||
sub.add(slider, "w 75lp, wrap");
|
sub.add(slider, "w 75lp, wrap");
|
||||||
@ -381,19 +393,17 @@ public class SimulationConditionsPanel extends JPanel {
|
|||||||
|
|
||||||
// Direction:
|
// Direction:
|
||||||
label = new JLabel(trans.get("simedtdlg.lbl.Direction"));
|
label = new JLabel(trans.get("simedtdlg.lbl.Direction"));
|
||||||
//// <html>Direction of the launch rod relative to the wind.<br>
|
//// <html>Direction of the launch rod.
|
||||||
//// = towards the wind,
|
|
||||||
//// = downwind.
|
|
||||||
tip = trans.get("simedtdlg.lbl.ttip.Direction1") +
|
tip = trans.get("simedtdlg.lbl.ttip.Direction1") +
|
||||||
UnitGroup.UNITS_ANGLE.toStringUnit(0) +
|
UnitGroup.UNITS_ANGLE.toStringUnit(0) +
|
||||||
" " + trans.get("simedtdlg.lbl.ttip.Direction2") + " " +
|
" " + trans.get("simedtdlg.lbl.ttip.Direction2") + " " +
|
||||||
UnitGroup.UNITS_ANGLE.toStringUnit(Math.PI) +
|
UnitGroup.UNITS_ANGLE.toStringUnit(2*Math.PI) +
|
||||||
" " + trans.get("simedtdlg.lbl.ttip.Direction3");
|
" " + trans.get("simedtdlg.lbl.ttip.Direction3");
|
||||||
label.setToolTipText(tip);
|
label.setToolTipText(tip);
|
||||||
sub.add(label);
|
sub.add(label);
|
||||||
|
|
||||||
m = new DoubleModel(conditions, "LaunchRodDirection", UnitGroup.UNITS_ANGLE,
|
m = new DoubleModel(conditions, "LaunchRodDirection", 1.0, UnitGroup.UNITS_ANGLE,
|
||||||
-Math.PI, Math.PI);
|
0, 2*Math.PI);
|
||||||
|
|
||||||
spin = new JSpinner(m.getSpinnerModel());
|
spin = new JSpinner(m.getSpinnerModel());
|
||||||
spin.setEditor(new SpinnerEditor(spin));
|
spin.setEditor(new SpinnerEditor(spin));
|
||||||
@ -403,10 +413,11 @@ public class SimulationConditionsPanel extends JPanel {
|
|||||||
unit = new UnitSelector(m);
|
unit = new UnitSelector(m);
|
||||||
unit.setToolTipText(tip);
|
unit.setToolTipText(tip);
|
||||||
sub.add(unit, "growx");
|
sub.add(unit, "growx");
|
||||||
slider = new BasicSlider(m.getSliderModel(-Math.PI, Math.PI));
|
slider = new BasicSlider(m.getSliderModel(0, 2*Math.PI));
|
||||||
slider.setToolTipText(tip);
|
slider.setToolTipText(tip);
|
||||||
sub.add(slider, "w 75lp, wrap");
|
sub.add(slider, "w 75lp, wrap");
|
||||||
|
|
||||||
|
|
||||||
JButton restoreDefaults = new JButton(trans.get("simedtdlg.but.resettodefault"));
|
JButton restoreDefaults = new JButton(trans.get("simedtdlg.but.resettodefault"));
|
||||||
restoreDefaults.addActionListener(new ActionListener() {
|
restoreDefaults.addActionListener(new ActionListener() {
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user