Skip to content

Commit be4bedb

Browse files
author
ShotaAk
committed
inverse_kinematics_LMのパラメータを定数にした
1 parent 2ab8caf commit be4bedb

File tree

1 file changed

+10
-7
lines changed

1 file changed

+10
-7
lines changed

rt_manipulators_lib/src/kinematics.cpp

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -53,16 +53,21 @@ bool inverse_kinematics_LM(
5353
auto route = kinematics_utils::find_route(links, target_id);
5454
auto q_list = kinematics_utils::get_q_list(links, route);
5555

56+
const double we_pos = 1 / 0.1; // 位置成分の重み (代表長さの逆数)
57+
const double we_ang = 1 / (2*M_PI); // 姿勢成分の重み
58+
const int num_of_iterations = 100; // qを更新するための反復回数
59+
const double omega = 0.001; // 0.1 ~ 0.001 * 代表リンク長の2乗
60+
const double initial_q_value = 0; // 初期値を0にすると特異姿勢になるため、適当な角度を設定する
61+
const double error_tolerance = 1.0E-6; // 誤差の許容量。誤差がこれより小さければ反復計算を終える
62+
5663
// We : 拘束条件に対する重み行列
57-
double we_pos = 1 / 0.1; // 位置成分の重み (代表長さの逆数)
58-
double we_ang = 1 / (2*M_PI); // 姿勢成分の重み
5964
auto We_vec = Eigen::VectorXd(6);
6065
We_vec << we_pos, we_pos, we_pos, we_ang, we_ang, we_ang;
6166
Eigen::MatrixXd We = We_vec.asDiagonal();
6267

6368
// qを0にリセットする
6469
for (auto q_i = q_list.begin(); q_i != q_list.end(); ++q_i) {
65-
q_i->second = 0;
70+
q_i->second = initial_q_value;
6671
}
6772

6873
// qをセットしてリンク情報を更新する
@@ -71,23 +76,21 @@ bool inverse_kinematics_LM(
7176
forward_kinematics(calc_links, 1);
7277

7378
auto error = kinematics_utils::calc_error(target_p, target_R, calc_links[target_id]);
74-
75-
for (int n=0; n < 100; n++) {
79+
for (int n=0; n < num_of_iterations; n++) {
7680
// 基礎ヤコビ行列を計算
7781
auto J = kinematics_utils::calc_basic_jacobian(calc_links, target_id);
7882

7983
// 位置・姿勢の誤差を計算
8084
error = kinematics_utils::calc_error(target_p, target_R, calc_links[target_id]);
8185

8286
// 誤差が小さければ終了
83-
if (error.norm() < 1.0E-6) {
87+
if (error.norm() < error_tolerance) {
8488
result_q_list = q_list;
8589
return true;
8690
}
8791

8892
// 減衰因子の計算
8993
auto E = 0.5 * error.transpose() * We * error;
90-
double omega = 0.001; // 0.1 ~ 0.001 * 代表リンク長の2乗
9194
auto Wn_ = omega * Eigen::MatrixXd::Identity(q_list.size(), q_list.size());
9295
auto Wn = E * Eigen::MatrixXd::Identity(q_list.size(), q_list.size()) + Wn_;
9396

0 commit comments

Comments
 (0)