-
Notifications
You must be signed in to change notification settings - Fork 1.2k
/
cspace_free_box.cc
96 lines (87 loc) · 4.09 KB
/
cspace_free_box.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#include "drake/geometry/optimization/cspace_free_box.h"
#include <map>
#include <memory>
#include "drake/common/fmt_eigen.h"
#include "drake/geometry/optimization/cspace_free_internal.h"
namespace drake {
namespace geometry {
namespace optimization {
CspaceFreeBox::CspaceFreeBox(const multibody::MultibodyPlant<double>* plant,
const geometry::SceneGraph<double>* scene_graph,
SeparatingPlaneOrder plane_order,
const Options& options)
: CspaceFreePolytopeBase(plant, scene_graph, plane_order, options) {}
CspaceFreeBox::~CspaceFreeBox() {}
CspaceFreeBox::SeparatingPlaneLagrangians
CspaceFreeBox::SeparatingPlaneLagrangians::GetSolution(
const solvers::MathematicalProgramResult& result) const {
CspaceFreeBox::SeparatingPlaneLagrangians ret(this->s_box_lower_.rows());
for (int i = 0; i < this->s_box_lower_.rows(); ++i) {
ret.s_box_lower_(i) = result.GetSolution(this->s_box_lower_(i));
ret.s_box_upper_(i) = result.GetSolution(this->s_box_upper_(i));
}
return ret;
}
void CspaceFreeBox::ComputeSBox(
const Eigen::Ref<const Eigen::VectorXd>& q_box_lower,
const Eigen::Ref<const Eigen::VectorXd>& q_box_upper,
Eigen::VectorXd* s_box_lower, Eigen::VectorXd* s_box_upper,
Eigen::VectorXd* q_star) const {
if ((q_box_lower.array() > q_box_upper.array()).any()) {
throw std::runtime_error(
fmt::format("CspaceFreeBox: q_box_lower={} has some entries larger "
"than q_box_upper={}.",
fmt_eigen(q_box_lower.transpose()),
fmt_eigen(q_box_upper.transpose())));
}
const auto& plant = this->rational_forward_kin().plant();
const Eigen::VectorXd q_position_lower = plant.GetPositionLowerLimits();
const Eigen::VectorXd q_position_upper = plant.GetPositionUpperLimits();
if ((q_box_lower.array() > q_position_upper.array()).any()) {
throw std::runtime_error(fmt::format(
"CspaceFreeBox: q_box_lower={} has some entries larger the the robot "
"position upper limit={}.",
fmt_eigen(q_box_lower.transpose()),
fmt_eigen(q_position_upper.transpose())));
}
if ((q_box_upper.array() < q_position_lower.array()).any()) {
throw std::runtime_error(fmt::format(
"CspaceFreeBox: q_box_upper={} has some entries smaller than the robot "
"position lower limit={}.",
fmt_eigen(q_box_upper.transpose()),
fmt_eigen(q_position_lower.transpose())));
}
const Eigen::VectorXd q_lower =
q_box_lower.array().max(q_position_lower.array()).matrix();
const Eigen::VectorXd q_upper =
q_box_upper.array().min(q_position_upper.array()).matrix();
*q_star = 0.5 * (q_lower + q_upper);
*s_box_lower = this->rational_forward_kin().ComputeSValue(q_lower, *q_star);
*s_box_upper = this->rational_forward_kin().ComputeSValue(q_upper, *q_star);
}
void CspaceFreeBox::GeneratePolynomialsToCertify(
const Eigen::Ref<const Eigen::VectorXd>& s_box_lower,
const Eigen::Ref<const Eigen::VectorXd>& s_box_upper,
const Eigen::Ref<const Eigen::VectorXd>& q_star,
const IgnoredCollisionPairs& ignored_collision_pairs,
PolynomialsToCertify* certify_polynomials) const {
this->CalcSBoundsPolynomial(s_box_lower, s_box_upper,
&(certify_polynomials->s_minus_s_box_lower),
&(certify_polynomials->s_box_upper_minus_s));
std::map<int, const CSpaceSeparatingPlane<symbolic::Variable>*>
separating_planes_map;
for (int i = 0; i < static_cast<int>(separating_planes().size()); ++i) {
const auto& plane = separating_planes()[i];
if (ignored_collision_pairs.count(SortedPair<geometry::GeometryId>(
plane.positive_side_geometry->id(),
plane.negative_side_geometry->id())) == 0) {
separating_planes_map.emplace(i, &plane);
}
}
internal::GenerateRationals(separating_planes_map, y_slack(), q_star,
rational_forward_kin(),
&(certify_polynomials->plane_geometries));
}
} // namespace optimization
} // namespace geometry
} // namespace drake