collision_margin_data.cpp
Go to the documentation of this file.
1 
28 #include <boost/serialization/access.hpp>
29 #include <boost/serialization/nvp.hpp>
30 #include <boost/serialization/utility.hpp>
31 #if (BOOST_VERSION >= 107400) && (BOOST_VERSION < 107500)
32 #include <boost/serialization/library_version_type.hpp>
33 #endif
34 #include <boost/serialization/unordered_map.hpp>
36 
37 #include <tesseract_common/utils.h>
39 
40 namespace tesseract_common
41 {
43 {
44  for (const auto& pair : pair_margins)
45  setCollisionMargin(pair.first.first, pair.first.second, pair.second);
46 }
47 
48 void CollisionMarginPairData::setCollisionMargin(const std::string& obj1, const std::string& obj2, double margin)
49 {
50  auto key = tesseract_common::makeOrderedLinkPair(obj1, obj2);
51  lookup_table_[key] = margin;
53 }
54 
55 std::optional<double> CollisionMarginPairData::getCollisionMargin(const std::string& obj1,
56  const std::string& obj2) const
57 {
58  thread_local LinkNamesPair key;
60  const auto it = lookup_table_.find(key);
61 
62  if (it != lookup_table_.end())
63  return it->second;
64 
65  return {};
66 }
67 
69 
71 
73 {
74  if (lookup_table_.empty())
75  return;
76 
77  max_collision_margin_ += increment;
78  for (auto& pair : lookup_table_)
79  pair.second += increment;
80 }
81 
83 {
84  if (lookup_table_.empty())
85  return;
86 
87  max_collision_margin_ *= scale;
88  for (auto& pair : lookup_table_)
89  pair.second *= scale;
90 }
91 
92 bool CollisionMarginPairData::empty() const { return lookup_table_.empty(); }
93 
95 {
96  lookup_table_.clear();
97  max_collision_margin_ = std::numeric_limits<double>::lowest();
98 }
99 
101 {
102  max_collision_margin_ = std::numeric_limits<double>::lowest();
103  for (const auto& pair : lookup_table_)
104  max_collision_margin_ = std::max(max_collision_margin_, pair.second);
105 }
106 
108  CollisionMarginPairOverrideType override_type)
109 {
110  switch (override_type)
111  {
113  {
114  *this = pair_margin_data;
115  break;
116  }
118  {
119  for (const auto& p : pair_margin_data.lookup_table_)
120  lookup_table_[p.first] = p.second;
121 
123  break;
124  }
126  {
127  break;
128  }
129  }
130 }
131 
133 {
134  bool ret_val = true;
136  ret_val &= (lookup_table_.size() == rhs.lookup_table_.size());
137  if (ret_val)
138  {
139  for (const auto& pair : lookup_table_)
140  {
141  auto cp = rhs.lookup_table_.find(pair.first);
142  ret_val = (cp != rhs.lookup_table_.end());
143  if (!ret_val)
144  break;
145 
146  ret_val = tesseract_common::almostEqualRelativeAndAbs(pair.second, cp->second, 1e-5);
147  if (!ret_val)
148  break;
149  }
150  }
151  return ret_val;
152 }
153 
155 
156 template <class Archive>
157 void CollisionMarginPairData::serialize(Archive& ar, const unsigned int /*version*/)
158 {
159  ar& BOOST_SERIALIZATION_NVP(lookup_table_);
160  ar& BOOST_SERIALIZATION_NVP(max_collision_margin_);
161 }
162 
163 CollisionMarginData::CollisionMarginData(double default_collision_margin)
164  : default_collision_margin_(default_collision_margin)
165 {
166 }
167 
168 CollisionMarginData::CollisionMarginData(double default_collision_margin,
169  CollisionMarginPairData pair_collision_margins)
170  : default_collision_margin_(default_collision_margin), pair_margins_(std::move(pair_collision_margins))
171 {
172 }
173 
175  : pair_margins_(std::move(pair_collision_margins))
176 {
177 }
178 
179 void CollisionMarginData::setDefaultCollisionMargin(double default_collision_margin)
180 {
181  default_collision_margin_ = default_collision_margin;
182 }
183 
185 
186 void CollisionMarginData::setCollisionMargin(const std::string& obj1, const std::string& obj2, double margin)
187 {
188  pair_margins_.setCollisionMargin(obj1, obj2, margin);
189 }
190 
191 double CollisionMarginData::getCollisionMargin(const std::string& obj1, const std::string& obj2) const
192 {
193  std::optional<double> margin = pair_margins_.getCollisionMargin(obj1, obj2);
194  if (margin.has_value())
195  return margin.value();
196 
198 }
199 
201 
203 {
204  if (pair_margins_.empty())
206 
208 }
209 
211 {
212  default_collision_margin_ += increment;
213  pair_margins_.incrementMargins(increment);
214 }
215 
217 {
218  default_collision_margin_ *= scale;
220 }
221 
223  CollisionMarginPairOverrideType override_type)
224 {
225  pair_margins_.apply(pair_margin_data, override_type);
226 }
227 
229 {
230  bool ret_val = true;
231  ret_val &=
233  ret_val &= (pair_margins_ == rhs.pair_margins_);
234  return ret_val;
235 }
236 
237 bool CollisionMarginData::operator!=(const CollisionMarginData& rhs) const { return !operator==(rhs); }
238 
239 template <class Archive>
240 void CollisionMarginData::serialize(Archive& ar, const unsigned int /*version*/)
241 {
242  ar& BOOST_SERIALIZATION_NVP(default_collision_margin_);
243  ar& BOOST_SERIALIZATION_NVP(pair_margins_);
244 }
245 } // namespace tesseract_common
246 
249 BOOST_CLASS_EXPORT_IMPLEMENT(tesseract_common::CollisionMarginPairData)
251 BOOST_CLASS_EXPORT_IMPLEMENT(tesseract_common::CollisionMarginData)
tesseract_common::CollisionMarginData::setCollisionMargin
void setCollisionMargin(const std::string &obj1, const std::string &obj2, double collision_margin)
Set the margin for a given contact pair.
Definition: collision_margin_data.cpp:186
tesseract_common::CollisionMarginData::getMaxCollisionMargin
double getMaxCollisionMargin() const
Get the largest collision margin.
Definition: collision_margin_data.cpp:202
tesseract_common::CollisionMarginPairData::getCollisionMargin
std::optional< double > getCollisionMargin(const std::string &obj1, const std::string &obj2) const
Get the pairs collision margin data.
Definition: collision_margin_data.cpp:55
tesseract_common
Definition: allowed_collision_matrix.h:19
tesseract_common::CollisionMarginPairOverrideType::REPLACE
@ REPLACE
Replace the contact manager's CollisionMarginPairData.
tesseract_common::CollisionMarginData::getCollisionMarginPairData
const CollisionMarginPairData & getCollisionMarginPairData() const
Get Collision Margin Data for stored pairs.
Definition: collision_margin_data.cpp:200
tesseract_common::CollisionMarginPairData::CollisionMarginPairData
EIGEN_MAKE_ALIGNED_OPERATOR_NEW CollisionMarginPairData()=default
tesseract_common::CollisionMarginPairOverrideType::MODIFY
@ MODIFY
Modify the contact managers pair margins.
tesseract_common::CollisionMarginPairData::getCollisionMargins
const PairsCollisionMarginData & getCollisionMargins() const
Get Collision Margin Data for stored pairs.
Definition: collision_margin_data.cpp:70
collision_margin_data.h
This is used to store collision margin information.
tesseract_common::CollisionMarginPairData::empty
bool empty() const
Check if empty.
Definition: collision_margin_data.cpp:92
TESSERACT_SERIALIZE_ARCHIVES_INSTANTIATE
#define TESSERACT_SERIALIZE_ARCHIVES_INSTANTIATE(Type)
Definition: serialization.h:49
macros.h
Common Tesseract Macros.
tesseract_common::CollisionMarginPairData::lookup_table_
PairsCollisionMarginData lookup_table_
A map of link pair names to contact distance.
Definition: collision_margin_data.h:144
TESSERACT_COMMON_IGNORE_WARNINGS_PUSH
#define TESSERACT_COMMON_IGNORE_WARNINGS_PUSH
Definition: macros.h:71
tesseract_common::CollisionMarginData::getDefaultCollisionMargin
double getDefaultCollisionMargin() const
Get the default collision margin.
Definition: collision_margin_data.cpp:184
tesseract_common::CollisionMarginData
Stores information about how the margins allowed between collision objects.
Definition: collision_margin_data.h:159
tesseract_common::CollisionMarginPairData::updateCollisionMarginMax
void updateCollisionMarginMax()
Recalculate the max margin.
Definition: collision_margin_data.cpp:100
tesseract_common::LinkNamesPair
std::pair< std::string, std::string > LinkNamesPair
Definition: types.h:37
tesseract_common::CollisionMarginData::getCollisionMargin
double getCollisionMargin(const std::string &obj1, const std::string &obj2) const
Get the pairs collision margin data.
Definition: collision_margin_data.cpp:191
tesseract_common::almostEqualRelativeAndAbs
bool almostEqualRelativeAndAbs(double a, double b, double max_diff=1e-6, double max_rel_diff=std::numeric_limits< double >::epsilon())
Check if two double are relatively equal.
Definition: utils.cpp:445
tesseract_common::CollisionMarginPairData::setCollisionMargin
void setCollisionMargin(const std::string &obj1, const std::string &obj2, double margin)
Set the margin for a given contact pair.
Definition: collision_margin_data.cpp:48
tesseract_common::CollisionMarginPairData::operator!=
bool operator!=(const CollisionMarginPairData &rhs) const
Definition: collision_margin_data.cpp:154
utils.h
Common Tesseract Utility Functions.
tesseract_common::CollisionMarginData::scaleMargins
void scaleMargins(double scale)
Scale all margins by input value.
Definition: collision_margin_data.cpp:216
tesseract_common::CollisionMarginPairOverrideType
CollisionMarginPairOverrideType
Identifies how the provided contact margin data should be applied.
Definition: collision_margin_data.h:51
tesseract_common::CollisionMarginPairData::getMaxCollisionMargin
double getMaxCollisionMargin() const
Get the largest pair collision margin.
Definition: collision_margin_data.cpp:68
tesseract_common::CollisionMarginData::operator!=
bool operator!=(const CollisionMarginData &rhs) const
Definition: collision_margin_data.cpp:237
tesseract_common::CollisionMarginData::CollisionMarginData
CollisionMarginData(double default_collision_margin=0)
Definition: collision_margin_data.cpp:163
tesseract_common::CollisionMarginData::serialize
void serialize(Archive &ar, const unsigned int version)
Definition: collision_margin_data.cpp:240
tesseract_common::CollisionMarginData::apply
void apply(const CollisionMarginPairData &pair_margin_data, CollisionMarginPairOverrideType override_type)
Apply the contents of the provide CollisionMarginPairData based on the override type.
Definition: collision_margin_data.cpp:222
tesseract_common::CollisionMarginData::pair_margins_
CollisionMarginPairData pair_margins_
A map of link pair names to contact distance.
Definition: collision_margin_data.h:248
tesseract_common::CollisionMarginPairData::apply
void apply(const CollisionMarginPairData &pair_margin_data, CollisionMarginPairOverrideType override_type)
Apply the contents of the provide CollisionMarginPairData based on the override type.
Definition: collision_margin_data.cpp:107
tesseract_common::CollisionMarginPairData::incrementMargins
void incrementMargins(double increment)
Increment all margins by input amount. Useful for inflating or reducing margins.
Definition: collision_margin_data.cpp:72
tesseract_common::CollisionMarginData::incrementMargins
void incrementMargins(double increment)
Increment all margins by input amount. Useful for inflating or reducing margins.
Definition: collision_margin_data.cpp:210
tesseract_common::CollisionMarginData::default_collision_margin_
double default_collision_margin_
Stores the collision margin used if no pair-specific one is set.
Definition: collision_margin_data.h:245
tesseract_common::CollisionMarginPairData::scaleMargins
void scaleMargins(double scale)
Scale all margins by input value.
Definition: collision_margin_data.cpp:82
tesseract_common::CollisionMarginPairData
Definition: collision_margin_data.h:68
TESSERACT_COMMON_IGNORE_WARNINGS_POP
#define TESSERACT_COMMON_IGNORE_WARNINGS_POP
Definition: macros.h:72
tesseract_common::CollisionMarginPairData::serialize
void serialize(Archive &ar, const unsigned int version)
Definition: collision_margin_data.cpp:157
tesseract_common::CollisionMarginData::setDefaultCollisionMargin
void setDefaultCollisionMargin(double default_collision_margin)
Set the default collision margin.
Definition: collision_margin_data.cpp:179
tesseract_common::makeOrderedLinkPair
LinkNamesPair makeOrderedLinkPair(const std::string &link_name1, const std::string &link_name2)
Create a pair of strings, where the pair.first is always <= pair.second.
Definition: types.cpp:44
serialization.h
Additional Boost serialization wrappers.
tesseract_common::CollisionMarginPairData::clear
void clear()
Clear/Reset the data structure.
Definition: collision_margin_data.cpp:94
tesseract_common::CollisionMarginPairData::max_collision_margin_
double max_collision_margin_
Stores the largest collision margin.
Definition: collision_margin_data.h:147
tesseract_common::CollisionMarginPairData::operator==
bool operator==(const CollisionMarginPairData &rhs) const
Definition: collision_margin_data.cpp:132
tesseract_common::CollisionMarginData::operator==
bool operator==(const CollisionMarginData &rhs) const
Definition: collision_margin_data.cpp:228
tesseract_common::PairsCollisionMarginData
std::unordered_map< tesseract_common::LinkNamesPair, double, tesseract_common::PairHash > PairsCollisionMarginData
Definition: collision_margin_data.h:66
tesseract_common::CollisionMarginPairOverrideType::NONE
@ NONE
Do not apply contact margin data.


tesseract_common
Author(s): Levi Armstrong
autogenerated on Sun May 18 2025 03:01:40