146 std::vector<int> idx;
166 std::vector<int> idx;
197 Eigen::MatrixXd mc(3, 1);
200 mc = Eigen::MatrixXd::Zero(3, 1);
214 Eigen::MatrixXd COM(3, 1);
255 int idx_size = idx.size();
256 int end = idx_size - 1;
259 Eigen::MatrixXd Jacobian = Eigen::MatrixXd::Zero(6, idx_size);
261 for (
int index = 0; index < idx_size; index++)
269 Jacobian.block(3, index, 3, 1) = tar_orientation;
277 int idx_size = idx.size();
278 int end = idx_size - 1;
281 Eigen::MatrixXd jacobianCOM = Eigen::MatrixXd::Zero(6, idx_size);
283 for (
int index = 0; index < idx_size; index++)
292 jacobianCOM.block(3, index, 3, 1) = target_orientation;
299 Eigen::MatrixXd tar_orientation, Eigen::MatrixXd curr_orientation)
301 Eigen::MatrixXd pos_err = tar_position - curr_position;
302 Eigen::MatrixXd ori_err1 = curr_orientation.inverse() * tar_orientation;
305 Eigen::MatrixXd err = Eigen::MatrixXd::Zero(6, 1);
306 err.block(0, 0, 3, 1) = pos_err;
307 err.block(3, 0, 3, 1) = ori_err2;
313 Eigen::MatrixXd tar_orientation,
int max_iter,
double ik_err)
315 bool ik_success =
false;
316 bool limit_success =
false;
322 for (
int iter = 0; iter < max_iter; iter++)
329 Eigen::MatrixXd err =
calcVWerr(tar_position, curr_position, tar_orientation, curr_orientation);
331 if (err.norm() < ik_err)
339 Eigen::MatrixXd jacobian2 = jacobian * jacobian.transpose();
340 Eigen::MatrixXd jacobian3 = jacobian.transpose() * jacobian2.inverse();
342 Eigen::MatrixXd _delta_angle = jacobian3 * err;
344 for (
int id = 0;
id < idx.size();
id++)
346 int joint_num = idx[id];
353 for (
int id = 0;
id < idx.size();
id++)
355 int joint_num = idx[id];
359 limit_success =
false;
364 limit_success =
false;
368 limit_success =
true;
371 if (ik_success ==
true && limit_success ==
true)
378 Eigen::MatrixXd tar_orientation,
int max_iter,
double ik_err)
380 bool ik_success =
false;
381 bool limit_success =
false;
385 std::vector<int> idx =
findRoute(from, to);
387 for (
int iter = 0; iter < max_iter; iter++)
394 Eigen::MatrixXd err =
calcVWerr(tar_position, curr_position, tar_orientation, curr_orientation);
396 if (err.norm() < ik_err)
406 Eigen::MatrixXd jacobian2 = jacobian * jacobian.transpose();
407 Eigen::MatrixXd jacobian3 = jacobian.transpose() * jacobian2.inverse();
409 Eigen::MatrixXd delta_angle = jacobian3 * err;
411 for (
int id = 0;
id < idx.size();
id++)
413 int joint_num = idx[id];
420 for (
int id = 0;
id < idx.size();
id++)
422 int joint_num = idx[id];
426 limit_success =
false;
431 limit_success =
false;
435 limit_success =
true;
438 if (ik_success ==
true && limit_success ==
true)
Eigen::MatrixXd center_of_mass_
Eigen::MatrixXd calcJacobian(std::vector< int > idx)
bool inverseKinematics(int to, Eigen::MatrixXd tar_position, Eigen::MatrixXd tar_orientation, int max_iter, double ik_err)
Eigen::MatrixXd relative_position_
Eigen::Matrix3d calcHatto(const Eigen::Vector3d &matrix3d)
Eigen::Matrix3d calcRodrigues(const Eigen::Matrix3d &hat_matrix, double angle)
Eigen::Vector3d convertRotToOmega(const Eigen::Matrix3d &rotation)
Eigen::MatrixXd joint_axis_
Eigen::MatrixXd calcJacobianCOM(std::vector< int > idx)
Eigen::MatrixXd position_
double totalMass(int joint_ID)
Eigen::Vector3d getTransitionXYZ(double position_x, double position_y, double position_z)
Eigen::Vector3d calcCross(const Eigen::Vector3d &vector3d_a, const Eigen::Vector3d &vector3d_b)
void forwardKinematics(int joint_ID)
Eigen::MatrixXd orientation_
~ManipulatorKinematicsDynamics()
ManipulatorKinematicsDynamics()
LinkData * manipulator_link_data_[ALL_JOINT_ID+1]
Eigen::MatrixXd calcCOM(Eigen::MatrixXd MC)
Eigen::Matrix3d getInertiaXYZ(double ixx, double ixy, double ixz, double iyy, double iyz, double izz)
Eigen::MatrixXd transformation_
std::vector< int > findRoute(int to)
Eigen::MatrixXd calcVWerr(Eigen::MatrixXd tar_position, Eigen::MatrixXd curr_position, Eigen::MatrixXd tar_orientation, Eigen::MatrixXd curr_orientation)
Eigen::MatrixXd calcMC(int joint_ID)