Nav2 Navigation Stack - humble  humble
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 <string>
19 #include <memory>
20 
21 #include <xtensor/xtensor.hpp>
22 #include <xtensor/xview.hpp>
23 
24 #include "rclcpp_lifecycle/lifecycle_node.hpp"
25 
26 #include "nav2_costmap_2d/costmap_2d_ros.hpp"
27 #include "nav2_core/goal_checker.hpp"
28 
29 #include "geometry_msgs/msg/twist.hpp"
30 #include "geometry_msgs/msg/pose_stamped.hpp"
31 #include "geometry_msgs/msg/twist_stamped.hpp"
32 #include "nav_msgs/msg/path.hpp"
33 
34 #include "nav2_mppi_controller/models/optimizer_settings.hpp"
35 #include "nav2_mppi_controller/motion_models.hpp"
36 #include "nav2_mppi_controller/critic_manager.hpp"
37 #include "nav2_mppi_controller/models/state.hpp"
38 #include "nav2_mppi_controller/models/trajectories.hpp"
39 #include "nav2_mppi_controller/models/path.hpp"
40 #include "nav2_mppi_controller/tools/noise_generator.hpp"
41 #include "nav2_mppi_controller/tools/parameters_handler.hpp"
42 #include "nav2_mppi_controller/tools/utils.hpp"
43 
44 #ifdef __APPLE__
45  #include "nav2_mppi_controller/tools/apple_utils.hpp"
46 #endif
47 
48 namespace mppi
49 {
50 
55 class Optimizer
56 {
57 public:
61  Optimizer() = default;
62 
67 
68 
76  void initialize(
77  rclcpp_lifecycle::LifecycleNode::WeakPtr parent, const std::string & name,
78  std::shared_ptr<nav2_costmap_2d::Costmap2DROS> costmap_ros,
79  ParametersHandler * dynamic_parameters_handler);
80 
84  void shutdown();
85 
94  geometry_msgs::msg::TwistStamped evalControl(
95  const geometry_msgs::msg::PoseStamped & robot_pose,
96  const geometry_msgs::msg::Twist & robot_speed, const nav_msgs::msg::Path & plan,
97  nav2_core::GoalChecker * goal_checker);
98 
104 
109  xt::xtensor<float, 2> getOptimizedTrajectory();
110 
116  void setSpeedLimit(double speed_limit, bool percentage);
117 
121  void reset();
122 
123 protected:
127  void optimize();
128 
136  void prepare(
137  const geometry_msgs::msg::PoseStamped & robot_pose,
138  const geometry_msgs::msg::Twist & robot_speed,
139  const nav_msgs::msg::Path & plan, nav2_core::GoalChecker * goal_checker);
140 
144  void getParams();
145 
150  void setMotionModel(const std::string & model);
151 
156  void shiftControlSequence();
157 
163 
168 
173  void updateStateVelocities(models::State & state) const;
174 
179  void updateInitialStateVelocities(models::State & state) const;
180 
187 
194  models::Trajectories & trajectories,
195  const models::State & state) const;
196 
203  xt::xtensor<float, 2> & trajectories,
204  const xt::xtensor<float, 2> & state) const;
205 
210  void updateControlSequence();
211 
217  geometry_msgs::msg::TwistStamped
218  getControlFromSequenceAsTwist(const builtin_interfaces::msg::Time & stamp);
219 
224  bool isHolonomic() const;
225 
230  void setOffset(double controller_frequency);
231 
236  bool fallback(bool fail);
237 
238 protected:
239  rclcpp_lifecycle::LifecycleNode::WeakPtr parent_;
240  std::shared_ptr<nav2_costmap_2d::Costmap2DROS> costmap_ros_;
241  nav2_costmap_2d::Costmap2D * costmap_;
242  std::string name_;
243 
244  std::shared_ptr<MotionModel> motion_model_;
245 
246  ParametersHandler * parameters_handler_;
247  CriticManager critic_manager_;
248  NoiseGenerator noise_generator_;
249 
250  models::OptimizerSettings settings_;
251 
252  models::State state_;
253  models::ControlSequence control_sequence_;
254  std::array<mppi::models::Control, 4> control_history_;
255  models::Trajectories generated_trajectories_;
256  models::Path path_;
257  xt::xtensor<float, 1> costs_;
258 
259  CriticData critics_data_ =
260  {state_, generated_trajectories_, path_, costs_, settings_.model_dt, false, nullptr, nullptr,
261  std::nullopt, std::nullopt};
262 
263  rclcpp::Logger logger_{rclcpp::get_logger("MPPIController")};
264 };
265 
266 template<typename E>
267 inline auto cumsum_1d(const E & expression)
268 {
269  #ifdef __APPLE__
270  return utils::manual_cumsum_1d(expression);
271  #else
272  return xt::cumsum(expression, 0);
273  #endif
274 }
275 
276 template<typename E>
277 inline auto cumsum_2d(const E & expression, int axis)
278 {
279  #ifdef __APPLE__
280  return utils::manual_cumsum_2d(expression, axis);
281  #else
282  return xt::cumsum(expression, axis);
283  #endif
284 }
285 
286 } // namespace mppi
287 
288 #endif // NAV2_MPPI_CONTROLLER__OPTIMIZER_HPP_
Manager of objective function plugins for scoring trajectories.
Generates noise trajectories from optimal trajectory.
Main algorithm optimizer of the MPPI Controller.
Definition: optimizer.hpp:56
void updateStateVelocities(models::State &state) const
Update velocities in state.
Definition: optimizer.cpp:245
void setMotionModel(const std::string &model)
Set the motion model of the vehicle platform.
Definition: optimizer.cpp:406
void setOffset(double controller_frequency)
Using control frequence and time step size, determine if trajectory offset should be used to populate...
Definition: optimizer.cpp:95
rclcpp::Logger logger_
Caution, keep references.
Definition: optimizer.hpp:263
void integrateStateVelocities(models::Trajectories &trajectories, const models::State &state) const
Rollout velocities in state to poses.
Definition: optimizer.cpp:307
void prepare(const geometry_msgs::msg::PoseStamped &robot_pose, const geometry_msgs::msg::Twist &robot_speed, const nav_msgs::msg::Path &plan, nav2_core::GoalChecker *goal_checker)
Prepare state information on new request for trajectory rollouts.
Definition: optimizer.cpp:183
~Optimizer()
Destructor for mppi::Optimizer.
Definition: optimizer.hpp:66
geometry_msgs::msg::TwistStamped evalControl(const geometry_msgs::msg::PoseStamped &robot_pose, const geometry_msgs::msg::Twist &robot_speed, const nav_msgs::msg::Path &plan, nav2_core::GoalChecker *goal_checker)
Compute control using MPPI algorithm.
Definition: optimizer.cpp:134
void updateControlSequence()
Update control sequence with state controls weighted by costs using softmax function.
Definition: optimizer.cpp:356
void generateNoisedTrajectories()
updates generated trajectories with noised trajectories from the last cycle's optimal control
Definition: optimizer.cpp:221
bool fallback(bool fail)
Perform fallback behavior to try to recover from a set of trajectories in collision.
Definition: optimizer.cpp:164
bool isHolonomic() const
Whether the motion model is holonomic.
Definition: optimizer.cpp:229
models::Trajectories & getGeneratedTrajectories()
Get the trajectories generated in a cycle for visualization.
Definition: optimizer.cpp:449
void updateInitialStateVelocities(models::State &state) const
Update initial velocity in state.
Definition: optimizer.cpp:252
xt::xtensor< float, 2 > getOptimizedTrajectory()
Get the optimal trajectory for a cycle for visualization.
Definition: optimizer.cpp:339
void shutdown()
Shutdown for optimizer at process end.
Definition: optimizer.cpp:57
void optimize()
Main function to generate, score, and return trajectories.
Definition: optimizer.cpp:155
void reset()
Reset the optimization problem to initial conditions.
Definition: optimizer.cpp:116
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:422
void shiftControlSequence()
Shift the optimal control sequence after processing for next iterations initial conditions after exec...
Definition: optimizer.cpp:200
void applyControlSequenceConstraints()
Apply hard vehicle constraints on control sequence.
Definition: optimizer.cpp:231
void getParams()
Obtain the main controller's parameters.
Definition: optimizer.cpp:62
void propagateStateVelocitiesFromInitials(models::State &state) const
predict velocities in state using model for time horizon equal to timesteps
Definition: optimizer.cpp:263
void initialize(rclcpp_lifecycle::LifecycleNode::WeakPtr parent, const std::string &name, std::shared_ptr< nav2_costmap_2d::Costmap2DROS > costmap_ros, ParametersHandler *dynamic_parameters_handler)
Initializes optimizer on startup.
Definition: optimizer.cpp:35
geometry_msgs::msg::TwistStamped getControlFromSequenceAsTwist(const builtin_interfaces::msg::Time &stamp)
Convert control sequence to a twist commant.
Definition: optimizer.cpp:390
Handles getting parameters and dynamic parmaeter 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:68
Data to pass to critics for scoring, including state, trajectories, path, costs, and important parame...
Definition: critic_data.hpp:39
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:31
Candidate Trajectories.