Skip to content

Commit 8b29531

Browse files
vivi-ennepejotejo
andauthored
Forward kinematic (#2116)
* start K1 joints * change joints to booster, remove mio * remove unused coordinate systems * add center of masses, masses * check vivis errors * rename robotdimensions * check robot positions * add more robot positions * rename legdimensions * dO Do TODO formating * fix righ sole to robot * limprojector to new arms * delete inverse kinematic and --> walking engine * work on todos * add missing translations * work on review comment, fix duplicate rotation error --------- Co-authored-by: Johannes Blum <johannes.blum@tuhh.de>
1 parent 21fd459 commit 8b29531

84 files changed

Lines changed: 548 additions & 11065 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

Cargo.lock

Lines changed: 144 additions & 1648 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,12 +47,10 @@ members = [
4747
"crates/step_planning_solver",
4848
"crates/types",
4949
"crates/vision",
50-
"crates/walking_engine",
5150
"crates/zed",
5251
"tools/annotato",
5352
"tools/depp",
5453
"tools/fanta",
55-
"tools/mio",
5654
"tools/mujoco-simulator/mujoco-rust-server",
5755
"tools/parameter_tester",
5856
"tools/pepsi",
@@ -246,7 +244,6 @@ uuid = { version = "1.12.1", features = ["v4"] }
246244
v4l = { version = "0.12.1", git = "https://github.com/HULKs/libv4l-rs", rev = "be65819073514b193d082dd37dbcc2cfac3f6183" }
247245
vision = { path = "crates/vision" }
248246
walkdir = "2.5.0"
249-
walking_engine = { path = "crates/walking_engine" }
250247
watch = "0.2.3"
251248
webots = { version = "0.8.0" }
252249
xdg = "2.5.2"

crates/bevyhavior_simulator/Cargo.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@ tokio = { workspace = true }
4848
tokio-util = { workspace = true }
4949
types = { workspace = true }
5050
vision = { workspace = true }
51-
walking_engine = { workspace = true }
5251
zed = { workspace = true }
5352

5453
[build-dependencies]

crates/bevyhavior_simulator/build.rs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,6 @@ fn main() -> Result<()> {
3030
"control::kinematics_provider",
3131
"control::motion::look_around",
3232
"control::motion::motion_selector",
33-
"control::motion::step_planner",
34-
"control::motion::walking_engine",
35-
"control::motion::walk_manager",
3633
"control::odometry",
3734
"control::penalty_shot_direction_estimation",
3835
"control::primary_state_filter",

crates/bevyhavior_simulator/src/bin/intercept_ball.rs

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use bevy::{ecs::system::SystemParam, prelude::*};
33
use linear_algebra::{point, vector, Isometry2, Point2, Vector};
44
use scenario::scenario;
55
use spl_network_messages::{GameState, PlayerNumber};
6-
use types::{ball_position::SimulatorBallState, step::Step};
6+
use types::ball_position::SimulatorBallState;
77

88
use bevyhavior_simulator::{
99
ball::BallResource,
@@ -33,13 +33,6 @@ fn startup(
3333
) {
3434
let mut robot = Robot::new(PlayerNumber::One);
3535
*robot.ground_to_field_mut() = Isometry2::from_parts(vector![-2.0, 0.0], 0.0);
36-
robot.parameters.step_planner.walk_volume_extents.forward = 1.0;
37-
robot.parameters.step_planner.walk_volume_extents.outward = 1.0;
38-
robot.parameters.step_planner.request_scale = Step {
39-
forward: 1.0,
40-
left: 1.0,
41-
turn: 1.0,
42-
};
4336
commands.spawn(robot);
4437
game_controller.state.game_state = GameState::Playing;
4538
game_controller_commands.send(GameControllerCommand::SetGameState(GameState::Playing));

crates/bevyhavior_simulator/src/bin/mpc_step_planning_optimizer.rs

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -67,12 +67,6 @@ fn update(
6767
});
6868

6969
let optimizer_steps = time.ticks() as usize;
70-
robots
71-
.single_mut()
72-
.parameters
73-
.step_planner
74-
.optimization_parameters
75-
.optimizer_steps = optimizer_steps;
7670

7771
println!("tick {}: {optimizer_steps} steps", time.ticks());
7872

crates/bevyhavior_simulator/src/bin/step_planning_test.rs

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -32,16 +32,6 @@ fn startup(
3232
fn update(time: Res<Time<Ticks>>, mut exit: EventWriter<AppExit>, mut robots: Query<&mut Robot>) {
3333
let mut robot = robots.iter_mut().next().unwrap();
3434

35-
robot
36-
.parameters
37-
.step_planner
38-
.optimization_parameters
39-
.optimizer_steps = 100;
40-
robot
41-
.parameters
42-
.step_planner
43-
.optimization_parameters
44-
.warm_start = false;
4535
robot.database.main_outputs.ground_to_field = Some(Isometry2::identity());
4636

4737
let angle = 0.01 * time.ticks() as f32;

crates/bevyhavior_simulator/src/robot.rs

Lines changed: 8 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
use std::{
22
convert::Into,
3-
f32::consts::FRAC_PI_2,
43
mem::take,
54
sync::{mpsc, Arc},
65
time::{Duration, SystemTime, UNIX_EPOCH},
@@ -17,14 +16,13 @@ use bevy::{
1716
use color_eyre::{eyre::WrapErr, Result};
1817

1918
use buffered_watch::{Receiver, Sender};
20-
use control::{localization::generate_initial_pose, zero_moment_point_provider::LEFT_FOOT_OUTLINE};
19+
use control::localization::generate_initial_pose;
2120
use coordinate_systems::{Field, Ground, Head, LeftSole, RightSole, Robot as RobotCoordinates};
2221
use framework::{future_queue, Producer, RecordingTrigger};
23-
use geometry::{circle::Circle, polygon::circle_overlaps_polygon};
2422
use hula_types::hardware::Ids;
2523
use linear_algebra::{
26-
point, vector, Isometry2, Isometry3, Orientation2, Orientation3, Point2, Pose2, Pose3,
27-
Rotation2, Vector2,
24+
vector, Isometry2, Isometry3, Orientation2, Orientation3, Point2, Pose2, Pose3, Rotation2,
25+
Vector2,
2826
};
2927
use parameters::directory::deserialize;
3028
use projection::intrinsic::Intrinsic;
@@ -34,17 +32,13 @@ use types::{
3432
filtered_whistle::FilteredWhistle,
3533
joints::Joints,
3634
messages::{IncomingMessage, OutgoingMessage},
37-
motion_command::{HeadMotion, KickVariant},
35+
motion_command::HeadMotion,
3836
motion_selection::MotionSafeExits,
3937
pose_kinds::PoseKind,
4038
robot_dimensions::RobotDimensions,
4139
sensor_data::Foot,
4240
support_foot::Side,
4341
};
44-
use walking_engine::{
45-
kick_state::KickState,
46-
mode::{kicking::Kicking, Mode},
47-
};
4842

4943
use crate::{
5044
ball::BallResource,
@@ -249,65 +243,12 @@ pub fn from_player_number(val: PlayerNumber) -> usize {
249243
}
250244
}
251245

252-
pub fn move_robots(mut robots: Query<&mut Robot>, mut ball: ResMut<BallResource>, time: Res<Time>) {
246+
pub fn move_robots(mut robots: Query<&mut Robot>, _ball: ResMut<BallResource>, time: Res<Time>) {
253247
for mut robot in &mut robots {
254248
if let Some(ball) = robot.database.main_outputs.ball_position.as_mut() {
255249
ball.position += ball.velocity * time.delta_secs();
256250
ball.velocity *= 0.98
257251
}
258-
if let Mode::Kicking(Kicking {
259-
kick:
260-
KickState {
261-
variant,
262-
side: kicking_side,
263-
strength,
264-
..
265-
},
266-
..
267-
}) = robot.cycler.cycler_state.walking_engine_mode
268-
{
269-
if let Some(ball) = ball.state.as_mut() {
270-
let side = match kicking_side {
271-
Side::Left => -1.0,
272-
Side::Right => 1.0,
273-
};
274-
275-
let robot_to_ground = robot.database.main_outputs.robot_to_ground.unwrap();
276-
let kinematics = &robot.database.main_outputs.robot_kinematics;
277-
let left_sole_to_ground = robot_to_ground * kinematics.left_leg.sole_to_robot;
278-
let right_sole_to_ground = robot_to_ground * kinematics.right_leg.sole_to_robot;
279-
let left_sole_in_ground: Vec<_> = LEFT_FOOT_OUTLINE
280-
.into_iter()
281-
.map(|point| (left_sole_to_ground * point).xy())
282-
.collect();
283-
let right_sole_in_ground: Vec<_> = LEFT_FOOT_OUTLINE
284-
.into_iter()
285-
.map(|point| {
286-
(right_sole_to_ground * point![point.x(), -point.y(), point.z()]).xy()
287-
})
288-
.collect();
289-
290-
let ball_circle = Circle::new(
291-
robot.ground_to_field().inverse() * ball.position,
292-
robot.parameters.field_dimensions.ball_radius,
293-
);
294-
let in_range = circle_overlaps_polygon(&left_sole_in_ground, ball_circle)
295-
|| circle_overlaps_polygon(&right_sole_in_ground, ball_circle);
296-
let previous_kick_finished =
297-
(time.elapsed() - robot.last_kick_time).as_secs_f32() > 1.0;
298-
if in_range && previous_kick_finished {
299-
let direction = match variant {
300-
KickVariant::Forward => Orientation2::identity(),
301-
KickVariant::Turn => Orientation2::new(0.35),
302-
KickVariant::Side => Orientation2::new(-FRAC_PI_2),
303-
}
304-
.as_unit_vector()
305-
.component_mul(&vector![1.0, side]);
306-
ball.velocity += robot.ground_to_field() * direction * strength * 2.5;
307-
robot.last_kick_time = time.elapsed();
308-
};
309-
}
310-
};
311252

312253
let (left_sole, right_sole) =
313254
sole_positions(&robot.database.main_outputs.sensor_data.positions);
@@ -324,17 +265,6 @@ pub fn move_robots(mut robots: Query<&mut Robot>, mut ball: ResMut<BallResource>
324265
let ground = robot.database.main_outputs.robot_to_ground.unwrap() * support_sole;
325266
let anchor = robot.ground_to_field() * to2d(ground);
326267

327-
let target = robot.database.main_outputs.walk_motor_commands.positions;
328-
let positions = &mut robot.database.main_outputs.sensor_data.positions;
329-
positions.left_leg =
330-
positions.left_leg + (target.left_leg - positions.left_leg) * time.delta_secs() * 10.0;
331-
positions.right_leg = positions.right_leg
332-
+ (target.right_leg - positions.right_leg) * time.delta_secs() * 10.0;
333-
positions.left_arm =
334-
positions.left_arm + (target.left_arm - positions.left_arm) * time.delta_secs() * 10.0;
335-
positions.right_arm = positions.right_arm
336-
+ (target.right_arm - positions.right_arm) * time.delta_secs() * 10.0;
337-
338268
let (new_left_sole, new_right_sole) =
339269
sole_positions(&robot.database.main_outputs.sensor_data.positions);
340270
let support_sole = match support_foot {
@@ -505,12 +435,7 @@ pub fn cycle_robots(
505435
.support_foot
506436
.support_side
507437
.unwrap();
508-
let is_step_finished = robot
509-
.cycler
510-
.cycler_state
511-
.walking_engine_mode
512-
.step_state()
513-
.is_some_and(|step_state| step_state.time_since_start >= step_state.plan.step_duration);
438+
let is_step_finished = false;
514439
let next_support_foot = if is_step_finished {
515440
support_foot.opposite()
516441
} else {
@@ -568,7 +493,7 @@ fn sole_positions(joint_positions: &Joints) -> (Pose3<RobotCoordinates>, Pose3<R
568493
let left_foot_to_robot =
569494
left_ankle_to_robot * left_foot_to_left_ankle(&joint_positions.left_leg);
570495
let left_sole_to_robot: Isometry3<LeftSole, RobotCoordinates> =
571-
left_foot_to_robot * Isometry3::from(RobotDimensions::LEFT_ANKLE_TO_LEFT_SOLE);
496+
left_foot_to_robot * Isometry3::from(RobotDimensions::LEFT_FOOT_TO_LEFT_SOLE);
572497
// right leg
573498
let right_pelvis_to_robot = right_pelvis_to_robot(&joint_positions.right_leg);
574499
let right_hip_to_robot =
@@ -582,7 +507,7 @@ fn sole_positions(joint_positions: &Joints) -> (Pose3<RobotCoordinates>, Pose3<R
582507
let right_foot_to_robot =
583508
right_ankle_to_robot * right_foot_to_right_ankle(&joint_positions.right_leg);
584509
let right_sole_to_robot: Isometry3<RightSole, RobotCoordinates> =
585-
right_foot_to_robot * Isometry3::from(RobotDimensions::RIGHT_ANKLE_TO_RIGHT_SOLE);
510+
right_foot_to_robot * Isometry3::from(RobotDimensions::RIGHT_FOOT_TO_RIGHT_SOLE);
586511

587512
(left_sole_to_robot.as_pose(), right_sole_to_robot.as_pose())
588513
}

crates/control/Cargo.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,4 +42,3 @@ splines = { workspace = true }
4242
step_planning = { workspace = true }
4343
step_planning_solver = { workspace = true }
4444
types = { workspace = true }
45-
walking_engine = { workspace = true }

crates/control/src/ball_filter.rs

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ use types::{
2323
limb::{is_above_limbs, Limb, ProjectedLimbs},
2424
parameters::BallFilterParameters,
2525
};
26-
use walking_engine::mode::Mode;
2726

2827
#[derive(Deserialize, Serialize)]
2928
pub struct BallFilter {
@@ -54,7 +53,6 @@ pub struct CycleContext {
5453

5554
balls: PerceptionInput<Option<Vec<BallPercept>>, "Vision", "balls?">,
5655
projected_limbs: PerceptionInput<Option<ProjectedLimbs>, "Vision", "projected_limbs?">,
57-
walking_engine_mode: CyclerState<Mode, "walking_engine_mode">,
5856
}
5957

6058
#[context]
@@ -83,7 +81,6 @@ impl BallFilter {
8381
filter_parameters: &BallFilterParameters,
8482
field_dimensions: &FieldDimensions,
8583
cycle_time: &CycleTime,
86-
walking_engine_mode: Mode,
8784
) {
8885
for (detection_time, balls) in measurements {
8986
self.ball_filter.hypotheses.retain(|hypothesis| {
@@ -183,11 +180,9 @@ impl BallFilter {
183180
.expect("time ran backwards");
184181
let validity_high_enough =
185182
hypothesis.validity >= filter_parameters.validity_discard_threshold;
186-
let ball_kicked = matches!(walking_engine_mode, Mode::Kicking(_));
187183
is_ball_inside_field(ball, field_dimensions)
188184
&& validity_high_enough
189185
&& duration_since_last_observation < filter_parameters.hypothesis_timeout
190-
&& !ball_kicked
191186
};
192187

193188
let should_merge_hypotheses =
@@ -225,7 +220,6 @@ impl BallFilter {
225220
filter_parameters,
226221
context.field_dimensions,
227222
context.cycle_time,
228-
*context.walking_engine_mode,
229223
);
230224

231225
context

0 commit comments

Comments
 (0)