65 int nSamples = shape.cols();
69 Matrix errors = this->controlNet * this->createSLE(proprioception) - shape;
71 std::vector<Real> summed_squared_errors(nSamples, 0.0f);
73 error_values.
Mean = 0;
75 for (
int iSamples = 0; iSamples < nSamples; iSamples++)
79 for (
int iDim = 0; iDim < this->dim; iDim++)
81 sum += pow(errors(iDim, iSamples), 2);
85 summed_squared_errors[iSamples] = sqrt(sum);
86 error_values.
Mean += sqrt(sum);
89 error_values.
Mean /= nSamples;
90 std::sort(summed_squared_errors.begin(), summed_squared_errors.end());
92 error_values.
Median = summed_squared_errors[nSamples / 2];
94 summed_squared_errors[(nSamples * 3) / 4] - summed_squared_errors[nSamples / 4];
97 *std::max_element(summed_squared_errors.begin(), summed_squared_errors.end());
271 std::ifstream file(fileName.c_str());
279 std::vector<double> values;
286 while (getline(file, line))
289 std::stringstream linestream(line);
292 while (getline(linestream, value,
','))
294 values.push_back(strtod(value.c_str(), NULL));
304 assert(lastCols == cols);
311 assert(this->dim == rows &&
"Incompatible output dimensions");
312 assert(this->nControlPoints == lastCols &&
"Incompatible input dimensions");
314 for (
int i = 0; i < this->dim; i++)
315 for (
int j = 0; j < this->nControlPoints; j++)
317 this->controlNet(i, j) =
318 values[i * this->nControlPoints +
323 ARMARX_DEBUG_S <<
"done (rows: " << rows <<
", Cols: " << lastCols
324 <<
", nDoF: " << this->nDoF <<
", dim: " << this->dim <<
")" << std::endl;
347 return controlNet * createSLE(proprioception);
356 Vector o = controlNet * createSLE(proprioception);
360 proprioception, dim, (-1) * this->spreadAngles[dim], proprioception(dim, 0)) -
361 createSLE(proprioception, dim, this->spreadAngles[dim], proprioception(dim, 0)));
364 Vector3 e2 = this->controlNet * (createSLE(proprioception,
366 (-1) * this->spreadAngles[dim],
367 proprioception(dim, 0) + offset) -
368 createSLE(proprioception,
370 this->spreadAngles[dim],
371 proprioception(dim, 0) + offset));
376 Matrix result = Matrix::Zero(4, 4);
378 result.block(0, 0, 3, 1) = e1 / e1.norm();
379 result.block(0, 1, 3, 1) = e2 / e2.norm();
380 result.block(0, 2, 3, 1) = e3 / e3.norm();
381 result.block(0, 3, 3, 1) = o;
495 VirtualRobot::SceneObjectPtr FoR,
496 const Vector& spreadAngles,
503 controlNet = FoR->toLocalCoordinateSystem(chain->getTCP()->getGlobalPose())
509 controlNet.resize(12, 1);
510 Eigen::Transform<float, 3, Eigen::Affine> axis_x(
511 Eigen::Translation<float, 3>(1.0, 0.0, 0.0));
512 Eigen::Transform<float, 3, Eigen::Affine> axis_y(
513 Eigen::Translation<float, 3>(0.0, 1.0, 0.0));
514 controlNet.block(0, 0, 4, 1) =
515 FoR->toLocalCoordinateSystem(chain->getTCP()->getGlobalPose())
518 controlNet.block(4, 0, 4, 1) =
519 FoR->toLocalCoordinateSystem(chain->getTCP()->getGlobalPose() * axis_x.matrix())
522 controlNet.block(8, 0, 4, 1) =
523 FoR->toLocalCoordinateSystem(chain->getTCP()->getGlobalPose() * axis_y.matrix())
528 for (
int i = chain->getSize() - 1; i >= 0; --i)
531 controlNet.resize(controlNet.rows(), controlNet.cols() * 3);
533 VirtualRobot::RobotNodeRevolute* node =
534 dynamic_cast<VirtualRobot::RobotNodeRevolute*
>(chain->getNode(i).get());
535 Vector3 axis = node->getJointRotationAxisInJointCoordSystem().cast<
Real>();
537 toLocal = node->getGlobalPose().inverse().cast<
Real>();
538 toGlobal = node->getGlobalPose().cast<
Real>();
539 Real factor = 1.0f / cos(spreadAngles(i));
540 Eigen::Transform<Real, 3, Eigen::Affine> rotation(
541 Eigen::AngleAxis<Real>(spreadAngles(i), axis));
542 Eigen::Transform<Real, 3, Eigen::Affine> scaling;
543 Vector3 diag = axis + factor * (Vector3::Constant(1.0f) - axis);
544 scaling = Eigen::Scaling(diag);
546 for (
int i = 0; i < temp.rows() / 4; i++)
548 controlNet.block(i * 4, 0, 4, temp.cols()) =
549 toGlobal * rotation.inverse() * toLocal * temp.block(i * 4, 0, 4, temp.cols());
550 controlNet.block(i * 4, temp.cols(), 4, temp.cols()) =
551 toGlobal * scaling * toLocal * temp.block(i * 4, 0, 4, temp.cols());
552 controlNet.block(i * 4, 2 * temp.cols(), 4, temp.cols()) =
553 toGlobal * rotation * toLocal * temp.block(i * 4, 0, 4, temp.cols());
557 Vector center = Vector::Constant(chain->getSize(), 0.0f);
565 controlNet.block(0, 0, 3, controlNet.cols()));
569 Matrix reducedControlNet(9, controlNet.cols());
570 reducedControlNet.block(0, 0, 3, controlNet.cols()) =
571 controlNet.block(0, 0, 3, controlNet.cols());
572 reducedControlNet.block(3, 0, 3, controlNet.cols()) =
573 controlNet.block(4, 0, 3, controlNet.cols());
574 reducedControlNet.block(6, 0, 3, controlNet.cols()) =
575 controlNet.block(8, 0, 3, controlNet.cols());
576 return KBM::createKBM(chain->getSize(), 9, center, spreadAngles, reducedControlNet);