26#include <VirtualRobot/IK/DifferentialIK.h>
27#include <VirtualRobot/Nodes/RobotNode.h>
28#include <VirtualRobot/Robot.h>
35 const VirtualRobot::RobotNodeSetPtr& rns,
36 const Eigen::VectorXf& currentJointVelocity,
37 VirtualRobot::IKSolver::CartesianSelection mode,
38 float maxPositionAcceleration,
39 float maxOrientationAcceleration,
40 float maxNullspaceAcceleration,
41 const VirtualRobot::RobotNodePtr& tcp) :
45 maxPositionAcceleration, maxOrientationAcceleration, maxNullspaceAcceleration);
46#pragma GCC diagnostic push
47#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
49#pragma GCC diagnostic pop
54 const Eigen::Ref<const Eigen::VectorXf>& currentJointVelocity)
60 Eigen::FullPivLU<Eigen::MatrixXf> lu_decomp(jacobi);
61 Eigen::MatrixXf nullspace = lu_decomp.kernel();
62 Eigen::VectorXf nsv = Eigen::VectorXf::Zero(nullspace.rows());
64 for (
int i = 0; i < nullspace.cols(); i++)
66 nsv += nullspace.col(i) * nullspace.col(i).dot(currentJointVelocity) /
67 nullspace.col(i).squaredNorm();
69 cartesianVelocityRamp.setState(jacobi * currentJointVelocity, mode);
70 nullSpaceVelocityRamp.setState(nsv);
75 VirtualRobot::IKSolver::CartesianSelection mode)
78 cartesianVelocityRamp.setState(jacobi * currentJointVelocity, mode);
82 VirtualRobot::IKSolver::CartesianSelection
90 float jointLimitAvoidanceScale,
93 Eigen::VectorXf nullspaceVel =
94 controller.calculateNullspaceVelocity(cartesianVel, jointLimitAvoidanceScale, mode);
100 const Eigen::VectorXf& nullspaceVel,
104 return controller.calculate(cartesianVelocityRamp.update(cartesianVel,
dt),
105 nullSpaceVelocityRamp.update(nullspaceVel,
dt),
111 float maxOrientationAcceleration,
112 float maxNullspaceAcceleration)
114 cartesianVelocityRamp.setMaxOrientationAcceleration(maxOrientationAcceleration);
115 cartesianVelocityRamp.setMaxPositionAcceleration(maxPositionAcceleration);
116 nullSpaceVelocityRamp.setMaxAccelaration(maxNullspaceAcceleration);
122 return cartesianVelocityRamp.getMaxOrientationAcceleration();
128 return cartesianVelocityRamp.getMaxPositionAcceleration();
134 return nullSpaceVelocityRamp.getMaxAccelaration();
float getMaxOrientationAcceleration()
Eigen::VectorXf calculate(const Eigen::VectorXf &cartesianVel, float jointLimitAvoidanceScale, float dt)
void setCurrentJointVelocity(const Eigen::Ref< const Eigen::VectorXf > ¤tJointVelocity)
float getMaxPositionAcceleration()
void setMaxAccelerations(float maxPositionAcceleration, float maxOrientationAcceleration, float maxNullspaceAcceleration)
VirtualRobot::IKSolver::CartesianSelection getMode()
CartesianVelocityControllerWithRamp(const VirtualRobot::RobotNodeSetPtr &rns, const Eigen::VectorXf ¤tJointVelocity, VirtualRobot::IKSolver::CartesianSelection mode, float maxPositionAcceleration, float maxOrientationAcceleration, float maxNullspaceAcceleration, const VirtualRobot::RobotNodePtr &tcp=nullptr)
float getMaxNullspaceAcceleration()
void switchMode(const Eigen::VectorXf ¤tJointVelocity, VirtualRobot::IKSolver::CartesianSelection mode)
This file offers overloads of toIce() and fromIce() functions for STL container types.