Skip to content
Snippets Groups Projects
Commit 83d0257a authored by Simon Ottenhaus's avatar Simon Ottenhaus
Browse files

added SimpleDiffIK::CalculateReachability

parent e43a3027
No related branches found
No related tags found
No related merge requests found
...@@ -63,8 +63,11 @@ module armarx ...@@ -63,8 +63,11 @@ module armarx
}; };
class GraspCandidateReachabilityInfo class GraspCandidateReachabilityInfo
{ {
bool reachable; bool reachable = false;
float minimumJointLimitMargin; float minimumJointLimitMargin = -1;
Ice::FloatSeq jointLimitMargins;
float maxPosError = 0;
float maxOriError = 0;
}; };
......
...@@ -83,3 +83,19 @@ SimpleDiffIK::Result SimpleDiffIK::CalculateDiffIK(const Eigen::Matrix4f targetP ...@@ -83,3 +83,19 @@ SimpleDiffIK::Result SimpleDiffIK::CalculateDiffIK(const Eigen::Matrix4f targetP
return result; return result;
} }
SimpleDiffIK::Reachability SimpleDiffIK::CalculateReachability(const std::vector<Eigen::Matrix4f> targets, const Eigen::VectorXf& initialJV, VirtualRobot::RobotNodeSetPtr rns, VirtualRobot::RobotNodePtr tcp, SimpleDiffIK::Parameters params)
{
Reachability r;
rns->setJointValues(initialJV);
for (const Eigen::Matrix4f& target : targets)
{
Result res = CalculateDiffIK(target, rns, tcp, params);
r.aggregate(res);
}
if (!r.reachable)
{
r.minimumJointLimitMargin = -1;
}
return r;
}
...@@ -58,8 +58,35 @@ namespace armarx ...@@ -58,8 +58,35 @@ namespace armarx
Eigen::VectorXf jointLimitMargins; Eigen::VectorXf jointLimitMargins;
float minimumJointLimitMargin; float minimumJointLimitMargin;
}; };
struct Reachability
{
bool reachable = true;
float minimumJointLimitMargin = M_PI;
Eigen::VectorXf jointLimitMargins;
float maxPosError = 0;
float maxOriError = 0;
void aggregate(const Result& result)
{
reachable = reachable && result.reached;
minimumJointLimitMargin = std::min(minimumJointLimitMargin, result.minimumJointLimitMargin);
if (jointLimitMargins.rows() == 0)
{
jointLimitMargins = result.jointLimitMargins;
}
else
{
jointLimitMargins = jointLimitMargins.cwiseMin(result.jointLimitMargins);
}
maxPosError = std::max(maxPosError, result.posError);
maxOriError = std::max(maxOriError, result.oriError);
}
};
static Result CalculateDiffIK(const Eigen::Matrix4f targetPose, VirtualRobot::RobotNodeSetPtr rns, VirtualRobot::RobotNodePtr tcp = VirtualRobot::RobotNodePtr(), Parameters params = Parameters()); static Result CalculateDiffIK(const Eigen::Matrix4f targetPose, VirtualRobot::RobotNodeSetPtr rns, VirtualRobot::RobotNodePtr tcp = VirtualRobot::RobotNodePtr(), Parameters params = Parameters());
static Reachability CalculateReachability(const std::vector<Eigen::Matrix4f> targets, const Eigen::VectorXf& initialJV, VirtualRobot::RobotNodeSetPtr rns, VirtualRobot::RobotNodePtr tcp = VirtualRobot::RobotNodePtr(), Parameters params = Parameters());
}; };
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment