Skip to content

Commit 8adb291

Browse files
authored
Bevyhaviorsimulator parameters (HULKs#2098)
* Bevyhavior simulator: split up parameters and simulator state * Serve parameters from currently selected robot * Naming consistency
1 parent 0a87226 commit 8adb291

File tree

6 files changed

+85
-52
lines changed

6 files changed

+85
-52
lines changed
Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,4 @@
11
{
22
"selected_frame": 0,
3-
"selected_robot": 7,
4-
"field_dimensions": {
5-
"ball_radius": 0.05,
6-
"length": 9.0,
7-
"width": 6.0,
8-
"line_width": 0.05,
9-
"penalty_marker_size": 0.1,
10-
"goal_box_area_length": 0.6,
11-
"goal_box_area_width": 2.2,
12-
"penalty_area_length": 1.65,
13-
"penalty_area_width": 4.0,
14-
"penalty_marker_distance": 1.3,
15-
"center_circle_diameter": 1.5,
16-
"border_strip_width": 0.7,
17-
"goal_inner_width": 1.5,
18-
"goal_post_diameter": 0.1,
19-
"goal_depth": 0.5
20-
}
3+
"selected_robot": 7
214
}

crates/bevyhavior_simulator/src/recorder.rs

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,19 @@ use tokio_util::sync::CancellationToken;
1616

1717
use types::{ball_position::SimulatorBallState, players::Players};
1818

19-
use crate::{ball::BallResource, cyclers::control::Database, robot::Robot, server};
19+
use crate::{
20+
ball::BallResource, cyclers::control::Database, robot::Robot, server, structs::Parameters,
21+
};
2022

2123
pub struct Frame {
2224
pub timestamp: SystemTime,
2325
pub ball: Option<SimulatorBallState>,
24-
pub robots: Players<Option<Database>>,
26+
pub robots: Players<Option<RobotFrame>>,
27+
}
28+
29+
pub struct RobotFrame {
30+
pub database: Database,
31+
pub parameters: Parameters,
2532
}
2633

2734
#[derive(Resource)]
@@ -37,9 +44,12 @@ pub fn frame_recorder(
3744
recording: ResMut<Recording>,
3845
time: Res<Time>,
3946
) {
40-
let mut players = Players::<Option<Database>>::default();
47+
let mut players = Players::<Option<RobotFrame>>::default();
4148
for robot in &robots {
42-
players[robot.parameters.player_number] = Some(robot.database.clone())
49+
players[robot.parameters.player_number] = Some(RobotFrame {
50+
database: robot.database.clone(),
51+
parameters: robot.parameters.clone(),
52+
})
4353
}
4454
recording
4555
.frame_sender

crates/bevyhavior_simulator/src/server.rs

Lines changed: 51 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,16 @@ use tokio_util::sync::CancellationToken;
88

99
use hula_types::hardware::Ids;
1010
use path_serde::{PathDeserialize, PathIntrospect, PathSerialize};
11-
use types::{
12-
ball_position::SimulatorBallState, field_dimensions::FieldDimensions, players::Players,
13-
};
11+
use types::{ball_position::SimulatorBallState, players::Players};
1412

15-
use crate::{cyclers::control::Database, recorder::Frame, robot::to_player_number};
13+
use crate::{
14+
cyclers::control::Database, recorder::Frame, robot::to_player_number, structs::Parameters,
15+
};
1616

1717
#[derive(Clone, Serialize, Deserialize, PathSerialize, PathDeserialize, PathIntrospect)]
18-
pub struct Parameters {
18+
pub struct SimulatorState {
1919
selected_frame: usize,
2020
selected_robot: usize,
21-
pub field_dimensions: FieldDimensions,
2221
}
2322

2423
#[derive(Clone, Default, Serialize, PathSerialize, PathIntrospect)]
@@ -35,9 +34,10 @@ struct BehaviorSimulatorDatabase {
3534

3635
async fn timeline_server(
3736
keep_running: CancellationToken,
38-
mut parameters_reader: buffered_watch::Receiver<(SystemTime, Parameters)>,
37+
mut simulator_state_reader: buffered_watch::Receiver<(SystemTime, SimulatorState)>,
3938
mut outputs_writer: buffered_watch::Sender<(SystemTime, BehaviorSimulatorDatabase)>,
4039
mut control_writer: buffered_watch::Sender<(SystemTime, Database)>,
40+
mut parameter_writer: buffered_watch::Sender<(SystemTime, Parameters)>,
4141
mut frame_receiver: UnboundedReceiver<Frame>,
4242
) {
4343
let mut frames = Vec::<Frame>::new();
@@ -61,26 +61,46 @@ async fn timeline_server(
6161
}
6262
}
6363
}
64-
_ = parameters_reader.wait_for_change() => { }
64+
_ = simulator_state_reader.wait_for_change() => { }
6565
_ = keep_running.cancelled() => {
6666
break
6767
}
6868
}
6969

70-
let (_, parameters) = &*parameters_reader.borrow_and_mark_as_seen();
71-
if let Some(frame) = &frames.get(parameters.selected_frame) {
70+
let (_, simulator_state) = &*simulator_state_reader.borrow_and_mark_as_seen();
71+
if let Some(frame) = &frames.get(simulator_state.selected_frame) {
7272
{
7373
let (time, outputs) = &mut *outputs_writer.borrow_mut();
7474
outputs.main_outputs.frame_count = frames.len();
7575
outputs.main_outputs.ball.clone_from(&frame.ball);
76-
outputs.main_outputs.databases = frame.robots.clone();
76+
outputs.main_outputs.databases = frame.robots.as_ref().map(|maybe_robot_frame| {
77+
maybe_robot_frame
78+
.as_ref()
79+
.map(|robot_frame| robot_frame.database.clone())
80+
});
7781
*time = frame.timestamp;
7882
}
7983
{
8084
let (time, control) = &mut *control_writer.borrow_mut();
81-
*control = to_player_number(parameters.selected_robot)
85+
*control = to_player_number(simulator_state.selected_robot)
86+
.ok()
87+
.and_then(|player_number| {
88+
frame.robots[player_number]
89+
.as_ref()
90+
.map(|robot_frame| robot_frame.database.clone())
91+
})
92+
.unwrap_or_default();
93+
*time = frame.timestamp;
94+
}
95+
{
96+
let (time, parameters) = &mut *parameter_writer.borrow_mut();
97+
*parameters = to_player_number(simulator_state.selected_robot)
8298
.ok()
83-
.and_then(|player_number| frame.robots[player_number].clone())
99+
.and_then(|player_number| {
100+
frame.robots[player_number]
101+
.as_ref()
102+
.map(|robot_frame| robot_frame.parameters.clone())
103+
})
84104
.unwrap_or_default();
85105
*time = frame.timestamp;
86106
}
@@ -97,12 +117,12 @@ pub async fn run(
97117
body_id: "behavior_simulator".to_string(),
98118
head_id: "behavior_simulator".to_string(),
99119
};
100-
let parameters_from_disk: Parameters =
120+
let initial_simulator_state: SimulatorState =
101121
parameters::directory::deserialize("crates/bevyhavior_simulator", &ids, true)
102122
.wrap_err("failed to parse initial parameters")?;
103-
let initial_parameters = parameters_from_disk;
104-
let (parameters_sender, parameters_receiver) =
105-
buffered_watch::channel((std::time::SystemTime::now(), initial_parameters));
123+
124+
let (simulator_state_sender, simulator_state_receiver) =
125+
buffered_watch::channel((std::time::SystemTime::now(), initial_simulator_state));
106126

107127
let (outputs_sender, outputs_receiver) =
108128
buffered_watch::channel((UNIX_EPOCH, Default::default()));
@@ -113,32 +133,38 @@ pub async fn run(
113133
let (control_writer, control_reader) =
114134
buffered_watch::channel((UNIX_EPOCH, Default::default()));
115135

116-
let (subscribed_control_writer, _subscribed_control_reader) =
117-
buffered_watch::channel(Default::default());
136+
let (parameter_writer, parameter_reader) =
137+
buffered_watch::channel((UNIX_EPOCH, Default::default()));
118138

119139
let mut communication_server = communication::server::Server::default();
140+
141+
let (control_subscriptions, _) = buffered_watch::channel(Default::default());
120142
let (parameters_subscriptions, _) = buffered_watch::channel(Default::default());
143+
let (simulator_state_subscriptions, _) = buffered_watch::channel(Default::default());
144+
121145
communication_server.expose_source(
122146
"BehaviorSimulator",
123147
outputs_receiver,
124148
subscribed_outputs_sender,
125149
)?;
126-
communication_server.expose_source("Control", control_reader, subscribed_control_writer)?;
150+
communication_server.expose_source("Control", control_reader, control_subscriptions)?;
151+
communication_server.expose_source("parameters", parameter_reader, parameters_subscriptions)?;
127152
communication_server.expose_source(
128-
"parameters",
129-
parameters_receiver.clone(),
130-
parameters_subscriptions,
153+
"simulator",
154+
simulator_state_receiver.clone(),
155+
simulator_state_subscriptions,
131156
)?;
132-
communication_server.expose_sink("parameters", parameters_sender)?;
157+
communication_server.expose_sink("simulator", simulator_state_sender)?;
133158

134159
{
135160
let keep_running = keep_running.clone();
136161
tokio::spawn(async {
137162
timeline_server(
138163
keep_running,
139-
parameters_receiver,
164+
simulator_state_receiver,
140165
outputs_sender,
141166
control_writer,
167+
parameter_writer,
142168
frame_receiver,
143169
)
144170
.await

crates/bevyhavior_simulator/src/simulator.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ use crate::{
2424
game_controller::{game_controller_plugin, GameController},
2525
recorder::Recording,
2626
robot::{cycle_robots, move_robots, Messages},
27-
server::Parameters,
2827
soft_error::{soft_error_plugin, SoftErrorResource},
28+
structs::Parameters,
2929
test_rules::check_robots_dont_walk_into_rule_obstacles,
3030
time::{update_time, Ticks},
3131
visual_referee::VisualRefereeResource,
@@ -127,7 +127,7 @@ fn load_parameters() -> Result<Parameters> {
127127
let current_directory = current_dir().wrap_err("failed to get current directory")?;
128128
let repository =
129129
Repository::find_root(current_directory).wrap_err("failed to get repository root")?;
130-
let parameters_path = repository.root.join("crates/bevyhavior_simulator");
130+
let parameters_path = repository.root.join("etc/parameters");
131131

132132
parameters::directory::deserialize(parameters_path, &ids, true)
133133
.wrap_err("failed to parse initial parameters")

crates/types/src/players.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,20 @@ pub struct Players<T> {
2828
pub seven: T,
2929
}
3030

31+
impl<T> Players<T> {
32+
pub fn as_ref(&self) -> Players<&T> {
33+
Players {
34+
one: &self.one,
35+
two: &self.two,
36+
three: &self.three,
37+
four: &self.four,
38+
five: &self.five,
39+
six: &self.six,
40+
seven: &self.seven,
41+
}
42+
}
43+
}
44+
3145
impl<From> Players<From> {
3246
pub fn map<To>(self, mut f: impl FnMut(From) -> To) -> Players<To> {
3347
Players {

tools/twix/src/panels/behavior_simulator.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ impl Panel for BehaviorSimulatorPanel {
2323
const NAME: &'static str = "Behavior Simulator";
2424

2525
fn new(nao: Arc<Nao>, value: Option<&Value>) -> Self {
26-
let selected_frame_updater = nao.subscribe_value("parameters.selected_frame");
26+
let selected_frame_updater = nao.subscribe_value("simulator.selected_frame");
2727

2828
let frame_count = nao.subscribe_value("BehaviorSimulator.main_outputs.frame_count");
2929
let selected_frame = value
@@ -117,7 +117,7 @@ impl Widget for &mut BehaviorSimulatorPanel {
117117
.ui(ui);
118118
if response.changed() {
119119
self.nao.write(
120-
"parameters.selected_robot",
120+
"simulator.selected_robot",
121121
TextOrBinary::Text(robots[self.selected_robot].into()),
122122
);
123123
};
@@ -138,7 +138,7 @@ impl Widget for &mut BehaviorSimulatorPanel {
138138
if let Some(new_frame) = new_frame {
139139
self.selected_frame = (new_frame + frame_count as f64) % frame_count as f64;
140140
self.nao.write(
141-
"parameters.selected_frame",
141+
"simulator.selected_frame",
142142
TextOrBinary::Text((self.selected_frame as usize).into()),
143143
);
144144
}

0 commit comments

Comments
 (0)