3535/* Author: Ioan Sucan */
3636
3737#include " state_validation_service_capability.hpp"
38+ #include < moveit/collision_detection/collision_tools.hpp>
39+ #include < moveit/move_group/capability_names.hpp>
3840#include < moveit/moveit_cpp/moveit_cpp.hpp>
3941#include < moveit/robot_state/conversions.hpp>
4042#include < moveit/utils/message_checks.hpp>
41- #include < moveit/collision_detection/collision_tools.hpp>
42- #include < moveit/move_group/capability_names.hpp>
4343
4444namespace move_group
4545{
@@ -57,20 +57,18 @@ void MoveGroupStateValidationService::initialize()
5757 });
5858}
5959
60- bool MoveGroupStateValidationService::computeService (
61- const std::shared_ptr<rmw_request_id_t >& /* unused */ ,
62- const std::shared_ptr<moveit_msgs::srv::GetStateValidity::Request>& req,
63- const std::shared_ptr<moveit_msgs::srv::GetStateValidity::Response>& res)
60+ bool MoveGroupStateValidationService::isStateValid (
61+ const planning_scene_monitor::LockedPlanningSceneRO& ls, const moveit::core::RobotState& rs,
62+ const std::string& group_name, const moveit_msgs::msg::Constraints& constraints,
63+ std::vector<moveit_msgs::msg::ContactInformation>& contacts,
64+ std::vector<moveit_msgs::msg::CostSource>& cost_sources,
65+ std::vector<moveit_msgs::msg::ConstraintEvalResult>& constraint_result)
6466{
65- planning_scene_monitor::LockedPlanningSceneRO ls (context_->planning_scene_monitor_ );
66- moveit::core::RobotState rs = ls->getCurrentState ();
67- moveit::core::robotStateMsgToRobotState (req->robot_state , rs);
68-
69- res->valid = true ;
67+ bool valid = true ;
7068
7169 // configure collision request
7270 collision_detection::CollisionRequest creq;
73- creq.group_name = req-> group_name ;
71+ creq.group_name = group_name;
7472 creq.cost = true ;
7573 creq.contacts = true ;
7674 creq.max_contacts = ls->getWorld ()->size () + ls->getRobotModel ()->getLinkModelsWithCollisionGeometry ().size ();
@@ -85,48 +83,63 @@ bool MoveGroupStateValidationService::computeService(
8583 if (cres.collision )
8684 {
8785 rclcpp::Time time_now = context_->moveit_cpp_ ->getNode ()->get_clock ()->now ();
88- res-> contacts .reserve (cres.contact_count );
89- res-> valid = false ;
86+ contacts.reserve (cres.contact_count );
87+ valid = false ;
9088 for (collision_detection::CollisionResult::ContactMap::const_iterator it = cres.contacts .begin ();
9189 it != cres.contacts .end (); ++it)
9290 {
9391 for (const collision_detection::Contact& contact : it->second )
9492 {
95- res-> contacts .resize (res-> contacts .size () + 1 );
96- collision_detection::contactToMsg (contact, res-> contacts .back ());
97- res-> contacts .back ().header .frame_id = ls->getPlanningFrame ();
98- res-> contacts .back ().header .stamp = time_now;
93+ contacts.resize (contacts.size () + 1 );
94+ collision_detection::contactToMsg (contact, contacts.back ());
95+ contacts.back ().header .frame_id = ls->getPlanningFrame ();
96+ contacts.back ().header .stamp = time_now;
9997 }
10098 }
10199 }
102100
103101 // copy cost sources
104- res-> cost_sources .reserve (cres.cost_sources .size ());
102+ cost_sources.reserve (cres.cost_sources .size ());
105103 for (const collision_detection::CostSource& cost_source : cres.cost_sources )
106104 {
107- res-> cost_sources .resize (res-> cost_sources .size () + 1 );
108- collision_detection::costSourceToMsg (cost_source, res-> cost_sources .back ());
105+ cost_sources.resize (cost_sources.size () + 1 );
106+ collision_detection::costSourceToMsg (cost_source, cost_sources.back ());
109107 }
110108
111109 // evaluate constraints
112- if (!moveit::core::isEmpty (req-> constraints ))
110+ if (!moveit::core::isEmpty (constraints))
113111 {
114112 kinematic_constraints::KinematicConstraintSet kset (ls->getRobotModel ());
115- kset.add (req-> constraints , ls->getTransforms ());
113+ kset.add (constraints, ls->getTransforms ());
116114 std::vector<kinematic_constraints::ConstraintEvaluationResult> kres;
117115 kinematic_constraints::ConstraintEvaluationResult total_result = kset.decide (rs, kres);
118116 if (!total_result.satisfied )
119- res->valid = false ;
117+ {
118+ valid = false ;
119+ }
120120
121121 // copy constraint results
122- res-> constraint_result .resize (kres.size ());
122+ constraint_result.resize (kres.size ());
123123 for (std::size_t k = 0 ; k < kres.size (); ++k)
124124 {
125- res-> constraint_result [k].result = kres[k].satisfied ;
126- res-> constraint_result [k].distance = kres[k].distance ;
125+ constraint_result[k].result = kres[k].satisfied ;
126+ constraint_result[k].distance = kres[k].distance ;
127127 }
128128 }
129129
130+ return valid;
131+ }
132+
133+ bool MoveGroupStateValidationService::computeService (
134+ const std::shared_ptr<rmw_request_id_t >& /* unused */ ,
135+ const std::shared_ptr<moveit_msgs::srv::GetStateValidity::Request>& req,
136+ const std::shared_ptr<moveit_msgs::srv::GetStateValidity::Response>& res)
137+ {
138+ planning_scene_monitor::LockedPlanningSceneRO ls (context_->planning_scene_monitor_ );
139+ moveit::core::RobotState rs = ls->getCurrentState ();
140+ moveit::core::robotStateMsgToRobotState (req->robot_state , rs);
141+ res->valid =
142+ isStateValid (ls, rs, req->group_name , req->constraints , res->contacts , res->cost_sources , res->constraint_result );
130143 return true ;
131144}
132145} // namespace move_group
0 commit comments