37 #include <gtest/gtest.h> 
   38 #ifndef INSTANTIATE_TEST_SUITE_P   
   39 #define INSTANTIATE_TEST_SUITE_P(...) INSTANTIATE_TEST_CASE_P(__VA_ARGS__) 
   41 #ifndef TYPED_TEST_SUITE   
   42 #define TYPED_TEST_SUITE(...) TYPED_TEST_CASE(__VA_ARGS__) 
   45 #include <moveit_msgs/msg/motion_sequence_request.hpp> 
   50 #include <boost/core/demangle.hpp> 
   55 #include <moveit_msgs/msg/constraints.hpp> 
   56 #include <moveit_msgs/action/move_group.hpp> 
   57 #include <sensor_msgs/msg/joint_state.hpp> 
   60 #if __has_include(<tf2/LinearMath/Quaternion.hpp>) 
   61 #include <tf2/LinearMath/Quaternion.hpp> 
   63 #include <tf2/LinearMath/Quaternion.h> 
   65 #if __has_include(<tf2/convert.hpp>) 
   66 #include <tf2/convert.hpp> 
   68 #include <tf2/convert.h> 
   70 #include <tf2_geometry_msgs/tf2_geometry_msgs.hpp> 
   77 static constexpr int32_t DEFAULT_SERVICE_TIMEOUT(10);
 
   78 static constexpr 
double DEFAULT_ACCELERATION_EQUALITY_TOLERANCE{ 1e-6 };
 
   79 static constexpr 
double DEFAULT_ROTATION_AXIS_EQUALITY_TOLERANCE{ 1e-8 };
 
   84 inline static constexpr 
double deg2Rad(
double angle)
 
   86   return (angle / 180.0) * M_PI;
 
   89 inline std::string 
getJointName(
size_t joint_number, 
const std::string& joint_prefix)
 
   91   return joint_prefix + std::to_string(joint_number);
 
  109 inline sensor_msgs::msg::JointState 
generateJointState(
const std::vector<double>& pos, 
const std::vector<double>& vel,
 
  112   sensor_msgs::msg::JointState state;
 
  113   auto posit = pos.cbegin();
 
  116   while (posit != pos.cend())
 
  119     state.position.push_back(*posit);
 
  124   for (
const auto& one_vel : vel)
 
  126     state.velocity.push_back(one_vel);
 
  137 inline moveit_msgs::msg::Constraints
 
  141   moveit_msgs::msg::Constraints gc;
 
  143   auto pos_it = pos_list.begin();
 
  145   for (
size_t i = 0; i < pos_list.size(); ++i)
 
  147     moveit_msgs::msg::JointConstraint jc;
 
  149     jc.position = *pos_it;
 
  150     gc.joint_constraints.push_back(jc);
 
  164                          Eigen::Isometry3d& goal_pose_expect);
 
  173 void createDummyRequest(
const moveit::core::RobotModelConstPtr& robot_model, 
const std::string& planning_group,
 
  188 bool isGoalReached(
const trajectory_msgs::msg::JointTrajectory& trajectory,
 
  189                    const std::vector<moveit_msgs::msg::JointConstraint>& goal, 
const double joint_position_tolerance,
 
  190                    const double joint_velocity_tolerance = 1.0e-6);
 
  202 bool isGoalReached(
const moveit::core::RobotModelConstPtr& robot_model,
 
  203                    const trajectory_msgs::msg::JointTrajectory& trajectory,
 
  205                    const double orientation_tolerance);
 
  207 bool isGoalReached(
const moveit::core::RobotModelConstPtr& robot_model,
 
  208                    const trajectory_msgs::msg::JointTrajectory& trajectory,
 
  215                              const trajectory_msgs::msg::JointTrajectory& trajectory,
 
  217                              const double rot_axis_norm_tolerance, 
const double rot_angle_tolerance = 10e-5);
 
  228 bool checkSLERP(
const Eigen::Isometry3d& start_pose, 
const Eigen::Isometry3d& goal_pose,
 
  229                 const Eigen::Isometry3d& wp_pose, 
const double rot_axis_norm_tolerance,
 
  230                 const double rot_angle_tolerance = 10e-5);
 
  238 inline int getWayPointIndex(
const robot_trajectory::RobotTrajectoryPtr& trajectory, 
const double time_from_start)
 
  240   int index_before, index_after;
 
  242   trajectory->findWayPointIndicesForDurationAfterStart(time_from_start, index_before, index_after, blend);
 
  243   return blend > 0.5 ? index_after : index_before;
 
  311 bool toTCPPose(
const moveit::core::RobotModelConstPtr& robot_model, 
const std::string& link_name,
 
  312                const std::vector<double>& joint_values, geometry_msgs::msg::Pose& pose,
 
  323 bool computeLinkFK(
const moveit::core::RobotModelConstPtr& robot_model, 
const std::string& link_name,
 
  324                    const std::map<std::string, double>& joint_state, Eigen::Isometry3d& pose);
 
  336                                           const double time_tolerance);
 
  346                                        double joint_velocity_tolerance, 
double joint_accleration_tolerance);
 
  367 void computeCartVelocity(
const Eigen::Isometry3d& pose_1, 
const Eigen::Isometry3d& pose_2, 
double duration,
 
  380                                     geometry_msgs::msg::PoseStamped& p1, geometry_msgs::msg::PoseStamped& p2);
 
  382 void getOriChange(Eigen::Matrix3d& ori1, Eigen::Matrix3d& ori2);
 
  384 void createFakeCartTraj(
const robot_trajectory::RobotTrajectoryPtr& traj, 
const std::string& link_name,
 
  385                         moveit_msgs::msg::RobotTrajectory& fake_traj);
 
  387 inline geometry_msgs::msg::Quaternion 
fromEuler(
double a, 
double b, 
double c)
 
  389   tf2::Vector3 qvz(0., 0., 1.);
 
  390   tf2::Vector3 qvy(0., 1., 0.);
 
  391   tf2::Quaternion q1(qvz, 
a);
 
  393   q1 = q1 * tf2::Quaternion(qvy, b);
 
  394   q1 = q1 * tf2::Quaternion(qvz, 
c);
 
  396   return tf2::toMsg(q1);
 
  415 bool getBlendTestData(
const rclcpp::Node::SharedPtr& node, 
const size_t& dataset_num, 
const std::string& name_prefix,
 
  416                       std::vector<BlendTestData>& datasets);
 
  429                       double joint_acceleration_tolerance, 
double cartesian_velocity_tolerance,
 
  430                       double cartesian_angular_velocity_tolerance);
 
  444                                    const std::shared_ptr<pilz_industrial_motion_planner::TrajectoryGenerator>& tg,
 
  445                                    const std::string& group_name, 
const std::string& link_name,
 
  452                                          const std::string& planner_id, 
const std::string& group_name,
 
  453                                          const std::string& link_name,
 
  454                                          moveit_msgs::msg::MotionSequenceRequest& req_list);
 
  456 void checkRobotModel(
const moveit::core::RobotModelConstPtr& robot_model, 
const std::string& group_name,
 
  457                      const std::string& link_name);
 
  463 ::testing::AssertionResult 
hasTrapezoidVelocity(std::vector<double> accelerations, 
const double acc_tol);
 
  470 ::testing::AssertionResult
 
  472                                 const std::string& link_name,
 
  473                                 const double acc_tol = DEFAULT_ACCELERATION_EQUALITY_TOLERANCE);
 
  481 ::testing::AssertionResult
 
  483                              const double rot_axis_tol = DEFAULT_ROTATION_AXIS_EQUALITY_TOLERANCE,
 
  484                              const double acc_tol = DEFAULT_ACCELERATION_EQUALITY_TOLERANCE);
 
  488   return std::is_sorted(vec.begin(), vec.end(), [tol](
double a, 
double b) {
 
  489     return !(std::abs(a - b) < tol || a < b);  
 
Representation of a robot's state. This includes position, velocity, acceleration and effort.
 
Container for JointLimits, essentially a map with convenience functions. Adds the ability to as for l...
 
This class combines CartesianLimit and JointLimits into on single class.
 
Vec3fX< details::Vec3Data< double > > Vector3d
 
moveit_msgs::msg::MotionPlanRequest MotionPlanRequest
 
bool isMonotonouslyDecreasing(const std::vector< double > &vec, const double &tol)
 
bool checkBlendingCartSpaceContinuity(const pilz_industrial_motion_planner::TrajectoryBlendRequest &req, const pilz_industrial_motion_planner::TrajectoryBlendResponse &res, const pilz_industrial_motion_planner::LimitsContainer &planner_limits)
 
bool isGoalReached(const trajectory_msgs::msg::JointTrajectory &trajectory, const std::vector< moveit_msgs::msg::JointConstraint > &goal, const double joint_position_tolerance, const double joint_velocity_tolerance=1.0e-6)
check if the goal given in joint space is reached Only the last point in the trajectory is veryfied.
 
bool computeLinkFK(const moveit::core::RobotModelConstPtr &robot_model, const std::string &link_name, const std::map< std::string, double > &joint_state, Eigen::Isometry3d &pose)
computeLinkFK
 
sensor_msgs::msg::JointState generateJointState(const std::vector< double > &pos, const std::vector< double > &vel, const std::string &joint_prefix=testutils::JOINT_NAME_PREFIX)
 
::testing::AssertionResult checkCartesianTranslationalPath(const robot_trajectory::RobotTrajectoryConstPtr &trajectory, const std::string &link_name, const double acc_tol=DEFAULT_ACCELERATION_EQUALITY_TOLERANCE)
Check that the translational path of a given trajectory has a trapezoid velocity profile.
 
bool isVelocityBounded(const trajectory_msgs::msg::JointTrajectory &trajectory, const pilz_industrial_motion_planner::JointLimitsContainer &joint_limits)
is Velocity Bounded
 
void createDummyRequest(const moveit::core::RobotModelConstPtr &robot_model, const std::string &planning_group, planning_interface::MotionPlanRequest &req)
create a dummy motion plan request with zero start state No goal constraint is given.
 
int getWayPointIndex(const robot_trajectory::RobotTrajectoryPtr &trajectory, const double time_from_start)
get the waypoint index from time from start
 
bool getExpectedGoalPose(const moveit::core::RobotModelConstPtr &robot_model, const planning_interface::MotionPlanRequest &req, std::string &link_name, Eigen::Isometry3d &goal_pose_expect)
Determines the goal position from the given request. TRUE if successful, FALSE otherwise.
 
bool isAccelerationBounded(const trajectory_msgs::msg::JointTrajectory &trajectory, const pilz_industrial_motion_planner::JointLimitsContainer &joint_limits)
is Acceleration Bounded
 
bool checkThatPointsInRadius(const std::string &link_name, const double &r, Eigen::Isometry3d &circ_pose, const pilz_industrial_motion_planner::TrajectoryBlendResponse &res)
Checks if all points of the blending trajectory lie within the blending radius.
 
void generateRequestMsgFromBlendTestData(const moveit::core::RobotModelConstPtr &robot_model, const BlendTestData &data, const std::string &planner_id, const std::string &group_name, const std::string &link_name, moveit_msgs::msg::MotionSequenceRequest &req_list)
 
bool generateTrajFromBlendTestData(const planning_scene::PlanningSceneConstPtr &scene, const std::shared_ptr< pilz_industrial_motion_planner::TrajectoryGenerator > &tg, const std::string &group_name, const std::string &link_name, const BlendTestData &data, const double &sampling_time_1, const double &sampling_time_2, planning_interface::MotionPlanResponse &res_lin_1, planning_interface::MotionPlanResponse &res_lin_2, double &dis_lin_1, double &dis_lin_2)
generate two LIN trajectories from test data set
 
bool isTrajectoryConsistent(const trajectory_msgs::msg::JointTrajectory &trajectory)
check if the sizes of the joint position/veloicty/acceleration are correct
 
void createFakeCartTraj(const robot_trajectory::RobotTrajectoryPtr &traj, const std::string &link_name, moveit_msgs::msg::RobotTrajectory &fake_traj)
 
moveit_msgs::msg::Constraints generateJointConstraint(const std::vector< double > &pos_list, const std::string &joint_prefix=testutils::JOINT_NAME_PREFIX)
 
bool checkBlendResult(const pilz_industrial_motion_planner::TrajectoryBlendRequest &blend_req, const pilz_industrial_motion_planner::TrajectoryBlendResponse &blend_res, const pilz_industrial_motion_planner::LimitsContainer &limits, double joint_velocity_tolerance, double joint_acceleration_tolerance, double cartesian_velocity_tolerance, double cartesian_angular_velocity_tolerance)
check the blending result of lin-lin
 
bool getBlendTestData(const rclcpp::Node::SharedPtr &node, const size_t &dataset_num, const std::string &name_prefix, std::vector< BlendTestData > &datasets)
fetch test datasets from node parameters
 
pilz_industrial_motion_planner::JointLimitsContainer createFakeLimits(const std::vector< std::string > &joint_names)
Create limits for tests to avoid the need to get the limits from the node parameter.
 
bool checkSLERP(const Eigen::Isometry3d &start_pose, const Eigen::Isometry3d &goal_pose, const Eigen::Isometry3d &wp_pose, const double rot_axis_norm_tolerance, const double rot_angle_tolerance=10e-5)
check SLERP. The orientation should rotate around the same axis linearly.
 
::testing::AssertionResult hasStrictlyIncreasingTime(const robot_trajectory::RobotTrajectoryPtr &trajectory)
Checks that every waypoint in the trajectory has a non-zero duration between itself and its predecess...
 
bool checkJointTrajectory(const trajectory_msgs::msg::JointTrajectory &trajectory, const pilz_industrial_motion_planner::JointLimitsContainer &joint_limits)
check joint trajectory of consistency, position, velocity and acceleration limits
 
std::string getJointName(size_t joint_number, const std::string &joint_prefix)
 
void computeCartVelocity(const Eigen::Isometry3d &pose_1, const Eigen::Isometry3d &pose_2, double duration, Eigen::Vector3d &v, Eigen::Vector3d &w)
compute Cartesian velocity
 
geometry_msgs::msg::Quaternion fromEuler(double a, double b, double c)
 
void getOriChange(Eigen::Matrix3d &ori1, Eigen::Matrix3d &ori2)
 
bool toTCPPose(const moveit::core::RobotModelConstPtr &robot_model, const std::string &link_name, const std::vector< double > &joint_values, geometry_msgs::msg::Pose &pose, const std::string &joint_prefix=testutils::JOINT_NAME_PREFIX)
compute the tcp pose from joint values
 
std::string demangle(char const *name)
 
void getLinLinPosesWithoutOriChange(const std::string &frame_id, sensor_msgs::msg::JointState &initialJointState, geometry_msgs::msg::PoseStamped &p1, geometry_msgs::msg::PoseStamped &p2)
Returns an initial joint state and two poses which can be used to perform a Lin-Lin movement.
 
bool checkCartesianLinearity(const moveit::core::RobotModelConstPtr &robot_model, const trajectory_msgs::msg::JointTrajectory &trajectory, const planning_interface::MotionPlanRequest &req, const double translation_norm_tolerance, const double rot_axis_norm_tolerance, const double rot_angle_tolerance=10e-5)
Check that given trajectory is straight line.
 
const std::string JOINT_NAME_PREFIX("prbt_joint_")
 
bool isPositionBounded(const trajectory_msgs::msg::JointTrajectory &trajectory, const pilz_industrial_motion_planner::JointLimitsContainer &joint_limits)
is Position Bounded
 
::testing::AssertionResult hasTrapezoidVelocity(std::vector< double > accelerations, const double acc_tol)
Check that a given vector of accelerations represents a trapezoid velocity profile.
 
bool checkOriginalTrajectoryAfterBlending(const pilz_industrial_motion_planner::TrajectoryBlendRequest &req, const pilz_industrial_motion_planner::TrajectoryBlendResponse &res, const double time_tolerance)
checkOriginalTrajectoryAfterBlending
 
bool checkBlendingJointSpaceContinuity(const pilz_industrial_motion_planner::TrajectoryBlendResponse &res, double joint_velocity_tolerance, double joint_accleration_tolerance)
check the blending result, if the joint space continuity is fulfilled
 
void createPTPRequest(const std::string &planning_group, const moveit::core::RobotState &start_state, const moveit::core::RobotState &goal_state, planning_interface::MotionPlanRequest &req)
 
void checkRobotModel(const moveit::core::RobotModelConstPtr &robot_model, const std::string &group_name, const std::string &link_name)
 
::testing::AssertionResult checkCartesianRotationalPath(const robot_trajectory::RobotTrajectoryConstPtr &trajectory, const std::string &link_name, const double rot_axis_tol=DEFAULT_ROTATION_AXIS_EQUALITY_TOLERANCE, const double acc_tol=DEFAULT_ACCELERATION_EQUALITY_TOLERANCE)
Check that the rotational path of a given trajectory is a quaternion slerp.
 
Test data for blending, which contains three joint position vectors of three robot state.
 
std::vector< double > end_position
 
std::vector< double > start_position
 
std::vector< double > mid_position