xxxxxxxxxx
110
let sf = 400; // scaling factor for visualisation
let fast_jitter = [0.0, 0.0]; // init to zero
let slow_pointing = [0.0, 0.0]; // init to zero
let jitter_gain = 0.5;
let offload_fraction = 0.1;
let noise_std = 5.0;
let jitter_gain_slider, offload_fraction_slider, noise_std_slider;
function setup() {
frameRate(30);
createCanvas(400, 400);
createDiv("Jitter Gain:");
jitter_gain_slider = createSlider(0, 1, 0.5, 0.001);
createDiv("Offload Fraction:");
offload_fraction_slider = createSlider(0, 1, 0.1, 0.001);
createDiv("Measurement Noise STD:");
noise_std_slider = createSlider(0, 20, 0, 0.1);
ellipseMode(CENTER);
}
function draw() {
prep_display();
read_sliders();
let t = frameCount / 100;
// true position: (bounded random walk)
let pos = [];
for (let p in [0,1]){
pos.push(sf * (noise(t, p) - 0.5));
}
fill(255, 0, 0);
ellipse(pos, 20, 20);
// noisy measurement: (additive gaussian noise, plus residual tip/tilt)
let meas = [];
for (let p in [0,1]) {
meas.push(
pos[p] - slow_pointing[p] - fast_jitter[p] + randomGaussian(0, noise_std)
);
}
fill(0, 0, 255);
noStroke();
ellipse(meas, 20, 20);
// slow_pointing: (pure integral of offloaded jitter)
for (let p in [0,1]) {
slow_pointing[p] += offload_fraction * fast_jitter[p];
fast_jitter[p] -= offload_fraction * fast_jitter[p];
}
stroke(0);
strokeWeight(10);
line(0, 0, slow_pointing);
push();
translate(slow_pointing);
// fast jitter: (pure integral of gain * measurement)
for (let p in [0,1]) {
fast_jitter[p] += jitter_gain * meas[p];
}
stroke(0);
strokeWeight(5);
line(0, 0, fast_jitter);
// overkill plotting stuff:
fill(255);
ellipse(0, 0, 10, 10);
ellipse(fast_jitter, 10, 10);
pop();
strokeWeight(5);
fill(255);
ellipse(0, 0, 10, 10);
}
function prep_display() {
background(220);
noStroke();
fill(0, 0, 255);
ellipse(20, 20, 20, 20);
fill(0);
text("Closed-loop measurement", 35, 25);
fill(255, 0, 0);
ellipse(20, 43, 20, 20);
fill(0);
text("True disturbance", 35, 48);
stroke(0);
strokeWeight(10);
line(width - 70, 20, width - 30, 20);
noStroke();
text("Pointing", width - 125, 23);
stroke(0);
strokeWeight(5);
line(width - 70, 43, width - 30, 43);
noStroke();
text("Jitter mirror", width - 140, 47);
translate(width / 2, height / 2);
noStroke();
}
function read_sliders() {
jitter_gain = jitter_gain_slider.value();
offload_fraction = offload_fraction_slider.value();
noise_std = noise_std_slider.value();
}