12 #include <franka/robot_state.h>
23 std::vector<double> cartesian_stiffness_vector;
24 std::vector<double> cartesian_damping_vector;
33 ROS_ERROR_STREAM(
"CartesianImpedanceController: Could not read parameter arm_id");
39 "CartesianImpedanceController: Invalid or no joint_names parameters provided, "
40 "aborting controller init!");
45 if (model_interface ==
nullptr) {
47 "CartesianImpedanceController: Error getting model interface from hardware");
51 model_handle_ = std::make_unique<franka_hw::FrankaModelHandle>(
52 model_interface->getHandle(
arm_id +
"_model"));
55 "CartesianImpedanceController: Exception getting model handle from interface: "
61 if (state_interface ==
nullptr) {
63 "CartesianImpedanceController: Error getting state interface from hardware");
67 state_handle_ = std::make_unique<franka_hw::FrankaStateHandle>(
68 state_interface->getHandle(
arm_id +
"_robot"));
71 "CartesianImpedanceController: Exception getting state handle from interface: "
77 if (effort_joint_interface ==
nullptr) {
79 "CartesianImpedanceController: Error getting effort joint interface from hardware");
82 for (
size_t i = 0; i < 7; ++i) {
87 "CartesianImpedanceController: Exception getting joint handles: " << ex.
what());
96 dynamic_reconfigure::Server<serl_franka_controllers::compliance_paramConfig>>(
116 franka::RobotState initial_state =
state_handle_->getRobotState();
121 Eigen::Map<Eigen::Matrix<double, 7, 1>> q_initial(initial_state.q.data());
122 Eigen::Affine3d initial_transform(Eigen::Matrix4d::Map(initial_state.O_T_EE.data()));
137 franka::RobotState robot_state =
state_handle_->getRobotState();
138 std::array<double, 7> coriolis_array =
model_handle_->getCoriolis();
142 Eigen::Map<Eigen::Matrix<double, 7, 1>> coriolis(coriolis_array.data());
143 Eigen::Map<Eigen::Matrix<double, 6, 7>> jacobian(
jacobian_array.data());
144 Eigen::Map<Eigen::Matrix<double, 7, 1>>
q(robot_state.q.data());
145 Eigen::Map<Eigen::Matrix<double, 7, 1>> dq(robot_state.dq.data());
146 Eigen::Map<Eigen::Matrix<double, 7, 1>> tau_J_d(
147 robot_state.tau_J_d.data());
148 Eigen::Affine3d
transform(Eigen::Matrix4d::Map(robot_state.O_T_EE.data()));
149 Eigen::Vector3d position(
transform.translation());
150 Eigen::Quaterniond orientation(
transform.linear());
155 for (
int i = 0; i < 3; i++) {
161 orientation.coeffs() << -orientation.coeffs();
164 Eigen::Quaterniond error_quaternion(orientation.inverse() *
orientation_d_);
165 error_.tail(3) << error_quaternion.x(), error_quaternion.y(), error_quaternion.z();
169 for (
int i = 0; i < 3; i++) {
178 Eigen::VectorXd tau_task(7), tau_nullspace(7), tau_d(7);
182 Eigen::MatrixXd jacobian_transpose_pinv;
183 pseudoInverse(jacobian.transpose(), jacobian_transpose_pinv);
185 tau_task << jacobian.transpose() *
188 Eigen::Matrix<double, 7, 1> dqe;
189 Eigen::Matrix<double, 7, 1> qe;
195 tau_nullspace << (Eigen::MatrixXd::Identity(7, 7) -
196 jacobian.transpose() * jacobian_transpose_pinv) *
200 tau_d << tau_task + tau_nullspace + coriolis;
204 for (
size_t i = 0; i < 7; ++i) {
234 const Eigen::Matrix<double, 7, 1>& tau_d_calculated,
235 const Eigen::Matrix<double, 7, 1>& tau_J_d) {
236 Eigen::Matrix<double, 7, 1> tau_d_saturated{};
237 for (
size_t i = 0; i < 7; i++) {
238 double difference = tau_d_calculated[i] - tau_J_d[i];
242 return tau_d_saturated;
246 serl_franka_controllers::compliance_paramConfig& config,
250 <<
config.translational_stiffness * Eigen::Matrix3d::Identity();
252 <<
config.rotational_stiffness * Eigen::Matrix3d::Identity();
256 <<
config.translational_damping * Eigen::Matrix3d::Identity();
258 <<
config.rotational_damping * Eigen::Matrix3d::Identity();
270 <<
config.translational_Ki * Eigen::Matrix3d::Identity();
272 <<
config.rotational_Ki * Eigen::Matrix3d::Identity();
276 const geometry_msgs::PoseStampedConstPtr& msg) {
277 position_d_target_ << msg->pose.position.x, msg->pose.position.y, msg->pose.position.z;
281 msg->pose.orientation.z, msg->pose.orientation.w;