17 #include "nav2_mppi_controller/controller.hpp"
18 #include "nav2_mppi_controller/tools/utils.hpp"
19 #include "nav2_ros_common/tf2_factories.hpp"
23 namespace nav2_mppi_controller
27 const nav2::LifecycleNode::WeakPtr & parent,
28 std::string name,
const nav2::TransformBuffer::SharedPtr tf,
29 const std::shared_ptr<nav2_costmap_2d::Costmap2DROS> costmap_ros)
32 costmap_ros_ = costmap_ros;
35 parameters_handler_ = std::make_unique<ParametersHandler>(parent, name_);
37 auto node = parent_.lock();
39 auto getParam = parameters_handler_->getParamGetter(name_);
40 getParam(visualize_,
"visualize",
false);
41 getParam(critic_index_to_visualize_,
"critic_index_to_visualize", 0);
43 getParam(publish_optimal_trajectory_,
"publish_optimal_trajectory",
false);
46 optimizer_.
initialize(parent_, name_, costmap_ros_, tf_buffer_, parameters_handler_.get());
49 costmap_ros_->getGlobalFrameID(), parameters_handler_.get());
51 if (publish_optimal_trajectory_) {
52 opt_traj_pub_ = node->create_publisher<nav_msgs::msg::Trajectory>(
53 "~/optimal_trajectory");
56 RCLCPP_INFO(logger_,
"Configured MPPI Controller: %s", name_.c_str());
63 parameters_handler_.reset();
64 opt_traj_pub_.reset();
65 RCLCPP_INFO(logger_,
"Cleaned up MPPI Controller: %s", name_.c_str());
70 auto node = parent_.lock();
72 parameters_handler_->start();
74 opt_traj_pub_->on_activate();
76 RCLCPP_INFO(logger_,
"Activated MPPI Controller: %s", name_.c_str());
83 opt_traj_pub_->on_deactivate();
85 RCLCPP_INFO(logger_,
"Deactivated MPPI Controller: %s", name_.c_str());
90 optimizer_.
reset(
false );
94 const geometry_msgs::msg::PoseStamped & robot_pose,
95 const geometry_msgs::msg::Twist & robot_speed,
97 const nav_msgs::msg::Path & transformed_global_plan,
98 const geometry_msgs::msg::PoseStamped & global_goal)
100 #ifdef BENCHMARK_TESTING
101 auto start = std::chrono::system_clock::now();
104 std::lock_guard<std::mutex> param_lock(*parameters_handler_->getLock());
107 std::unique_lock<nav2_costmap_2d::Costmap2D::mutex_t> costmap_lock(*(costmap->getMutex()));
109 auto [cmd, optimal_trajectory] =
110 optimizer_.
evalControl(robot_pose, robot_speed, transformed_global_plan, global_goal.pose,
113 #ifdef BENCHMARK_TESTING
114 auto end = std::chrono::system_clock::now();
115 auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();
116 RCLCPP_INFO(logger_,
"Control loop execution time: %ld [ms]", duration);
119 if (publish_optimal_trajectory_ && opt_traj_pub_ && opt_traj_pub_->get_subscription_count() > 0) {
120 std_msgs::msg::Header trajectory_header;
121 trajectory_header.stamp = cmd.header.stamp;
122 trajectory_header.frame_id = costmap_ros_->getGlobalFrameID();
124 auto trajectory_msg = utils::toTrajectoryMsg(
129 opt_traj_pub_->publish(std::move(trajectory_msg));
133 visualize(cmd.header.stamp, optimal_trajectory);
140 const builtin_interfaces::msg::Time & cmd_stamp,
141 const Eigen::ArrayXXf & optimal_trajectory)
144 const Eigen::ArrayXf & costs =
145 (critic_index_to_visualize_ <= 0 ||
146 critic_index_to_visualize_ >
static_cast<int>(critic_costs.size())) ?
148 critic_costs[critic_index_to_visualize_ - 1].second;
150 trajectory_visualizer_.
add(
156 trajectory_visualizer_.
add(optimal_trajectory,
"Optimal Trajectory", cmd_stamp);
171 #include "pluginlib/class_list_macros.hpp"
const std::vector< std::pair< std::string, Eigen::ArrayXf > > & getCriticCosts() const
Get per-critic cost breakdown from last evaluation.
const std::vector< bool > & getCollisionFlags() const
Get per-trajectory collision flags from last evaluation.
const models::ControlSequence & getOptimalControlSequence()
Get the optimal control sequence for a cycle for visualization.
void reset(bool reset_dynamic_speed_limits=true)
Reset the optimization problem to initial conditions.
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.
const models::OptimizerSettings & getSettings() const
Get the motion model time step.
models::Trajectories & getGeneratedTrajectories()
Get the trajectories generated in a cycle for visualization.
void shutdown()
Shutdown for optimizer at process end.
void setSpeedLimit(double speed_limit, bool percentage)
Set the maximum speed based on the speed limits callback.
const Eigen::ArrayXf & getCosts() const
Get the aggregated trajectory costs from last evaluation.
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.
void add(const Eigen::ArrayXXf &trajectory, const std::string &marker_namespace, const builtin_interfaces::msg::Time &cmd_stamp)
Add an optimal trajectory to visualize.
void on_deactivate()
Deactivate object.
void on_configure(nav2::LifecycleNode::WeakPtr parent, const std::string &name, const std::string &frame_id, ParametersHandler *parameters_handler)
Configure trajectory visualizer.
void visualize()
Visualize the plan.
void on_activate()
Activate object.
void on_cleanup()
Cleanup object on shutdown.
controller interface that acts as a virtual base class for all controller plugins
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".
void cleanup() override
Cleanup resources.
void newPathReceived(const nav_msgs::msg::Path &raw_global_path) override
Receives a new plan from the Planner Server.
void configure(const nav2::LifecycleNode::WeakPtr &parent, std::string name, const nav2::TransformBuffer::SharedPtr tf, const std::shared_ptr< nav2_costmap_2d::Costmap2DROS > costmap_ros) override
Configure controller on bringup.
void visualize(const builtin_interfaces::msg::Time &cmd_stamp, const Eigen::ArrayXXf &optimal_trajectory)
Visualize trajectories.
void setSpeedLimit(const double &speed_limit, const bool &percentage) override
Set new speed limit from callback.
geometry_msgs::msg::TwistStamped computeVelocityCommands(const geometry_msgs::msg::PoseStamped &robot_pose, const geometry_msgs::msg::Twist &robot_speed, nav2_core::GoalChecker *goal_checker, const nav_msgs::msg::Path &transformed_global_plan, const geometry_msgs::msg::PoseStamped &global_goal) override
Main method to compute velocities using the optimizer.
void activate() override
Activate controller.
void reset() override
Reset the controller state between tasks.
void deactivate() override
Deactivate controller.