Skip to content

Commit 7ecd2db

Browse files
authored
[AdmittanceController] Remove superfluous admittance_tranforms_ structure (ros-controls#1668)
1 parent fa06e90 commit 7ecd2db

File tree

2 files changed

+45
-81
lines changed

2 files changed

+45
-81
lines changed

admittance_controller/include/admittance_controller/admittance_rule.hpp

Lines changed: 4 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -32,26 +32,6 @@
3232

3333
namespace admittance_controller
3434
{
35-
struct AdmittanceTransforms
36-
{
37-
// transformation from force torque sensor frame to base link frame at reference joint angles
38-
Eigen::Isometry3d ref_base_ft_;
39-
// transformation from force torque sensor frame to base link frame at reference + admittance
40-
// offset joint angles
41-
Eigen::Isometry3d base_ft_;
42-
// transformation from control frame to base link frame at reference + admittance offset joint
43-
// angles
44-
Eigen::Isometry3d base_control_;
45-
// transformation from end effector frame to base link frame at reference + admittance offset
46-
// joint angles
47-
Eigen::Isometry3d base_tip_;
48-
// transformation from center of gravity frame to base link frame at reference + admittance offset
49-
// joint angles
50-
Eigen::Isometry3d base_cog_;
51-
// transformation from world frame to base link frame
52-
Eigen::Isometry3d world_base_;
53-
};
54-
5535
struct AdmittanceState
5636
{
5737
explicit AdmittanceState(size_t num_joints)
@@ -109,17 +89,6 @@ class AdmittanceRule
10989
/// Reset all values back to default
11090
controller_interface::return_type reset(const size_t num_joints);
11191

112-
/**
113-
* Calculate all transforms needed for admittance control using the loader kinematics plugin. If
114-
* the transform does not exist in the kinematics model, then TF will be used for lookup. The
115-
* return value is true if all transformation are calculated without an error \param[in]
116-
* current_joint_state current joint state of the robot \param[in] reference_joint_state input
117-
* joint state reference \param[out] success true if no calls to the kinematics interface fail
118-
*/
119-
bool get_all_transforms(
120-
const trajectory_msgs::msg::JointTrajectoryPoint & current_joint_state,
121-
const trajectory_msgs::msg::JointTrajectoryPoint & reference_joint_state);
122-
12392
/**
12493
* Updates parameter_ struct if any parameters have changed since last update. Parameter dependent
12594
* Eigen field members (end_effector_weight_, cog_pos_, mass_, mass_inv_ stiffness, selected_axes,
@@ -131,6 +100,10 @@ class AdmittanceRule
131100
* Calculate 'desired joint states' based on the 'measured force', 'reference joint state', and
132101
* 'current_joint_state'.
133102
*
103+
* All transforms (e.g., world to base, sensor to base, CoG to base) are now computed
104+
* directly in this function and stored in `admittance_state_`, removing the
105+
* need for an intermediate transform struct.
106+
*
134107
* \param[in] current_joint_state current joint state of the robot
135108
* \param[in] measured_wrench most recent measured wrench from force torque sensor
136109
* \param[in] reference_joint_state input joint state reference
@@ -198,9 +171,6 @@ class AdmittanceRule
198171
// admittance controllers internal state
199172
AdmittanceState admittance_state_{0};
200173

201-
// transforms needed for admittance update
202-
AdmittanceTransforms admittance_transforms_;
203-
204174
// position of center of gravity in cog_frame
205175
Eigen::Vector3d cog_pos_;
206176

admittance_controller/include/admittance_controller/admittance_rule_impl.hpp

Lines changed: 41 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -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
175145
controller_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

Comments
 (0)