Nav2 Navigation Stack - lyrical  lyrical
ROS 2 Navigation Stack
optimizer.hpp
1 // Copyright (c) 2022 Samsung Research America, @artofnothingness Alexey Budyakov
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #ifndef NAV2_MPPI_CONTROLLER__OPTIMIZER_HPP_
16 #define NAV2_MPPI_CONTROLLER__OPTIMIZER_HPP_
17 
18 #include <Eigen/Dense>
19 
20 #include <string>
21 #include <memory>
22 #include <tuple>
23 #include <utility>
24 #include <vector>
25 
26 #include "rclcpp_lifecycle/lifecycle_node.hpp"
27 
28 #include "nav2_costmap_2d/costmap_2d_ros.hpp"
29 #include "nav2_core/goal_checker.hpp"
30 #include "nav2_core/controller_exceptions.hpp"
31 #include "nav2_ros_common/tf2_factories.hpp"
32 #include "pluginlib/class_loader.hpp"
33 
34 #include "geometry_msgs/msg/accel_stamped.hpp"
35 #include "geometry_msgs/msg/twist.hpp"
36 #include "geometry_msgs/msg/pose_stamped.hpp"
37 #include "geometry_msgs/msg/twist_stamped.hpp"
38 #include "nav_msgs/msg/path.hpp"
39 #include "nav2_util/geometry_utils.hpp"
40 
41 #include "nav2_mppi_controller/models/optimizer_settings.hpp"
42 #include "nav2_mppi_controller/motion_models.hpp"
43 #include "nav2_mppi_controller/critic_manager.hpp"
44 #include "nav2_mppi_controller/models/state.hpp"
45 #include "nav2_mppi_controller/models/trajectories.hpp"
46 #include "nav2_mppi_controller/models/path.hpp"
47 #include "nav2_mppi_controller/tools/noise_generator.hpp"
48 #include "nav2_mppi_controller/tools/parameters_handler.hpp"
49 #include "nav2_mppi_controller/tools/utils.hpp"
50 #include "nav2_mppi_controller/optimal_trajectory_validator.hpp"
51 
52 namespace mppi
53 {
54 
59 class Optimizer
60 {
61 public:
65  Optimizer() = default;
66 
71 
72 
81  void initialize(
82  nav2::LifecycleNode::WeakPtr parent, const std::string & name,
83  std::shared_ptr<nav2_costmap_2d::Costmap2DROS> costmap_ros,
84  nav2::TransformBuffer::SharedPtr tf_buffer,
85  ParametersHandler * dynamic_parameters_handler);
86 
90  void shutdown();
91 
101  std::tuple<geometry_msgs::msg::TwistStamped, Eigen::ArrayXXf> evalControl(
102  const geometry_msgs::msg::PoseStamped & robot_pose,
103  const geometry_msgs::msg::Twist & robot_speed, const nav_msgs::msg::Path & plan,
104  const geometry_msgs::msg::Pose & goal, nav2_core::GoalChecker * goal_checker);
105 
111 
116  Eigen::ArrayXXf getOptimizedTrajectory();
117 
123 
128  const Eigen::ArrayXf & getCosts() const {return costs_;}
129 
134  const std::vector<std::pair<std::string, Eigen::ArrayXf>> & getCriticCosts() const
135  {
136  return critic_manager_.getCriticCosts();
137  }
138 
143  const std::vector<bool> & getCollisionFlags() const
144  {
145  return critics_data_.trajectories_in_collision;
146  }
147 
153  void setSpeedLimit(double speed_limit, bool percentage);
154 
159  void reset(bool reset_dynamic_speed_limits = true);
160 
165  bool isSpeedLimitActive() const;
166 
172  {
173  return settings_;
174  }
175 
176 protected:
180  void optimize();
181 
189  void prepare(
190  const geometry_msgs::msg::PoseStamped & robot_pose,
191  const geometry_msgs::msg::Twist & robot_speed,
192  const nav_msgs::msg::Path & plan,
193  const geometry_msgs::msg::Pose & goal, nav2_core::GoalChecker * goal_checker);
194 
198  void getParams();
199 
204  void setMotionModel(const std::string & model);
205 
210  void shiftControlSequence();
211 
217 
223 
228 
233  void updateStateVelocities(models::State & state) const;
234 
239  void updateInitialStateVelocities(models::State & state) const;
240 
247 
254  models::Trajectories & trajectories,
255  const models::State & state) const;
256 
263  Eigen::Array<float, Eigen::Dynamic, 3> & trajectories,
264  const Eigen::ArrayXXf & state) const;
265 
270  void updateControlSequence();
271 
277  geometry_msgs::msg::TwistStamped
278  getControlFromSequenceAsTwist(const builtin_interfaces::msg::Time & stamp);
279 
284  bool isHolonomic() const;
285 
290  void setOffset(double controller_period);
291 
296  bool fallback(bool fail);
297 
298 protected:
299  nav2::LifecycleNode::WeakPtr parent_;
300  std::shared_ptr<nav2_costmap_2d::Costmap2DROS> costmap_ros_;
301  nav2_costmap_2d::Costmap2D * costmap_;
302  std::string name_;
303  nav2::TransformBuffer::SharedPtr tf_buffer_;
304 
305  std::shared_ptr<MotionModel> motion_model_;
306 
307  ParametersHandler * parameters_handler_;
308  CriticManager critic_manager_;
309  NoiseGenerator noise_generator_;
310 
311  std::unique_ptr<pluginlib::ClassLoader<MotionModel>> motion_model_loader_;
312  std::unique_ptr<pluginlib::ClassLoader<OptimalTrajectoryValidator>> validator_loader_;
313  OptimalTrajectoryValidator::Ptr trajectory_validator_;
314 
315  models::OptimizerSettings settings_;
316 
317  models::State state_;
318  models::ControlSequence control_sequence_;
319  std::array<mppi::models::Control, 4> control_history_;
320  models::Trajectories generated_trajectories_;
321  models::Path path_;
322  geometry_msgs::msg::Pose goal_;
323  Eigen::ArrayXf costs_;
324 
325  CriticData critics_data_ = {
326  state_, generated_trajectories_, path_, goal_,
327  costs_, settings_.model_dt, false, nullptr, nullptr,
328  std::nullopt, std::nullopt, {}};
329 
330  rclcpp::Logger logger_{rclcpp::get_logger("MPPIController")};
331 
332  geometry_msgs::msg::Twist last_command_vel_;
333 };
334 
335 } // namespace mppi
336 
337 #endif // NAV2_MPPI_CONTROLLER__OPTIMIZER_HPP_
Manager of objective function plugins for scoring trajectories.
const std::vector< std::pair< std::string, Eigen::ArrayXf > > & getCriticCosts() const
Get stored per-critic costs from last evaluation.
Generates noise trajectories from optimal trajectory.
Main algorithm optimizer of the MPPI Controller.
Definition: optimizer.hpp:60
void updateStateVelocities(models::State &state) const
Update velocities in state.
Definition: optimizer.cpp:466
const std::vector< std::pair< std::string, Eigen::ArrayXf > > & getCriticCosts() const
Get per-critic cost breakdown from last evaluation.
Definition: optimizer.hpp:134
const std::vector< bool > & getCollisionFlags() const
Get per-trajectory collision flags from last evaluation.
Definition: optimizer.hpp:143
const models::ControlSequence & getOptimalControlSequence()
Get the optimal control sequence for a cycle for visualization.
Definition: optimizer.cpp:600
void setMotionModel(const std::string &model)
Set the motion model of the vehicle platform.
Definition: optimizer.cpp:666
Eigen::ArrayXXf getOptimizedTrajectory()
Get the optimal trajectory for a cycle for visualization.
Definition: optimizer.cpp:582
void reset(bool reset_dynamic_speed_limits=true)
Reset the optimization problem to initial conditions.
Definition: optimizer.cpp:183
rclcpp::Logger logger_
Caution, keep references.
Definition: optimizer.hpp:330
void prepare(const geometry_msgs::msg::PoseStamped &robot_pose, const geometry_msgs::msg::Twist &robot_speed, const nav_msgs::msg::Path &plan, const geometry_msgs::msg::Pose &goal, nav2_core::GoalChecker *goal_checker)
Prepare state information on new request for trajectory rollouts.
Definition: optimizer.cpp:300
std::tuple< geometry_msgs::msg::TwistStamped, Eigen::ArrayXXf > evalControl(const geometry_msgs::msg::PoseStamped &robot_pose, const geometry_msgs::msg::Twist &robot_speed, const nav_msgs::msg::Path &plan, const geometry_msgs::msg::Pose &goal, nav2_core::GoalChecker *goal_checker)
Compute control using MPPI algorithm.
Definition: optimizer.cpp:230
void integrateStateVelocities(models::Trajectories &trajectories, const models::State &state) const
Rollout velocities in state to poses.
Definition: optimizer.cpp:539
const models::OptimizerSettings & getSettings() const
Get the motion model time step.
Definition: optimizer.hpp:171
void applyControlSequenceInterIterationConstraints()
Apply inter-iteration dynamic feasibility constraints on the first control sequence element before no...
Definition: optimizer.cpp:368
~Optimizer()
Destructor for mppi::Optimizer.
Definition: optimizer.hpp:70
void updateControlSequence()
Update control sequence with state controls weighted by costs using softmax function.
Definition: optimizer.cpp:605
bool isSpeedLimitActive() const
Check if a dynamic speed limit is currently active.
Definition: optimizer.cpp:218
void generateNoisedTrajectories()
updates generated trajectories with noised trajectories from the last cycle's optimal control
Definition: optimizer.cpp:359
bool fallback(bool fail)
Perform fallback behavior to try to recover from a set of trajectories in collision.
Definition: optimizer.cpp:281
bool isHolonomic() const
Whether the motion model is holonomic.
Definition: optimizer.cpp:213
models::Trajectories & getGeneratedTrajectories()
Get the trajectories generated in a cycle for visualization.
Definition: optimizer.cpp:721
void updateInitialStateVelocities(models::State &state) const
Update initial velocity in state.
Definition: optimizer.cpp:473
void shutdown()
Shutdown for optimizer at process end.
Definition: optimizer.cpp:72
void optimize()
Main function to generate, score, and return trajectories.
Definition: optimizer.cpp:272
void setOffset(double controller_period)
Using control period and time step size, determine if trajectory offset should be used to populate in...
Definition: optimizer.cpp:163
Optimizer()=default
Constructor for mppi::Optimizer.
void setSpeedLimit(double speed_limit, bool percentage)
Set the maximum speed based on the speed limits callback.
Definition: optimizer.cpp:691
void shiftControlSequence()
Shift the optimal control sequence after processing for next iterations initial conditions after exec...
Definition: optimizer.cpp:345
void applyControlSequenceConstraints()
Apply hard vehicle constraints on control sequence.
Definition: optimizer.cpp:404
void getParams()
Obtain the main controller's parameters.
Definition: optimizer.cpp:77
void propagateStateVelocitiesFromInitials(models::State &state) const
predict velocities in state using model for time horizon equal to timesteps
Definition: optimizer.cpp:483
const Eigen::ArrayXf & getCosts() const
Get the aggregated trajectory costs from last evaluation.
Definition: optimizer.hpp:128
geometry_msgs::msg::TwistStamped getControlFromSequenceAsTwist(const builtin_interfaces::msg::Time &stamp)
Convert control sequence to a twist command.
Definition: optimizer.cpp:647
void initialize(nav2::LifecycleNode::WeakPtr parent, const std::string &name, std::shared_ptr< nav2_costmap_2d::Costmap2DROS > costmap_ros, nav2::TransformBuffer::SharedPtr tf_buffer, ParametersHandler *dynamic_parameters_handler)
Initializes optimizer on startup.
Definition: optimizer.cpp:34
Handles getting parameters and dynamic parameter changes.
Function-object for checking whether a goal has been reached.
A 2D costmap provides a mapping between points in the world and their associated "costs".
Definition: costmap_2d.hpp:69
Data to pass to critics for scoring, including state, trajectories, pruned path, global goal,...
Definition: critic_data.hpp:40
A control sequence over time (e.g. trajectory)
Settings for the optimizer to use.
Path represented as a tensor.
Definition: path.hpp:28
State information: velocities, controls, poses, speed.
Definition: state.hpp:32
Candidate Trajectories.