38#include <gtest/gtest.h>
39#include <urdf_parser/urdf_parser.h>
41#include <tf2_eigen/tf2_eigen.hpp>
68 moveit_msgs::msg::JointConstraint jcm;
69 jcm.joint_name =
"head_pan_joint";
71 jcm.tolerance_above = 0.1;
72 jcm.tolerance_below = 0.05;
83 EXPECT_NEAR(p1.
distance, jcm.position, 1e-6);
91 EXPECT_NEAR(p2.
distance, 0.01, 1e-6);
100 jval = 0.35 - std::numeric_limits<double>::epsilon();
106 jval = 0.35 - 3 * std::numeric_limits<double>::epsilon();
111 jcm.tolerance_below = -0.05;
114 jcm.tolerance_below = 0.05;
141 EXPECT_TRUE(jc.
equal(jc2, 1e-12));
144 jcm.joint_name =
"head_tilt_joint";
146 EXPECT_FALSE(jc.
equal(jc2, 1e-12));
149 jcm.joint_name =
"head_pan_joint";
152 EXPECT_FALSE(jc.
equal(jc2, 1e-12));
154 EXPECT_FALSE(jc.
equal(jc2, .1));
155 EXPECT_TRUE(jc.
equal(jc2, .101));
162 EXPECT_FALSE(jc.
equal(jc2, 1e-12));
165 jcm.joint_name =
"base_footprint_joint";
169 jcm.joint_name =
"head_pan_joint";
173 EXPECT_FALSE(jc.
equal(jc2, 1e-12));
184 moveit_msgs::msg::JointConstraint jcm;
186 jcm.joint_name =
"l_wrist_roll_joint";
188 jcm.tolerance_above = 0.04;
189 jcm.tolerance_below = 0.02;
194 std::map<std::string, double> jvals;
200 jvals[jcm.joint_name] = .03;
206 jvals[jcm.joint_name] = .05;
212 jvals[jcm.joint_name] = -.01;
217 jvals[jcm.joint_name] = -.03;
226 jvals[jcm.joint_name] = 3.17;
230 EXPECT_NEAR(p1.
distance, 0.03, 1e-6);
233 jvals[jcm.joint_name] = -3.14;
237 EXPECT_NEAR(p2.
distance, 0.003185, 1e-4);
240 jvals[jcm.joint_name] = 3.19;
246 jvals[jcm.joint_name] = -3.11;
251 jvals[jcm.joint_name] = -3.09;
257 jvals[jcm.joint_name] = 3.13;
262 jvals[jcm.joint_name] = 3.11;
267 jcm.position = -3.14;
271 jvals[jcm.joint_name] = -3.11;
276 jvals[jcm.joint_name] = -3.09;
281 jvals[jcm.joint_name] = 3.13;
286 jvals[jcm.joint_name] = 3.12;
295 jvals[jcm.joint_name] = 0.0;
300 moveit_msgs::msg::JointConstraint jcm2 = jcm;
301 jcm2.position = -6.28;
313 moveit_msgs::msg::JointConstraint jcm;
314 jcm.joint_name =
"world_joint";
316 jcm.tolerance_above = 0.1;
317 jcm.tolerance_below = 0.05;
324 jcm.joint_name =
"world_joint/x";
327 std::map<std::string, double> jvals;
328 jvals[jcm.joint_name] = 3.2;
333 jvals[jcm.joint_name] = 3.25;
338 jvals[jcm.joint_name] = -3.14;
344 jcm.joint_name =
"world_joint/theta";
347 jvals[jcm.joint_name] = -3.14;
352 jvals[jcm.joint_name] = 3.25;
365 moveit_msgs::msg::PositionConstraint pcm;
370 pcm.link_name =
"l_wrist_roll_link";
371 pcm.target_point_offset.x = 0;
372 pcm.target_point_offset.y = 0;
373 pcm.target_point_offset.z = 0;
374 pcm.constraint_region.primitives.resize(1);
375 pcm.constraint_region.primitives[0].type = shape_msgs::msg::SolidPrimitive::SPHERE;
380 pcm.constraint_region.primitives[0].dimensions.resize(1);
381 pcm.constraint_region.primitives[0].dimensions[0] = 0.2;
386 pcm.constraint_region.primitive_poses.resize(1);
387 pcm.constraint_region.primitive_poses[0].position.x = 0.55;
388 pcm.constraint_region.primitive_poses[0].position.y = 0.2;
389 pcm.constraint_region.primitive_poses[0].position.z = 1.25;
390 pcm.constraint_region.primitive_poses[0].orientation.x = 0.0;
391 pcm.constraint_region.primitive_poses[0].orientation.y = 0.0;
392 pcm.constraint_region.primitive_poses[0].orientation.z = 0.0;
393 pcm.constraint_region.primitive_poses[0].orientation.w = 1.0;
399 pcm.header.frame_id = robot_model_->getModelFrame();
405 std::map<std::string, double> jvals;
406 jvals[
"torso_lift_joint"] = 0.4;
410 EXPECT_TRUE(pc.
equal(pc, 1e-12));
413 pcm.target_point_offset.x = 0;
414 pcm.target_point_offset.y = 0;
415 pcm.target_point_offset.z = .15;
425 pcm.constraint_region.primitive_poses[0].orientation.x = 0.0;
426 pcm.constraint_region.primitive_poses[0].orientation.y = 0.0;
427 pcm.constraint_region.primitive_poses[0].orientation.z = 0.0;
428 pcm.constraint_region.primitive_poses[0].orientation.w = 0.0;
442 moveit_msgs::msg::PositionConstraint pcm;
444 pcm.link_name =
"l_wrist_roll_link";
445 pcm.target_point_offset.x = 0;
446 pcm.target_point_offset.y = 0;
447 pcm.target_point_offset.z = 0;
449 pcm.constraint_region.primitives.resize(1);
450 pcm.constraint_region.primitives[0].type = shape_msgs::msg::SolidPrimitive::SPHERE;
451 pcm.constraint_region.primitives[0].dimensions.resize(1);
452 pcm.constraint_region.primitives[0].dimensions[shape_msgs::msg::SolidPrimitive::BOX_X] = 0.38 * 2.0;
454 pcm.header.frame_id =
"r_wrist_roll_link";
456 pcm.constraint_region.primitive_poses.resize(1);
457 pcm.constraint_region.primitive_poses[0].position.x = 0.0;
458 pcm.constraint_region.primitive_poses[0].position.y = 0.6;
459 pcm.constraint_region.primitive_poses[0].position.z = 0.0;
460 pcm.constraint_region.primitive_poses[0].orientation.x = 0.0;
461 pcm.constraint_region.primitive_poses[0].orientation.y = 0.0;
462 pcm.constraint_region.primitive_poses[0].orientation.z = 0.0;
463 pcm.constraint_region.primitive_poses[0].orientation.w = 1.0;
472 pcm.constraint_region.primitives[0].type = shape_msgs::msg::SolidPrimitive::BOX;
473 pcm.constraint_region.primitives[0].dimensions.resize(3);
474 pcm.constraint_region.primitives[0].dimensions[shape_msgs::msg::SolidPrimitive::BOX_X] = 0.1;
475 pcm.constraint_region.primitives[0].dimensions[shape_msgs::msg::SolidPrimitive::BOX_Y] = 0.1;
476 pcm.constraint_region.primitives[0].dimensions[shape_msgs::msg::SolidPrimitive::BOX_Z] = 0.1;
479 std::map<std::string, double> jvals;
480 jvals[
"l_shoulder_pan_joint"] = 0.4;
484 EXPECT_TRUE(pc.
equal(pc, 1e-12));
486 jvals[
"l_shoulder_pan_joint"] = -0.4;
492 pcm.constraint_region.primitive_poses.resize(2);
493 pcm.constraint_region.primitive_poses[1].position.x = 0.0;
494 pcm.constraint_region.primitive_poses[1].position.y = 0.1;
495 pcm.constraint_region.primitive_poses[1].position.z = 0.0;
496 pcm.constraint_region.primitive_poses[1].orientation.x = 0.0;
497 pcm.constraint_region.primitive_poses[1].orientation.y = 0.0;
498 pcm.constraint_region.primitive_poses[1].orientation.z = 0.0;
499 pcm.constraint_region.primitive_poses[1].orientation.w = 1.0;
501 pcm.constraint_region.primitives.resize(2);
502 pcm.constraint_region.primitives[1].type = shape_msgs::msg::SolidPrimitive::BOX;
503 pcm.constraint_region.primitives[1].dimensions.resize(3);
504 pcm.constraint_region.primitives[1].dimensions[shape_msgs::msg::SolidPrimitive::BOX_X] = 0.1;
505 pcm.constraint_region.primitives[1].dimensions[shape_msgs::msg::SolidPrimitive::BOX_Y] = 0.1;
506 pcm.constraint_region.primitives[1].dimensions[shape_msgs::msg::SolidPrimitive::BOX_Z] = 0.1;
519 moveit_msgs::msg::PositionConstraint pcm;
521 pcm.link_name =
"l_wrist_roll_link";
522 pcm.target_point_offset.x = 0;
523 pcm.target_point_offset.y = 0;
524 pcm.target_point_offset.z = 0;
526 pcm.constraint_region.primitives.resize(2);
527 pcm.constraint_region.primitives[0].type = shape_msgs::msg::SolidPrimitive::SPHERE;
528 pcm.constraint_region.primitives[0].dimensions.resize(1);
529 pcm.constraint_region.primitives[0].dimensions[0] = 0.38 * 2.0;
530 pcm.constraint_region.primitives[1].type = shape_msgs::msg::SolidPrimitive::BOX;
531 pcm.constraint_region.primitives[1].dimensions.resize(3);
532 pcm.constraint_region.primitives[1].dimensions[shape_msgs::msg::SolidPrimitive::BOX_X] = 2.0;
533 pcm.constraint_region.primitives[1].dimensions[shape_msgs::msg::SolidPrimitive::BOX_Y] = 2.0;
534 pcm.constraint_region.primitives[1].dimensions[shape_msgs::msg::SolidPrimitive::BOX_Z] = 2.0;
536 pcm.header.frame_id =
"r_wrist_roll_link";
537 pcm.constraint_region.primitive_poses.resize(2);
538 pcm.constraint_region.primitive_poses[0].position.x = 0.0;
539 pcm.constraint_region.primitive_poses[0].position.y = 0.6;
540 pcm.constraint_region.primitive_poses[0].position.z = 0.0;
541 pcm.constraint_region.primitive_poses[0].orientation.w = 1.0;
542 pcm.constraint_region.primitive_poses[1].position.x = 2.0;
543 pcm.constraint_region.primitive_poses[1].position.y = 0.0;
544 pcm.constraint_region.primitive_poses[1].position.z = 0.0;
545 pcm.constraint_region.primitive_poses[1].orientation.w = 1.0;
551 EXPECT_TRUE(pc.
equal(pc2, .001));
552 EXPECT_TRUE(pc2.
equal(pc, .001));
555 moveit_msgs::msg::PositionConstraint pcm2 = pcm;
556 pcm2.constraint_region.primitives[0] = pcm.constraint_region.primitives[1];
557 pcm2.constraint_region.primitives[1] = pcm.constraint_region.primitives[0];
559 pcm2.constraint_region.primitive_poses[0] = pcm.constraint_region.primitive_poses[1];
560 pcm2.constraint_region.primitive_poses[1] = pcm.constraint_region.primitive_poses[0];
563 EXPECT_TRUE(pc.
equal(pc2, .001));
564 EXPECT_TRUE(pc2.
equal(pc, .001));
567 pcm2.constraint_region.primitive_poses[0].position.z = .01;
569 EXPECT_FALSE(pc.
equal(pc2, .001));
570 EXPECT_FALSE(pc2.
equal(pc, .001));
571 EXPECT_TRUE(pc.
equal(pc2, .1));
572 EXPECT_TRUE(pc2.
equal(pc, .1));
575 pcm2.constraint_region.primitive_poses[0].position.z = 0.0;
576 pcm2.constraint_region.primitives.resize(3);
577 pcm2.constraint_region.primitive_poses.resize(3);
578 pcm2.constraint_region.primitives[2] = pcm2.constraint_region.primitives[0];
579 pcm2.constraint_region.primitive_poses[2] = pcm2.constraint_region.primitive_poses[0];
581 EXPECT_TRUE(pc.
equal(pc2, .001));
582 EXPECT_TRUE(pc2.
equal(pc, .001));
585 pcm2.constraint_region.primitives[2].dimensions[0] = 3.0;
587 EXPECT_FALSE(pc.
equal(pc2, .001));
588 EXPECT_FALSE(pc2.
equal(pc, .001));
591 pcm2.constraint_region.primitives[2].dimensions[0] = pcm2.constraint_region.primitives[0].dimensions[0];
592 pcm2.constraint_region.primitives[2].type = shape_msgs::msg::SolidPrimitive::SPHERE;
594 EXPECT_FALSE(pc.
equal(pc2, .001));
606 moveit_msgs::msg::OrientationConstraint ocm;
610 ocm.link_name =
"r_wrist_roll_link";
615 ocm.header.frame_id = robot_model_->getModelFrame();
616 ocm.orientation.x = 0.0;
617 ocm.orientation.y = 0.0;
618 ocm.orientation.z = 0.0;
619 ocm.orientation.w = 1.0;
620 ocm.absolute_x_axis_tolerance = 0.1;
621 ocm.absolute_y_axis_tolerance = 0.1;
622 ocm.absolute_z_axis_tolerance = 0.1;
630 ocm.header.frame_id = ocm.link_name;
634 EXPECT_TRUE(oc.
equal(oc, 1e-12));
641 ocm.orientation = p.orientation;
642 ocm.header.frame_id = robot_model_->getModelFrame();
646 std::map<std::string, double> jvals;
647 jvals[
"r_wrist_roll_joint"] = .05;
652 jvals[
"r_wrist_roll_joint"] = .11;
658 jvals[
"r_wrist_roll_joint"] = M_PI;
672 moveit_msgs::msg::VisibilityConstraint vcm;
676 vcm.sensor_pose.header.frame_id =
"base_footprint";
677 vcm.sensor_pose.pose.position.z = -1.0;
678 vcm.sensor_pose.pose.orientation.x = 0.0;
679 vcm.sensor_pose.pose.orientation.y = 1.0;
680 vcm.sensor_pose.pose.orientation.z = 0.0;
681 vcm.sensor_pose.pose.orientation.w = 0.0;
683 vcm.target_pose.header.frame_id =
"base_footprint";
684 vcm.target_pose.pose.position.z = -2.0;
685 vcm.target_pose.pose.orientation.y = 0.0;
686 vcm.target_pose.pose.orientation.w = 1.0;
688 vcm.target_radius = .2;
690 vcm.max_view_angle = 0.0;
691 vcm.max_range_angle = 0.0;
692 vcm.sensor_view_direction = moveit_msgs::msg::VisibilityConstraint::SENSOR_Z;
699 vcm.max_view_angle = .1;
706 vcm.target_pose.pose.orientation.y = 0.03;
707 vcm.target_pose.pose.orientation.w = sqrt(1 - pow(vcm.target_pose.pose.orientation.y, 2));
712 vcm.target_pose.pose.orientation.y = 0.06;
713 vcm.target_pose.pose.orientation.w = sqrt(1 - pow(vcm.target_pose.pose.orientation.y, 2));
726 moveit_msgs::msg::VisibilityConstraint vcm;
728 vcm.sensor_pose.header.frame_id =
"narrow_stereo_optical_frame";
729 vcm.sensor_pose.pose.position.z = 0.05;
730 vcm.sensor_pose.pose.orientation.w = 1.0;
732 vcm.target_pose.header.frame_id =
"l_gripper_r_finger_tip_link";
733 vcm.target_pose.pose.position.z = 0.03;
734 vcm.target_pose.pose.orientation.w = 1.0;
737 vcm.max_view_angle = 0.0;
738 vcm.max_range_angle = 0.0;
739 vcm.sensor_view_direction = moveit_msgs::msg::VisibilityConstraint::SENSOR_Z;
746 vcm.target_radius = .05;
751 std::map<std::string, double> state_values;
752 state_values[
"l_shoulder_lift_joint"] = .5;
753 state_values[
"r_shoulder_pan_joint"] = .5;
754 state_values[
"r_elbow_flex_joint"] = -1.4;
760 state_values[
"r_shoulder_pan_joint"] = .4;
766 state_values[
"l_shoulder_lift_joint"] = 0;
767 state_values[
"r_shoulder_pan_joint"] = .5;
768 state_values[
"r_elbow_flex_joint"] = -.6;
774 vcm.sensor_view_direction = moveit_msgs::msg::VisibilityConstraint::SENSOR_X;
780 vcm.target_radius = .01;
781 vcm.target_pose.pose.position.z = 0.00;
782 vcm.target_pose.pose.position.x = 0.035;
787 vcm.target_radius = .05;
799 EXPECT_TRUE(kcs.
empty());
801 moveit_msgs::msg::JointConstraint jcm;
802 jcm.joint_name =
"head_pan_joint";
804 jcm.tolerance_above = 0.1;
805 jcm.tolerance_below = 0.05;
809 std::vector<moveit_msgs::msg::JointConstraint> jcv;
811 EXPECT_TRUE(kcs.
add(jcv));
817 std::map<std::string, double> jvals;
818 jvals[jcm.joint_name] = 0.41;
824 EXPECT_FALSE(kcs.
empty());
826 EXPECT_TRUE(kcs.
empty());
828 jcv.back().joint_name =
"head_tilt_joint";
829 EXPECT_TRUE(kcs.
add(jcv));
835 jvals[jcv.back().joint_name] = 0.41;
840 jvals[jcv.back().joint_name] = 0.51;
846 jcv.back().joint_name =
"no_joint";
847 EXPECT_FALSE(kcs.
add(jcv));
853 jvals[
"head_pan_joint"] = 0.51;
867 moveit_msgs::msg::JointConstraint jcm;
868 jcm.joint_name =
"head_pan_joint";
870 jcm.tolerance_above = 0.1;
871 jcm.tolerance_below = 0.05;
874 moveit_msgs::msg::PositionConstraint pcm;
875 pcm.link_name =
"l_wrist_roll_link";
876 pcm.target_point_offset.x = 0;
877 pcm.target_point_offset.y = 0;
878 pcm.target_point_offset.z = 0;
879 pcm.constraint_region.primitives.resize(1);
880 pcm.constraint_region.primitives[0].type = shape_msgs::msg::SolidPrimitive::SPHERE;
881 pcm.constraint_region.primitives[0].dimensions.resize(1);
882 pcm.constraint_region.primitives[0].dimensions[0] = 0.2;
884 pcm.constraint_region.primitive_poses.resize(1);
885 pcm.constraint_region.primitive_poses[0].position.x = 0.55;
886 pcm.constraint_region.primitive_poses[0].position.y = 0.2;
887 pcm.constraint_region.primitive_poses[0].position.z = 1.25;
888 pcm.constraint_region.primitive_poses[0].orientation.x = 0.0;
889 pcm.constraint_region.primitive_poses[0].orientation.y = 0.0;
890 pcm.constraint_region.primitive_poses[0].orientation.z = 0.0;
891 pcm.constraint_region.primitive_poses[0].orientation.w = 1.0;
894 pcm.header.frame_id = robot_model_->getModelFrame();
897 std::vector<moveit_msgs::msg::JointConstraint> jcv;
899 EXPECT_TRUE(kcs.
add(jcv));
901 std::vector<moveit_msgs::msg::PositionConstraint> pcv;
903 EXPECT_TRUE(kcs.
add(pcv, tf));
906 EXPECT_TRUE(kcs2.
add(pcv, tf));
907 EXPECT_TRUE(kcs2.
add(jcv));
910 EXPECT_TRUE(kcs.
equal(kcs2, .001));
911 EXPECT_TRUE(kcs2.
equal(kcs, .001));
915 EXPECT_TRUE(kcs2.
add(jcv));
917 EXPECT_TRUE(kcs.
equal(kcs2, .001));
918 EXPECT_TRUE(kcs2.
equal(kcs, .001));
920 jcm.joint_name =
"head_pan_joint";
922 jcm.tolerance_above = 0.1;
923 jcm.tolerance_below = 0.05;
927 EXPECT_TRUE(kcs2.
add(jcv));
929 EXPECT_FALSE(kcs.
equal(kcs2, .001));
930 EXPECT_FALSE(kcs2.
equal(kcs, .001));
933 EXPECT_TRUE(kcs.
equal(kcs2, .1));
934 EXPECT_TRUE(kcs2.
equal(kcs, .1));
939 testing::InitGoogleTest(&argc, argv);
940 return RUN_ALL_TESTS();
moveit::core::RobotModelPtr robot_model_
Class for handling single DOF joint constraints.
bool equal(const KinematicConstraint &other, double margin) const override
Check if two joint constraints are the same.
ConstraintEvaluationResult decide(const moveit::core::RobotState &state, bool verbose=false) const override
Decide whether the constraint is satisfied in the indicated state.
void clear() override
Clear the stored constraint.
bool configure(const moveit_msgs::msg::JointConstraint &jc)
Configure the constraint based on a moveit_msgs::msg::JointConstraint.
bool enabled() const override
This function returns true if this constraint is configured and able to decide whether states do meet...
A class that contains many different constraints, and can check RobotState *versus the full set....
void clear()
Clear the stored constraints.
bool equal(const KinematicConstraintSet &other, double margin) const
Whether or not another KinematicConstraintSet is equal to this one.
bool empty() const
Returns whether or not there are any constraints in the set.
bool add(const moveit_msgs::msg::Constraints &c, const moveit::core::Transforms &tf)
Add all known constraints.
ConstraintEvaluationResult decide(const moveit::core::RobotState &state, bool verbose=false) const
Determines whether all constraints are satisfied by state, returning a single evaluation result.
double getConstraintWeight() const
The weight of a constraint is a multiplicative factor associated to the distance computed by the deci...
Class for constraints on the orientation of a link.
bool equal(const KinematicConstraint &other, double margin) const override
Check if two orientation constraints are the same.
const moveit::core::LinkModel * getLinkModel() const
Gets the subject link model.
bool mobileReferenceFrame() const
Whether or not a mobile reference frame is being employed.
bool configure(const moveit_msgs::msg::OrientationConstraint &oc, const moveit::core::Transforms &tf)
Configure the constraint based on a moveit_msgs::msg::OrientationConstraint.
ConstraintEvaluationResult decide(const moveit::core::RobotState &state, bool verbose=false) const override
Decide whether the constraint is satisfied in the indicated state.
Class for constraints on the XYZ position of a link.
bool enabled() const override
This function returns true if this constraint is configured and able to decide whether states do meet...
void clear() override
Clear the stored constraint.
bool configure(const moveit_msgs::msg::PositionConstraint &pc, const moveit::core::Transforms &tf)
Configure the constraint based on a moveit_msgs::msg::PositionConstraint.
ConstraintEvaluationResult decide(const moveit::core::RobotState &state, bool verbose=false) const override
Decide whether the constraint is satisfied in the indicated state.
bool mobileReferenceFrame() const
If enabled and the specified frame is a mobile frame, return true. Otherwise, returns false.
bool equal(const KinematicConstraint &other, double margin) const override
Check if two constraints are the same. For position constraints this means that:
bool hasLinkOffset() const
If the constraint is enabled and the link offset is substantially different than zero.
Class for constraints on the visibility relationship between a sensor and a target.
ConstraintEvaluationResult decide(const moveit::core::RobotState &state, bool verbose=false) const override
Decide whether the constraint is satisfied in the indicated state.
bool configure(const moveit_msgs::msg::VisibilityConstraint &vc, const moveit::core::Transforms &tf)
Configure the constraint based on a moveit_msgs::msg::VisibilityConstraint.
const std::string & getName() const
The name of this link.
Representation of a robot's state. This includes position, velocity, acceleration and effort.
void setVariablePositions(const double *position)
It is assumed positions is an array containing the new positions for all variables in this state....
void update(bool force=false)
Update all transforms.
void setToDefaultValues()
Set all joints to their default positions. The default position is 0, or if that is not within bounds...
const Eigen::Isometry3d & getGlobalLinkTransform(const std::string &link_name)
Get the link transform w.r.t. the root link (model frame) of the RobotModel. This is typically the ro...
void setJointPositions(const std::string &joint_name, const double *position)
moveit::core::RobotModelPtr loadTestingRobotModel(const std::string &package_name, const std::string &urdf_relative_path, const std::string &srdf_relative_path)
Loads a robot model given a URDF and SRDF file in a package.
Struct for containing the results of constraint evaluation.
bool satisfied
Whether or not the constraint or constraints were satisfied.
double distance
The distance evaluation from the constraint or constraints.
TEST_F(LoadPlanningModelsPr2, JointConstraintsSimple)
int main(int argc, char **argv)