@@ -97,35 +97,26 @@ bool VanillaCartesianAdmittanceRule::compute_controls(
97
97
auto rot_base_admittance = vic_transforms_.base_vic_ .rotation ();
98
98
99
99
// Express M, K, D matrices in base (provided in base_vic frame)
100
+ auto registration_MKD = [&rot_base_admittance](
101
+ const Eigen::Matrix<double , 6 , 6 > & matrix_in_adm_frame,
102
+ Eigen::Matrix<double , 6 , 6 > & matrix_in_base_frame)
103
+ {
104
+ matrix_in_base_frame.block <3 , 3 >(0 , 0 ) =
105
+ rot_base_admittance * \
106
+ matrix_in_adm_frame.block <3 , 3 >(0 , 0 ) * \
107
+ rot_base_admittance.transpose ();
108
+ matrix_in_base_frame.block <3 , 3 >(3 , 3 ) =
109
+ rot_base_admittance * \
110
+ matrix_in_adm_frame.block <3 , 3 >(3 , 3 ) * \
111
+ rot_base_admittance.transpose ();
112
+ return ;
113
+ };
114
+ Eigen::Matrix<double , 6 , 6 > M = Eigen::Matrix<double , 6 , 6 >::Zero ();
100
115
Eigen::Matrix<double , 6 , 6 > K = Eigen::Matrix<double , 6 , 6 >::Zero ();
101
- K.block <3 , 3 >(0 , 0 ) =
102
- rot_base_admittance * \
103
- vic_command_data.stiffness .block <3 , 3 >(0 , 0 ) * \
104
- rot_base_admittance.transpose ();
105
- K.block <3 , 3 >(3 , 3 ) =
106
- rot_base_admittance * \
107
- vic_command_data.stiffness .block <3 , 3 >(3 , 3 ) * \
108
- rot_base_admittance.transpose ();
109
-
110
116
Eigen::Matrix<double , 6 , 6 > D = Eigen::Matrix<double , 6 , 6 >::Zero ();
111
- D.block <3 , 3 >(0 , 0 ) =
112
- rot_base_admittance * \
113
- vic_command_data.damping .block <3 , 3 >(0 , 0 ) * \
114
- rot_base_admittance.transpose ();
115
- D.block <3 , 3 >(3 , 3 ) =
116
- rot_base_admittance * \
117
- vic_command_data.damping .block <3 , 3 >(3 , 3 ) * \
118
- rot_base_admittance.transpose ();
119
-
120
- Eigen::Matrix<double , 6 , 6 > M = Eigen::Matrix<double , 6 , 6 >::Zero ();
121
- M.block <3 , 3 >(0 , 0 ) =
122
- rot_base_admittance * \
123
- vic_command_data.inertia .block <3 , 3 >(0 , 0 ) * \
124
- rot_base_admittance.transpose ();
125
- M.block <3 , 3 >(3 , 3 ) =
126
- rot_base_admittance * \
127
- vic_command_data.inertia .block <3 , 3 >(3 , 3 ) * \
128
- rot_base_admittance.transpose ();
117
+ registration_MKD (vic_command_data.inertia , M);
118
+ registration_MKD (vic_command_data.stiffness , K);
119
+ registration_MKD (vic_command_data.damping , D);
129
120
130
121
// Compute pose tracking errors
131
122
Eigen::Matrix<double , 6 , 1 > error_pose;
@@ -137,15 +128,13 @@ bool VanillaCartesianAdmittanceRule::compute_controls(
137
128
reference_compliant_frame.pose .rotation () * \
138
129
vic_input_data.robot_current_pose .rotation ().transpose ();
139
130
auto angle_axis = Eigen::AngleAxisd (R_angular_error);
140
-
141
131
error_pose.tail (3 ) = angle_axis.angle () * angle_axis.axis ();
142
132
143
133
// Compute velocity tracking errors in ft frame
144
134
Eigen::Matrix<double , 6 , 1 > error_velocity =
145
135
reference_compliant_frame.velocity - \
146
136
vic_input_data.robot_current_velocity ;
147
137
148
-
149
138
// Retrieve forces if needed (not used if use_natural_robot_inertia is set to True)
150
139
// RQ: external force at interaction frame (assumed to be control frame),
151
140
// expressed in the base frame
@@ -197,17 +186,30 @@ bool VanillaCartesianAdmittanceRule::compute_controls(
197
186
Eigen::JacobiSVD<Eigen::MatrixXd>(J_, Eigen::ComputeThinU | Eigen::ComputeThinV);
198
187
double conditioning_J = 1000.0 ;
199
188
if (J_.cols () < 6 ) {
189
+ RCLCPP_WARN_THROTTLE (
190
+ logger_, internal_clock_, 5000 , " Jacobian has only %u columns, expecting at least 6!!!" ,
191
+ J_.cols ());
200
192
conditioning_J = J_svd.singularValues ()(0 ) / J_svd.singularValues ()(J_.cols () - 1 );
201
193
} else {
202
194
conditioning_J = J_svd.singularValues ()(0 ) / J_svd.singularValues ()(dims - 1 );
203
195
}
204
- if (conditioning_J > 30 ) {
196
+ if (conditioning_J > 40 ) {
205
197
success = false ;
198
+ std::cerr << " J_svd.singularValues() = " << J_svd.singularValues ().transpose () << std::endl;
206
199
RCLCPP_ERROR (
207
200
logger_,
208
201
" Jacobian singularity detected (max(singular values)/min(singular values) = %lf)!" ,
209
202
conditioning_J
210
203
);
204
+ } else if (conditioning_J > 15 ) {
205
+ RCLCPP_WARN_THROTTLE (
206
+ logger_,
207
+ internal_clock_,
208
+ 5000 ,
209
+ " Nearing Jacobian singularity (max(singular values)/min(singular values) = %lf), "
210
+ " proceed with caution!" ,
211
+ conditioning_J
212
+ );
211
213
}
212
214
// J_pinv_ = J_svd.matrixV() * matrix_s.inverse() * J_svd.matrixU().transpose();
213
215
J_pinv_ = (J_.transpose () * J_ + alpha_pinv_ * I_joint_space_).inverse () * J_.transpose ();
0 commit comments