@@ -43,6 +43,7 @@ pub struct CycleContext {
43
43
44
44
ground_to_upcoming_support_out :
45
45
AdditionalOutput < Isometry2 < Ground , UpcomingSupport > , "ground_to_upcoming_support" > ,
46
+ max_step_size_output : AdditionalOutput < Step , "max_step_size" > ,
46
47
}
47
48
48
49
#[ context]
@@ -64,6 +65,7 @@ impl StepPlanner {
64
65
} else {
65
66
None
66
67
} ;
68
+
67
69
let ( max_turn_left, max_turn_right) = if let Some ( support_side) = support_side {
68
70
if support_side == Side :: Left {
69
71
( -* context. max_inside_turn , context. max_step_size . turn )
@@ -87,20 +89,41 @@ impl StepPlanner {
87
89
} => ( path, orientation_mode, speed) ,
88
90
_ => {
89
91
return Ok ( MainOutputs {
90
- planned_step : Step {
91
- forward : 0.0 ,
92
- left : 0.0 ,
93
- turn : 0.0 ,
94
- }
95
- . into ( ) ,
92
+ planned_step : Step :: default ( ) . into ( ) ,
96
93
} )
97
94
}
98
95
} ;
99
96
97
+ let initial_side_bonus = if self . last_planned_step . forward . abs ( )
98
+ + self . last_planned_step . left . abs ( )
99
+ + self . last_planned_step . turn . abs ( )
100
+ <= f32:: EPSILON
101
+ {
102
+ Step {
103
+ forward : 0.0 ,
104
+ left : * context. initial_side_bonus ,
105
+ turn : 0.0 ,
106
+ }
107
+ } else {
108
+ Step :: default ( )
109
+ } ;
110
+
111
+ let max_step_size = match speed {
112
+ WalkSpeed :: Slow => * context. max_step_size + * context. step_size_delta_slow ,
113
+ WalkSpeed :: Normal => * context. max_step_size + initial_side_bonus,
114
+ WalkSpeed :: Fast => {
115
+ * context. max_step_size + * context. step_size_delta_fast + initial_side_bonus
116
+ }
117
+ } ;
118
+
119
+ context
120
+ . max_step_size_output
121
+ . fill_if_subscribed ( || max_step_size) ;
122
+
100
123
let segment = path
101
124
. iter ( )
102
125
. scan ( 0.0f32 , |distance, segment| {
103
- let result = if * distance < context . max_step_size . forward {
126
+ let result = if * distance < max_step_size. forward {
104
127
Some ( segment)
105
128
} else {
106
129
None
@@ -161,25 +184,6 @@ impl StepPlanner {
161
184
step = * injected_step;
162
185
}
163
186
164
- let initial_side_bonus = if self . last_planned_step . left . abs ( ) <= f32:: EPSILON {
165
- Step {
166
- forward : 0.0 ,
167
- left : * context. initial_side_bonus ,
168
- turn : 0.0 ,
169
- }
170
- } else {
171
- Step :: default ( )
172
- } ;
173
- step += initial_side_bonus;
174
-
175
- let max_step_size = match speed {
176
- WalkSpeed :: Slow => * context. max_step_size + * context. step_size_delta_slow ,
177
- WalkSpeed :: Normal => * context. max_step_size + initial_side_bonus,
178
- WalkSpeed :: Fast => {
179
- * context. max_step_size + * context. step_size_delta_fast + initial_side_bonus
180
- }
181
- } ;
182
-
183
187
let step = clamp_step_to_walk_volume (
184
188
step,
185
189
& max_step_size,
@@ -210,7 +214,6 @@ fn clamp_step_to_walk_volume(
210
214
// Values in range [-1..1]
211
215
let clamped_turn = request. turn . clamp ( max_turn_left, max_turn_right) ;
212
216
213
- // let =
214
217
let request = Step {
215
218
forward : request. forward ,
216
219
left : request. left ,
0 commit comments