3 #include "../include/choreo_descartes_planner/pose_sampling_helpers.h" 4 #include "../include/choreo_descartes_planner/pose_verification_helpers.h" 9 typedef boost::function<double(const double*, const double*)>
CostFunction;
12 #include "descartes_planner/planning_graph_edge_policy.h" 17 void concatenate(descartes_planner::LadderGraph& dest,
const descartes_planner::LadderGraph& src)
19 assert(dest.size() > 0);
20 assert(src.size() > 0);
21 assert(dest.size() == src.size());
25 for (std::size_t i = 0; i < src.size(); ++i)
28 auto& dest_joints = dest.getRung(i).data;
29 const auto& src_joints = src.getRung(i).data;
30 dest_joints.insert(dest_joints.end(), src_joints.begin(), src_joints.end());
32 if (i != src.size() - 1)
35 const auto next_rung_size = dest.rungSize(i + 1);
36 auto& dest_edges = dest.getEdges(i);
37 const auto& src_edges = src.getEdges(i);
38 for (
const auto& edge : src_edges)
40 auto edge_copy = edge;
41 for (
auto& e : edge_copy)
42 e.idx += next_rung_size;
43 dest_edges.push_back(edge_copy);
55 const std::vector <Eigen::Affine3d> &ps,
58 descartes_planner::LadderGraph graph(model.getDOF());
59 graph.resize(ps.size());
61 const descartes_core::TimingConstraint timing(dt);
64 for (std::size_t i = 0; i < ps.size(); ++i)
66 std::vector <std::vector<double>> joint_poses;
67 model.getAllIK(ps[i], joint_poses);
69 graph.assignRung(i, descartes_core::TrajectoryID::make_nil(), timing, joint_poses);
72 bool has_edges_t =
true;
76 for (std::size_t i = 0; i < graph.size() - 1; ++i)
78 const auto start_idx = i;
79 const auto end_idx = i + 1;
80 const auto &joints1 = graph.getRung(start_idx).data;
81 const auto &joints2 = graph.getRung(end_idx).data;
82 const auto &tm = graph.getRung(end_idx).timing;
83 const auto dof = model.getDOF();
85 const auto start_size = joints1.size() / dof;
86 const auto end_size = joints2.size() / dof;
88 descartes_planner::DefaultEdgesWithTime builder(start_size, end_size, dof, tm.upper,
89 model.getJointVelocityLimits());
90 for (
size_t k = 0; k < start_size; k++)
92 const auto start_index = k * dof;
94 for (
size_t j = 0; j < end_size; j++)
96 const auto end_index = j * dof;
98 builder.consider(&joints1[start_index], &joints2[end_index], j);
103 std::vector <descartes_planner::LadderGraph::EdgeList> edges = builder.result();
104 if (!builder.hasEdges())
109 has_edges_t = has_edges_t && builder.hasEdges();
110 graph.assignEdges(i, std::move(edges));
117 const std::vector <Eigen::Vector3d> &origins,
119 const Eigen::Matrix3d &orientation,
120 const double z_axis_angle)
122 std::vector <Eigen::Affine3d> poses;
124 for (
const auto &o : origins)
126 poses.push_back(
makePose(o, orientation, z_axis_angle));
133 const std::vector <Eigen::Vector3d> &origins,
134 const Eigen::Matrix3d &orientation,
137 std::vector <Eigen::Affine3d> poses;
139 for (
const auto &o : origins)
141 poses.push_back(
makePose(o, orientation));
156 static const auto min_angle = -
M_PI;
157 static const auto max_angle =
M_PI;
158 const auto n_angle_disc = std::lround((max_angle - min_angle) / segment.
z_axis_disc);
159 const auto angle_step = (max_angle - min_angle) / n_angle_disc;
162 double traverse_length = (segment.
end - segment.
start).norm();
163 const auto dt = traverse_length / segment.
linear_vel;
165 LadderGraph graph(model.getDOF());
168 graph.resize(points.size());
173 std::vector <Eigen::Vector3d> process_pts = points;
175 for (
long i = 0; i < n_angle_disc; ++i)
177 const auto angle = angle_step * i;
179 LadderGraph single_config_graph =
sampleSingleConfig(model, process_pts, dt, orientation, angle);
180 concatenate(graph, single_config_graph);
192 const auto ref_size = current.size();
193 const auto new_total_size = ref_size + next.size();
197 current.resize(new_total_size);
198 for (std::size_t i = 0; i < next.size(); ++i)
200 current.getRung(ref_size + i) = next.getRung(i);
204 if (ref_size > 0 && next.size() > 0)
206 const auto dof = current.dof();
207 auto &a_rung = current.getRung(ref_size - 1);
208 auto &b_rung = current.getRung(ref_size);
210 const auto n_start = a_rung.data.size() / dof;
211 const auto n_end = b_rung.data.size() / dof;
213 descartes_planner::DefaultEdgesWithoutTime builder(n_start, n_end, dof);
215 for (
size_t k = 0; k < n_start; k++)
217 const auto start_index = k * dof;
219 for (
size_t j = 0; j < n_end; j++)
221 const auto end_index = j * dof;
223 builder.consider(&a_rung.data[start_index], &b_rung.data[end_index], j);
228 std::vector <descartes_planner::LadderGraph::EdgeList> edges = builder.result();
230 if (!builder.hasEdges())
232 ROS_ERROR(
"[Descartes graph builder] No edges!!!");
235 current.assignEdges(ref_size - 1, std::move(edges));
std::vector< Eigen::Vector3d > discretizePositions(const Eigen::Vector3d &start, const Eigen::Vector3d &stop, const double ds)
boost::function< double(const double *, const double *)> CostFunction
LadderGraph generateLadderGraphFromPoses(const descartes_core::RobotModel &model, const std::vector< Eigen::Affine3d > &ps, const double dt)
std::vector< Eigen::Matrix3d > orientations
Eigen::Affine3d makePose(const Eigen::Vector3d &position, const Eigen::Matrix3d &orientation, const double z_axis_angle)
void appendInTime(LadderGraph ¤t, const LadderGraph &next)
LadderGraph sampleSingleConfig(const descartes_core::RobotModel &model, const std::vector< Eigen::Vector3d > &origins, const Eigen::Matrix3d &orientation, const double dt)
LadderGraph sampleConstrainedPaths(const descartes_core::RobotModel &model, ConstrainedSegment &segment)