Skip to content

Commit 8989432

Browse files
adding x offset slider
1 parent d8bf672 commit 8989432

File tree

3 files changed

+50
-18
lines changed

3 files changed

+50
-18
lines changed

index.html

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,17 @@
187187
<button id="step">Step</button>
188188
</div>
189189
<div id="reference-trajectory-container" class="controls-container">
190+
<div id="reference-trajectory-offset-container">
191+
<span class="slider-container">
192+
<div>
193+
<span class="control-container-label">X Offset:</span>
194+
<span class="control-container-label">0</span>
195+
</div>
196+
<div>
197+
<input type="range" min="0" max="0.2" step="0.001" value="0">
198+
</div>
199+
</span>
200+
</div>
190201
<label for="reference-trajectory">Reference Trajectory:</label>
191202
<select id="reference-trajectory" name="reference-trajectory">
192203
</select>

index.js

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -50,13 +50,15 @@ class MultiController {
5050
this.controllers.forEach(controller => controller.reset())
5151
}
5252
get_reference(states){
53-
console.assert(this.controllers.length == states.length)
54-
return this.controllers.map((c) => c.get_reference())
53+
// console.assert(this.controllers.length == states.length)
54+
// return this.controllers.map((c) => c.get_reference())
55+
return null
5556
}
5657
}
5758

5859
let model = null
5960
let trajectory = null
61+
let trajectory_x_offset = 0
6062
class Policy{
6163
constructor() {
6264
this.step = 0
@@ -87,7 +89,7 @@ class Policy{
8789
if (delay === 0) {
8890
return full_observation.slice(15, 18)
8991
} else {
90-
const s = get_state()
92+
const s = get_state(0)
9193
return s["angular_velocity_history"][s["angular_velocity_history"].length - delay]
9294
}
9395
case obs.startsWith("ActionHistory"):
@@ -109,12 +111,13 @@ class Policy{
109111
this.policy_states = states.map(() => null)
110112
}
111113
this.step += 1
114+
const references = this.get_reference(states)
112115
return states.map((state, i) => {
113116
state.observe()
114117
const observation_description = document.getElementById("observations").observation
115118
let input = math.matrix([observation_description.split(".").map(x => this.get_observation(state, x)).flat()])
116-
const input_offset = this._get_reference()
117-
input_offset.forEach((x, i) => {
119+
const reference = references[i]
120+
reference.forEach((x, i) => {
118121
input._data[0][i] = input._data[0][i] - x
119122
})
120123
const [output, new_state] = model.evaluate_step(input, this.policy_states[i])
@@ -131,7 +134,11 @@ class Policy{
131134
}
132135
get_reference(states){
133136
const ref = this._get_reference()
134-
return states.map(() => ref)
137+
return states.map((_, i) => {
138+
const new_ref = ref.slice()
139+
new_ref[0] += trajectory_x_offset * i
140+
return new_ref
141+
})
135142
}
136143
}
137144

@@ -178,6 +185,13 @@ async function load_model(checkpoint) {
178185
}
179186

180187
async function main() {
188+
const trajectory_x_offset_container = document.getElementById("reference-trajectory-offset-container")
189+
const trajectory_x_offset_slider = trajectory_x_offset_container.querySelector("input[type=range]")
190+
const trajectory_x_offset_label = trajectory_x_offset_container.querySelectorAll(".control-container-label")[1]
191+
trajectory_x_offset_slider.addEventListener("input", (event) => {
192+
trajectory_x_offset = parseFloat(event.target.value)
193+
trajectory_x_offset_label.textContent = trajectory_x_offset.toFixed(2)
194+
})
181195
const trajectory_select = document.getElementById("reference-trajectory")
182196
const trajectories = { "Position": Position, "Lissajous": Lissajous, "Langevin": SecondOrderLangevin}
183197
trajectory_select.innerHTML = ""

l2f.js

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -116,20 +116,27 @@ export class L2F{
116116
simulate_step(){
117117
const actions = this.policy.evaluate_step(this.states)
118118
const references = this.policy.get_reference(this.states)
119-
if(this.references === null){
120-
// create three.js reference ball
121-
this.references_ui = references.map((reference, i) => {
122-
const geometry = new THREE.SphereGeometry(Math.cbrt(this.parameters[i].dynamics.mass) / 20, 32, 32);
123-
const material = new THREE.MeshStandardMaterial({ color: 0xff4444 });
124-
const ball = new THREE.Mesh(geometry, material);
125-
const reference_ui_objects = this.ui_state.simulator.add(ball)
126-
return ball
119+
if(references !== null){
120+
if(this.references === null || this.references.length !== references.length){
121+
// create three.js reference ball
122+
if(this.references !== null){
123+
this.references_ui.forEach(ball => {
124+
this.ui_state.simulator.remove(ball)
125+
})
126+
}
127+
this.references_ui = references.map((reference, i) => {
128+
const geometry = new THREE.SphereGeometry(Math.cbrt(this.parameters[i].dynamics.mass) / 20, 32, 32);
129+
const material = new THREE.MeshStandardMaterial({ color: 0xff4444 });
130+
const ball = new THREE.Mesh(geometry, material);
131+
const reference_ui_objects = this.ui_state.simulator.add(ball)
132+
return ball
133+
})
134+
}
135+
this.references = references
136+
this.references.forEach((reference, i) => {
137+
this.references_ui[i].position.set(reference[0], reference[1], reference[2])
127138
})
128139
}
129-
this.references = references
130-
this.references.forEach((reference, i) => {
131-
this.references_ui[i].position.set(reference[0], reference[1], reference[2])
132-
})
133140
console.assert(actions.length === this.states.length, "Action dimension mismatch")
134141
this.states.forEach((state, i) => {
135142
const action = actions[i]

0 commit comments

Comments
 (0)