15 #include "nav2_mppi_controller/critics/path_align_critic.hpp"
17 namespace mppi::critics
22 auto getParentParam = parameters_handler_->
getParamGetter(parent_name_);
23 getParentParam(enforce_path_inversion_,
"enforce_path_inversion",
false);
26 getParam(power_,
"cost_power", 1);
27 getParam(weight_,
"cost_weight", 10.0f);
29 getParam(max_path_occupancy_ratio_,
"max_path_occupancy_ratio", 0.07f);
30 getParam(offset_from_furthest_,
"offset_from_furthest", 20);
31 getParam(trajectory_point_step_,
"trajectory_point_step", 4);
33 threshold_to_consider_,
34 "threshold_to_consider", 0.5f);
35 getParam(use_path_orientations_,
"use_path_orientations",
false);
39 "ReferenceTrajectoryCritic instantiated with %d power and %f weight",
49 geometry_msgs::msg::Pose goal = utils::getCriticGoal(data, enforce_path_inversion_);
52 if (utils::withinPositionGoalTolerance(
53 threshold_to_consider_, data.state.pose.pose, goal))
59 utils::setPathFurthestPointIfNotSet(data);
61 const size_t path_segments_count = *data.furthest_reached_path_point;
62 float path_segments_flt =
static_cast<float>(path_segments_count);
63 if (path_segments_count < offset_from_furthest_) {
68 utils::setPathCostsIfNotSet(data, costmap_ros_);
69 std::vector<bool> & path_pts_valid = *data.path_pts_valid;
70 float invalid_ctr = 0.0f;
71 for (
size_t i = 0; i < path_segments_count; i++) {
72 if (!path_pts_valid[i]) {invalid_ctr += 1.0f;}
73 if (invalid_ctr / path_segments_flt > max_path_occupancy_ratio_ && invalid_ctr > 2.0f) {
78 const size_t batch_size = data.trajectories.x.rows();
79 Eigen::ArrayXf cost(data.costs.rows());
83 std::vector<float> path_integrated_distances(path_segments_count, 0.0f);
84 std::vector<utils::Pose2D> path(path_segments_count);
85 float dx = 0.0f, dy = 0.0f;
86 for (
unsigned int i = 1; i != path_segments_count; i++) {
87 auto & pose = path[i - 1];
88 pose.x = data.path.x(i - 1);
89 pose.y = data.path.y(i - 1);
90 pose.theta = data.path.yaws(i - 1);
92 dx = data.path.x(i) - pose.x;
93 dy = data.path.y(i) - pose.y;
94 path_integrated_distances[i] = path_integrated_distances[i - 1] + sqrtf(dx * dx + dy * dy);
98 auto & final_pose = path[path_segments_count - 1];
99 final_pose.x = data.path.x(path_segments_count - 1);
100 final_pose.y = data.path.y(path_segments_count - 1);
101 final_pose.theta = data.path.yaws(path_segments_count - 1);
103 float summed_path_dist = 0.0f, dyaw = 0.0f;
104 unsigned int num_samples = 0u;
105 unsigned int path_pt = 0u;
106 float traj_integrated_distance = 0.0f;
108 int strided_traj_rows = data.trajectories.x.rows();
109 int strided_traj_cols = floor((data.trajectories.x.cols() - 1) / trajectory_point_step_) + 1;
110 int outer_stride = strided_traj_rows * trajectory_point_step_;
112 const auto T_x = Eigen::Map<
const Eigen::ArrayXXf, 0,
113 Eigen::Stride<-1, -1>>(data.trajectories.x.data(),
114 strided_traj_rows, strided_traj_cols, Eigen::Stride<-1, -1>(outer_stride, 1));
115 const auto T_y = Eigen::Map<
const Eigen::ArrayXXf, 0,
116 Eigen::Stride<-1, -1>>(data.trajectories.y.data(),
117 strided_traj_rows, strided_traj_cols, Eigen::Stride<-1, -1>(outer_stride, 1));
118 const auto T_yaw = Eigen::Map<
const Eigen::ArrayXXf, 0,
119 Eigen::Stride<-1, -1>>(data.trajectories.yaws.data(), strided_traj_rows, strided_traj_cols,
120 Eigen::Stride<-1, -1>(outer_stride, 1));
121 const auto traj_sampled_size = T_x.cols();
123 for (
size_t t = 0; t < batch_size; ++t) {
124 summed_path_dist = 0.0f;
126 traj_integrated_distance = 0.0f;
128 float Tx_m1 = T_x(t, 0);
129 float Ty_m1 = T_y(t, 0);
130 for (
int p = 1; p < traj_sampled_size; p++) {
131 const float Tx = T_x(t, p);
132 const float Ty = T_y(t, p);
137 traj_integrated_distance += sqrtf(dx * dx + dy * dy);
138 path_pt = utils::findClosestPathPt(
139 path_integrated_distances, traj_integrated_distance, path_pt);
143 if (path_pts_valid[path_pt]) {
144 const auto & pose = path[path_pt];
148 if (use_path_orientations_) {
149 dyaw = angles::shortest_angular_distance(pose.theta, T_yaw(t, p));
150 summed_path_dist += sqrtf(dx * dx + dy * dy + dyaw * dyaw);
152 summed_path_dist += sqrtf(dx * dx + dy * dy);
156 if (num_samples > 0u) {
157 cost(t) = summed_path_dist /
static_cast<float>(num_samples);
164 data.costs += (cost * weight_).pow(power_).eval();
166 data.costs += (cost * weight_).eval();
172 #include <pluginlib/class_list_macros.hpp>
174 PLUGINLIB_EXPORT_CLASS(
auto getParamGetter(const std::string &ns)
Get an object to retrieve parameters.
Abstract critic objective function to score trajectories.
void score(CriticData &data) override
Evaluate cost related to trajectories path alignment.
void initialize() override
Initialize critic.
Data to pass to critics for scoring, including state, trajectories, pruned path, global goal,...