13 #include <mrpt/containers/traits_map.h> 14 #include <mrpt/core/optional_ref.h> 15 #include <mrpt/graphs/CDirectedTree.h> 16 #include <mrpt/math/wrap2pi.h> 17 #include <mrpt/nav/tpspace/CParameterizedTrajectoryGenerator.h> 18 #include <mrpt/poses/CPose2D.h> 29 using mrpt::graphs::TNodeID;
32 template <
class node_t>
35 template <
class node_t>
72 template <
class NODE_TYPE_DATA,
class EDGE_TYPE>
76 struct node_t :
public NODE_TYPE_DATA
80 TNodeID nodeID_ = mrpt::graphs::INVALID_NODEID;
90 TNodeID nodeID,
const std::optional<TNodeID>& parentID,
91 const NODE_TYPE_DATA& data,
cost_t cost)
92 : NODE_TYPE_DATA(data),
100 using base_t = mrpt::graphs::CDirectedTree<EDGE_TYPE>;
107 template <
class KEY,
class VALUE>
108 using map = mrpt::containers::map_as_vector<
109 KEY, VALUE,
typename std::deque<std::pair<KEY, VALUE>>>;
123 const TNodeID parentId,
const TNodeID newChildId,
124 const NODE_TYPE_DATA& newChildNodeData,
const EDGE_TYPE& newEdgeData)
127 auto& parentEdges = base_t::edges_to_children[parentId];
128 const bool dirChildToParent =
false;
130 parentEdges.emplace_back(newChildId, dirChildToParent, newEdgeData);
132 const cost_t newCost = nodes_.at(parentId).cost_ + newEdgeData.cost;
136 node_t(newChildId, parentId, newChildNodeData, newCost);
140 const TNodeID parentId,
const TNodeID childId,
141 const EDGE_TYPE& newEdgeData)
144 auto& parentEdges = base_t::edges_to_children[parentId];
145 bool updateDone =
false;
147 for (
auto& edge : parentEdges)
149 if (edge.id == childId)
151 edge.data = newEdgeData;
159 "[update_node_and_edge] Error: Could not find edge from " 160 "parent #%s -> node #%s",
161 std::to_string(parentId).c_str(),
162 std::to_string(childId).c_str());
165 const cost_t newCost = nodes_.at(parentId).cost_ + newEdgeData.cost;
168 auto& node = nodes_.at(childId);
169 node.parentID_ = parentId;
170 node.cost_ = newCost;
174 const TNodeID nodeId,
const EDGE_TYPE& newEdgeFromParent)
176 auto& node = nodes_.at(nodeId);
179 const auto oldParentId = *node.parentID_;
180 auto& oldParentEdges = base_t::edges_to_children[oldParentId];
181 bool deletionDone =
false;
182 for (
auto it = oldParentEdges.begin(); it != oldParentEdges.end(); ++it)
184 if (it->id == nodeId)
186 oldParentEdges.erase(it);
194 "[rewire_node_parent] Error: Could not find edge from former " 195 "parent #%s -> node #%s",
196 std::to_string(oldParentId).c_str(),
197 std::to_string(nodeId).c_str());
201 const TNodeID parentId = newEdgeFromParent.parentId;
202 typename base_t::TListEdges& parentEdges =
203 base_t::edges_to_children[parentId];
204 const bool dirChildToParent =
false;
205 parentEdges.emplace_back(nodeId, dirChildToParent, newEdgeFromParent);
208 nodes_.at(parentId).cost_ + newEdgeFromParent.cost;
211 ASSERT_LE_(newCost, node.cost_);
213 node.parentID_ = parentId;
214 node.cost_ = newCost;
219 auto& node = nodes_.at(nodeId);
220 const auto& parentEdges = base_t::edges_to_children.at(*node.parentID_);
221 for (
const auto& edge : parentEdges)
223 if (edge.id == nodeId)
return edge.data;
226 "Could not find edge to parent for node #%s",
227 std::to_string(nodeId).c_str());
233 const TNodeID node_id,
const NODE_TYPE_DATA& node_data)
236 nodes_.empty(),
"insert_root_node() called on a non-empty tree");
238 nodes_[node_id] = node_t(node_id, {}, node_data, zeroCost);
251 return nodes_.at(nodeId);
260 const TNodeID target_node)
const 265 auto it_src = nodes_.find(target_node);
266 if (it_src == nodes_.end())
267 throw std::runtime_error(
268 "backtrackPath: target_node not found in tree!");
269 const node_t* node = &it_src->second;
272 outPath.push_front(*node);
274 auto next_node_id = node->parentID_;
275 if (!next_node_id.has_value())
282 const EDGE_TYPE& edge = edge_to_parent(node->nodeID_);
283 edgeList.push_front(const_cast<EDGE_TYPE*>(&edge));
285 auto it_next = nodes_.find(next_node_id.value());
286 if (it_next == nodes_.end())
287 throw std::runtime_error(
288 "backtrackPath: Node ID not found during tree " 290 node = &it_next->second;
293 return {outPath, edgeList};
309 : ptg_(ptg), headingTolerance_(headingTolerance)
317 if (std::abs(a.
pose.x - b.x) > d)
return true;
318 if (std::abs(a.
pose.y - b.y) > d)
return true;
319 if (std::abs(mrpt::math::angDistance(a.
pose.phi, b.phi)) > d)
323 std::optional<std::tuple<distance_t, trajectory_index_t>>
distance(
324 const SE2_KinState& src,
const mrpt::math::TPose2D& dst,
325 bool ignoreDstHeading)
const 329 const auto relPose = dst - src.
pose;
330 auto localSrcVel = src.
vel;
331 localSrcVel.rotate(-src.
pose.phi);
333 ptg_t::TNavDynamicState dynState;
334 dynState.relTarget = relPose;
335 dynState.targetRelSpeed = 1.0;
336 dynState.curVelLocal = localSrcVel;
338 ptg_.updateNavDynamicState(dynState);
340 bool tp_point_is_exact =
341 ptg_.inverseMap_WS2TP(relPose.x, relPose.y, k, normDist);
343 distance_t d = normDist * ptg_.getRefDistance();
345 if (tp_point_is_exact)
348 ptg_.getPathStepForDist(k, d, ptg_step);
349 const auto reconsRelPose = ptg_.getPathPose(k, ptg_step);
350 const double headingError =
351 ignoreDstHeading ? .0
352 : std::abs(mrpt::math::angDistance(
353 reconsRelPose.phi, relPose.phi));
355 if (headingError > headingTolerance_) tp_point_is_exact =
false;
358 if (tp_point_is_exact)
362 (relPose.x != 0 || relPose.y != 0 || relPose.phi != 0))
368 std::abs(relPose.phi) * ptg_.getRefDistance();
393 const mrpt::math::TPose2D& a,
const mrpt::math::TPose2D& b,
396 if (std::abs(a.x - b.x) > d)
return true;
397 if (std::abs(a.y - b.y) > d)
return true;
398 if (phiWeight_ * std::abs(mrpt::math::angDistance(a.phi, b.phi)) > d)
404 const mrpt::math::TPose2D& src,
const mrpt::math::TPose2D& dst)
const 406 const auto relPose = dst - src;
407 return relPose.norm() + phiWeight_ * std::abs(relPose.phi);
411 double phiWeight_ = 0.1;
ptg_step_t step
Definition: MotionPrimitivesTree.h:50
cost_t cost_
Definition: MotionPrimitivesTree.h:86
Definition: MotionPrimitivesTree.h:73
std::list< node_t > path_t
Definition: MotionPrimitivesTree.h:120
Definition: MotionPrimitivesTree.h:33
distance_t distance(const mrpt::math::TPose2D &src, const mrpt::math::TPose2D &dst) const
Definition: MotionPrimitivesTree.h:403
double cost_t
Definition: basic_types.h:25
PoseDistanceMetric_TPS(ptg_t &ptg, const double headingTolerance)
Definition: MotionPrimitivesTree.h:308
Definition: MotionPrimitivesTree.h:105
Definition: bestTrajectory.h:15
const EDGE_TYPE & edge_to_parent(const TNodeID nodeId) const
Definition: MotionPrimitivesTree.h:217
PoseDistanceMetric_Lie(const double phiWeight)
Definition: MotionPrimitivesTree.h:390
node_map_t nodes_
Definition: MotionPrimitivesTree.h:298
void rewire_node_parent(const TNodeID nodeId, const EDGE_TYPE &newEdgeFromParent)
Definition: MotionPrimitivesTree.h:173
void update_node_and_edge(const TNodeID parentId, const TNodeID childId, const EDGE_TYPE &newEdgeData)
Definition: MotionPrimitivesTree.h:139
Definition: SE2_KinState.h:65
NODE_TYPE_DATA & node_state(const TNodeID nodeId)
Definition: MotionPrimitivesTree.h:249
Definition: MotionPrimitivesTree.h:36
bool cannotBeNearerThan(const SE2_KinState &a, const mrpt::math::TPose2D &b, const distance_t d) const
Definition: MotionPrimitivesTree.h:313
std::optional< TNodeID > parentID_
Definition: MotionPrimitivesTree.h:83
double distance_t
Definition: basic_types.h:16
bool cannotBeNearerThan(const mrpt::math::TPose2D &a, const mrpt::math::TPose2D &b, const distance_t d) const
Definition: MotionPrimitivesTree.h:392
mrpt::graphs::CDirectedTree< MoveEdgeSE2_TPS > base_t
Definition: MotionPrimitivesTree.h:100
mrpt::containers::map_as_vector< KEY, VALUE, typename std::deque< std::pair< KEY, VALUE > >> map
Definition: MotionPrimitivesTree.h:109
std::list< edge_t *> edge_sequence_t
Definition: MotionPrimitivesTree.h:102
std::optional< std::tuple< distance_t, trajectory_index_t > > distance(const SE2_KinState &src, const mrpt::math::TPose2D &dst, bool ignoreDstHeading) const
Definition: MotionPrimitivesTree.h:323
mrpt::math::TPose2D pose
global pose (x,y,phi)
Definition: SE2_KinState.h:69
Definition: MotionPrimitivesTree.h:38
std::tuple< path_t, edge_sequence_t > backtrack_path(const TNodeID target_node) const
Definition: MotionPrimitivesTree.h:259
node_t(TNodeID nodeID, const std::optional< TNodeID > &parentID, const NODE_TYPE_DATA &data, cost_t cost)
Definition: MotionPrimitivesTree.h:89
Definition: MoveEdgeSE2_TPS.h:19
double normalized_speed_t
Definition: basic_types.h:33
const double headingTolerance_
Definition: MotionPrimitivesTree.h:381
Definition: MotionPrimitivesTree.h:76
trajectory_index_t k
Definition: MotionPrimitivesTree.h:49
int trajectory_index_t
Definition: basic_types.h:28
std::map< TNodeID, node_t > node_map_t
Definition: MotionPrimitivesTree.h:113
bool operator<(const TPS_point &a, const TPS_point &b)
Definition: MotionPrimitivesTree.h:53
double normalized_distance_t
Definition: basic_types.h:19
const node_map_t & nodes() const
Definition: MotionPrimitivesTree.h:246
TPS_point(trajectory_index_t _k, ptg_step_t _step, normalized_speed_t _speed)
Definition: MotionPrimitivesTree.h:43
void insert_root_node(const TNodeID node_id, const NODE_TYPE_DATA &node_data)
Definition: MotionPrimitivesTree.h:232
mrpt::nav::CParameterizedTrajectoryGenerator ptg_t
Definition: ptg_t.h:13
TNodeID next_free_node_ID() const
Definition: MotionPrimitivesTree.h:241
normalized_speed_t speed
Definition: MotionPrimitivesTree.h:51
ptg_t & ptg_
Definition: MotionPrimitivesTree.h:380
void insert_node_and_edge(const TNodeID parentId, const TNodeID newChildId, const NODE_TYPE_DATA &newChildNodeData, const EDGE_TYPE &newEdgeData)
Definition: MotionPrimitivesTree.h:122
mrpt::math::TTwist2D vel
global velocity (vx,vy,omega)
Definition: SE2_KinState.h:70
uint32_t ptg_step_t
Definition: basic_types.h:22