@@ -108,9 +108,6 @@ controller_interface::return_type AdmittanceRule::reset(const size_t num_joints)
108108 // reset admittance state
109109 admittance_state_ = AdmittanceState (num_joints);
110110
111- // reset transforms and rotations
112- admittance_transforms_ = AdmittanceTransforms ();
113-
114111 // reset forces
115112 wrench_world_.setZero ();
116113 end_effector_weight_.setZero ();
@@ -144,78 +141,75 @@ void AdmittanceRule::apply_parameters_update()
144141 }
145142}
146143
147- bool AdmittanceRule::get_all_transforms (
148- const trajectory_msgs::msg::JointTrajectoryPoint & current_joint_state,
149- const trajectory_msgs::msg::JointTrajectoryPoint & reference_joint_state)
150- {
151- // get reference transforms
152- bool success = kinematics_->calculate_link_transform (
153- reference_joint_state.positions , parameters_.ft_sensor .frame .id ,
154- admittance_transforms_.ref_base_ft_ );
155-
156- // get transforms at current configuration
157- success &= kinematics_->calculate_link_transform (
158- current_joint_state.positions , parameters_.ft_sensor .frame .id , admittance_transforms_.base_ft_ );
159- success &= kinematics_->calculate_link_transform (
160- current_joint_state.positions , parameters_.kinematics .tip , admittance_transforms_.base_tip_ );
161- success &= kinematics_->calculate_link_transform (
162- current_joint_state.positions , parameters_.fixed_world_frame .frame .id ,
163- admittance_transforms_.world_base_ );
164- success &= kinematics_->calculate_link_transform (
165- current_joint_state.positions , parameters_.gravity_compensation .frame .id ,
166- admittance_transforms_.base_cog_ );
167- success &= kinematics_->calculate_link_transform (
168- current_joint_state.positions , parameters_.control .frame .id ,
169- admittance_transforms_.base_control_ );
170-
171- return success;
172- }
173-
174144// Update from reference joint states
175145controller_interface::return_type AdmittanceRule::update (
176146 const trajectory_msgs::msg::JointTrajectoryPoint & current_joint_state,
177147 const geometry_msgs::msg::Wrench & measured_wrench,
178148 const trajectory_msgs::msg::JointTrajectoryPoint & reference_joint_state,
179149 const rclcpp::Duration & period, trajectory_msgs::msg::JointTrajectoryPoint & desired_joint_state)
180150{
151+ // duration & live-parameter refresh
181152 const double dt = period.seconds ();
182153
183154 if (parameters_.enable_parameter_update_without_reactivation )
184155 {
185156 apply_parameters_update ();
186157 }
187158
188- bool success = get_all_transforms (current_joint_state, reference_joint_state) ;
159+ bool success = true ;
189160
190- // apply filter and update wrench_world_ vector
191- Eigen::Matrix<double , 3 , 3 > rot_world_sensor =
192- admittance_transforms_.world_base_ .rotation () * admittance_transforms_.base_ft_ .rotation ();
193- Eigen::Matrix<double , 3 , 3 > rot_world_cog =
194- admittance_transforms_.world_base_ .rotation () * admittance_transforms_.base_cog_ .rotation ();
195- process_wrench_measurements (measured_wrench, rot_world_sensor, rot_world_cog);
161+ // Reusable transform variable
162+ Eigen::Isometry3d tf;
196163
197- // transform wrench_world_ into base frame
164+ // --- FT sensor frame to base frame (translation + rotation) ---
165+ success &= kinematics_->calculate_link_transform (
166+ reference_joint_state.positions , parameters_.ft_sensor .frame .id , tf);
167+ admittance_state_.ref_trans_base_ft = tf;
168+
169+ // --- world frame to base frame (we only need the rotation) ---
170+ success &= kinematics_->calculate_link_transform (
171+ current_joint_state.positions , parameters_.fixed_world_frame .frame .id , tf);
172+ const Eigen::Matrix3d rot_world_base = tf.rotation ();
173+
174+ // --- control/base frame to base frame (rotation only) ---
175+ success &= kinematics_->calculate_link_transform (
176+ current_joint_state.positions , parameters_.control .frame .id , tf);
177+ admittance_state_.rot_base_control = tf.rotation ();
178+
179+ success &= kinematics_->calculate_link_transform (
180+ current_joint_state.positions , parameters_.gravity_compensation .frame .id , tf);
181+ const Eigen::Matrix3d rot_tf_cog = tf.rotation ();
182+
183+ success &= kinematics_->calculate_link_transform (
184+ current_joint_state.positions , parameters_.ft_sensor .frame .id , tf);
185+ const Eigen::Matrix3d rot_tf_base_ft = tf.rotation ();
186+
187+ // wrench processing (gravity + filter) in world
188+ process_wrench_measurements (
189+ measured_wrench,
190+ // pass rotations into sensor and CoG:
191+ rot_world_base * rot_tf_base_ft, rot_world_base * rot_tf_cog);
192+
193+ // transform filtered wrench into the robot base frame
198194 admittance_state_.wrench_base .block <3 , 1 >(0 , 0 ) =
199- admittance_transforms_. world_base_ . rotation () .transpose () * wrench_world_.block <3 , 1 >(0 , 0 );
195+ rot_world_base .transpose () * wrench_world_.block <3 , 1 >(0 , 0 );
200196 admittance_state_.wrench_base .block <3 , 1 >(3 , 0 ) =
201- admittance_transforms_. world_base_ . rotation () .transpose () * wrench_world_.block <3 , 1 >(3 , 0 );
197+ rot_world_base .transpose () * wrench_world_.block <3 , 1 >(3 , 0 );
202198
203- // Compute admittance control law
199+ // populate current joint positions in the state
204200 vec_to_eigen (current_joint_state.positions , admittance_state_.current_joint_pos );
205- admittance_state_.rot_base_control = admittance_transforms_.base_control_ .rotation ();
206- admittance_state_.ref_trans_base_ft = admittance_transforms_.ref_base_ft_ ;
201+
207202 admittance_state_.ft_sensor_frame = parameters_.ft_sensor .frame .id ;
208- success &= calculate_admittance_rule (admittance_state_, dt);
209203
210- // if a failure occurred during any kinematics interface calls, return an error and don't
211- // modify the desired reference
204+ // compute admittance dynamics
205+ success &= calculate_admittance_rule (admittance_state_, dt);
212206 if (!success)
213207 {
214208 desired_joint_state = reference_joint_state;
215209 return controller_interface::return_type::ERROR;
216210 }
217211
218- // update joint desired joint state
212+ // Update final desired_joint_state using the computed transforms
219213 for (size_t i = 0 ; i < num_joints_; ++i)
220214 {
221215 auto idx = static_cast <Eigen::Index>(i);
0 commit comments