@@ -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,41 @@ 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+
95+ if (pregrasp_state.name.size() == pregrasp_state.position.size() &&
96+ pregrasp_state.name.size() == pregrasp_state.velocity.size() &&
97+ pregrasp_state.name.size() == pregrasp_state.effort.size()) {
98+ // We only apply the joint state for for joints of the end effector
99+ sensor_msgs::JointState eef_state;
100+ eef_state.header = pregrasp_state.header;
101+ for (size_t i = 0; i < pregrasp_state.name.size(); ++i) {
102+ if (eef_jmg->hasJointModel(pregrasp_state.name[i])) {
103+ eef_state.name.push_back(pregrasp_state.name[i]);
104+ eef_state.position.push_back(pregrasp_state.position[i]);
105+ eef_state.velocity.push_back(pregrasp_state.velocity[i]);
106+ eef_state.effort.push_back(pregrasp_state.effort[i]);
107+ }
108+ }
109+ if (eef_state.name.empty())
110+ errors.push_back(*this, "pregrasp JointState doesn't contain joint values for end effector group");
111+ else
112+ properties().set("pregrasp_state", eef_state); // Override property with filtered joint state
113+ } else {
114+ errors.push_back(*this, "pregrasp JointState is malformed - size mismatch between joint names and values");
115+ }
90116 }
91117 }
92118
@@ -125,10 +151,16 @@ void GenerateGraspPose::compute() {
125151 const std::string& eef = props.get<std::string>("eef");
126152 const moveit::core::JointModelGroup* jmg = scene->getRobotModel()->getEndEffector(eef);
127153
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"));
154+ // Apply pregrasp target or joint state if defined
155+ const boost::any& pregrasp_prop = props.get("pregrasp");
156+ if (!pregrasp_prop.empty()) {
157+ robot_state::RobotState& current_state = scene->getCurrentStateNonConst();
158+ if (pregrasp_prop.type() == typeid(std::string)) {
159+ current_state.setToDefaultValues(jmg, boost::any_cast<std::string>(pregrasp_prop));
160+ } else if (pregrasp_prop.type() == typeid(sensor_msgs::JointState)) {
161+ const auto& pregrasp_state = boost::any_cast<sensor_msgs::JointState>(pregrasp_prop);
162+ current_state.setVariablePositions(pregrasp_state.name, pregrasp_state.position);
163+ }
132164 }
133165
134166 geometry_msgs::PoseStamped target_pose_msg;
0 commit comments