27#include <VirtualRobot/IK/DifferentialIK.h>
28#include <VirtualRobot/MathTools.h>
29#include <VirtualRobot/Nodes/RobotNode.h>
30#include <VirtualRobot/math/Helpers.h>
40 const VirtualRobot::RobotNodeSetPtr& rns,
41 const VirtualRobot::RobotNodePtr& elbow,
42 float maxPositionAcceleration,
43 float maxOrientationAcceleration,
44 float maxNullspaceAcceleration,
45 const VirtualRobot::RobotNodePtr& tcp) :
47 Eigen::VectorXf::Constant(rns->getSize(), 0.f),
49 maxPositionAcceleration,
50 maxOrientationAcceleration,
51 maxNullspaceAcceleration,
52 tcp ? tcp : rns->getTCP()),
53 pcTcp(tcp ? tcp : rns->getTCP()),
65 const std::vector<float>& maxValue)
67 if (maxValue.size() == 0)
71 if (maxValue.size() != 1 && (
int)maxValue.size() != vec.rows())
73 throw std::invalid_argument(
"maxValue.size != 1 and != maxValue.size");
76 for (
int i = 0; i < vec.rows(); i++)
78 int j = maxValue.size() == 1 ? 0 : i;
79 if (std::abs(vec(i)) > maxValue.at(j) && maxValue.at(j) >= 0)
81 scale = std::min(scale, maxValue.at(j) / std::abs(vec(i)));
90 Eigen::VectorXf jvNT = Eigen::VectorXf(rns->getSize());
91 for (
size_t i = 0; i < rns->getSize(); i++)
100 if (rns->getNode(i)->isLimitless())
102 diff = ::math::Helpers::AngleModPI(diff);
110 const Eigen::VectorXf
112 VirtualRobot::IKSolver::CartesianSelection mode)
128 Eigen::VectorXf cartesianVelTcp =
pcTcp.calculate(
tcpTarget, mode);
136 Eigen::VectorXf jnvClamped = Eigen::VectorXf::Zero(rns->getSize());
139 Eigen::VectorXf jnv = Eigen::VectorXf::Zero(rns->getSize());
140 Eigen::VectorXf jvElb =
141 vcElb.calculate(cartesianVelElb, VirtualRobot::IKSolver::Position);
143 Eigen::VectorXf jvLA =
149 jnv = jvElb + jvLA + jvNT;
154 if (
vcTcp.getMode() != mode)
158 Eigen::VectorXf jv =
vcTcp.calculate(cartesianVelTcp, jnvClamped,
dt);
190 const Eigen::Vector3f& feedForwardVelocityPos,
191 const Eigen::Vector3f& feedForwardVelocityOri)
208 for (
size_t i = 0; i < rns->getSize(); i++)
217 this->
nullspaceTarget = Eigen::VectorXf::Constant(rns->getSize(), std::nanf(
""));
252 const Eigen::Matrix4f&
258 const Eigen::Vector3f
261 return ::math::Helpers::GetPosition(
tcpTarget);
264 const Eigen::Vector3f&
270 const Eigen::VectorXf&
298 std::stringstream ss;
307 const CartesianNaturalPositionControllerConfig& cfg)
321 pcTcp.maxPosVel = cfg.maxTcpPosVel;
322 pcTcp.maxOriVel = cfg.maxTcpOriVel;
323 pcTcp.KpOri = cfg.KpOri;
324 pcTcp.KpPos = cfg.KpPos;
325 pcElb.maxPosVel = cfg.maxElbPosVel;
326 pcElb.KpPos = cfg.elbowKp;
328 vcTcp.setMaxAccelerations(cfg.maxPositionAcceleration,
329 cfg.maxOrientationAcceleration,
330 cfg.maxNullspaceAcceleration);
331 if (cfg.jointCosts.size() > 0)
333 vcTcp.controller.setJointCosts(cfg.jointCosts);
340 return (
vcTcp.controller.ik->getJacobianMatrix(VirtualRobot::IKSolver::All) * jointVel);
346 return (
vcElb.jacobi * jointVel);
float getPositionError() const
Eigen::VectorXf lastJointVelocity
bool autoClearFeedForward
bool hasNullspaceTarget() const
CartesianPositionController pcElb
void setNullSpaceControl(bool enabled)
CartesianVelocityController vcElb
bool isTargetReached() const
void setNullspaceTarget(const Eigen::VectorXf &nullspaceTarget)
Eigen::Vector3f elbowTarget
const Eigen::Matrix4f & getCurrentTarget() const
float thresholdPositionNear
float jointLimitAvoidanceKp
std::vector< float > maxJointVelocity
const Eigen::VectorXf calculate(float dt, VirtualRobot::IKSolver::CartesianSelection mode=VirtualRobot::IKSolver::All)
static Eigen::VectorXf LimitInfNormTo(const Eigen::VectorXf &vec, const std::vector< float > &maxValue)
void clearNullspaceTarget()
float thresholdPositionReached
const Eigen::VectorXf & getCurrentNullspaceTarget() const
Eigen::Vector6f feedForwardVelocity
void clearFeedForwardVelocity()
Eigen::VectorXf nullspaceTarget
const Eigen::Vector3f getCurrentTargetPosition() const
const Eigen::VectorXf calculateNullspaceTargetDifference()
Eigen::VectorXf actualElbVel(const Eigen::VectorXf &jointVel)
CartesianVelocityControllerWithRamp vcTcp
float getOrientationError() const
bool isTargetNear() const
const Eigen::Vector3f & getCurrentElbowTarget() const
std::vector< float > maxNullspaceVelocity
Eigen::Matrix4f tcpTarget
CartesianPositionController pcTcp
void setConfig(const CartesianNaturalPositionControllerConfig &cfg)
CartesianNaturalPositionController(const VirtualRobot::RobotNodeSetPtr &rns, const VirtualRobot::RobotNodePtr &elbow, float maxPositionAcceleration, float maxOrientationAcceleration, float maxNullspaceAcceleration, const VirtualRobot::RobotNodePtr &tcp=nullptr)
std::string getStatusText()
Eigen::VectorXf actualTcpVel(const Eigen::VectorXf &jointVel)
void setFeedForwardVelocity(const Eigen::Vector6f &feedForwardVelocity)
bool nullSpaceControlEnabled
void setTarget(const Eigen::Matrix4f &tcpTarget, const Eigen::Vector3f &elbowTarget)
float thresholdOrientationReached
float thresholdOrientationNear
#define ARMARX_CHECK_EXPRESSION(expression)
This macro evaluates the expression and if it turns out to be false it will throw an ExpressionExcept...
#define ARMARX_CHECK_NOT_NULL(ptr)
This macro evaluates whether ptr is not null and if it turns out to be false it will throw an Express...
Matrix< float, 6, 1 > Vector6f
This file offers overloads of toIce() and fromIce() functions for STL container types.