39 navtypes::Vectord<N>
solve(
const Eigen::Vector2d& eePos,
40 const navtypes::Vectord<N>& jointAngles,
41 bool& success)
const override {
42 navtypes::Arrayd<N + 1, 2> jointPos = jointAnglesToJointPos(jointAngles);
44 for (
int iter = 0; iter < maxIter; iter++) {
46 jointPos.row(N) = eePos;
47 for (
int i = N - 1; i >= 0; i--) {
48 double jointDist = (jointPos.row(i) - jointPos.row(i + 1)).matrix().norm();
49 double lambda = segLens[i] / jointDist;
51 lambda * jointPos.row(i) + (1 - lambda) * jointPos.row(i + 1);
55 jointPos.row(0) << 0, 0;
56 for (
int i = 0; i < N; i++) {
57 double jointDist = (jointPos.row(i) - jointPos.row(i + 1)).matrix().norm();
58 double lambda = segLens[i] / jointDist;
60 lambda * jointPos.row(i + 1) + (1 - lambda) * jointPos.row(i);
63 double err = (jointPos.row(N).matrix().
transpose() - eePos).norm();
70 navtypes::Vectord<N> targetJointAngles = jointPosToJointAngles(jointPos);
71 return targetJointAngles;
75 navtypes::Arrayd<N> segLens;
79 navtypes::Arrayd<N + 1, 2>
80 jointAnglesToJointPos(
const navtypes::Vectord<N>& jointAngles)
const {
81 std::array<double, N> jointAngleCumSum;
82 jointAngleCumSum[0] = jointAngles[0];
83 for (
int i = 1; i < N; i++) {
84 jointAngleCumSum[i] = jointAngleCumSum[i - 1] + jointAngles[i];
87 navtypes::Arrayd<N + 1, 2> jointPos;
88 jointPos.row(0) << 0, 0;
89 for (
int i = 1; i <= N; i++) {
92 jointPos.row(i) = jointPos.row(i - 1) + segLens[i - 1] * seg.array().transpose();
98 jointPosToJointAngles(
const navtypes::Arrayd<N + 1, 2>& jointPos)
const {
99 navtypes::Arrayd<N + 1, 3> jointPos3d;
100 jointPos3d << jointPos, navtypes::Arrayd<N + 1>::Zero();
102 navtypes::Vectord<N> jointAngles;
103 jointAngles[0] = std::atan2(jointPos(1, 1), jointPos(1, 0));
104 for (
int i = 1; i < N; i++) {
105 Eigen::RowVector3d prevSeg =
106 (jointPos3d.row(i) - jointPos3d.row(i - 1)).matrix().normalized();
107 Eigen::RowVector3d seg =
108 (jointPos3d.row(i + 1) - jointPos3d.row(i)).matrix().normalized();
110 jointAngles[i] = std::atan2(prevSeg.cross(seg).z(), prevSeg.dot(seg));
FabrikSolver2D(std::shared_ptr< const PlanarArmFK< N > > fk, double thresh, int maxIter)
Construct an IK solver object.
Definition FabrikSolver.h:35
bool solve(InputArray src1, InputArray src2, OutputArray dst, int flags=DECOMP_LU)