@@ -53,16 +53,21 @@ bool inverse_kinematics_LM(
53
53
auto route = kinematics_utils::find_route (links, target_id);
54
54
auto q_list = kinematics_utils::get_q_list (links, route);
55
55
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
+
56
63
// We : 拘束条件に対する重み行列
57
- double we_pos = 1 / 0.1 ; // 位置成分の重み (代表長さの逆数)
58
- double we_ang = 1 / (2 *M_PI); // 姿勢成分の重み
59
64
auto We_vec = Eigen::VectorXd (6 );
60
65
We_vec << we_pos, we_pos, we_pos, we_ang, we_ang, we_ang;
61
66
Eigen::MatrixXd We = We_vec.asDiagonal ();
62
67
63
68
// qを0にリセットする
64
69
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 ;
66
71
}
67
72
68
73
// qをセットしてリンク情報を更新する
@@ -71,23 +76,21 @@ bool inverse_kinematics_LM(
71
76
forward_kinematics (calc_links, 1 );
72
77
73
78
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++) {
76
80
// 基礎ヤコビ行列を計算
77
81
auto J = kinematics_utils::calc_basic_jacobian (calc_links, target_id);
78
82
79
83
// 位置・姿勢の誤差を計算
80
84
error = kinematics_utils::calc_error (target_p, target_R, calc_links[target_id]);
81
85
82
86
// 誤差が小さければ終了
83
- if (error.norm () < 1.0E-6 ) {
87
+ if (error.norm () < error_tolerance ) {
84
88
result_q_list = q_list;
85
89
return true ;
86
90
}
87
91
88
92
// 減衰因子の計算
89
93
auto E = 0.5 * error.transpose () * We * error;
90
- double omega = 0.001 ; // 0.1 ~ 0.001 * 代表リンク長の2乗
91
94
auto Wn_ = omega * Eigen::MatrixXd::Identity (q_list.size (), q_list.size ());
92
95
auto Wn = E * Eigen::MatrixXd::Identity (q_list.size (), q_list.size ()) + Wn_;
93
96
0 commit comments