Skip to content

Commit 83075e2

Browse files
improving parameter management
1 parent 5ce9985 commit 83075e2

File tree

4 files changed

+273
-264
lines changed

4 files changed

+273
-264
lines changed

index.js

Lines changed: 36 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -402,7 +402,19 @@ async function main() {
402402

403403
const sim_container = document.getElementById("sim-container")
404404
proxy_controller = new ProxyController(new Policy(model))
405-
const l2f = new L2F(sim_container, 10, proxy_controller, seed)
405+
406+
407+
const platforms_text = await (await fetch("./blob/registry/index.json")).text()
408+
const platforms = platforms_text.split("\n").filter(line => line.trim() !== "").sort()
409+
const platform_select = document.getElementById("vehicle-load-dynamics-selector")
410+
platforms.forEach(platform => {
411+
platform_select.innerHTML += `<option value="${platform}">${platform}</option>`
412+
})
413+
platform_select.value = "x500"
414+
415+
const default_parameters = await (await fetch(`./blob/registry/${platform_select.value}.json`)).json()
416+
417+
const l2f = new L2F(sim_container, Array(10).fill(default_parameters), proxy_controller, seed)
406418

407419
l2f.state_update_callbacks.push((states) => {
408420
const vehicle_container = document.getElementById("vehicle-list")
@@ -445,8 +457,27 @@ async function main() {
445457

446458
})
447459

460+
l2f.initialized.then(async () => {
461+
await parameter_manager.initialized
462+
const sim_container_cover = document.getElementById("sim-container-cover")
463+
sim_container_cover.style.display = "none"
464+
const pause_button = document.getElementById("pause")
465+
if(pause_button.innerText === "Resume"){
466+
pause_button.click()
467+
}
468+
469+
const perturbation_id_input = document.getElementById("perturbation-id-input")
470+
perturbation_id_input.value = "parameters.dynamics.mass"
471+
perturbation_id_input.dispatchEvent(new Event("input"))
472+
const event = new Event('keydown')
473+
event.key = "Enter"
474+
perturbation_id_input.dispatchEvent(event)
475+
})
476+
477+
478+
448479
const parameter_manager = new ParameterManager(l2f)
449-
const sim_controls = new SimControls(l2f, proxy_controller, parameter_manager)
480+
const sim_controls = new SimControls(l2f, proxy_controller)
450481

451482

452483
const set_parameters = async (parameters) => {
@@ -461,9 +492,7 @@ async function main() {
461492
})
462493
console.log("setting parameters for vehicles: ", ids)
463494
console.log("parameters: ", parameters)
464-
parameter_manager.set_parameters(ids, ids.map(() => parameters))
465-
await l2f.initialized
466-
await l2f.ui.episode_init_multi(l2f.ui_state, l2f.parameters)
495+
await l2f.set_parameters(ids, ids.map(() => parameters))
467496
}
468497
document.getElementById("vehicle-load-dynamics-btn-backend").addEventListener("change", async () => {
469498
const file = event.target.files[0];
@@ -484,44 +513,9 @@ async function main() {
484513
}
485514
else{
486515
const platform = document.getElementById("vehicle-load-dynamics-selector").value
487-
fetch(`./blob/registry/${platform}.json`).then(async (response) => {
488-
const parameters = await response.json()
489-
set_parameters(parameters)
490-
})
491-
}
492-
})
493-
fetch("./blob/registry/index.json").then(async (response) => {
494-
const text = await response.text()
495-
const platforms = text.split("\n").filter(line => line.trim() !== "").sort()
496-
const platform_select = document.getElementById("vehicle-load-dynamics-selector")
497-
platforms.forEach(platform => {
498-
platform_select.innerHTML += `<option value="${platform}">${platform}</option>`
499-
})
500-
501-
await l2f.initialized
502-
await sleep(500)
503-
const selectAllBtn = document.getElementById("vehicle-select-all-btn")
504-
selectAllBtn.click()
505-
506-
const dynamicsSelector = document.getElementById("vehicle-load-dynamics-selector")
507-
dynamicsSelector.value = "x500"
508-
const parameters_response = await fetch(`./blob/registry/${dynamicsSelector.value}.json`)
509-
const parameters = await parameters_response.json()
510-
await set_parameters(parameters)
511-
512-
const sim_container_cover = document.getElementById("sim-container-cover")
513-
sim_container_cover.style.display = "none"
514-
const pause_button = document.getElementById("pause")
515-
if(pause_button.innerText === "Resume"){
516-
pause_button.click()
516+
const parameters = await (await fetch(`./blob/registry/${platform}.json`)).json()
517+
set_parameters(parameters)
517518
}
518-
519-
const perturbation_id_input = document.getElementById("perturbation-id-input")
520-
perturbation_id_input.value = "parameters.dynamics.mass"
521-
perturbation_id_input.dispatchEvent(new Event("input"))
522-
const event = new Event('keydown')
523-
event.key = "Enter"
524-
perturbation_id_input.dispatchEvent(event)
525519
})
526520

527521

l2f.js

Lines changed: 34 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ function std(x){
1515
}
1616

1717
export class L2F{
18-
constructor(parent, num_quadrotors, policy, seed){
18+
constructor(parent, parameters, policy, seed){
1919

2020
this.seed = seed
2121
this.request_pause = true
@@ -80,8 +80,12 @@ export class L2F{
8080

8181
this.initialized = createModule().then(async (l2f_interface) => {
8282
this.l2f_interface = l2f_interface
83-
this.states = [...Array(num_quadrotors)].map((_, i) =>new this.l2f_interface.State(this.seed + i));
84-
this.parameters = this.states.map(state => JSON.parse(state.get_parameters()))
83+
this.states = [...Array(parameters.length)].map((_, i) =>new this.l2f_interface.State(this.seed + i));
84+
this.parameters = structuredClone(parameters)
85+
this.states.forEach((state, i) => {
86+
state.set_parameters(JSON.stringify(this.parameters[i]))
87+
})
88+
this.perturbed_parameters = structuredClone(parameters)
8589
if(DEBUG){
8690
this.ui = ui
8791
}
@@ -103,16 +107,22 @@ export class L2F{
103107
this.dt = null
104108
this.references = null
105109
}
106-
async change_num_quadrotors(num){
110+
async change_num_quadrotors(num, parameters){
107111
const diff = num - this.states.length
108112
if(diff > 0){
109113
const new_states = [...Array(num - this.states.length)].map((_, i) =>new this.l2f_interface.State(this.seed + this.states.length + i));
114+
// new_states.forEach((state, i) => {
115+
// state.set_parameters(JSON.stringify(parameters))
116+
// })
110117
this.states = this.states.concat(new_states)
118+
this.parameters = this.parameters.concat(new_states.map(_ => structuredClone(parameters)))
119+
this.perturbed_parameters = this.perturbed_parameters.concat(new_states.map(_ => structuredClone(parameters)))
111120
}
112121
else{
113122
this.states = this.states.slice(0, num)
123+
this.parameters = this.parameters.slice(0, num)
124+
this.perturbed_parameters = this.perturbed_parameters.slice(0, num)
114125
}
115-
this.parameters = this.states.map(state => JSON.parse(state.get_parameters()))
116126
this.update_render_state()
117127
await this.ui.episode_init_multi(this.ui_state, this.parameters)
118128
return diff
@@ -129,7 +139,7 @@ export class L2F{
129139
return {
130140
"state": state,
131141
"action": this.render_actions[i],
132-
"parameters": this.parameters[i]
142+
"parameters": this.perturbed_parameters[i]
133143
}
134144
})
135145
this.state_update_callbacks.forEach(callback => callback(combined_state))
@@ -146,7 +156,7 @@ export class L2F{
146156
})
147157
}
148158
this.references_ui = references.map((reference, i) => {
149-
const geometry = new THREE.SphereGeometry(Math.cbrt(this.parameters[i].dynamics.mass) / 20, 32, 32);
159+
const geometry = new THREE.SphereGeometry(Math.cbrt(this.parameters[i].dynamics.mass) / 50, 32, 32);
150160
const material = new THREE.MeshStandardMaterial({ color: 0xff4444 });
151161
const ball = new THREE.Mesh(geometry, material);
152162
const reference_ui_objects = this.ui_state.simulator.add(ball)
@@ -227,4 +237,21 @@ export class L2F{
227237
this.stats.end()
228238
}
229239
}
240+
async set_parameters(ids, parameters){
241+
await this.initialized
242+
ids.forEach((id, i) => {
243+
this.parameters[id] = structuredClone(parameters[i])
244+
this.perturbed_parameters[id] = structuredClone(parameters[i])
245+
this.states[id].set_parameters(JSON.stringify(parameters[i]))
246+
})
247+
await this.ui.episode_init_multi(this.ui_state, this.parameters)
248+
}
249+
async set_perturbed_parameters(ids, parameters){
250+
await this.initialized
251+
ids.forEach((id, i) => {
252+
this.perturbed_parameters[id] = structuredClone(parameters[i])
253+
this.states[id].set_parameters(JSON.stringify(parameters[i]))
254+
})
255+
}
256+
230257
}

0 commit comments

Comments
 (0)