@@ -54,7 +54,7 @@ GenerateGraspPose::GenerateGraspPose(const std::string& name) : GeneratePose(nam
5454 p.declare <std::string>(" object" );
5555 p.declare <double >(" angle_delta" , 0.1 , " angular steps (rad)" );
5656
57- p.declare <boost::any>(" pregrasp" , std::string ( " " ), " pregrasp posture" );
57+ p.declare <boost::any>(" pregrasp" , " pregrasp posture" );
5858 p.declare <boost::any>(" grasp" , " grasp posture" );
5959}
6060
@@ -78,15 +78,40 @@ void GenerateGraspPose::init(const core::RobotModelConstPtr& robot_model) {
7878 const std::string& eef = props.get <std::string>(" eef" );
7979 if (!robot_model->hasEndEffector (eef))
8080 errors.push_back (*this , " unknown end effector: " + eef);
81- else {
81+ else if (props. property ( " pregrasp " ). defined ()) {
8282 // if pregrasp pose is defined, check if it's valid
83- const std::string& pregrasp_name = props.get <std::string>(" pregrasp" );
84- if (!pregrasp_name.empty ()) {
85- // check availability of eef pose
83+ const moveit::core::JointModelGroup* eef_jmg = robot_model->getEndEffector (eef);
84+ const boost::any& pregrasp_prop = props.get (" pregrasp" );
85+ if (pregrasp_prop.type () == typeid (std::string)) {
86+ // check if the specified pregrasp pose is a valid named target
87+ const auto & pregrasp_name = boost::any_cast<std::string>(pregrasp_prop);
8688 std::map<std::string, double > m;
87- const moveit::core::JointModelGroup* jmg = robot_model->getEndEffector (eef);
88- if (!jmg->getVariableDefaultPositions (pregrasp_name, m))
89- errors.push_back (*this , " unknown end effector pose: " + pregrasp_name);
89+ if (!eef_jmg->getVariableDefaultPositions (pregrasp_name, m))
90+ errors.push_back (*this , " pregrasp is set to unknown end effector pose: " + pregrasp_name);
91+ } else if (pregrasp_prop.type () == typeid (sensor_msgs::JointState)) {
92+ // check if the specified pregrasp pose is a valid named target
93+ const auto & pregrasp_state = boost::any_cast<sensor_msgs::JointState>(pregrasp_prop);
94+ if (pregrasp_state.name .size () == pregrasp_state.position .size () &&
95+ pregrasp_state.name .size () == pregrasp_state.velocity .size () &&
96+ pregrasp_state.name .size () == pregrasp_state.effort .size ()) {
97+ // We only apply the joint state for for joints of the end effector
98+ sensor_msgs::JointState eef_state;
99+ eef_state.header = pregrasp_state.header ;
100+ for (size_t i = 0 ; i < pregrasp_state.name .size (); ++i) {
101+ if (eef_jmg->hasJointModel (pregrasp_state.name [i])) {
102+ eef_state.name .push_back (pregrasp_state.name [i]);
103+ eef_state.position .push_back (pregrasp_state.position [i]);
104+ eef_state.velocity .push_back (pregrasp_state.velocity [i]);
105+ eef_state.effort .push_back (pregrasp_state.effort [i]);
106+ }
107+ }
108+ if (eef_state.name .empty ())
109+ errors.push_back (*this , " pregrasp JointState doesn't contain joint values for end effector group" );
110+ else
111+ properties ().set (" pregrasp_state" , eef_state); // Override property with filtered joint state
112+ } else {
113+ errors.push_back (*this , " pregrasp JointState is malformed - size mismatch between joint names and values" );
114+ }
90115 }
91116 }
92117
@@ -125,10 +150,16 @@ void GenerateGraspPose::compute() {
125150 const std::string& eef = props.get <std::string>(" eef" );
126151 const moveit::core::JointModelGroup* jmg = scene->getRobotModel ()->getEndEffector (eef);
127152
128- // Apply pregrasp pose if defined
129- if (!props.get <std::string>(" pregrasp" ).empty ()) {
130- robot_state::RobotState& robot_state = scene->getCurrentStateNonConst ();
131- robot_state.setToDefaultValues (jmg, props.get <std::string>(" pregrasp" ));
153+ // Apply pregrasp target or joint state if defined
154+ const boost::any& pregrasp_prop = props.get (" pregrasp" );
155+ if (!pregrasp_prop.empty ()) {
156+ robot_state::RobotState& current_state = scene->getCurrentStateNonConst ();
157+ if (pregrasp_prop.type () == typeid (std::string)) {
158+ current_state.setToDefaultValues (jmg, boost::any_cast<std::string>(pregrasp_prop));
159+ } else if (pregrasp_prop.type () == typeid (sensor_msgs::JointState)) {
160+ const auto & pregrasp_state = boost::any_cast<sensor_msgs::JointState>(pregrasp_prop);
161+ current_state.setVariablePositions (pregrasp_state.name , pregrasp_state.position );
162+ }
132163 }
133164
134165 geometry_msgs::PoseStamped target_pose_msg;
0 commit comments