| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | /* | ||
| 2 | * Copyright 2017, LAAS-CNRS | ||
| 3 | * Author: Steve Tonneau | ||
| 4 | */ | ||
| 5 | |||
| 6 | #include <hpp/bezier-com-traj/common_solve_methods.hh> | ||
| 7 | #include <hpp/bezier-com-traj/cost/costfunction_definition.hh> | ||
| 8 | #include <hpp/bezier-com-traj/waypoints/waypoints_definition.hh> | ||
| 9 | |||
| 10 | namespace bezier_com_traj { | ||
| 11 | namespace cost { | ||
| 12 | // cost : min distance between x and midPoint : | ||
| 13 | ✗ | void computeCostMidPoint(const ProblemData& pData, const VectorX& /*Ts*/, | |
| 14 | const double /*T*/, const T_time& /*timeArray*/, | ||
| 15 | MatrixXX& H, VectorX& g) { | ||
| 16 | // cost : x' H x + 2 x g' | ||
| 17 | ✗ | Vector3 midPoint = (pData.c0_ + pData.c1_) / | |
| 18 | ✗ | 2.; // todo : replace it with point found by planning ?? | |
| 19 | ✗ | H.block<3, 3>(0, 0) = Matrix3::Identity(); | |
| 20 | ✗ | g.head<3>() = -midPoint; | |
| 21 | ✗ | } | |
| 22 | |||
| 23 | // cost : min distance between end velocity and the one computed by planning | ||
| 24 | ✗ | void computeCostEndVelocity(const ProblemData& pData, const VectorX& /*Ts*/, | |
| 25 | const double T, const T_time& /*timeArray*/, | ||
| 26 | MatrixXX& H, VectorX& g) { | ||
| 27 | ✗ | if (pData.constraints_.flag_ && END_VEL) | |
| 28 | throw std::runtime_error( | ||
| 29 | "Can't use computeCostEndVelocity as cost function when end velocity " | ||
| 30 | ✗ | "is a contraint"); | |
| 31 | ✗ | coefs_t v = computeFinalVelocityPoint(pData, T); | |
| 32 | ✗ | H.block<3, 3>(0, 0) = Matrix3::Identity() * v.first * v.first; | |
| 33 | ✗ | g.head<3>() = v.first * (v.second - pData.dc1_); | |
| 34 | ✗ | } | |
| 35 | |||
| 36 | // TODO this is temporary.The acceleration integral can be computed analitcally | ||
| 37 | 61 | void computeCostMinAcceleration(const ProblemData& pData, const VectorX& Ts, | |
| 38 | const double /*T*/, const T_time& timeArray, | ||
| 39 | MatrixXX& H, VectorX& g) { | ||
| 40 | 61 | double t_total = 0.; | |
| 41 |
3/4✓ Branch 1 taken 177 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 177 times.
✓ Branch 5 taken 61 times.
|
238 | for (int i = 0; i < Ts.size(); ++i) t_total += Ts[i]; |
| 42 | std::vector<coefs_t> wps_ddc = | ||
| 43 | computeDiscretizedAccelerationWaypoints<point3_t>(pData, t_total, | ||
| 44 |
1/2✓ Branch 1 taken 61 times.
✗ Branch 2 not taken.
|
61 | timeArray); |
| 45 | // cost : x' H x + 2 x g' | ||
| 46 |
3/6✓ Branch 1 taken 61 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 61 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 61 times.
✗ Branch 8 not taken.
|
61 | H.block<3, 3>(0, 0) = Matrix3::Zero(); |
| 47 |
3/6✓ Branch 1 taken 61 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 61 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 61 times.
✗ Branch 8 not taken.
|
61 | g.head<3>() = Vector3::Zero(); |
| 48 |
2/2✓ Branch 1 taken 1178 times.
✓ Branch 2 taken 61 times.
|
1239 | for (size_t i = 0; i < wps_ddc.size(); ++i) { |
| 49 |
1/2✓ Branch 1 taken 1178 times.
✗ Branch 2 not taken.
|
1178 | H.block<3, 3>(0, 0) += |
| 50 |
4/8✓ Branch 3 taken 1178 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1178 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1178 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 1178 times.
✗ Branch 13 not taken.
|
2356 | Matrix3::Identity() * wps_ddc[i].first * wps_ddc[i].first; |
| 51 |
3/6✓ Branch 3 taken 1178 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1178 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1178 times.
✗ Branch 10 not taken.
|
1178 | g.head<3>() += wps_ddc[i].first * wps_ddc[i].second; |
| 52 | } | ||
| 53 | 61 | } | |
| 54 | |||
| 55 | typedef void (*costCompute)(const ProblemData&, const VectorX&, const double, | ||
| 56 | const T_time&, MatrixXX&, VectorX&); | ||
| 57 | typedef std::map<CostFunction, costCompute> T_costCompute; | ||
| 58 | static const T_costCompute costs = | ||
| 59 | boost::assign::map_list_of(ACCELERATION, computeCostMinAcceleration)( | ||
| 60 | DISTANCE_TRAVELED, computeCostMidPoint)(TARGET_END_VELOCITY, | ||
| 61 | computeCostEndVelocity); | ||
| 62 | |||
| 63 | 61 | void genCostFunction(const ProblemData& pData, const VectorX& Ts, | |
| 64 | const double T, const T_time& timeArray, MatrixXX& H, | ||
| 65 | VectorX& g) { | ||
| 66 |
1/2✓ Branch 1 taken 61 times.
✗ Branch 2 not taken.
|
61 | T_costCompute::const_iterator cit = costs.find(pData.costFunction_); |
| 67 |
1/2✓ Branch 2 taken 61 times.
✗ Branch 3 not taken.
|
61 | if (cit != costs.end()) |
| 68 |
1/2✓ Branch 2 taken 61 times.
✗ Branch 3 not taken.
|
122 | return cit->second(pData, Ts, T, timeArray, H, g); |
| 69 | else { | ||
| 70 | ✗ | std::cout << "Unknown cost function" << std::endl; | |
| 71 | ✗ | throw std::runtime_error("Unknown cost function"); | |
| 72 | } | ||
| 73 | } | ||
| 74 | |||
| 75 | } // namespace cost | ||
| 76 | } // namespace bezier_com_traj | ||
| 77 |