44 const ::math::AbstractFunctionR1R6Ptr&
trajectory,
46 VirtualRobot::IKSolver::CartesianSelection mode)
48 int posLen = mode & VirtualRobot::IKSolver::Position ? 3 : 0;
49 int oriLen = mode & VirtualRobot::IKSolver::Orientation ? 3 : 0;
50 Eigen::VectorXf cartesianVel(posLen + oriLen);
54 Eigen::Vector3f targetPos =
trajectory->GetPosition(t);
55 Eigen::Vector3f errPos = targetPos - tcp->getPositionInRootFrame();
56 Eigen::Vector3f posVel = errPos *
KpPos;
59 posVel +=
trajectory->GetPositionDerivative(t);
66 cartesianVel.block<3, 1>(0, 0) = posVel;
71 Eigen::Matrix3f targetOri =
trajectory->GetOrientation(t).toRotationMatrix();
72 Eigen::Matrix3f tcpOri = tcp->getPoseInRootFrame().block<3, 3>(0, 0);
73 Eigen::Matrix3f oriDir = targetOri * tcpOri.inverse();
74 Eigen::AngleAxisf aa(oriDir);
75 Eigen::Vector3f errOri = aa.axis() * aa.angle();
76 Eigen::Vector3f oriVel = errOri *
KpOri;
79 oriVel +=
trajectory->GetOrientationDerivative(t);
86 cartesianVel.block<3, 1>(posLen, 0) = oriVel;
103 const ::math::AbstractFunctionR1R6Ptr&
trajectory,
106 Eigen::Matrix3f targetOri =
trajectory->GetOrientation(t).toRotationMatrix();
107 Eigen::Matrix3f tcpOri = tcp->getPoseInRootFrame().block<3, 3>(0, 0);
108 Eigen::Matrix3f oriDir = targetOri * tcpOri.inverse();
109 Eigen::AngleAxisf aa(oriDir);
124 const ::math::AbstractFunctionR1R6Ptr&
trajectory,
127 Eigen::Matrix3f targetOri =
trajectory->GetOrientation(t).toRotationMatrix();
128 Eigen::Matrix3f tcpOri = tcp->getPoseInRootFrame().block<3, 3>(0, 0);
129 Eigen::Matrix3f oriDir = targetOri * tcpOri.inverse();
130 Eigen::AngleAxisf aa(oriDir);
131 return aa.axis() * aa.angle();