ForceTorqueCalibration.cpp
Go to the documentation of this file.
2 #include <utility>
3 
4 namespace rokubimini
5 {
6 namespace calibration
7 {
9 {
10  ROS_INFO("[rokubimini][ForceTorqueCalibration][constructor]");
11 }
12 
14 {
15 }
16 
17 void ForceTorqueCalibration::addMeasurement(const Eigen::Vector3d& acc, const Eigen::Vector3d& gravity,
18  Eigen::Vector3d angVel, Eigen::Vector3d angAcc,
19  const Eigen::VectorXd& ftRaw)
20 {
22 
23  // From measurements, create measurement matrix as data point for LS
24  Eigen::MatrixXd h = createMeasurementMat(acc, gravity, std::move(angVel), std::move(angAcc));
25 
26  // Add data point
27  if (numMeasurements_ == 1)
28  {
29  measurementMat_ = h;
30  ftReadings_ = ftRaw;
31  }
32  else
33  {
34  Eigen::MatrixXd h_temp = measurementMat_;
35  Eigen::VectorXd z_temp = ftReadings_;
36 
37  measurementMat_.resize(numMeasurements_ * 6, 10);
38  ftReadings_.resize(numMeasurements_ * 6);
39 
40  measurementMat_.topRows((numMeasurements_ - 1) * 6) = h_temp;
41  ftReadings_.topRows((numMeasurements_ - 1) * 6) = z_temp;
42 
43  measurementMat_.bottomRows(6) = h;
44  ftReadings_.bottomRows(6) = ftRaw;
45  }
46 }
47 
48 Eigen::MatrixXd ForceTorqueCalibration::createMeasurementMat(const Eigen::Vector3d& acc, const Eigen::Vector3d& gravity,
49  Eigen::Vector3d angVel, Eigen::Vector3d angAcc)
50 {
51  Eigen::MatrixXd h = Eigen::Matrix<double, 6, 10>::Zero();
52 
53  // Initialize skew symmetric matrices
54  Eigen::Matrix3d ang_vel_skew = skewMatrix(std::move(angVel));
55  Eigen::Matrix3d ang_acc_skew = skewMatrix(std::move(angAcc));
56  Eigen::Matrix3d acc_skew = skewMatrix(gravity - acc);
57  Eigen::Matrix3d ang_pow2 = ang_vel_skew * ang_vel_skew;
58 
59  // Create identity matrix for the offsets
60  for (int i = 0; i < 6; i++)
61  h(i, i + 4) = 1.0;
62 
63  // Look at paper "RIGID BODY LOAD IDENTIFICATION FOR MANIPULATORS" for an explanation
64  h.col(0).head(3) << (acc - gravity);
65 
66  for (int i = 0; i < 3; i++)
67  {
68  for (int j = 0; j < 3; j++)
69  {
70  h(i, j + 1) = ang_pow2(i, j) + ang_acc_skew(i, j);
71  h(i + 3, j + 1) = acc_skew(i, j);
72  }
73  }
74 
75  return h;
76 }
77 
78 Eigen::Matrix3d ForceTorqueCalibration::skewMatrix(Eigen::Vector3d inVec)
79 {
80  Eigen::Matrix3d skew_mat = Eigen::Matrix<double, 3, 3>::Zero();
81 
82  skew_mat(0, 1) = -inVec[2];
83  skew_mat(0, 2) = inVec[1];
84  skew_mat(1, 2) = -inVec[0];
85 
86  skew_mat(1, 0) = inVec[2];
87  skew_mat(2, 0) = -inVec[1];
88  skew_mat(2, 1) = inVec[0];
89 
90  return skew_mat;
91 }
92 
94 {
95  ROS_INFO("[rokubimini::ForceTorqueCalibration][getCalibParams] solve LS problem");
96  Eigen::VectorXd calib_params = Eigen::VectorXd::Zero(6);
97 
98  calib_params = measurementMat_.bdcSvd(Eigen::ComputeThinU | Eigen::ComputeThinV).solve(ftReadings_);
99 
100  return calib_params;
101 }
102 
104 {
105  ROS_INFO("[rokubimini::ForceTorqueCalibration][resetCalibration]");
106  numMeasurements_ = 0;
107 }
108 } // namespace calibration
109 } // namespace rokubimini
Eigen::Matrix3d skewMatrix(Eigen::Vector3d inVec)
#define ROS_INFO(...)
void addMeasurement(const Eigen::Vector3d &acc, const Eigen::Vector3d &gravity, Eigen::Vector3d angVel, Eigen::Vector3d angAcc, const Eigen::VectorXd &ftRaw)
Eigen::MatrixXd createMeasurementMat(const Eigen::Vector3d &acc, const Eigen::Vector3d &gravity, Eigen::Vector3d angVel, Eigen::Vector3d angAcc)
Tests Configuration.


rokubimini
Author(s):
autogenerated on Wed Mar 3 2021 03:09:12