10 #include <franka/errors.h>
12 #include <franka_msgs/Errors.h>
21 tf::Transform convertArrayToTf(
const std::array<double, 16>& transform) {
22 tf::Matrix3x3 rotation(transform[0], transform[4], transform[8], transform[1], transform[5],
23 transform[9], transform[2], transform[6], transform[10]);
24 tf::Vector3 translation(transform[12], transform[13], transform[14]);
28 franka_msgs::Errors errorsToMessage(
const franka::Errors& error) {
30 message.joint_position_limits_violation =
31 static_cast<decltype(
message.joint_position_limits_violation)
>(
32 error.joint_position_limits_violation);
33 message.cartesian_position_limits_violation =
34 static_cast<decltype(
message.cartesian_position_limits_violation)
>(
35 error.cartesian_position_limits_violation);
36 message.self_collision_avoidance_violation =
37 static_cast<decltype(
message.self_collision_avoidance_violation)
>(
38 error.self_collision_avoidance_violation);
39 message.joint_velocity_violation =
40 static_cast<decltype(
message.joint_velocity_violation)
>(
error.joint_velocity_violation);
41 message.cartesian_velocity_violation =
42 static_cast<decltype(
message.cartesian_velocity_violation)
>(
43 error.cartesian_velocity_violation);
44 message.force_control_safety_violation =
45 static_cast<decltype(
message.force_control_safety_violation)
>(
46 error.force_control_safety_violation);
49 static_cast<decltype(
message.cartesian_reflex)
>(
error.cartesian_reflex);
50 message.max_goal_pose_deviation_violation =
51 static_cast<decltype(
message.max_goal_pose_deviation_violation)
>(
52 error.max_goal_pose_deviation_violation);
53 message.max_path_pose_deviation_violation =
54 static_cast<decltype(
message.max_path_pose_deviation_violation)
>(
55 error.max_path_pose_deviation_violation);
56 message.cartesian_velocity_profile_safety_violation =
57 static_cast<decltype(
message.cartesian_velocity_profile_safety_violation)
>(
58 error.cartesian_velocity_profile_safety_violation);
59 message.joint_position_motion_generator_start_pose_invalid =
60 static_cast<decltype(
message.joint_position_motion_generator_start_pose_invalid)
>(
61 error.joint_position_motion_generator_start_pose_invalid);
62 message.joint_motion_generator_position_limits_violation =
63 static_cast<decltype(
message.joint_motion_generator_position_limits_violation)
>(
64 error.joint_motion_generator_position_limits_violation);
65 message.joint_motion_generator_velocity_limits_violation =
66 static_cast<decltype(
message.joint_motion_generator_velocity_limits_violation)
>(
67 error.joint_motion_generator_velocity_limits_violation);
68 message.joint_motion_generator_velocity_discontinuity =
69 static_cast<decltype(
message.joint_motion_generator_velocity_discontinuity)
>(
70 error.joint_motion_generator_velocity_discontinuity);
71 message.joint_motion_generator_acceleration_discontinuity =
72 static_cast<decltype(
message.joint_motion_generator_acceleration_discontinuity)
>(
73 error.joint_motion_generator_acceleration_discontinuity);
74 message.cartesian_position_motion_generator_start_pose_invalid =
75 static_cast<decltype(
message.cartesian_position_motion_generator_start_pose_invalid)
>(
76 error.cartesian_position_motion_generator_start_pose_invalid);
77 message.cartesian_motion_generator_elbow_limit_violation =
78 static_cast<decltype(
message.cartesian_motion_generator_elbow_limit_violation)
>(
79 error.cartesian_motion_generator_elbow_limit_violation);
80 message.cartesian_motion_generator_velocity_limits_violation =
81 static_cast<decltype(
message.cartesian_motion_generator_velocity_limits_violation)
>(
82 error.cartesian_motion_generator_velocity_limits_violation);
83 message.cartesian_motion_generator_velocity_discontinuity =
84 static_cast<decltype(
message.cartesian_motion_generator_velocity_discontinuity)
>(
85 error.cartesian_motion_generator_velocity_discontinuity);
86 message.cartesian_motion_generator_acceleration_discontinuity =
87 static_cast<decltype(
message.cartesian_motion_generator_acceleration_discontinuity)
>(
88 error.cartesian_motion_generator_acceleration_discontinuity);
89 message.cartesian_motion_generator_elbow_sign_inconsistent =
90 static_cast<decltype(
message.cartesian_motion_generator_elbow_sign_inconsistent)
>(
91 error.cartesian_motion_generator_elbow_sign_inconsistent);
92 message.cartesian_motion_generator_start_elbow_invalid =
93 static_cast<decltype(
message.cartesian_motion_generator_start_elbow_invalid)
>(
94 error.cartesian_motion_generator_start_elbow_invalid);
95 message.cartesian_motion_generator_joint_position_limits_violation =
96 static_cast<decltype(
message.cartesian_motion_generator_joint_position_limits_violation)
>(
97 error.cartesian_motion_generator_joint_position_limits_violation);
98 message.cartesian_motion_generator_joint_velocity_limits_violation =
99 static_cast<decltype(
message.cartesian_motion_generator_joint_velocity_limits_violation)
>(
100 error.cartesian_motion_generator_joint_velocity_limits_violation);
101 message.cartesian_motion_generator_joint_velocity_discontinuity =
102 static_cast<decltype(
message.cartesian_motion_generator_joint_velocity_discontinuity)
>(
103 error.cartesian_motion_generator_joint_velocity_discontinuity);
104 message.cartesian_motion_generator_joint_acceleration_discontinuity =
105 static_cast<decltype(
message.cartesian_motion_generator_joint_acceleration_discontinuity)
>(
106 error.cartesian_motion_generator_joint_acceleration_discontinuity);
107 message.cartesian_position_motion_generator_invalid_frame =
108 static_cast<decltype(
message.cartesian_position_motion_generator_invalid_frame)
>(
109 error.cartesian_position_motion_generator_invalid_frame);
110 message.force_controller_desired_force_tolerance_violation =
111 static_cast<decltype(
message.force_controller_desired_force_tolerance_violation)
>(
112 error.force_controller_desired_force_tolerance_violation);
113 message.controller_torque_discontinuity =
114 static_cast<decltype(
message.controller_torque_discontinuity)
>(
115 error.controller_torque_discontinuity);
116 message.start_elbow_sign_inconsistent =
117 static_cast<decltype(
message.start_elbow_sign_inconsistent)
>(
118 error.start_elbow_sign_inconsistent);
119 message.communication_constraints_violation =
120 static_cast<decltype(
message.communication_constraints_violation)
>(
121 error.communication_constraints_violation);
122 message.power_limit_violation =
123 static_cast<decltype(
message.power_limit_violation)
>(
error.power_limit_violation);
124 message.joint_p2p_insufficient_torque_for_planning =
125 static_cast<decltype(
message.joint_p2p_insufficient_torque_for_planning)
>(
126 error.joint_p2p_insufficient_torque_for_planning);
127 message.tau_j_range_violation =
128 static_cast<decltype(
message.tau_j_range_violation)
>(
error.tau_j_range_violation);
130 static_cast<decltype(
message.instability_detected)
>(
error.instability_detected);
131 message.joint_move_in_wrong_direction =
132 static_cast<decltype(
message.joint_move_in_wrong_direction)
>(
133 error.joint_move_in_wrong_direction);
134 #ifdef ENABLE_BASE_ACCELERATION
135 message.cartesian_spline_motion_generator_violation =
136 static_cast<decltype(
message.cartesian_spline_motion_generator_violation)
>(
137 error.cartesian_spline_motion_generator_violation);
138 message.joint_via_motion_generator_planning_joint_limit_violation =
139 static_cast<decltype(
message.joint_via_motion_generator_planning_joint_limit_violation)
>(
140 error.joint_via_motion_generator_planning_joint_limit_violation);
141 message.base_acceleration_initialization_timeout =
142 static_cast<decltype(
message.base_acceleration_initialization_timeout)
>(
143 error.base_acceleration_initialization_timeout);
144 message.base_acceleration_invalid_reading =
145 static_cast<decltype(
message.base_acceleration_invalid_reading)
>(
146 error.base_acceleration_invalid_reading);
160 ROS_ERROR(
"FrankaStateController: Could not get Franka state interface from hardware");
164 ROS_ERROR(
"FrankaStateController: Could not get parameter arm_id");
167 double publish_rate(30.0);
168 if (!controller_node_handle.
getParam(
"publish_rate", publish_rate)) {
169 ROS_INFO_STREAM(
"FrankaStateController: Did not find publish_rate. Using default "
170 << publish_rate <<
" [Hz].");
177 "FrankaStateController: Invalid or no joint_names parameters provided, aborting "
186 ROS_ERROR_STREAM(
"FrankaStateController: Exception getting franka state handle: " << ex.
what());
197 std::lock_guard<realtime_tools::RealtimePublisher<sensor_msgs::JointState>> lock(
205 std::lock_guard<realtime_tools::RealtimePublisher<sensor_msgs::JointState>> lock(
213 std::lock_guard<realtime_tools::RealtimePublisher<tf2_msgs::TFMessage>> lock(
217 tf::Vector3 translation(0.0, 0.0, 0.05);
221 geometry_msgs::TransformStamped transform_message;
222 transformStampedTFToMsg(stamped_transform, transform_message);
225 translation = tf::Vector3(0.0, 0.0, 0.0);
229 transformStampedTFToMsg(stamped_transform, transform_message);
234 transformStampedTFToMsg(stamped_transform, transform_message);
238 std::lock_guard<realtime_tools::RealtimePublisher<geometry_msgs::WrenchStamped>> lock(
266 "Robot state Cartesian members do not have same size");
268 "Robot state Cartesian members do not have same size");
270 "Robot state Cartesian members do not have same size");
272 "Robot state Cartesian members do not have same size");
274 "Robot state Cartesian members do not have same size");
276 "Robot state Cartesian members do not have same size");
277 for (
size_t i = 0; i <
robot_state_.cartesian_collision.size(); i++) {
288 "Robot state joint members do not have same size");
290 "Robot state joint members do not have same size");
292 "Robot state joint members do not have same size");
294 "Robot state joint members do not have same size");
296 "Robot state joint members do not have same size");
298 "Robot state joint members do not have same size");
300 "Robot state joint members do not have same size");
302 "Robot state joint members do not have same size");
304 "Robot state joint members do not have same size");
306 "Robot state joint members do not have same size");
308 "Robot state joint members do not have same size");
310 "Robot state joint members do not have same size");
328 "Robot state elbow configuration members do not have same size");
330 "Robot state elbow configuration members do not have same size");
332 "Robot state elbow configuration members do not have same size");
334 "Robot state elbow configuration members do not have same size");
336 for (
size_t i = 0; i <
robot_state_.elbow.size(); i++) {
345 "Robot state transforms do not have same size");
347 "Robot state transforms do not have same size");
349 "Robot state transforms do not have same size");
351 "Robot state transforms do not have same size");
353 "Robot state transforms do not have same size");
355 "Robot state transforms do not have same size");
356 for (
size_t i = 0; i <
robot_state_.O_T_EE.size(); i++) {
369 for (
size_t i = 0; i <
robot_state_.I_load.size(); i++) {
375 for (
size_t i = 0; i <
robot_state_.F_x_Cload.size(); i++) {
380 #ifdef ENABLE_BASE_ACCELERATION
381 for (
size_t i = 0; i <
robot_state_.O_ddP_O.size(); i++) {
396 case franka::RobotMode::kOther:
400 case franka::RobotMode::kIdle:
404 case franka::RobotMode::kMove:
408 case franka::RobotMode::kGuiding:
412 case franka::RobotMode::kReflex:
416 case franka::RobotMode::kUserStopped:
418 franka_msgs::FrankaState::ROBOT_MODE_USER_STOPPED;
421 case franka::RobotMode::kAutomaticErrorRecovery:
423 franka_msgs::FrankaState::ROBOT_MODE_AUTOMATIC_ERROR_RECOVERY;
436 "Robot state joint members do not have same size");
438 "Robot state joint members do not have same size");
451 "Robot state joint members do not have same size");
453 "Robot state joint members do not have same size");
470 geometry_msgs::TransformStamped transform_message;
471 transformStampedTFToMsg(stamped_transform, transform_message);
476 transformStampedTFToMsg(stamped_transform, transform_message);
481 transformStampedTFToMsg(stamped_transform, transform_message);