utils.cpp
Go to the documentation of this file.
1 
29 #include <iostream>
30 #include <console_bridge/console.h>
32 
40 
41 namespace tesseract_environment
42 {
54 void getActiveLinkNamesRecursive(std::vector<std::string>& active_links,
55  const tesseract_scene_graph::SceneGraph& scene_graph,
56  const std::string& current_link,
57  bool active)
58 {
59  // recursively get all active links
60  assert(scene_graph.isTree());
61  if (active)
62  {
63  active_links.push_back(current_link);
64  for (const auto& child_link : scene_graph.getAdjacentLinkNames(current_link))
65  getActiveLinkNamesRecursive(active_links, scene_graph, child_link, active);
66  }
67  else
68  {
69  for (const auto& child_link : scene_graph.getAdjacentLinkNames(current_link))
70  if (scene_graph.getInboundJoints(child_link)[0]->type != tesseract_scene_graph::JointType::FIXED)
71  getActiveLinkNamesRecursive(active_links, scene_graph, child_link, true);
72  else
73  getActiveLinkNamesRecursive(active_links, scene_graph, child_link, active);
74  }
75 }
76 
79  const tesseract_common::TransformMap& state0,
80  const tesseract_common::TransformMap& state1,
81  const tesseract_collision::ContactRequest& contact_request)
82 {
83  for (const auto& link_name : manager.getActiveCollisionObjects())
84  manager.setCollisionObjectsTransform(link_name, state0.at(link_name), state1.at(link_name));
85 
86  manager.contactTest(contact_results, contact_request);
87 }
88 
91  const tesseract_common::TransformMap& state,
92  const tesseract_collision::ContactRequest& contact_request)
93 {
94  for (const auto& link_name : manager.getActiveCollisionObjects())
95  manager.setCollisionObjectsTransform(link_name, state.at(link_name));
96 
97  manager.contactTest(contact_results, contact_request);
98 }
99 
102  const tesseract_common::TransformMap& state,
103  const tesseract_collision::ContactRequest& contact_request)
104 {
105  for (const auto& link_name : manager.getActiveCollisionObjects())
106  manager.setCollisionObjectsTransform(link_name, state.at(link_name), state.at(link_name));
107 
108  manager.contactTest(contact_results, contact_request);
109 }
110 
111 void printContinuousDebugInfo(const std::vector<std::string>& joint_names,
112  const Eigen::VectorXd& swp0,
113  const Eigen::VectorXd& swp1,
114  tesseract_common::TrajArray::Index step_idx,
115  tesseract_common::TrajArray::Index step_size,
116  tesseract_common::TrajArray::Index sub_step_idx = -1)
117 {
118  std::stringstream ss;
119  ss << "Continuous collision detected at step: " << step_idx << " of " << step_size;
120  if (sub_step_idx >= 0)
121  ss << " substep: " << sub_step_idx;
122  ss << "\n";
123 
124  ss << " Names:";
125  for (const auto& name : joint_names)
126  ss << " " << name;
127 
128  ss << "\n"
129  << " State0: " << swp0 << "\n"
130  << " State1: " << swp1 << "\n";
131 
132  CONSOLE_BRIDGE_logDebug(ss.str().c_str());
133 }
134 
135 void printDiscreteDebugInfo(const std::vector<std::string>& joint_names,
136  const Eigen::VectorXd& swp,
137  tesseract_common::TrajArray::Index step_idx,
138  tesseract_common::TrajArray::Index step_size,
139  tesseract_common::TrajArray::Index sub_step_idx = -1)
140 {
141  std::stringstream ss;
142  ss << "Discrete collision detected at step: " << step_idx << " of " << step_size;
143  if (sub_step_idx >= 0)
144  ss << " substep: " << sub_step_idx;
145  ss << "\n";
146 
147  ss << " Names:";
148  for (const auto& name : joint_names)
149  ss << " " << name;
150 
151  ss << "\n"
152  << " State: " << swp << "\n";
153 
154  CONSOLE_BRIDGE_logDebug(ss.str().c_str());
155 }
156 
157 using CalcStateFn = std::function<tesseract_common::TransformMap(const Eigen::VectorXd& state)>;
158 
159 bool checkTrajectory(std::vector<tesseract_collision::ContactResultMap>& contacts,
161  const CalcStateFn& state_fn,
162  const std::vector<std::string>& joint_names,
163  const tesseract_common::TrajArray& traj,
165 {
168  throw std::runtime_error("checkTrajectory was given an CollisionEvaluatorType that is inconsistent with the "
169  "ContactManager type");
170 
171  if (traj.rows() < 2)
172  throw std::runtime_error("checkTrajectory was given continuous contact manager with a trajectory that only has one "
173  "state.");
174 
175  bool debug_logging = console_bridge::getLogLevel() < console_bridge::LogLevel::CONSOLE_BRIDGE_LOG_INFO;
176 
178  if (debug_logging)
179  {
180  traj_contacts =
181  std::make_unique<tesseract_collision::ContactTrajectoryResults>(joint_names, static_cast<int>(traj.rows()));
182  }
183 
184  contacts.clear();
185  contacts.reserve(static_cast<std::size_t>(traj.rows()));
186 
189  tesseract_collision::ContactResultMap sub_state_results;
190 
191  bool found = false;
193  {
194  tesseract_common::TransformMap state = state_fn(traj.row(0));
195  sub_state_results.clear();
196  checkTrajectoryState(sub_state_results, manager, state, config.contact_request);
197 
198  if (!sub_state_results.empty())
199  {
200  found = true;
201  // Always use addInterpolatedCollisionResults so cc_type is defined correctly
202  state_results.addInterpolatedCollisionResults(
203  sub_state_results, 0, 0, manager.getActiveCollisionObjects(), 0, false);
204  if (debug_logging)
205  printContinuousDebugInfo(joint_names, traj.row(0), traj.row(0), 0, traj.rows() - 1);
206  }
207 
208  contacts.push_back(state_results);
209  return found;
210  }
211 
213  {
214  tesseract_common::TransformMap state = state_fn(traj.row(traj.rows() - 1));
215  sub_state_results.clear();
216  tesseract_environment::checkTrajectoryState(sub_state_results, manager, state, config.contact_request);
217 
218  if (!sub_state_results.empty())
219  {
220  found = true;
221  // Always use addInterpolatedCollisionResults so cc_type is defined correctly
222  state_results.addInterpolatedCollisionResults(
223  sub_state_results, 0, 0, manager.getActiveCollisionObjects(), 0, false);
224  if (debug_logging)
225  printContinuousDebugInfo(joint_names, traj.row(traj.rows() - 1), traj.row(traj.rows() - 1), 0, traj.rows() - 1);
226  }
227  contacts.push_back(state_results);
228  return found;
229  }
230 
232  {
233  for (tesseract_common::TrajArray::Index iStep = 0; iStep < traj.rows() - 1; ++iStep)
234  {
235  state_results.clear();
236 
237  double dist = (traj.row(iStep + 1) - traj.row(iStep)).norm();
238  if (dist > config.longest_valid_segment_length)
239  {
240  tesseract_common::TrajArray::Index cnt =
241  static_cast<tesseract_common::TrajArray::Index>(std::ceil(dist / config.longest_valid_segment_length)) + 1;
242  tesseract_common::TrajArray subtraj(cnt, traj.cols());
243  for (tesseract_common::TrajArray::Index iVar = 0; iVar < traj.cols(); ++iVar)
244  subtraj.col(iVar) = Eigen::VectorXd::LinSpaced(cnt, traj.row(iStep)(iVar), traj.row(iStep + 1)(iVar));
245 
247 
248  if (debug_logging)
249  {
250  step_contacts = std::make_unique<tesseract_collision::ContactTrajectoryStepResults>(
251  static_cast<int>(iStep + 1), traj.row(iStep), traj.row(iStep + 1), static_cast<int>(subtraj.rows()));
252  }
253 
254  auto sub_segment_last_index = static_cast<int>(subtraj.rows() - 1);
255 
256  // Update start index based on collision check program mode
257  tesseract_common::TrajArray::Index start_idx{ 0 };
258  tesseract_common::TrajArray::Index end_idx{ subtraj.rows() - 1 };
259  if (iStep == 0)
260  {
263  ++start_idx;
264  }
265 
266  if (iStep == (traj.rows() - 2))
267  {
270  --end_idx;
271  }
272 
273  for (tesseract_common::TrajArray::Index iSubStep = start_idx; iSubStep < end_idx; ++iSubStep)
274  {
276  if (debug_logging)
277  {
278  substep_contacts = std::make_unique<tesseract_collision::ContactTrajectorySubstepResults>(
279  static_cast<int>(iSubStep) + 1, subtraj.row(iSubStep), subtraj.row(iSubStep + 1));
280  }
281 
282  tesseract_common::TransformMap state0 = state_fn(subtraj.row(iSubStep));
283  tesseract_common::TransformMap state1 = state_fn(subtraj.row(iSubStep + 1));
284  sub_state_results.clear();
285  checkTrajectorySegment(sub_state_results, manager, state0, state1, config.contact_request);
286  if (!sub_state_results.empty())
287  {
288  found = true;
289 
290  if (debug_logging)
291  {
292  substep_contacts->contacts = sub_state_results;
293  step_contacts->substeps[static_cast<size_t>(iSubStep)] = *substep_contacts;
294  }
295  double segment_dt = (sub_segment_last_index > 0) ? 1.0 / static_cast<double>(sub_segment_last_index) : 0.0;
296  // Always use addInterpolatedCollisionResults so cc_type is defined correctly
297  state_results.addInterpolatedCollisionResults(sub_state_results,
298  iSubStep,
299  sub_segment_last_index,
300  manager.getActiveCollisionObjects(),
301  segment_dt,
302  false);
303  }
304 
306  break;
307  }
308  contacts.push_back(state_results);
309 
310  if (debug_logging)
311  {
312  traj_contacts->steps[static_cast<size_t>(iStep)] = *step_contacts;
313  }
314 
316  break;
317  }
318  else
319  {
320  // Update start and end index based on collision check program mode
321  if (iStep == 0)
322  {
325  {
326  contacts.emplace_back();
327  continue;
328  }
329  }
330  if (iStep == (traj.rows() - 2))
331  {
334  continue;
335  }
336 
339 
340  if (debug_logging)
341  {
342  step_contacts = std::make_unique<tesseract_collision::ContactTrajectoryStepResults>(
343  static_cast<int>(iStep + 1), traj.row(iStep), traj.row(iStep + 1), 1);
344  substep_contacts = std::make_unique<tesseract_collision::ContactTrajectorySubstepResults>(
345  1, traj.row(iStep), traj.row(iStep + 1));
346  }
347 
348  tesseract_common::TransformMap state0 = state_fn(traj.row(iStep));
349  tesseract_common::TransformMap state1 = state_fn(traj.row(iStep + 1));
350  checkTrajectorySegment(state_results, manager, state0, state1, config.contact_request);
351  if (!state_results.empty())
352  {
353  found = true;
354  // For continuous no lvs addInterpolatedCollisionResults should not be used.
355 
356  if (debug_logging)
357  {
358  substep_contacts->contacts = state_results;
359  step_contacts->substeps[0] = *substep_contacts;
360  traj_contacts->steps[static_cast<size_t>(iStep)] = *step_contacts;
361  }
362  }
363  contacts.push_back(state_results);
364 
365  if (debug_logging)
366  {
367  traj_contacts->steps[static_cast<size_t>(iStep)] = *step_contacts;
368  }
369 
371  break;
372  }
373  }
374  }
375  else
376  {
377  tesseract_common::TrajArray::Index start_idx{ 0 };
378  tesseract_common::TrajArray::Index end_idx{ traj.rows() - 1 };
381  {
382  contacts.emplace_back();
383  ++start_idx;
384  }
385 
388  --end_idx;
389 
390  for (tesseract_common::TrajArray::Index iStep = start_idx; iStep < end_idx; ++iStep)
391  {
394  if (debug_logging)
395  {
396  step_contacts = std::make_unique<tesseract_collision::ContactTrajectoryStepResults>(
397  static_cast<int>(iStep + 1), traj.row(iStep), traj.row(iStep + 1), 1);
398  substep_contacts = std::make_unique<tesseract_collision::ContactTrajectorySubstepResults>(
399  1, traj.row(iStep), traj.row(iStep + 1));
400  }
401 
402  tesseract_common::TransformMap state0 = state_fn(traj.row(iStep));
403  tesseract_common::TransformMap state1 = state_fn(traj.row(iStep + 1));
404 
405  state_results.clear();
406  checkTrajectorySegment(state_results, manager, state0, state1, config.contact_request);
407  if (!state_results.empty())
408  {
409  found = true;
410  // For continuous no lvs addInterpolatedCollisionResults should not be used.
411 
412  if (debug_logging)
413  {
414  substep_contacts->contacts = state_results;
415  step_contacts->substeps[0] = *substep_contacts;
416  traj_contacts->steps[static_cast<size_t>(iStep)] = *step_contacts;
417  }
418  }
419  contacts.push_back(state_results);
420 
421  if (debug_logging)
422  {
423  traj_contacts->steps[static_cast<size_t>(iStep)] = *step_contacts;
424  }
425 
427  break;
428  }
429  }
430 
431  if (debug_logging)
432  std::cout << traj_contacts->trajectoryCollisionResultsTable().str();
433 
434  return found;
435 }
436 
437 bool checkTrajectory(std::vector<tesseract_collision::ContactResultMap>& contacts,
439  const tesseract_scene_graph::StateSolver& state_solver,
440  const std::vector<std::string>& joint_names,
441  const tesseract_common::TrajArray& traj,
443 {
444  CalcStateFn state_fn = [&joint_names, &state_solver](const Eigen::VectorXd& state) {
445  return state_solver.getState(joint_names, state).link_transforms;
446  };
447 
448  return checkTrajectory(contacts, manager, state_fn, joint_names, traj, config);
449 }
450 
451 bool checkTrajectory(std::vector<tesseract_collision::ContactResultMap>& contacts,
454  const tesseract_common::TrajArray& traj,
456 {
457  CalcStateFn state_fn = [&manip](const Eigen::VectorXd& state) { return manip.calcFwdKin(state); };
458 
459  const std::vector<std::string> joint_names = manip.getJointNames();
460  return checkTrajectory(contacts, manager, state_fn, joint_names, traj, config);
461 }
462 
463 bool checkTrajectory(std::vector<tesseract_collision::ContactResultMap>& contacts,
465  const CalcStateFn& state_fn,
466  const std::vector<std::string>& joint_names,
467  const tesseract_common::TrajArray& traj,
469 {
472  throw std::runtime_error("checkTrajectory was given an CollisionEvaluatorType that is inconsistent with the "
473  "ContactManager type");
474 
475  if (traj.rows() == 0)
476  throw std::runtime_error("checkTrajectory was given continuous contact manager with empty trajectory.");
477 
478  bool debug_logging = console_bridge::getLogLevel() < console_bridge::LogLevel::CONSOLE_BRIDGE_LOG_INFO;
479 
481  if (debug_logging)
482  {
483  traj_contacts =
484  std::make_unique<tesseract_collision::ContactTrajectoryResults>(joint_names, static_cast<int>(traj.rows()));
485  }
486 
487  contacts.clear();
488  contacts.reserve(static_cast<std::size_t>(traj.rows()));
489 
492  tesseract_collision::ContactResultMap sub_state_results;
493 
494  bool found = false;
496  {
497  tesseract_common::TransformMap state = state_fn(traj.row(0));
498  sub_state_results.clear();
499  tesseract_environment::checkTrajectoryState(sub_state_results, manager, state, config.contact_request);
500 
501  if (!sub_state_results.empty())
502  {
503  found = true;
504  // Always use addInterpolatedCollisionResults so cc_type is defined correctly
505  state_results.addInterpolatedCollisionResults(
506  sub_state_results, 0, 0, manager.getActiveCollisionObjects(), 0, true);
507  if (debug_logging)
508  printDiscreteDebugInfo(joint_names, traj.row(0), 0, traj.rows() - 1);
509  }
510  contacts.push_back(state_results);
511  return found;
512  }
513 
515  {
516  tesseract_common::TransformMap state = state_fn(traj.row(traj.rows() - 1));
517  sub_state_results.clear();
518  tesseract_environment::checkTrajectoryState(sub_state_results, manager, state, config.contact_request);
519 
520  if (!sub_state_results.empty())
521  {
522  found = true;
523  // Always use addInterpolatedCollisionResults so cc_type is defined correctly
524  state_results.addInterpolatedCollisionResults(
525  sub_state_results, 0, 0, manager.getActiveCollisionObjects(), 0, true);
526  if (debug_logging)
527  printDiscreteDebugInfo(joint_names, traj.row(traj.rows() - 1), 0, traj.rows() - 1);
528  }
529  contacts.push_back(state_results);
530  return found;
531  }
532 
533  if (traj.rows() == 1)
534  {
537  if (debug_logging)
538  {
539  step_contacts = std::make_unique<tesseract_collision::ContactTrajectoryStepResults>(1, traj.row(0));
540  substep_contacts = std::make_unique<tesseract_collision::ContactTrajectorySubstepResults>(1, traj.row(0));
541  }
542 
544  return true;
545 
546  auto sub_segment_last_index = static_cast<int>(traj.rows() - 1);
547  state_results.clear();
548  tesseract_common::TransformMap state = state_fn(traj.row(0));
549  sub_state_results.clear();
550  checkTrajectoryState(sub_state_results, manager, state, config.contact_request);
551 
552  if (debug_logging)
553  {
554  substep_contacts->contacts = sub_state_results;
555  step_contacts->substeps[0] = *substep_contacts;
556  traj_contacts->steps[0] = *step_contacts;
557  }
558 
559  double segment_dt = (sub_segment_last_index > 0) ? 1.0 / static_cast<double>(sub_segment_last_index) : 0.0;
560  state_results.addInterpolatedCollisionResults(
561  sub_state_results, 0, sub_segment_last_index, manager.getActiveCollisionObjects(), segment_dt, true);
562  contacts.push_back(state_results);
563 
564  if (debug_logging)
565  std::cout << traj_contacts->trajectoryCollisionResultsTable().str();
566 
567  return (!state_results.empty());
568  }
569 
571  {
572  for (int iStep = 0; iStep < (traj.rows() - 1); ++iStep)
573  {
574  state_results.clear();
575 
576  const double dist = (traj.row(iStep + 1) - traj.row(iStep)).norm();
577  if (dist > config.longest_valid_segment_length)
578  {
579  int cnt = static_cast<int>(std::ceil(dist / config.longest_valid_segment_length)) + 1;
580  tesseract_common::TrajArray subtraj(cnt, traj.cols());
581  for (tesseract_common::TrajArray::Index iVar = 0; iVar < traj.cols(); ++iVar)
582  subtraj.col(iVar) = Eigen::VectorXd::LinSpaced(cnt, traj.row(iStep)(iVar), traj.row(iStep + 1)(iVar));
583 
585 
586  if (debug_logging)
587  {
588  step_contacts = std::make_unique<tesseract_collision::ContactTrajectoryStepResults>(
589  iStep + 1, traj.row(iStep), traj.row(iStep + 1), static_cast<int>(subtraj.rows()));
590  }
591 
592  auto sub_segment_last_index = static_cast<int>(subtraj.rows() - 1);
593 
594  // Update start index based on collision check program mode
595  tesseract_common::TrajArray::Index start_idx{ 0 };
596  tesseract_common::TrajArray::Index end_idx{ subtraj.rows() - 1 };
597  if (iStep == 0)
598  {
601  ++start_idx;
602  }
603 
604  if (iStep == (traj.rows() - 2))
605  {
606  // This is the last segment so check the last state
607  end_idx = subtraj.rows();
610  --end_idx;
611  }
612 
613  for (tesseract_common::TrajArray::Index iSubStep = start_idx; iSubStep < end_idx; ++iSubStep)
614  {
616  if (debug_logging)
617  {
618  substep_contacts = std::make_unique<tesseract_collision::ContactTrajectorySubstepResults>(
619  static_cast<int>(iSubStep) + 1, subtraj.row(iSubStep));
620  }
621 
622  tesseract_common::TransformMap state = state_fn(subtraj.row(iSubStep));
623  sub_state_results.clear();
624  checkTrajectoryState(sub_state_results, manager, state, config.contact_request);
625  if (!sub_state_results.empty())
626  {
627  found = true;
628  if (debug_logging)
629  {
630  substep_contacts->contacts = sub_state_results;
631  step_contacts->substeps[static_cast<size_t>(iSubStep)] = *substep_contacts;
632  }
633  double segment_dt = (sub_segment_last_index > 0) ? 1.0 / static_cast<double>(sub_segment_last_index) : 0.0;
634  state_results.addInterpolatedCollisionResults(sub_state_results,
635  iSubStep,
636  sub_segment_last_index,
637  manager.getActiveCollisionObjects(),
638  segment_dt,
639  true);
640  }
641 
643  break;
644  }
645  contacts.push_back(state_results);
646 
647  if (debug_logging)
648  {
649  traj_contacts->steps[static_cast<size_t>(iStep)] = *step_contacts;
650  }
651 
653  break;
654  }
655  else
656  {
657  // Special case when using LVS and only two states
661  if (debug_logging)
662  {
663  step_contacts =
664  std::make_unique<tesseract_collision::ContactTrajectoryStepResults>(iStep + 1, traj.row(iStep));
665  substep_contacts = std::make_unique<tesseract_collision::ContactTrajectorySubstepResults>(1, traj.row(iStep));
666  end_substep_contacts =
667  std::make_unique<tesseract_collision::ContactTrajectorySubstepResults>(2, traj.row(iStep + 1));
668  }
669 
670  if (iStep == 0 && traj.rows() == 2)
671  {
674  {
675  tesseract_common::TransformMap state = state_fn(traj.row(iStep));
676  sub_state_results.clear();
677  checkTrajectoryState(sub_state_results, manager, state, config.contact_request);
678  if (!sub_state_results.empty())
679  {
680  found = true;
681  if (debug_logging)
682  {
683  substep_contacts->contacts = sub_state_results;
684  step_contacts->substeps[0] = *substep_contacts;
685  traj_contacts->steps[static_cast<size_t>(iStep)] = *step_contacts;
686  }
687  state_results.addInterpolatedCollisionResults(
688  sub_state_results, 0, 0, manager.getActiveCollisionObjects(), 0, true);
689  }
690 
692  {
693  contacts.push_back(state_results);
694  break;
695  }
696  }
697 
700  {
701  tesseract_common::TransformMap state = state_fn(traj.row(iStep + 1));
702  sub_state_results.clear();
703  checkTrajectoryState(sub_state_results, manager, state, config.contact_request);
704  if (!sub_state_results.empty())
705  {
706  found = true;
707  if (debug_logging)
708  {
709  end_substep_contacts->contacts = sub_state_results;
710  step_contacts->substeps[1] = *end_substep_contacts;
711  traj_contacts->steps[static_cast<size_t>(iStep)] = *step_contacts;
712  }
713  state_results.addInterpolatedCollisionResults(
714  sub_state_results, 1, 1, manager.getActiveCollisionObjects(), 1, true);
715  }
716 
718  {
719  contacts.push_back(state_results);
720  break;
721  }
722  }
723 
724  contacts.push_back(state_results);
725  break;
726  }
727 
728  if (iStep == 0)
729  {
732  {
733  contacts.emplace_back();
734  continue;
735  }
736  }
737 
738  tesseract_common::TransformMap state = state_fn(traj.row(iStep));
739  sub_state_results.clear();
740  checkTrajectoryState(sub_state_results, manager, state, config.contact_request);
741  if (!sub_state_results.empty())
742  {
743  found = true;
744  if (debug_logging)
745  {
746  substep_contacts->contacts = sub_state_results;
747  step_contacts->substeps[0] = *substep_contacts;
748  traj_contacts->steps[static_cast<size_t>(iStep)] = *step_contacts;
749  }
750  state_results.addInterpolatedCollisionResults(
751  sub_state_results, 0, 0, manager.getActiveCollisionObjects(), 0, true);
752  }
753 
755  {
756  contacts.push_back(state_results);
757  break;
758  }
759 
760  // If last segment check the end state
761  if (iStep == (traj.rows() - 2))
762  {
765  {
766  contacts.push_back(state_results);
767  continue;
768  }
769 
770  tesseract_common::TransformMap state = state_fn(traj.row(iStep + 1));
771  sub_state_results.clear();
772  checkTrajectoryState(sub_state_results, manager, state, config.contact_request);
773  if (!sub_state_results.empty())
774  {
775  found = true;
776  if (debug_logging)
777  {
778  end_substep_contacts->contacts = sub_state_results;
779  step_contacts->substeps[1] = *end_substep_contacts;
780  traj_contacts->steps[static_cast<size_t>(iStep)] = *step_contacts;
781  }
782  state_results.addInterpolatedCollisionResults(
783  sub_state_results, 1, 1, manager.getActiveCollisionObjects(), 1, true);
784  }
785 
787  {
788  contacts.push_back(state_results);
789  break;
790  }
791  }
792 
793  contacts.push_back(state_results);
794 
795  if (debug_logging)
796  {
797  traj_contacts->steps[static_cast<size_t>(iStep)] = *step_contacts;
798  }
799  }
800  }
801  }
802  else
803  {
804  tesseract_common::TrajArray::Index start_idx{ 0 };
805  tesseract_common::TrajArray::Index end_idx(traj.rows());
806 
809  {
810  contacts.emplace_back();
811  ++start_idx;
812  }
813 
816  --end_idx;
817 
818  for (tesseract_common::TrajArray::Index iStep = start_idx; iStep < end_idx; ++iStep)
819  {
822  if (debug_logging)
823  {
824  step_contacts = std::make_unique<tesseract_collision::ContactTrajectoryStepResults>(static_cast<int>(iStep + 1),
825  traj.row(iStep));
826  substep_contacts = std::make_unique<tesseract_collision::ContactTrajectorySubstepResults>(1, traj.row(iStep));
827  }
828 
829  state_results.clear();
830 
831  tesseract_common::TransformMap state = state_fn(traj.row(iStep));
832  sub_state_results.clear();
833  checkTrajectoryState(sub_state_results, manager, state, config.contact_request);
834  if (!sub_state_results.empty())
835  {
836  found = true;
837  if (debug_logging)
838  {
839  substep_contacts->contacts = sub_state_results;
840  step_contacts->substeps[0] = *substep_contacts;
841  traj_contacts->steps[static_cast<size_t>(iStep)] = *step_contacts;
842  }
843  state_results.addInterpolatedCollisionResults(
844  sub_state_results, 0, 0, manager.getActiveCollisionObjects(), 0, true);
845  }
846  contacts.push_back(state_results);
847 
849  break;
850  }
851  }
852 
853  if (debug_logging)
854  std::cout << traj_contacts->trajectoryCollisionResultsTable().str();
855 
856  return found;
857 }
858 
859 bool checkTrajectory(std::vector<tesseract_collision::ContactResultMap>& contacts,
861  const tesseract_scene_graph::StateSolver& state_solver,
862  const std::vector<std::string>& joint_names,
863  const tesseract_common::TrajArray& traj,
865 {
866  CalcStateFn state_fn = [&joint_names, &state_solver](const Eigen::VectorXd& state) {
867  return state_solver.getState(joint_names, state).link_transforms;
868  };
869 
870  return checkTrajectory(contacts, manager, state_fn, joint_names, traj, config);
871 }
872 
873 bool checkTrajectory(std::vector<tesseract_collision::ContactResultMap>& contacts,
876  const tesseract_common::TrajArray& traj,
878 {
879  CalcStateFn state_fn = [&manip](const Eigen::VectorXd& state) { return manip.calcFwdKin(state); };
880 
881  const std::vector<std::string> joint_names = manip.getJointNames();
882  return checkTrajectory(contacts, manager, state_fn, joint_names, traj, config);
883 }
884 
885 } // namespace tesseract_environment
tesseract_collision::ContactResultMap::empty
bool empty() const
graph.h
tesseract_environment
Definition: command.h:45
tesseract_environment::printContinuousDebugInfo
void printContinuousDebugInfo(const std::vector< std::string > &joint_names, const Eigen::VectorXd &swp0, const Eigen::VectorXd &swp1, tesseract_common::TrajArray::Index step_idx, tesseract_common::TrajArray::Index step_size, tesseract_common::TrajArray::Index sub_step_idx=-1)
Definition: utils.cpp:111
tesseract_collision::DiscreteContactManager::getActiveCollisionObjects
virtual const std::vector< std::string > & getActiveCollisionObjects() const=0
tesseract_scene_graph::SceneGraph::isTree
bool isTree() const
utils.h
tesseract_environment::checkTrajectoryState
void checkTrajectoryState(tesseract_collision::ContactResultMap &contact_results, tesseract_collision::ContinuousContactManager &manager, const tesseract_common::TransformMap &state, const tesseract_collision::ContactRequest &contact_request)
Should perform a discrete collision check a state first configuring manager with config.
Definition: utils.cpp:100
tesseract_collision::ContactResultMap::addInterpolatedCollisionResults
void addInterpolatedCollisionResults(ContactResultMap &sub_segment_results, long sub_segment_index, long sub_segment_last_index, const std::vector< std::string > &active_link_names, double segment_dt, bool discrete, const ContactResultMap::FilterFn &filter=nullptr)
tesseract_collision::CollisionEvaluatorType::CONTINUOUS
@ CONTINUOUS
tesseract_common::TransformMap
AlignedMap< std::string, Eigen::Isometry3d > TransformMap
tesseract_collision::ContactTrajectoryStepResults::UPtr
std::unique_ptr< ContactTrajectoryStepResults > UPtr
tesseract_collision::ContactRequest::type
ContactTestType type
tesseract_kinematics::JointGroup
joint.h
tesseract_collision::ContinuousContactManager::getActiveCollisionObjects
virtual const std::vector< std::string > & getActiveCollisionObjects() const=0
tesseract_collision::ContactTrajectorySubstepResults::UPtr
std::unique_ptr< ContactTrajectorySubstepResults > UPtr
tesseract_scene_graph::StateSolver
TESSERACT_COMMON_IGNORE_WARNINGS_PUSH
#define TESSERACT_COMMON_IGNORE_WARNINGS_PUSH
tesseract_collision::ContactResultMap::clear
void clear()
tesseract_collision::DiscreteContactManager
tesseract_scene_graph::SceneGraph
tesseract_environment::getActiveLinkNamesRecursive
void getActiveLinkNamesRecursive(std::vector< std::string > &active_links, const tesseract_scene_graph::SceneGraph &scene_graph, const std::string &current_link, bool active)
Get the active Link Names Recursively.
Definition: utils.cpp:54
tesseract_collision::ContactTrajectoryResults::UPtr
std::unique_ptr< ContactTrajectoryResults > UPtr
tesseract_collision::CollisionCheckProgramType::INTERMEDIATE_ONLY
@ INTERMEDIATE_ONLY
tesseract_collision::CollisionCheckConfig::type
CollisionEvaluatorType type
tesseract_environment::CalcStateFn
std::function< tesseract_common::TransformMap(const Eigen::VectorXd &state)> CalcStateFn
Definition: utils.cpp:157
tesseract_scene_graph::SceneGraph::getAdjacentLinkNames
std::vector< std::string > getAdjacentLinkNames(const std::string &name) const
tesseract_scene_graph::StateSolver::getState
virtual SceneState getState() const=0
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_collision::CollisionEvaluatorType::LVS_CONTINUOUS
@ LVS_CONTINUOUS
tesseract_collision::CollisionCheckProgramType::START_ONLY
@ START_ONLY
name
std::string name
tesseract_collision::CollisionCheckProgramType::END_ONLY
@ END_ONLY
tesseract_collision::ContinuousContactManager
tesseract_collision::ContactResultMap
tesseract_collision::CollisionCheckConfig::contact_request
ContactRequest contact_request
tesseract_collision::DiscreteContactManager::contactTest
virtual void contactTest(ContactResultMap &collisions, const ContactRequest &request)=0
tesseract_collision::CollisionCheckConfig
tesseract_kinematics::JointGroup::getJointNames
std::vector< std::string > getJointNames() const
tesseract_scene_graph::SceneGraph::getInboundJoints
std::vector< std::shared_ptr< const Joint > > getInboundJoints(const std::string &link_name) const
tesseract_collision::ContinuousContactManager::setCollisionObjectsTransform
virtual void setCollisionObjectsTransform(const std::string &name, const Eigen::Isometry3d &pose)=0
tesseract_collision::DiscreteContactManager::setCollisionObjectsTransform
virtual void setCollisionObjectsTransform(const std::string &name, const Eigen::Isometry3d &pose)=0
TESSERACT_COMMON_IGNORE_WARNINGS_POP
state_solver.h
tesseract_environment::printDiscreteDebugInfo
void printDiscreteDebugInfo(const std::vector< std::string > &joint_names, const Eigen::VectorXd &swp, tesseract_common::TrajArray::Index step_idx, tesseract_common::TrajArray::Index step_size, tesseract_common::TrajArray::Index sub_step_idx=-1)
Definition: utils.cpp:135
tesseract_collision::CollisionCheckProgramType::ALL
@ ALL
continuous_contact_manager.h
tesseract_collision::CollisionCheckProgramType::ALL_EXCEPT_END
@ ALL_EXCEPT_END
tesseract_collision::ContactTestType::FIRST
@ FIRST
tesseract_collision::CollisionEvaluatorType::LVS_DISCRETE
@ LVS_DISCRETE
tesseract_collision::CollisionEvaluatorType::DISCRETE
@ DISCRETE
tesseract_kinematics::JointGroup::calcFwdKin
tesseract_common::TransformMap calcFwdKin(const Eigen::Ref< const Eigen::VectorXd > &joint_angles) const
joint_group.h
tesseract_scene_graph::SceneState::link_transforms
tesseract_common::TransformMap link_transforms
tesseract_collision::ContinuousContactManager::contactTest
virtual void contactTest(ContactResultMap &collisions, const ContactRequest &request)=0
tesseract_collision::ContactRequest
tesseract_scene_graph::JointType::FIXED
@ FIXED
tesseract_environment::checkTrajectorySegment
void checkTrajectorySegment(tesseract_collision::ContactResultMap &contact_results, tesseract_collision::ContinuousContactManager &manager, const tesseract_common::TransformMap &state0, const tesseract_common::TransformMap &state1, const tesseract_collision::ContactRequest &contact_request)
Should perform a continuous collision check between two states only passing along the contact_request...
Definition: utils.cpp:77
tesseract_collision::CollisionCheckConfig::longest_valid_segment_length
double longest_valid_segment_length
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_collision::CollisionCheckProgramType::ALL_EXCEPT_START
@ ALL_EXCEPT_START


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