30 #include <console_bridge/console.h>
56 const std::string& current_link,
60 assert(scene_graph.
isTree());
63 active_links.push_back(current_link);
86 manager.
contactTest(contact_results, contact_request);
97 manager.
contactTest(contact_results, contact_request);
108 manager.
contactTest(contact_results, contact_request);
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)
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;
125 for (
const auto&
name : joint_names)
129 <<
" State0: " << swp0 <<
"\n"
130 <<
" State1: " << swp1 <<
"\n";
132 CONSOLE_BRIDGE_logDebug(ss.str().c_str());
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)
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;
148 for (
const auto&
name : joint_names)
152 <<
" State: " << swp <<
"\n";
154 CONSOLE_BRIDGE_logDebug(ss.str().c_str());
162 const std::vector<std::string>& joint_names,
168 throw std::runtime_error(
"checkTrajectory was given an CollisionEvaluatorType that is inconsistent with the "
169 "ContactManager type");
172 throw std::runtime_error(
"checkTrajectory was given continuous contact manager with a trajectory that only has one "
175 bool debug_logging = console_bridge::getLogLevel() < console_bridge::LogLevel::CONSOLE_BRIDGE_LOG_INFO;
181 std::make_unique<tesseract_collision::ContactTrajectoryResults>(joint_names,
static_cast<int>(traj.rows()));
185 contacts.reserve(
static_cast<std::size_t
>(traj.rows()));
195 sub_state_results.
clear();
198 if (!sub_state_results.
empty())
208 contacts.push_back(state_results);
215 sub_state_results.
clear();
218 if (!sub_state_results.
empty())
227 contacts.push_back(state_results);
233 for (tesseract_common::TrajArray::Index iStep = 0; iStep < traj.rows() - 1; ++iStep)
235 state_results.
clear();
237 double dist = (traj.row(iStep + 1) - traj.row(iStep)).norm();
240 tesseract_common::TrajArray::Index cnt =
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));
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()));
254 auto sub_segment_last_index =
static_cast<int>(subtraj.rows() - 1);
257 tesseract_common::TrajArray::Index start_idx{ 0 };
258 tesseract_common::TrajArray::Index end_idx{ subtraj.rows() - 1 };
266 if (iStep == (traj.rows() - 2))
273 for (tesseract_common::TrajArray::Index iSubStep = start_idx; iSubStep < end_idx; ++iSubStep)
278 substep_contacts = std::make_unique<tesseract_collision::ContactTrajectorySubstepResults>(
279 static_cast<int>(iSubStep) + 1, subtraj.row(iSubStep), subtraj.row(iSubStep + 1));
284 sub_state_results.
clear();
286 if (!sub_state_results.
empty())
292 substep_contacts->contacts = sub_state_results;
293 step_contacts->substeps[
static_cast<size_t>(iSubStep)] = *substep_contacts;
295 double segment_dt = (sub_segment_last_index > 0) ? 1.0 /
static_cast<double>(sub_segment_last_index) : 0.0;
299 sub_segment_last_index,
308 contacts.push_back(state_results);
312 traj_contacts->steps[
static_cast<size_t>(iStep)] = *step_contacts;
326 contacts.emplace_back();
330 if (iStep == (traj.rows() - 2))
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));
351 if (!state_results.
empty())
358 substep_contacts->contacts = state_results;
359 step_contacts->substeps[0] = *substep_contacts;
360 traj_contacts->steps[
static_cast<size_t>(iStep)] = *step_contacts;
363 contacts.push_back(state_results);
367 traj_contacts->steps[
static_cast<size_t>(iStep)] = *step_contacts;
377 tesseract_common::TrajArray::Index start_idx{ 0 };
378 tesseract_common::TrajArray::Index end_idx{ traj.rows() - 1 };
382 contacts.emplace_back();
390 for (tesseract_common::TrajArray::Index iStep = start_idx; iStep < end_idx; ++iStep)
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));
405 state_results.
clear();
407 if (!state_results.
empty())
414 substep_contacts->contacts = state_results;
415 step_contacts->substeps[0] = *substep_contacts;
416 traj_contacts->steps[
static_cast<size_t>(iStep)] = *step_contacts;
419 contacts.push_back(state_results);
423 traj_contacts->steps[
static_cast<size_t>(iStep)] = *step_contacts;
432 std::cout << traj_contacts->trajectoryCollisionResultsTable().str();
440 const std::vector<std::string>& joint_names,
444 CalcStateFn state_fn = [&joint_names, &state_solver](
const Eigen::VectorXd& state) {
448 return checkTrajectory(contacts, manager, state_fn, joint_names, traj, config);
459 const std::vector<std::string> joint_names = manip.
getJointNames();
460 return checkTrajectory(contacts, manager, state_fn, joint_names, traj, config);
466 const std::vector<std::string>& joint_names,
472 throw std::runtime_error(
"checkTrajectory was given an CollisionEvaluatorType that is inconsistent with the "
473 "ContactManager type");
475 if (traj.rows() == 0)
476 throw std::runtime_error(
"checkTrajectory was given continuous contact manager with empty trajectory.");
478 bool debug_logging = console_bridge::getLogLevel() < console_bridge::LogLevel::CONSOLE_BRIDGE_LOG_INFO;
484 std::make_unique<tesseract_collision::ContactTrajectoryResults>(joint_names,
static_cast<int>(traj.rows()));
488 contacts.reserve(
static_cast<std::size_t
>(traj.rows()));
498 sub_state_results.
clear();
501 if (!sub_state_results.
empty())
510 contacts.push_back(state_results);
517 sub_state_results.
clear();
520 if (!sub_state_results.
empty())
529 contacts.push_back(state_results);
533 if (traj.rows() == 1)
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));
546 auto sub_segment_last_index =
static_cast<int>(traj.rows() - 1);
547 state_results.
clear();
549 sub_state_results.
clear();
554 substep_contacts->contacts = sub_state_results;
555 step_contacts->substeps[0] = *substep_contacts;
556 traj_contacts->steps[0] = *step_contacts;
559 double segment_dt = (sub_segment_last_index > 0) ? 1.0 /
static_cast<double>(sub_segment_last_index) : 0.0;
562 contacts.push_back(state_results);
565 std::cout << traj_contacts->trajectoryCollisionResultsTable().str();
567 return (!state_results.
empty());
572 for (
int iStep = 0; iStep < (traj.rows() - 1); ++iStep)
574 state_results.
clear();
576 const double dist = (traj.row(iStep + 1) - traj.row(iStep)).norm();
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));
588 step_contacts = std::make_unique<tesseract_collision::ContactTrajectoryStepResults>(
589 iStep + 1, traj.row(iStep), traj.row(iStep + 1),
static_cast<int>(subtraj.rows()));
592 auto sub_segment_last_index =
static_cast<int>(subtraj.rows() - 1);
595 tesseract_common::TrajArray::Index start_idx{ 0 };
596 tesseract_common::TrajArray::Index end_idx{ subtraj.rows() - 1 };
604 if (iStep == (traj.rows() - 2))
607 end_idx = subtraj.rows();
613 for (tesseract_common::TrajArray::Index iSubStep = start_idx; iSubStep < end_idx; ++iSubStep)
618 substep_contacts = std::make_unique<tesseract_collision::ContactTrajectorySubstepResults>(
619 static_cast<int>(iSubStep) + 1, subtraj.row(iSubStep));
623 sub_state_results.
clear();
625 if (!sub_state_results.
empty())
630 substep_contacts->contacts = sub_state_results;
631 step_contacts->substeps[
static_cast<size_t>(iSubStep)] = *substep_contacts;
633 double segment_dt = (sub_segment_last_index > 0) ? 1.0 /
static_cast<double>(sub_segment_last_index) : 0.0;
636 sub_segment_last_index,
645 contacts.push_back(state_results);
649 traj_contacts->steps[
static_cast<size_t>(iStep)] = *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));
670 if (iStep == 0 && traj.rows() == 2)
676 sub_state_results.
clear();
678 if (!sub_state_results.
empty())
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;
693 contacts.push_back(state_results);
702 sub_state_results.
clear();
704 if (!sub_state_results.
empty())
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;
719 contacts.push_back(state_results);
724 contacts.push_back(state_results);
733 contacts.emplace_back();
739 sub_state_results.
clear();
741 if (!sub_state_results.
empty())
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;
756 contacts.push_back(state_results);
761 if (iStep == (traj.rows() - 2))
766 contacts.push_back(state_results);
771 sub_state_results.
clear();
773 if (!sub_state_results.
empty())
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;
788 contacts.push_back(state_results);
793 contacts.push_back(state_results);
797 traj_contacts->steps[
static_cast<size_t>(iStep)] = *step_contacts;
804 tesseract_common::TrajArray::Index start_idx{ 0 };
805 tesseract_common::TrajArray::Index end_idx(traj.rows());
810 contacts.emplace_back();
818 for (tesseract_common::TrajArray::Index iStep = start_idx; iStep < end_idx; ++iStep)
824 step_contacts = std::make_unique<tesseract_collision::ContactTrajectoryStepResults>(
static_cast<int>(iStep + 1),
826 substep_contacts = std::make_unique<tesseract_collision::ContactTrajectorySubstepResults>(1, traj.row(iStep));
829 state_results.
clear();
832 sub_state_results.
clear();
834 if (!sub_state_results.
empty())
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;
846 contacts.push_back(state_results);
854 std::cout << traj_contacts->trajectoryCollisionResultsTable().str();
862 const std::vector<std::string>& joint_names,
866 CalcStateFn state_fn = [&joint_names, &state_solver](
const Eigen::VectorXd& state) {
870 return checkTrajectory(contacts, manager, state_fn, joint_names, traj, config);
881 const std::vector<std::string> joint_names = manip.
getJointNames();
882 return checkTrajectory(contacts, manager, state_fn, joint_names, traj, config);