Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

WideStance Left and right #1208

Draft
wants to merge 4 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 21 additions & 7 deletions crates/control/src/behavior/defend.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ use spl_network_messages::{GamePhase, SubState, Team};
use types::{
field_dimensions::FieldDimensions,
filtered_game_controller_state::FilteredGameControllerState,
motion_command::{MotionCommand, WalkSpeed},
motion_command::{JumpDirection, MotionCommand, WalkSpeed},
parameters::{RolePositionsParameters, WideStanceParameters},
path_obstacles::PathObstacle,
support_foot::Side,
Expand Down Expand Up @@ -58,24 +58,38 @@ impl<'cycle> Defend<'cycle> {

pub fn wide_stance(
&self,
wide_stance_paramters: WideStanceParameters,
wide_stance_parameters: WideStanceParameters,
) -> Option<MotionCommand> {
let ball = self.world_state.ball?;

let position = ball.ball_in_ground;
let velocity = ball.ball_in_ground_velocity;

if velocity.x() >= wide_stance_paramters.minimum_velocity {
if velocity.x() >= wide_stance_parameters.minimum_velocity {
return None;
}

let horizontal_distance_to_intersection =
position.y() - position.x() / velocity.x() * velocity.y();

if horizontal_distance_to_intersection.abs() < wide_stance_paramters.action_radius {
Some(MotionCommand::WideStance)
} else {
None
match (
(-wide_stance_parameters.action_radius..=wide_stance_parameters.action_radius)
.contains(&horizontal_distance_to_intersection),
(wide_stance_parameters.action_radius..wide_stance_parameters.action_radius_left)
.contains(&horizontal_distance_to_intersection),
(-wide_stance_parameters.action_radius_left..-wide_stance_parameters.action_radius)
.contains(&horizontal_distance_to_intersection),
) {
(true, _, _) => Some(MotionCommand::WideStance {
direction: JumpDirection::Center,
}),
(false, true, _) => Some(MotionCommand::WideStance {
direction: JumpDirection::Left,
}),
(false, _, true) => Some(MotionCommand::WideStance {
direction: JumpDirection::Right,
}),
(false, false, false) => None,
Comment on lines +75 to +92
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think a simple if-else statement is completely sufficient. This is basically a glorified if-else. Other opinions? @h3ndrk

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks like it, but not sure about the _ in line 89 🤔

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm sure. All cases are mutually exclusive

}
}

Expand Down
4 changes: 4 additions & 0 deletions crates/control/src/motion/dispatching_interpolator.rs
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@ pub struct CycleContext {
stand_up_front_positions: Input<Joints<f32>, "stand_up_front_positions">,
stand_up_sitting_positions: Input<Joints<f32>, "stand_up_sitting_positions">,
wide_stance_positions: Input<Joints<f32>, "wide_stance_positions">,
wide_stance_left_positions: Input<Joints<f32>, "wide_stance_left_positions">,
wide_stance_right_positions: Input<Joints<f32>, "wide_stance_right_positions">,
walk_motor_commands: Input<MotorCommands<BodyJoints<f32>>, "walk_motor_commands">,

initial_pose: Parameter<Joints<f32>, "initial_pose">,
Expand Down Expand Up @@ -105,6 +107,8 @@ impl DispatchingInterpolator {
MotionType::StandUpFront => *context.stand_up_front_positions,
MotionType::StandUpSitting => *context.stand_up_sitting_positions,
MotionType::WideStance => *context.wide_stance_positions,
MotionType::WideStanceLeft => *context.wide_stance_left_positions,
MotionType::WideStanceRight => *context.wide_stance_right_positions,
MotionType::CenterJump => *context.center_jump_positions,
MotionType::Unstiff => panic!("Dispatching Unstiff doesn't make sense"),
MotionType::Animation => context.animation_commands.positions,
Expand Down
2 changes: 2 additions & 0 deletions crates/control/src/motion/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -23,3 +23,5 @@ pub mod step_planner;
pub mod walk_manager;
pub mod walking_engine;
pub mod wide_stance;
pub mod wide_stance_left;
pub mod wide_stance_right;
21 changes: 19 additions & 2 deletions crates/control/src/motion/motion_selector.rs
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,12 @@ fn motion_type_from_command(command: &MotionCommand) -> MotionType {
Kind::FacingUp => MotionType::StandUpBack,
Kind::Sitting => MotionType::StandUpSitting,
},
MotionCommand::WideStance => MotionType::WideStance,
MotionCommand::WideStance { direction } => match direction {
JumpDirection::Left => MotionType::WideStanceLeft,
JumpDirection::Right => MotionType::WideStanceRight,
JumpDirection::Center => MotionType::WideStance,
},

MotionCommand::Unstiff => MotionType::Unstiff,
MotionCommand::Animation { stiff: false } => MotionType::Animation,
MotionCommand::Animation { stiff: true } => MotionType::AnimationStiff,
Expand All @@ -109,6 +114,13 @@ fn transition_motion(
(MotionType::StandUpFront, _, MotionType::FallProtection, _) => MotionType::StandUpFront,
(MotionType::StandUpBack, _, MotionType::FallProtection, _) => MotionType::StandUpBack,
(MotionType::WideStance, _, MotionType::FallProtection, _) => MotionType::WideStance,
(MotionType::WideStanceLeft, _, MotionType::FallProtection, _) => {
MotionType::WideStanceLeft
}

(MotionType::WideStanceRight, _, MotionType::FallProtection, _) => {
MotionType::WideStanceRight
}
(MotionType::JumpLeft, _, MotionType::FallProtection, _) => MotionType::JumpLeft,
(MotionType::JumpRight, _, MotionType::FallProtection, _) => MotionType::JumpRight,
(MotionType::CenterJump, _, MotionType::FallProtection, _) => MotionType::CenterJump,
Expand All @@ -122,7 +134,12 @@ fn transition_motion(
MotionType::Dispatching
}
(_, _, MotionType::FallProtection, _) => MotionType::FallProtection,
(_, _, MotionType::WideStance, _) => MotionType::WideStance,
(MotionType::Walk, _, MotionType::WideStance, _) => MotionType::WideStance,
(MotionType::Walk, _, MotionType::WideStanceRight, _) => MotionType::WideStanceRight,
(MotionType::Walk, _, MotionType::WideStanceLeft, _) => MotionType::WideStanceLeft,
(_, true, MotionType::WideStance, _) => MotionType::WideStance,
(_, true, MotionType::WideStanceRight, _) => MotionType::WideStanceRight,
(_, true, MotionType::WideStanceLeft, _) => MotionType::WideStanceLeft,
(_, _, MotionType::CenterJump, _) => MotionType::CenterJump,
(MotionType::ArmsUpStand, _, _, false) => MotionType::ArmsUpStand,
(MotionType::Dispatching, true, _, _) => to,
Expand Down
28 changes: 28 additions & 0 deletions crates/control/src/motion/motor_commands_collector.rs
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,8 @@ pub struct CycleContext {
stand_up_front_positions: Input<Joints<f32>, "stand_up_front_positions">,
stand_up_sitting_positions: Input<Joints<f32>, "stand_up_sitting_positions">,
wide_stance_positions: Input<Joints<f32>, "wide_stance_positions">,
wide_stance_left_positions: Input<Joints<f32>, "wide_stance_left_positions">,
wide_stance_right_positions: Input<Joints<f32>, "wide_stance_right_positions">,
center_jump_positions: Input<Joints<f32>, "center_jump_positions">,
walk_motor_commands: Input<MotorCommands<BodyJoints<f32>>, "walk_motor_commands">,
cycle_time: Input<CycleTime, "cycle_time">,
Expand Down Expand Up @@ -82,6 +84,8 @@ impl MotorCommandCollector {
let stand_up_front_positions = context.stand_up_front_positions;
let stand_up_sitting_positions = context.stand_up_sitting_positions;
let wide_stance_positions = context.wide_stance_positions;
let wide_stance_left_positions = context.wide_stance_left_positions;
let wide_stance_right_positions = context.wide_stance_right_positions;
let walk = context.walk_motor_commands;

let (positions, stiffnesses) = match motion_selection.current_motion {
Expand Down Expand Up @@ -191,6 +195,30 @@ impl MotorCommandCollector {
},
),
),
MotionType::WideStanceLeft => (
*wide_stance_left_positions,
Joints::from_head_and_body(
HeadJoints::fill(*context.stand_up_stiffness_upper_body),
BodyJoints {
left_arm: ArmJoints::fill(*context.stand_up_stiffness_upper_body),
right_arm: ArmJoints::fill(*context.stand_up_stiffness_upper_body),
left_leg: LegJoints::fill(1.0),
right_leg: LegJoints::fill(1.0),
},
),
),
MotionType::WideStanceRight => (
*wide_stance_right_positions,
Joints::from_head_and_body(
HeadJoints::fill(*context.stand_up_stiffness_upper_body),
BodyJoints {
left_arm: ArmJoints::fill(*context.stand_up_stiffness_upper_body),
right_arm: ArmJoints::fill(*context.stand_up_stiffness_upper_body),
left_leg: LegJoints::fill(1.0),
right_leg: LegJoints::fill(1.0),
},
),
),
MotionType::Unstiff => (measured_positions, Joints::fill(0.0)),
MotionType::Walk => (
Joints::from_head_and_body(head_joints_command.positions, walk.positions),
Expand Down
77 changes: 77 additions & 0 deletions crates/control/src/motion/wide_stance_left.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
use color_eyre::Result;
use context_attribute::context;
use framework::MainOutput;
use hardware::PathsInterface;
use motionfile::{MotionFile, MotionInterpolator};
use serde::{Deserialize, Serialize};
use std::time::Duration;
use types::{
condition_input::ConditionInput,
cycle_time::CycleTime,
joints::Joints,
motion_selection::{MotionSafeExits, MotionSelection, MotionType},
};

#[derive(Deserialize, Serialize)]
pub struct WideStanceLeft {
interpolator: MotionInterpolator<Joints<f32>>,
}

#[context]
pub struct CreationContext {
hardware_interface: HardwareInterface,
}

#[context]
pub struct CycleContext {
condition_input: Input<ConditionInput, "condition_input">,
cycle_time: Input<CycleTime, "cycle_time">,
motion_selection: Input<MotionSelection, "motion_selection">,

motion_safe_exits: CyclerState<MotionSafeExits, "motion_safe_exits">,
}

#[context]
#[derive(Default)]
pub struct MainOutputs {
pub wide_stance_left_positions: MainOutput<Joints<f32>>,
pub wide_stance_left_estimated_remaining_duration: MainOutput<Option<Duration>>,
}

impl WideStanceLeft {
pub fn new(context: CreationContext<impl PathsInterface>) -> Result<Self> {
let paths = context.hardware_interface.get_paths();
Ok(Self {
interpolator: MotionFile::from_path(paths.motions.join("wide_stance_left.json"))?
.try_into()?,
})
}

pub fn advance_interpolator(&mut self, context: CycleContext) {
let last_cycle_duration = context.cycle_time.last_cycle_duration;
let condition_input = context.condition_input;

context.motion_safe_exits[MotionType::WideStanceLeft] = false;

self.interpolator
.advance_by(last_cycle_duration, condition_input);

context.motion_safe_exits[MotionType::WideStanceLeft] = self.interpolator.is_finished();
}

pub fn cycle(&mut self, context: CycleContext) -> Result<MainOutputs> {
let wide_stance_left_estimated_remaining_duration =
if let MotionType::WideStanceLeft = context.motion_selection.current_motion {
self.advance_interpolator(context);
Some(self.interpolator.estimated_remaining_duration())
} else {
self.interpolator.reset();
None
};
Ok(MainOutputs {
wide_stance_left_positions: self.interpolator.value().into(),
wide_stance_left_estimated_remaining_duration:
wide_stance_left_estimated_remaining_duration.into(),
})
}
}
77 changes: 77 additions & 0 deletions crates/control/src/motion/wide_stance_right.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
use color_eyre::Result;
use context_attribute::context;
use framework::MainOutput;
use hardware::PathsInterface;
use motionfile::{MotionFile, MotionInterpolator};
use serde::{Deserialize, Serialize};
use std::time::Duration;
use types::{
condition_input::ConditionInput,
cycle_time::CycleTime,
joints::{mirror::Mirror, Joints},
motion_selection::{MotionSafeExits, MotionSelection, MotionType},
};

#[derive(Deserialize, Serialize)]
pub struct WideStanceRight {
interpolator: MotionInterpolator<Joints<f32>>,
}

#[context]
pub struct CreationContext {
hardware_interface: HardwareInterface,
}

#[context]
pub struct CycleContext {
condition_input: Input<ConditionInput, "condition_input">,
cycle_time: Input<CycleTime, "cycle_time">,
motion_selection: Input<MotionSelection, "motion_selection">,

motion_safe_exits: CyclerState<MotionSafeExits, "motion_safe_exits">,
}

#[context]
#[derive(Default)]
pub struct MainOutputs {
pub wide_stance_right_positions: MainOutput<Joints<f32>>,
pub wide_stance_right_estimated_remaining_duration: MainOutput<Option<Duration>>,
}

impl WideStanceRight {
pub fn new(context: CreationContext<impl PathsInterface>) -> Result<Self> {
let paths = context.hardware_interface.get_paths();
Ok(Self {
interpolator: MotionFile::from_path(paths.motions.join("wide_stance_left.json"))?
.try_into()?,
})
}

pub fn advance_interpolator(&mut self, context: CycleContext) {
let last_cycle_duration = context.cycle_time.last_cycle_duration;
let condition_input = context.condition_input;

context.motion_safe_exits[MotionType::WideStanceRight] = false;

self.interpolator
.advance_by(last_cycle_duration, condition_input);

context.motion_safe_exits[MotionType::WideStanceRight] = self.interpolator.is_finished();
}

pub fn cycle(&mut self, context: CycleContext) -> Result<MainOutputs> {
let wide_stance_right_estimated_remaining_duration =
if let MotionType::WideStanceRight = context.motion_selection.current_motion {
self.advance_interpolator(context);
Some(self.interpolator.estimated_remaining_duration())
} else {
self.interpolator.reset();
None
};
Ok(MainOutputs {
wide_stance_right_positions: self.interpolator.value().mirrored().into(),
wide_stance_right_estimated_remaining_duration:
wide_stance_right_estimated_remaining_duration.into(),
})
}
}
2 changes: 2 additions & 0 deletions crates/hulk_manifest/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,8 @@ pub fn collect_hulk_cyclers() -> Result<Cyclers, Error> {
"control::motion::step_planner",
"control::motion::walk_manager",
"control::motion::wide_stance",
"control::motion::wide_stance_right",
"control::motion::wide_stance_left",
"control::motion::walking_engine",
"control::obstacle_filter",
"control::odometry",
Expand Down
7 changes: 5 additions & 2 deletions crates/types/src/motion_command.rs
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,10 @@ pub enum MotionCommand {
StandUp {
kind: Kind,
},
WideStance,
WideStance {
direction: JumpDirection,
},

#[default]
Unstiff,
Animation {
Expand Down Expand Up @@ -103,7 +106,7 @@ impl MotionCommand {
| MotionCommand::FallProtection { .. }
| MotionCommand::Jump { .. }
| MotionCommand::StandUp { .. } => None,
MotionCommand::WideStance => None,
MotionCommand::WideStance { .. } => None,
}
}

Expand Down
Loading