check_trajectory_benchmarks.cpp
Go to the documentation of this file.
3 #include <benchmark/benchmark.h>
4 #include <algorithm>
5 #include <console_bridge/console.h>
22 
23 using namespace tesseract_scene_graph;
24 using namespace tesseract_srdf;
25 using namespace tesseract_collision;
26 using namespace tesseract_environment;
27 
29 {
30  std::string url = "package://tesseract_support/urdf/lbr_iiwa_14_r820.urdf";
31 
33  return tesseract_urdf::parseURDFFile(locator.locateResource(url)->getFilePath(), locator);
34 }
35 
37 {
38  std::string url = "package://tesseract_support/urdf/lbr_iiwa_14_r820.srdf";
40 
41  auto srdf = std::make_shared<SRDFModel>();
42  srdf->initFile(scene_graph, locator.locateResource(url)->getFilePath(), locator);
43 
44  return srdf;
45 }
46 
47 static void BM_CHECK_TRAJECTORY_CONTINUOUS_SS(benchmark::State& state,
48  std::vector<tesseract_collision::ContactResultMap> contacts,
51  std::vector<std::string> joint_names,
54  bool log_level_debug)
55 {
56  if (log_level_debug)
57  console_bridge::setLogLevel(console_bridge::LogLevel::CONSOLE_BRIDGE_LOG_DEBUG);
58  else
59  console_bridge::setLogLevel(console_bridge::LogLevel::CONSOLE_BRIDGE_LOG_INFO);
60 
61  for (auto _ : state)
62  {
63  benchmark::DoNotOptimize(checkTrajectory(contacts, *manager, *state_solver, joint_names, traj, config));
64  }
65 }
66 
67 static void BM_CHECK_TRAJECTORY_CONTINUOUS_MANIP(benchmark::State& state,
68  std::vector<tesseract_collision::ContactResultMap> contacts,
73  bool log_level_debug)
74 {
75  if (log_level_debug)
76  console_bridge::setLogLevel(console_bridge::LogLevel::CONSOLE_BRIDGE_LOG_DEBUG);
77  else
78  console_bridge::setLogLevel(console_bridge::LogLevel::CONSOLE_BRIDGE_LOG_INFO);
79 
80  for (auto _ : state)
81  {
82  benchmark::DoNotOptimize(checkTrajectory(contacts, *manager, *manip, traj, config));
83  }
84 }
85 
86 static void BM_CHECK_TRAJECTORY_DISCRETE_SS(benchmark::State& state,
87  std::vector<tesseract_collision::ContactResultMap> contacts,
90  std::vector<std::string> joint_names,
93  bool log_level_debug)
94 {
95  if (log_level_debug)
96  console_bridge::setLogLevel(console_bridge::LogLevel::CONSOLE_BRIDGE_LOG_DEBUG);
97  else
98  console_bridge::setLogLevel(console_bridge::LogLevel::CONSOLE_BRIDGE_LOG_INFO);
99 
100  for (auto _ : state)
101  {
102  benchmark::DoNotOptimize(checkTrajectory(contacts, *manager, *state_solver, joint_names, traj, config));
103  }
104 }
105 
106 static void BM_CHECK_TRAJECTORY_DISCRETE_MANIP(benchmark::State& state,
107  std::vector<tesseract_collision::ContactResultMap> contacts,
112  bool log_level_debug)
113 {
114  if (log_level_debug)
115  console_bridge::setLogLevel(console_bridge::LogLevel::CONSOLE_BRIDGE_LOG_DEBUG);
116  else
117  console_bridge::setLogLevel(console_bridge::LogLevel::CONSOLE_BRIDGE_LOG_INFO);
118 
119  for (auto _ : state)
120  {
121  benchmark::DoNotOptimize(checkTrajectory(contacts, *manager, *manip, traj, config));
122  }
123 }
124 
125 int main(int argc, char** argv)
126 {
127  auto env = std::make_shared<Environment>();
129  auto srdf = getSRDFModel(*scene_graph);
130  env->init(*scene_graph, srdf);
131  env->setResourceLocator(std::make_shared<tesseract_common::GeneralResourceLocator>());
132 
133  // Add sphere to environment
134  Link link_sphere("sphere_attached");
135 
136  Visual::Ptr visual = std::make_shared<Visual>();
137  visual->origin = Eigen::Isometry3d::Identity();
138  visual->origin.translation() = Eigen::Vector3d(0.5, 0, 0.55);
139  visual->geometry = std::make_shared<tesseract_geometry::Sphere>(0.15);
140  link_sphere.visual.push_back(visual);
141 
142  Collision::Ptr collision = std::make_shared<Collision>();
143  collision->origin = visual->origin;
144  collision->geometry = visual->geometry;
145  link_sphere.collision.push_back(collision);
146 
147  Joint joint_sphere("joint_sphere_attached");
148  joint_sphere.parent_link_name = "base_link";
149  joint_sphere.child_link_name = link_sphere.getName();
150  joint_sphere.type = JointType::FIXED;
151 
152  auto cmd = std::make_shared<tesseract_environment::AddLinkCommand>(link_sphere, joint_sphere);
153 
154  // Set the robot initial state
155  std::vector<std::string> joint_names;
156  joint_names.emplace_back("joint_a1");
157  joint_names.emplace_back("joint_a2");
158  joint_names.emplace_back("joint_a3");
159  joint_names.emplace_back("joint_a4");
160  joint_names.emplace_back("joint_a5");
161  joint_names.emplace_back("joint_a6");
162  joint_names.emplace_back("joint_a7");
163 
164  Eigen::VectorXd joint_start_pos(7);
165  joint_start_pos(0) = -0.4;
166  joint_start_pos(1) = 0.2762;
167  joint_start_pos(2) = 0.0;
168  joint_start_pos(3) = -1.3348;
169  joint_start_pos(4) = 0.0;
170  joint_start_pos(5) = 1.4959;
171  joint_start_pos(6) = 0.0;
172 
173  Eigen::VectorXd joint_end_pos(7);
174  joint_end_pos(0) = 0.4;
175  joint_end_pos(1) = 0.2762;
176  joint_end_pos(2) = 0.0;
177  joint_end_pos(3) = -1.3348;
178  joint_end_pos(4) = 0.0;
179  joint_end_pos(5) = 1.4959;
180  joint_end_pos(6) = 0.0;
181 
182  Eigen::VectorXd joint_pos_collision(7);
183  joint_pos_collision(0) = 0.0;
184  joint_pos_collision(1) = 0.2762;
185  joint_pos_collision(2) = 0.0;
186  joint_pos_collision(3) = -1.3348;
187  joint_pos_collision(4) = 0.0;
188  joint_pos_collision(5) = 1.4959;
189  joint_pos_collision(6) = 0.0;
190 
191  std::vector<tesseract_common::TrajArray> traj_arrays;
192 
193  // Only intermediat states are in collision
194  tesseract_common::TrajArray traj(5, joint_start_pos.size());
195  for (int i = 0; i < joint_start_pos.size(); ++i)
196  traj.col(i) = Eigen::VectorXd::LinSpaced(5, joint_start_pos(i), joint_end_pos(i));
197 
198  // Only start state is not in collision
199  tesseract_common::TrajArray traj2(3, joint_start_pos.size());
200  for (int i = 0; i < joint_start_pos.size(); ++i)
201  traj2.col(i) = Eigen::VectorXd::LinSpaced(3, joint_start_pos(i), joint_pos_collision(i));
202 
203  // Only start state is not in collision
204  tesseract_common::TrajArray traj3(3, joint_start_pos.size());
205  for (int i = 0; i < joint_start_pos.size(); ++i)
206  traj3.col(i) = Eigen::VectorXd::LinSpaced(3, joint_pos_collision(i), joint_end_pos(i));
207 
208  // Only two states
209  tesseract_common::TrajArray traj4(2, joint_start_pos.size());
210  traj4.row(0) = joint_pos_collision;
211  traj4.row(1) = joint_end_pos;
212 
213  tesseract_common::TrajArray traj5(2, joint_start_pos.size());
214  traj5.row(0) = joint_start_pos;
215  traj5.row(1) = joint_pos_collision;
216 
217  traj_arrays.push_back(traj);
218  traj_arrays.push_back(traj2);
219  traj_arrays.push_back(traj3);
220  traj_arrays.push_back(traj4);
221  traj_arrays.push_back(traj5);
222 
223  tesseract_collision::DiscreteContactManager::Ptr discrete_manager = env->getDiscreteContactManager();
224  tesseract_collision::ContinuousContactManager::Ptr continuous_manager = env->getContinuousContactManager();
225  tesseract_scene_graph::StateSolver::Ptr state_solver = env->getStateSolver();
226  tesseract_kinematics::JointGroup::ConstPtr joint_group = env->getJointGroup("manipulator");
227  std::vector<tesseract_collision::ContactResultMap> contacts;
229  discrete_config.type = CollisionEvaluatorType::DISCRETE;
230  discrete_config.check_program_mode = CollisionCheckProgramType::ALL;
231  tesseract_collision::CollisionCheckConfig discrete_lvs_config;
232  discrete_lvs_config.type = CollisionEvaluatorType::LVS_DISCRETE;
233  discrete_lvs_config.check_program_mode = CollisionCheckProgramType::ALL;
235  continuous_config.type = CollisionEvaluatorType::CONTINUOUS;
236  continuous_config.check_program_mode = CollisionCheckProgramType::ALL;
237  tesseract_collision::CollisionCheckConfig continuous_lvs_config;
238  continuous_lvs_config.type = CollisionEvaluatorType::LVS_CONTINUOUS;
239  continuous_lvs_config.check_program_mode = CollisionCheckProgramType::ALL;
240 
242  // Clone
244 
245  {
246  std::function<void(benchmark::State&,
247  std::vector<tesseract_collision::ContactResultMap>,
250  std::vector<std::string>,
253  bool)>
254  BM_CHECK_TRAJ_CS = BM_CHECK_TRAJECTORY_CONTINUOUS_SS;
255  std::function<void(benchmark::State&,
256  std::vector<tesseract_collision::ContactResultMap>,
261  bool)>
262  BM_CHECK_TRAJ_CM = BM_CHECK_TRAJECTORY_CONTINUOUS_MANIP;
263  std::function<void(benchmark::State&,
264  std::vector<tesseract_collision::ContactResultMap>,
267  std::vector<std::string>,
270  bool)>
271  BM_CHECK_TRAJ_DS = BM_CHECK_TRAJECTORY_DISCRETE_SS;
272  std::function<void(benchmark::State&,
273  std::vector<tesseract_collision::ContactResultMap>,
278  bool)>
279  BM_CHECK_TRAJ_DM = BM_CHECK_TRAJECTORY_DISCRETE_MANIP;
280 
281  for (const bool log_level_debug : { false, true })
282  {
283  for (std::size_t i = 0; i < traj_arrays.size(); i++)
284  {
285  std::string debug_str = "";
286  if (log_level_debug)
287  debug_str = "-Debug";
288  const auto& traj_array = traj_arrays[i];
289  std::string BM_CHECK_TRAJ_CS_name =
290  "BM_CHECK_TRAJ_CONTINUOUS_STATE_SOLVER-TRAJ" + std::to_string(i + 1) + debug_str;
291  std::string BM_CHECK_TRAJ_CS_LVS_name =
292  "BM_CHECK_TRAJ_CONTINUOUS_STATE_SOLVER-TRAJ" + std::to_string(i + 1) + "-LVS" + debug_str;
293  std::string BM_CHECK_TRAJ_CM_name =
294  "BM_CHECK_TRAJ_CONTINUOUS_JOINT_GROUP-TRAJ" + std::to_string(i + 1) + debug_str;
295  std::string BM_CHECK_TRAJ_CM_LVS_name =
296  "BM_CHECK_TRAJ_CONTINUOUS_JOINT_GROUP-TRAJ" + std::to_string(i + 1) + "-LVS" + debug_str;
297  std::string BM_CHECK_TRAJ_DS_name =
298  "BM_CHECK_TRAJ_DISCRETE_STATE_SOLVER-TRAJ" + std::to_string(i + 1) + debug_str;
299  std::string BM_CHECK_TRAJ_DS_LVS_name =
300  "BM_CHECK_TRAJ_DISCRETE_STATE_SOLVER-TRAJ" + std::to_string(i + 1) + "-LVS" + debug_str;
301  std::string BM_CHECK_TRAJ_DM_name =
302  "BM_CHECK_TRAJ_DISCRETE_JOINT_GROUP-TRAJ" + std::to_string(i + 1) + debug_str;
303  std::string BM_CHECK_TRAJ_DM_LVS_name =
304  "BM_CHECK_TRAJ_DISCRETE_JOINT_GROUP-TRAJ" + std::to_string(i + 1) + "-LVS" + debug_str;
305 
306  benchmark::RegisterBenchmark(BM_CHECK_TRAJ_CS_name.c_str(),
307  BM_CHECK_TRAJ_CS,
308  contacts,
309  continuous_manager,
310  state_solver,
311  joint_names,
312  traj_array,
313  continuous_config,
314  log_level_debug)
315  ->UseRealTime()
316  ->Unit(benchmark::TimeUnit::kMicrosecond);
317  benchmark::RegisterBenchmark(BM_CHECK_TRAJ_CS_LVS_name.c_str(),
318  BM_CHECK_TRAJ_CS,
319  contacts,
320  continuous_manager,
321  state_solver,
322  joint_names,
323  traj,
324  continuous_lvs_config,
325  log_level_debug)
326  ->UseRealTime()
327  ->Unit(benchmark::TimeUnit::kMicrosecond);
328  benchmark::RegisterBenchmark(BM_CHECK_TRAJ_CM_name.c_str(),
329  BM_CHECK_TRAJ_CM,
330  contacts,
331  continuous_manager,
332  joint_group,
333  traj_array,
334  continuous_config,
335  log_level_debug)
336  ->UseRealTime()
337  ->Unit(benchmark::TimeUnit::kMicrosecond);
338  benchmark::RegisterBenchmark(BM_CHECK_TRAJ_CM_LVS_name.c_str(),
339  BM_CHECK_TRAJ_CM,
340  contacts,
341  continuous_manager,
342  joint_group,
343  traj_array,
344  continuous_lvs_config,
345  log_level_debug)
346  ->UseRealTime()
347  ->Unit(benchmark::TimeUnit::kMicrosecond);
348  benchmark::RegisterBenchmark(BM_CHECK_TRAJ_DS_name.c_str(),
349  BM_CHECK_TRAJ_DS,
350  contacts,
351  discrete_manager,
352  state_solver,
353  joint_names,
354  traj_array,
355  discrete_config,
356  log_level_debug)
357  ->UseRealTime()
358  ->Unit(benchmark::TimeUnit::kMicrosecond);
359  benchmark::RegisterBenchmark(BM_CHECK_TRAJ_DS_LVS_name.c_str(),
360  BM_CHECK_TRAJ_DS,
361  contacts,
362  discrete_manager,
363  state_solver,
364  joint_names,
365  traj,
366  discrete_lvs_config,
367  log_level_debug)
368  ->UseRealTime()
369  ->Unit(benchmark::TimeUnit::kMicrosecond);
370  benchmark::RegisterBenchmark(BM_CHECK_TRAJ_DM_name.c_str(),
371  BM_CHECK_TRAJ_DM,
372  contacts,
373  discrete_manager,
374  joint_group,
375  traj_array,
376  discrete_config,
377  log_level_debug)
378  ->UseRealTime()
379  ->Unit(benchmark::TimeUnit::kMicrosecond);
380  benchmark::RegisterBenchmark(BM_CHECK_TRAJ_DM_LVS_name.c_str(),
381  BM_CHECK_TRAJ_DM,
382  contacts,
383  discrete_manager,
384  joint_group,
385  traj_array,
386  discrete_lvs_config,
387  log_level_debug)
388  ->UseRealTime()
389  ->Unit(benchmark::TimeUnit::kMicrosecond);
390  }
391  }
392  }
393 
394  benchmark::Initialize(&argc, argv);
395  benchmark::RunSpecifiedBenchmarks();
396 }
main
int main(int argc, char **argv)
Definition: check_trajectory_benchmarks.cpp:125
graph.h
tesseract_srdf::SRDFModel::Ptr
std::shared_ptr< SRDFModel > Ptr
tesseract_srdf
tesseract_environment
Definition: command.h:45
tesseract_collision::ContinuousContactManager::Ptr
std::shared_ptr< ContinuousContactManager > Ptr
BM_CHECK_TRAJECTORY_DISCRETE_MANIP
static void BM_CHECK_TRAJECTORY_DISCRETE_MANIP(benchmark::State &state, std::vector< tesseract_collision::ContactResultMap > contacts, tesseract_collision::DiscreteContactManager::Ptr manager, tesseract_kinematics::JointGroup::ConstPtr manip, tesseract_common::TrajArray traj, tesseract_collision::CollisionCheckConfig config, bool log_level_debug)
Definition: check_trajectory_benchmarks.cpp:106
resource_locator.h
joint.h
TESSERACT_COMMON_IGNORE_WARNINGS_PUSH
#define TESSERACT_COMMON_IGNORE_WARNINGS_PUSH
BM_CHECK_TRAJECTORY_CONTINUOUS_SS
static void BM_CHECK_TRAJECTORY_CONTINUOUS_SS(benchmark::State &state, std::vector< tesseract_collision::ContactResultMap > contacts, tesseract_collision::ContinuousContactManager::Ptr manager, tesseract_scene_graph::StateSolver::Ptr state_solver, std::vector< std::string > joint_names, tesseract_common::TrajArray traj, tesseract_collision::CollisionCheckConfig config, bool log_level_debug)
Definition: check_trajectory_benchmarks.cpp:47
tesseract_scene_graph::SceneGraph
getSRDFModel
SRDFModel::Ptr getSRDFModel(const SceneGraph &scene_graph)
Definition: check_trajectory_benchmarks.cpp:36
BM_CHECK_TRAJECTORY_CONTINUOUS_MANIP
static void BM_CHECK_TRAJECTORY_CONTINUOUS_MANIP(benchmark::State &state, std::vector< tesseract_collision::ContactResultMap > contacts, tesseract_collision::ContinuousContactManager::Ptr manager, tesseract_kinematics::JointGroup::ConstPtr manip, tesseract_common::TrajArray traj, tesseract_collision::CollisionCheckConfig config, bool log_level_debug)
Definition: check_trajectory_benchmarks.cpp:67
tesseract_collision::CollisionCheckConfig::type
CollisionEvaluatorType type
urdf_parser.h
BM_CHECK_TRAJECTORY_DISCRETE_SS
static void BM_CHECK_TRAJECTORY_DISCRETE_SS(benchmark::State &state, std::vector< tesseract_collision::ContactResultMap > contacts, tesseract_collision::DiscreteContactManager::Ptr manager, tesseract_scene_graph::StateSolver::Ptr state_solver, std::vector< std::string > joint_names, tesseract_common::TrajArray traj, tesseract_collision::CollisionCheckConfig config, bool log_level_debug)
Definition: check_trajectory_benchmarks.cpp:86
tesseract_collision::CollisionCheckConfig::check_program_mode
CollisionCheckProgramType check_program_mode
discrete_contact_manager.h
tesseract_common::TrajArray
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor > TrajArray
utils.h
Tesseract Environment Utility Functions.
tesseract_urdf::parseURDFFile
std::unique_ptr< tesseract_scene_graph::SceneGraph > parseURDFFile(const std::string &path, const tesseract_common::ResourceLocator &locator)
tesseract_scene_graph::Joint::child_link_name
std::string child_link_name
tesseract_collision::CollisionCheckConfig
tesseract_scene_graph::Collision::Ptr
std::shared_ptr< Collision > Ptr
sphere.h
TESSERACT_COMMON_IGNORE_WARNINGS_POP
state_solver.h
continuous_contact_manager.h
tesseract_scene_graph::Joint
tesseract_common::GeneralResourceLocator::locateResource
std::shared_ptr< Resource > locateResource(const std::string &url) const override
srdf_model.h
tesseract_scene_graph::StateSolver::Ptr
std::shared_ptr< StateSolver > Ptr
tesseract_kinematics::JointGroup::ConstPtr
std::shared_ptr< const JointGroup > ConstPtr
tesseract_scene_graph::Visual::Ptr
std::shared_ptr< Visual > Ptr
environment.h
tesseract_common::GeneralResourceLocator
tesseract_scene_graph::Joint::type
JointType type
tesseract_collision
joint_group.h
macros.h
tesseract_scene_graph::SceneGraph::Ptr
std::shared_ptr< SceneGraph > Ptr
getSceneGraph
SceneGraph::Ptr getSceneGraph()
Definition: check_trajectory_benchmarks.cpp:28
tesseract_scene_graph
tesseract_collision::DiscreteContactManager::Ptr
std::shared_ptr< DiscreteContactManager > Ptr
tesseract_scene_graph::Joint::parent_link_name
std::string parent_link_name
tesseract_scene_graph::JointType::FIXED
@ FIXED
tesseract_environment::checkTrajectory
bool checkTrajectory(std::vector< tesseract_collision::ContactResultMap > &contacts, tesseract_collision::ContinuousContactManager &manager, const tesseract_scene_graph::StateSolver &state_solver, const std::vector< std::string > &joint_names, const tesseract_common::TrajArray &traj, const tesseract_collision::CollisionCheckConfig &config)
Should perform a continuous collision check over the trajectory and stop on first collision.
Definition: utils.cpp:437


tesseract_environment
Author(s): Levi Armstrong
autogenerated on Sun May 18 2025 03:02:21