Skip to content

Commit b47bcfa

Browse files
authored
Backport bidirectional settings #4954 (#5260)
Signed-off-by: Tatsuro Sakaguchi <[email protected]>
1 parent 4e160c5 commit b47bcfa

File tree

6 files changed

+41
-9
lines changed

6 files changed

+41
-9
lines changed

nav2_bringup/params/nav2_params.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ controller_server:
102102
ax_max: 3.0
103103
ax_min: -3.0
104104
ay_max: 3.0
105+
ay_min: -3.0
105106
az_max: 3.5
106107
vx_std: 0.2
107108
vy_std: 0.2

nav2_mppi_controller/include/nav2_mppi_controller/models/constraints.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ struct ControlConstraints
3131
float ax_max;
3232
float ax_min;
3333
float ay_max;
34+
float ay_min;
3435
float az_max;
3536
};
3637

nav2_mppi_controller/include/nav2_mppi_controller/models/optimizer_settings.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ namespace mppi::models
2727
*/
2828
struct OptimizerSettings
2929
{
30-
models::ControlConstraints base_constraints{0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f};
31-
models::ControlConstraints constraints{0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f};
30+
models::ControlConstraints base_constraints{0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f};
31+
models::ControlConstraints constraints{0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f};
3232
models::SamplingStd sampling_std{0.0f, 0.0f, 0.0f};
3333
float model_dt{0.0f};
3434
float temperature{0.0f};

nav2_mppi_controller/include/nav2_mppi_controller/motion_models.hpp

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -86,14 +86,19 @@ class MotionModel
8686
float max_delta_vx = model_dt_ * control_constraints_.ax_max;
8787
float min_delta_vx = model_dt_ * control_constraints_.ax_min;
8888
float max_delta_vy = model_dt_ * control_constraints_.ay_max;
89+
float min_delta_vy = model_dt_ * control_constraints_.ay_min;
8990
float max_delta_wz = model_dt_ * control_constraints_.az_max;
9091
for (unsigned int i = 0; i != state.vx.shape(0); i++) {
9192
float vx_last = state.vx(i, 0);
9293
float vy_last = state.vy(i, 0);
9394
float wz_last = state.wz(i, 0);
9495
for (unsigned int j = 1; j != state.vx.shape(1); j++) {
9596
float & cvx_curr = state.cvx(i, j - 1);
96-
cvx_curr = std::clamp(cvx_curr, vx_last + min_delta_vx, vx_last + max_delta_vx);
97+
if (vx_last > 0) {
98+
cvx_curr = std::clamp(cvx_curr, vx_last + min_delta_vx, vx_last + max_delta_vx);
99+
} else {
100+
cvx_curr = std::clamp(cvx_curr, vx_last - max_delta_vx, vx_last - min_delta_vx);
101+
}
97102
state.vx(i, j) = cvx_curr;
98103
vx_last = cvx_curr;
99104

@@ -104,7 +109,11 @@ class MotionModel
104109

105110
if (is_holo) {
106111
float & cvy_curr = state.cvy(i, j - 1);
107-
cvy_curr = std::clamp(cvy_curr, vy_last - max_delta_vy, vy_last + max_delta_vy);
112+
if (vy_last > 0) {
113+
cvy_curr = std::clamp(cvy_curr, vy_last + min_delta_vy, vy_last + max_delta_vy);
114+
} else {
115+
cvy_curr = std::clamp(cvy_curr, vy_last - max_delta_vy, vy_last - min_delta_vy);
116+
}
108117
state.vy(i, j) = cvy_curr;
109118
vy_last = cvy_curr;
110119
}
@@ -127,7 +136,7 @@ class MotionModel
127136
protected:
128137
float model_dt_{0.0};
129138
models::ControlConstraints control_constraints_{0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
130-
0.0f};
139+
0.0f, 0.0f};
131140
};
132141

133142
/**

nav2_mppi_controller/src/optimizer.cpp

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ void Optimizer::getParams()
8080
getParam(s.base_constraints.ax_max, "ax_max", 3.0f);
8181
getParam(s.base_constraints.ax_min, "ax_min", -3.0f);
8282
getParam(s.base_constraints.ay_max, "ay_max", 3.0f);
83+
getParam(s.base_constraints.ay_min, "ay_min", -3.0f);
8384
getParam(s.base_constraints.az_max, "az_max", 3.5f);
8485
getParam(s.sampling_std.vx, "vx_std", 0.2f);
8586
getParam(s.sampling_std.vy, "vy_std", 0.2f);
@@ -94,6 +95,13 @@ void Optimizer::getParams()
9495
"Sign of the parameter ax_min is incorrect, consider setting it negative.");
9596
}
9697

98+
if (s.base_constraints.ay_min > 0.0) {
99+
s.base_constraints.ay_min = -1.0 * s.base_constraints.ay_min;
100+
RCLCPP_WARN(
101+
logger_,
102+
"Sign of the parameter ay_min is incorrect, consider setting it negative.");
103+
}
104+
97105
getParam(motion_model_name, "motion_model", std::string("DiffDrive"));
98106

99107
s.constraints = s.base_constraints;
@@ -267,13 +275,18 @@ void Optimizer::applyControlSequenceConstraints()
267275
float max_delta_vx = s.model_dt * s.constraints.ax_max;
268276
float min_delta_vx = s.model_dt * s.constraints.ax_min;
269277
float max_delta_vy = s.model_dt * s.constraints.ay_max;
278+
float min_delta_vy = s.model_dt * s.constraints.ay_min;
270279
float max_delta_wz = s.model_dt * s.constraints.az_max;
271280
float vx_last = control_sequence_.vx(0);
272281
float vy_last = control_sequence_.vy(0);
273282
float wz_last = control_sequence_.wz(0);
274283
for (unsigned int i = 1; i != control_sequence_.vx.shape(0); i++) {
275284
float & vx_curr = control_sequence_.vx(i);
276-
vx_curr = std::clamp(vx_curr, vx_last + min_delta_vx, vx_last + max_delta_vx);
285+
if (vx_last > 0) {
286+
vx_curr = std::clamp(vx_curr, vx_last + min_delta_vx, vx_last + max_delta_vx);
287+
} else {
288+
vx_curr = std::clamp(vx_curr, vx_last - max_delta_vx, vx_last - min_delta_vx);
289+
}
277290
vx_last = vx_curr;
278291

279292
float & wz_curr = control_sequence_.wz(i);
@@ -282,7 +295,11 @@ void Optimizer::applyControlSequenceConstraints()
282295

283296
if (isHolonomic()) {
284297
float & vy_curr = control_sequence_.vy(i);
285-
vy_curr = std::clamp(vy_curr, vy_last - max_delta_vy, vy_last + max_delta_vy);
298+
if (vy_last > 0) {
299+
vy_curr = std::clamp(vy_curr, vy_last + min_delta_vy, vy_last + max_delta_vy);
300+
} else {
301+
vy_curr = std::clamp(vy_curr, vy_last - max_delta_vy, vy_last - min_delta_vy);
302+
}
286303
vy_last = vy_curr;
287304
}
288305
}

nav2_mppi_controller/test/optimizer_unit_tests.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -186,13 +186,14 @@ class OptimizerTester : public Optimizer
186186
float max_delta_vx = settings_.constraints.ax_max * settings_.model_dt;
187187
float min_delta_vx = settings_.constraints.ax_min * settings_.model_dt;
188188
float max_delta_vy = settings_.constraints.ay_max * settings_.model_dt;
189+
float min_delta_vy = settings_.constraints.ay_min * settings_.model_dt;
189190
float max_delta_wz = settings_.constraints.az_max * settings_.model_dt;
190191
propagateStateVelocitiesFromInitials(state);
191192
EXPECT_NEAR(state.vx(0, 0), 5.0, 1e-6);
192193
EXPECT_NEAR(state.vy(0, 0), 1.0, 1e-6);
193194
EXPECT_NEAR(state.wz(0, 0), 6.0, 1e-6);
194195
EXPECT_NEAR(state.vx(0, 1), std::clamp(0.75, 5.0 + min_delta_vx, 5.0 + max_delta_vx), 1e-6);
195-
EXPECT_NEAR(state.vy(0, 1), std::clamp(0.5, 1.0 - max_delta_vy, 1.0 + max_delta_vy), 1e-6);
196+
EXPECT_NEAR(state.vy(0, 1), std::clamp(0.5, 1.0 + min_delta_vy, 1.0 + max_delta_vy), 1e-6);
196197
EXPECT_NEAR(state.wz(0, 1), std::clamp(0.1, 6.0 - max_delta_wz, 6.0 + max_delta_wz), 1e-6);
197198

198199
// Putting them together: updateStateVelocities
@@ -234,16 +235,18 @@ TEST(OptimizerTests, BasicInitializedFunctions)
234235
node->declare_parameter("mppic.time_steps", rclcpp::ParameterValue(50));
235236
node->declare_parameter("controller_frequency", rclcpp::ParameterValue(30.0));
236237
node->declare_parameter("mppic.ax_min", rclcpp::ParameterValue(3.0));
238+
node->declare_parameter("mppic.ay_min", rclcpp::ParameterValue(3.0));
237239
auto costmap_ros = std::make_shared<nav2_costmap_2d::Costmap2DROS>(
238240
"dummy_costmap", "", "dummy_costmap", true);
239241
ParametersHandler param_handler(node);
240242
rclcpp_lifecycle::State lstate;
241243
costmap_ros->on_configure(lstate);
242244
optimizer_tester.initialize(node, "mppic", costmap_ros, &param_handler);
243245

244-
// Test value of ax_min, it should be negative
246+
// Test value of ax_min, ay_min it should be negative
245247
auto & constraints = optimizer_tester.getControlConstraints();
246248
EXPECT_EQ(constraints.ax_min, -3.0);
249+
EXPECT_EQ(constraints.ay_min, -3.0);
247250

248251
// Should be empty of size batches x time steps
249252
// and tests getting set params: time_steps, batch_size, controller_frequency
@@ -539,6 +542,7 @@ TEST(OptimizerTests, updateStateVelocitiesTests)
539542
node->declare_parameter("mppic.ax_max", rclcpp::ParameterValue(3.0));
540543
node->declare_parameter("mppic.ax_min", rclcpp::ParameterValue(-3.0));
541544
node->declare_parameter("mppic.ay_max", rclcpp::ParameterValue(3.0));
545+
node->declare_parameter("mppic.ay_min", rclcpp::ParameterValue(-3.0));
542546
node->declare_parameter("mppic.az_max", rclcpp::ParameterValue(3.5));
543547
auto costmap_ros = std::make_shared<nav2_costmap_2d::Costmap2DROS>(
544548
"dummy_costmap", "", "dummy_costmap", true);

0 commit comments

Comments
 (0)