Skip to content

Commit 3c6dfe2

Browse files
committed
Improve 'pregrasp' parameter handling in GenerateGraspPose
* Make parameter optional (skip pregrasp if left empty) * Allow setting by JointState, filtered by eef joints * Check parameter validity + improved error messages
1 parent 990ec26 commit 3c6dfe2

File tree

2 files changed

+44
-13
lines changed

2 files changed

+44
-13
lines changed

core/include/moveit/task_constructor/stages/generate_grasp_pose.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ class GenerateGraspPose : public GeneratePose
5757
void setAngleDelta(double delta) { setProperty("angle_delta", delta); }
5858

5959
void setPreGraspPose(const std::string& pregrasp) { properties().set("pregrasp", pregrasp); }
60-
void setPreGraspPose(const moveit_msgs::RobotState& pregrasp) { properties().set("pregrasp", pregrasp); }
60+
void setPreGraspPose(const sensor_msgs::JointState& pregrasp) { properties().set("pregrasp", pregrasp); }
6161
void setGraspPose(const std::string& grasp) { properties().set("grasp", grasp); }
6262
void setGraspPose(const moveit_msgs::RobotState& grasp) { properties().set("grasp", grasp); }
6363

core/src/stages/generate_grasp_pose.cpp

Lines changed: 43 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)