35#include <gtest/gtest.h>
42#include <Eigen/Geometry>
43#include <kdl/frames.hpp>
44#include <kdl/path_roundedcomposite.hpp>
45#include <kdl/rotational_interpolation_sa.hpp>
46#include <kdl/trajectory.hpp>
47#include <kdl/trajectory_segment.hpp>
48#include <kdl/velocityprofile_trap.hpp>
53#include <tf2_eigen/tf2_eigen.hpp>
54#include <tf2_geometry_msgs/tf2_geometry_msgs.hpp>
62#define _USE_MATH_DEFINES
64static constexpr double EPSILON{ 1.0e-6 };
65static constexpr double IK_SEED_OFFSET{ 0.1 };
66static constexpr double L0{ 0.2604 };
67static constexpr double L1{ 0.3500 };
68static constexpr double L2{ 0.3070 };
69static constexpr double L3{ 0.0840 };
90 rclcpp::NodeOptions node_options;
91 node_options.automatically_declare_parameters_from_overrides(
true);
92 node_ = rclcpp::Node::make_shared(
"unittest_trajectory_functions", node_options);
95 rm_loader_ = std::make_unique<robot_model_loader::RobotModelLoader>(
node_);
97 ASSERT_TRUE(
bool(
robot_model_)) <<
"Failed to load robot model";
102 ASSERT_TRUE(
node_->has_parameter(
"planning_group"));
104 ASSERT_TRUE(
node_->has_parameter(
"group_tip_link"));
106 ASSERT_TRUE(
node_->has_parameter(
"tcp_link"));
108 ASSERT_TRUE(
node_->has_parameter(
"ik_fast_link"));
110 ASSERT_TRUE(
node_->has_parameter(
"random_test_number"));
136 bool tfNear(
const Eigen::Isometry3d& pose1,
const Eigen::Isometry3d& pose2,
double epsilon);
145 bool jointsNear(
const std::vector<double>& joints1,
const std::vector<double>& joints2,
double epsilon);
164 const std::string& object_name,
const Eigen::Isometry3d& object_pose,
172 std::unique_ptr<robot_model_loader::RobotModelLoader>
rm_loader_;
188 for (std::size_t i = 0; i < 3; ++i)
190 for (std::size_t j = 0; j < 4; ++j)
192 if (fabs(pose1(i, j) - pose2(i, j)) > fabs(epsilon))
202 if (joints1.size() != joints2.size())
206 for (std::size_t i = 0; i < joints1.size(); ++i)
208 if (fabs(joints1.at(i) - joints2.at(i)) > fabs(epsilon))
219 std::vector<double> joints;
228 const std::string& object_name,
const Eigen::Isometry3d& object_pose,
231 state.
attachBody(std::make_unique<moveit::core::AttachedBody>(
232 link, object_name, object_pose, std::vector<shapes::ShapeConstPtr>{}, EigenSTL::vector_Isometry3d{},
233 std::set<std::string>{}, trajectory_msgs::msg::JointTrajectory{}, subframes));
258 Eigen::Isometry3d tip_pose;
259 std::map<std::string, double> test_state = zero_state_;
261 EXPECT_NEAR(tip_pose(0, 3), 0,
EPSILON);
262 EXPECT_NEAR(tip_pose(1, 3), 0,
EPSILON);
263 EXPECT_NEAR(tip_pose(2, 3), L0 + L1 + L2 + L3,
EPSILON);
265 test_state[joint_names_.at(1)] = M_PI_2;
267 EXPECT_NEAR(tip_pose(0, 3), L1 + L2 + L3,
EPSILON);
268 EXPECT_NEAR(tip_pose(1, 3), 0,
EPSILON);
269 EXPECT_NEAR(tip_pose(2, 3), L0,
EPSILON);
271 test_state[joint_names_.at(1)] = -M_PI_2;
272 test_state[joint_names_.at(2)] = M_PI_2;
274 EXPECT_NEAR(tip_pose(0, 3), -L1,
EPSILON);
275 EXPECT_NEAR(tip_pose(1, 3), 0,
EPSILON);
276 EXPECT_NEAR(tip_pose(2, 3), L0 - L2 - L3,
EPSILON);
279 std::string link_name =
"wrong_link_name";
294 throw(
"No IK solver configured for group '" + planning_group_ +
"'");
299 while (random_test_number_ > 0)
304 geometry_msgs::msg::Pose pose_expect = tf2::toMsg(rstate.
getFrameTransform(ik_fast_link_));
307 std::vector<geometry_msgs::msg::Pose> ik_poses;
308 ik_poses.push_back(pose_expect);
309 std::vector<double> ik_seed, ik_expect, ik_actual;
323 std::vector<std::vector<double>> ik_solutions;
325 moveit_msgs::msg::MoveItErrorCodes err_code;
329 EXPECT_TRUE(solver->getPositionIK(ik_poses, ik_seed, ik_solutions, ik_result, options));
332 EXPECT_TRUE(solver->getPositionIK(pose_expect, ik_seed, ik_actual, err_code));
334 ASSERT_EQ(ik_expect.size(), ik_actual.size());
336 for (std::size_t i = 0; i < ik_expect.size(); ++i)
338 EXPECT_NEAR(ik_actual.at(i), ik_expect.at(i), 4 * IK_SEED_OFFSET);
341 --random_test_number_;
355 while (random_test_number_ > 0)
363 std::map<std::string, double> ik_seed, ik_expect;
364 for (
const auto& joint_name : joint_names_)
381 std::map<std::string, double> ik_actual;
383 EXPECT_TRUE(rstate.
setFromIK(robot_model_->getJointModelGroup(planning_group_), pose_expect, tcp_link_));
385 for (
const auto& joint_name : joint_names_)
391 for (
const auto& joint_pair : ik_actual)
393 EXPECT_NEAR(joint_pair.second, ik_expect.at(joint_pair.first), 4 * IK_SEED_OFFSET);
401 EXPECT_TRUE(tfNear(pose_expect, pose_actual,
EPSILON));
403 --random_test_number_;
414 std::vector<double> default_joints = getJoints(jmg, state);
419 Eigen::Isometry3d object_pose_in_tip = Eigen::Isometry3d::Identity();
421 attachToLink(state, tip_link,
"object", object_pose_in_tip, subframes);
424 Eigen::Isometry3d object_pose_in_base = tip_pose_in_base * object_pose_in_tip;
425 bool success = state.
setFromIK(jmg, object_pose_in_base,
"object");
426 EXPECT_TRUE(success);
429 std::vector<double> ik_joints = getJoints(jmg, state);
430 EXPECT_TRUE(jointsNear(ik_joints, default_joints, 4 * IK_SEED_OFFSET));
440 std::vector<double> default_joints = getJoints(jmg, state);
445 Eigen::Isometry3d object_pose_in_tip;
446 object_pose_in_tip = Eigen::Translation3d(1, 2, 3);
447 object_pose_in_tip *= Eigen::AngleAxis(M_PI_2, Eigen::Vector3d::UnitX());
449 attachToLink(state, tip_link,
"object", object_pose_in_tip, subframes);
452 Eigen::Isometry3d object_pose_in_base = tip_pose_in_base * object_pose_in_tip;
453 bool success = state.
setFromIK(jmg, object_pose_in_base,
"object");
454 EXPECT_TRUE(success);
457 std::vector<double> ik_joints = getJoints(jmg, state);
458 EXPECT_TRUE(jointsNear(ik_joints, default_joints, 4 * IK_SEED_OFFSET));
468 std::vector<double> default_joints = getJoints(jmg, state);
473 Eigen::Isometry3d object_pose_in_tip = Eigen::Isometry3d::Identity();
474 Eigen::Isometry3d subframe_pose_in_object = Eigen::Isometry3d::Identity();
476 attachToLink(state, tip_link,
"object", object_pose_in_tip, subframes);
479 Eigen::Isometry3d subframe_pose_in_base = tip_pose_in_base * object_pose_in_tip * subframe_pose_in_object;
480 bool success = state.
setFromIK(jmg, subframe_pose_in_base,
"object/subframe");
481 EXPECT_TRUE(success);
484 std::vector<double> ik_joints = getJoints(jmg, state);
485 EXPECT_TRUE(jointsNear(ik_joints, default_joints, 4 * IK_SEED_OFFSET));
495 std::vector<double> default_joints = getJoints(jmg, state);
500 Eigen::Isometry3d object_pose_in_tip;
501 object_pose_in_tip = Eigen::Translation3d(1, 2, 3);
502 object_pose_in_tip *= Eigen::AngleAxis(M_PI_2, Eigen::Vector3d::UnitX());
504 Eigen::Isometry3d subframe_pose_in_object;
505 subframe_pose_in_object = Eigen::Translation3d(4, 5, 6);
506 subframe_pose_in_object *= Eigen::AngleAxis(M_PI_2, Eigen::Vector3d::UnitY());
509 attachToLink(state, tip_link,
"object", object_pose_in_tip, subframes);
512 Eigen::Isometry3d subframe_pose_in_base = tip_pose_in_base * object_pose_in_tip * subframe_pose_in_object;
513 bool success = state.
setFromIK(jmg, subframe_pose_in_base,
"object/subframe");
514 EXPECT_TRUE(success);
517 std::vector<double> ik_joints = getJoints(jmg, state);
518 EXPECT_TRUE(jointsNear(ik_joints, default_joints, 4 * IK_SEED_OFFSET));
530 const std::string frame_id = robot_model_->getModelFrame();
533 while (random_test_number_ > 0)
541 std::map<std::string, double> ik_seed, ik_expect;
542 for (
const auto& joint_name : robot_model_->getJointModelGroup(planning_group_)->getActiveJointModelNames())
556 std::map<std::string, double> ik_actual;
558 frame_id, ik_seed, ik_actual,
false));
561 for (
const auto& joint_pair : ik_actual)
563 EXPECT_NEAR(joint_pair.second, ik_expect.at(joint_pair.first), 4 * IK_SEED_OFFSET);
566 --random_test_number_;
575 const std::string frame_id = robot_model_->getModelFrame();
576 Eigen::Isometry3d pose_expect;
578 std::map<std::string, double> ik_seed;
581 std::map<std::string, double> ik_actual;
583 pose_expect, frame_id, ik_seed, ik_actual,
false));
591 const std::string frame_id = robot_model_->getModelFrame();
592 Eigen::Isometry3d pose_expect;
594 std::map<std::string, double> ik_seed;
597 std::map<std::string, double> ik_actual;
599 frame_id, ik_seed, ik_actual,
false));
609 Eigen::Isometry3d pose_expect;
611 std::map<std::string, double> ik_seed;
614 std::map<std::string, double> ik_actual;
616 "InvalidFrameId", ik_seed, ik_actual,
false));
701 const std::string frame_id = robot_model_->getModelFrame();
705 std::map<std::string, double> ik_seed;
708 ik_seed[joint_name] = 0;
712 std::vector<double> ik_goal = { 0, 2.3, -2.3, 0, 0, 0 };
719 std::map<std::string, double> ik_actual;
721 frame_id, ik_seed, ik_actual,
false));
725 frame_id, ik_seed, ik_actual,
true));
740 const std::map<std::string, double> position_last, velocity_last, position_current;
741 double duration_last{ 0.0 };
744 double duration_current = 10e-7;
762 const std::string test_joint_name{
"joint" };
764 std::map<std::string, double> position_last{ { test_joint_name, 2.0 } };
765 std::map<std::string, double> position_current{ { test_joint_name, 10.0 } };
766 std::map<std::string, double> velocity_last;
767 double duration_current{ 1.0 };
768 double duration_last{ 0.0 };
775 ((position_current.at(test_joint_name) - position_last.at(test_joint_name)) / duration_current) - 1.0;
777 joint_limits.addLimit(test_joint_name, test_joint_limits);
795 const std::string test_joint_name{
"joint" };
797 double duration_current = 1.0;
798 double duration_last = 1.0;
800 std::map<std::string, double> position_last{ { test_joint_name, 2.0 } };
801 std::map<std::string, double> position_current{ { test_joint_name, 20.0 } };
802 double velocity_current =
803 ((position_current.at(test_joint_name) - position_last.at(test_joint_name)) / duration_current);
804 std::map<std::string, double> velocity_last{ { test_joint_name, 9.0 } };
810 test_joint_limits.
max_velocity = velocity_current + 1.0;
813 double acceleration_current =
814 (velocity_current - velocity_last.at(test_joint_name)) / (duration_last + duration_current) * 2;
820 joint_limits.addLimit(test_joint_name, test_joint_limits);
838 const std::string test_joint_name{
"joint" };
840 double duration_current = 1.0;
841 double duration_last = 1.0;
843 std::map<std::string, double> position_last{ { test_joint_name, 20.0 } };
844 std::map<std::string, double> position_current{ { test_joint_name, 2.0 } };
845 double velocity_current =
846 ((position_current.at(test_joint_name) - position_last.at(test_joint_name)) / duration_current);
847 std::map<std::string, double> velocity_last{ { test_joint_name, 19.0 } };
853 test_joint_limits.
max_velocity = fabs(velocity_current) + 1.0;
856 double acceleration_current =
857 (velocity_current - velocity_last.at(test_joint_name)) / (duration_last + duration_current) * 2;
863 joint_limits.addLimit(test_joint_name, test_joint_limits);
887 KDL::Path_RoundedComposite* path =
888 new KDL::Path_RoundedComposite(0.2, 0.01,
new KDL::RotationalInterpolation_SingleAxis());
889 path->Add(KDL::Frame(KDL::Rotation::RPY(0, 0, 0), KDL::Vector(-1, 0, 0)));
892 KDL::VelocityProfile* vel_prof =
new KDL::VelocityProfile_Trap(0.5, 0.1);
893 vel_prof->SetProfile(0, path->PathLength());
894 KDL::Trajectory_Segment kdl_trajectory(path, vel_prof);
897 std::string group_name{
"invalid_group_name" };
898 std::map<std::string, double> initial_joint_position;
899 double sampling_time{ 0.1 };
900 trajectory_msgs::msg::JointTrajectory joint_trajectory;
901 moveit_msgs::msg::MoveItErrorCodes error_code;
902 bool check_self_collision{
false };
905 planning_scene_,
joint_limits, kdl_trajectory, group_name, tcp_link_, initial_joint_position, sampling_time,
906 joint_trajectory, error_code, check_self_collision));
908 std::map<std::string, double> initial_joint_velocity;
914 cart_traj.
points.push_back(cart_traj_point);
917 planning_scene_,
joint_limits, cart_traj, group_name, tcp_link_, initial_joint_position, initial_joint_velocity,
918 joint_trajectory, error_code, check_self_collision));
934 robot_trajectory::RobotTrajectoryPtr first_trajectory =
935 std::make_shared<robot_trajectory::RobotTrajectory>(robot_model_, planning_group_);
936 robot_trajectory::RobotTrajectoryPtr second_trajectory =
937 std::make_shared<robot_trajectory::RobotTrajectory>(robot_model_, planning_group_);
938 double epsilon{ 0.0 };
939 double sampling_time{ 0.0 };
942 first_trajectory->insertWayPoint(0, rstate, 0.1);
943 second_trajectory->insertWayPoint(0, rstate, 0.1);
946 epsilon, sampling_time));
962 robot_trajectory::RobotTrajectoryPtr first_trajectory =
963 std::make_shared<robot_trajectory::RobotTrajectory>(robot_model_, planning_group_);
964 robot_trajectory::RobotTrajectoryPtr second_trajectory =
965 std::make_shared<robot_trajectory::RobotTrajectory>(robot_model_, planning_group_);
966 double epsilon{ 0.0001 };
967 double sampling_time{ 0.0 };
968 double expected_sampling_time{ 0.1 };
971 first_trajectory->insertWayPoint(0, rstate, expected_sampling_time);
972 first_trajectory->insertWayPoint(1, rstate, expected_sampling_time);
974 second_trajectory->insertWayPoint(0, rstate, expected_sampling_time);
975 second_trajectory->insertWayPoint(1, rstate, expected_sampling_time);
976 second_trajectory->insertWayPoint(2, rstate, expected_sampling_time);
979 epsilon, sampling_time));
980 EXPECT_EQ(expected_sampling_time, sampling_time);
996 robot_trajectory::RobotTrajectoryPtr first_trajectory =
997 std::make_shared<robot_trajectory::RobotTrajectory>(robot_model_, planning_group_);
998 robot_trajectory::RobotTrajectoryPtr second_trajectory =
999 std::make_shared<robot_trajectory::RobotTrajectory>(robot_model_, planning_group_);
1000 double epsilon{ 0.0001 };
1001 double sampling_time{ 0.0 };
1002 double expected_sampling_time{ 0.1 };
1005 first_trajectory->insertWayPoint(0, rstate, expected_sampling_time);
1006 first_trajectory->insertWayPoint(1, rstate, expected_sampling_time);
1007 first_trajectory->insertWayPoint(2, rstate, expected_sampling_time);
1009 first_trajectory->insertWayPoint(2, rstate, expected_sampling_time + 1.0);
1010 first_trajectory->insertWayPoint(3, rstate, expected_sampling_time);
1012 second_trajectory->insertWayPoint(0, rstate, expected_sampling_time);
1013 second_trajectory->insertWayPoint(1, rstate, expected_sampling_time);
1014 second_trajectory->insertWayPoint(2, rstate, expected_sampling_time);
1015 second_trajectory->insertWayPoint(3, rstate, expected_sampling_time);
1018 epsilon, sampling_time));
1019 EXPECT_EQ(expected_sampling_time, sampling_time);
1038 double default_joint_position[6] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
1041 default_joint_position[0] = default_joint_position[0] + 70.0;
1044 double epsilon{ 0.0001 };
1065 double default_joint_position[6] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
1069 double default_joint_velocity[6] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
1072 default_joint_velocity[1] = default_joint_velocity[1] + 10.0;
1075 double epsilon{ 0.0001 };
1096 double default_joint_position[6] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
1101 double default_joint_velocity[6] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
1105 double default_joint_acceleration[6] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
1108 default_joint_acceleration[1] = default_joint_acceleration[1] + 10.0;
1111 double epsilon{ 0.0001 };
1131 double default_joint_velocity[6] = { 1.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
1134 double epsilon{ 0.0001 };
1154 double default_joint_velocity[6] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
1158 double default_joint_acceleration[6] = { 1.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
1161 double epsilon{ 0.0001 };
1167 rclcpp::init(argc, argv);
1168 testing::InitGoogleTest(&argc, argv);
1169 return RUN_ALL_TESTS();
std::unique_ptr< robot_model_loader::RobotModelLoader > rm_loader_
std::vector< double > getJoints(const moveit::core::JointModelGroup *jmg, const moveit::core::RobotState &state)
get the current joint values of the robot state
void SetUp() override
Create test scenario for trajectory functions.
std::string group_tip_link_
rclcpp::Node::SharedPtr node_
std::string planning_group_
random_numbers::RandomNumberGenerator rng_
void attachToLink(moveit::core::RobotState &state, const moveit::core::LinkModel *link, const std::string &object_name, const Eigen::Isometry3d &object_pose, const moveit::core::FixedTransformsMap &subframes)
attach a collision object and subframes to a link
std::string ik_fast_link_
moveit::core::RobotModelConstPtr robot_model_
std::map< std::string, double > zero_state_
planning_scene::PlanningSceneConstPtr planning_scene_
bool tfNear(const Eigen::Isometry3d &pose1, const Eigen::Isometry3d &pose2, double epsilon)
check if two transformations are close
bool jointsNear(const std::vector< double > &joints1, const std::vector< double > &joints2, double epsilon)
check if two sets of joint positions are close
std::vector< std::string > joint_names_
moveit::core::RobotStatePtr robot_state_
Parametrized class for tests with and without gripper.
const std::vector< std::string > & getActiveJointModelNames() const
Get the names of the active joints in this group. These are the names of the joints returned by getJo...
const kinematics::KinematicsBaseConstPtr getSolverInstance() const
A link from the robot. Contains the constant transform applied to the link and its geometry.
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 attachBody(std::unique_ptr< AttachedBody > attached_body)
Add an attached body to this state.
void setJointGroupAccelerations(const std::string &joint_group_name, const double *gstate)
Given accelerations for the variables that make up a group, in the order found in the group (includin...
void setJointGroupVelocities(const std::string &joint_group_name, const double *gstate)
Given velocities for the variables that make up a group, in the order found in the group (including v...
void setJointGroupPositions(const std::string &joint_group_name, const double *gstate)
Given positions for the variables that make up a group, in the order found in the group (including va...
const Eigen::Isometry3d & getFrameTransform(const std::string &frame_id, bool *frame_found=nullptr)
Get the transformation matrix from the model frame (root of model) to the frame identified by frame_i...
void setToRandomPositions()
Set all joints to random values. Values will be within default bounds.
double getVariablePosition(const std::string &variable) const
Get the position of a particular variable. An exception is thrown if the variable is not known.
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...
bool setFromIK(const JointModelGroup *group, const geometry_msgs::msg::Pose &pose, double timeout=0.0, const GroupStateValidityCallbackFn &constraint=GroupStateValidityCallbackFn(), const kinematics::KinematicsQueryOptions &options=kinematics::KinematicsQueryOptions(), const kinematics::KinematicsBase::IKCostFn &cost_function=kinematics::KinematicsBase::IKCostFn())
If the group this state corresponds to is a chain and a solver is available, then the joint values ca...
Container for JointLimits, essentially a map with convenience functions. Adds the ability to as for l...
std::map< std::string, Eigen::Isometry3d, std::less< std::string >, Eigen::aligned_allocator< std::pair< const std::string, Eigen::Isometry3d > > > FixedTransformsMap
Map frame names to the transformation matrix that can transform objects from the frame name to the pl...
bool computeLinkFK(moveit::core::RobotState &robot_state, const std::string &link_name, const std::map< std::string, double > &joint_state, Eigen::Isometry3d &pose)
compute the pose of a link at a given robot state
bool isRobotStateStationary(const moveit::core::RobotState &state, const std::string &group, double EPSILON)
check if the robot state have zero velocity/acceleration
bool determineAndCheckSamplingTime(const robot_trajectory::RobotTrajectoryPtr &first_trajectory, const robot_trajectory::RobotTrajectoryPtr &second_trajectory, double EPSILON, double &sampling_time)
Determines the sampling time and checks that both trajectroies use the same sampling time.
bool verifySampleJointLimits(const std::map< std::string, double > &position_last, const std::map< std::string, double > &velocity_last, const std::map< std::string, double > &position_current, double duration_last, double duration_current, const JointLimitsContainer &joint_limits)
verify the velocity/acceleration limits of current sample (based on backward difference computation) ...
bool generateJointTrajectory(const planning_scene::PlanningSceneConstPtr &scene, const JointLimitsContainer &joint_limits, const KDL::Trajectory &trajectory, const std::string &group_name, const std::string &link_name, const std::map< std::string, double > &initial_joint_position, double sampling_time, trajectory_msgs::msg::JointTrajectory &joint_trajectory, moveit_msgs::msg::MoveItErrorCodes &error_code, bool check_self_collision=false)
Generate joint trajectory from a KDL Cartesian trajectory.
bool computePoseIK(const planning_scene::PlanningSceneConstPtr &scene, const std::string &group_name, const std::string &link_name, const Eigen::Isometry3d &pose, const std::string &frame_id, const std::map< std::string, double > &seed, std::map< std::string, double > &solution, bool check_self_collision=true, const double timeout=0.0)
compute the inverse kinematics of a given pose, also check robot self collision
bool isRobotStateEqual(const moveit::core::RobotState &state1, const moveit::core::RobotState &state2, const std::string &joint_group_name, double epsilon)
Check if the two robot states have the same joint position/velocity/acceleration.
void checkRobotModel(const moveit::core::RobotModelConstPtr &robot_model, const std::string &group_name, const std::string &link_name)
bool has_acceleration_limits
A set of options for the kinematics solver.
std::vector< CartesianTrajectoryPoint > points
Extends joint_limits_interface::JointLimits with a deceleration parameter.
bool has_deceleration_limits
double max_deceleration
maximum deceleration MUST(!) be negative
const std::string PARAM_PLANNING_GROUP_NAME("planning_group")
const std::string RANDOM_TEST_NUMBER("random_test_number")
int main(int argc, char **argv)
const std::string IK_FAST_LINK_NAME("ik_fast_link")
TEST_F(TrajectoryFunctionsTestFlangeAndGripper, TipLinkFK)
Test the forward kinematics function with simple robot poses for robot tip link using robot model wit...
const std::string ROBOT_TCP_LINK_NAME("tcp_link")
const std::string GROUP_TIP_LINK_NAME("group_tip_link")