Skip to content

Commit a4930f9

Browse files
committed
Added check (with tests) for gain_scaling and damping_factor limits
1 parent c34c7d1 commit a4930f9

File tree

2 files changed

+96
-0
lines changed

2 files changed

+96
-0
lines changed

ur_controllers/src/force_mode_controller.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -303,8 +303,27 @@ bool ForceModeController::setForceMode(const ur_msgs::srv::SetForceMode::Request
303303

304304
/* The damping factor decides how fast the robot decelarates if no force is present. 0 means no deceleration, 1
305305
* means quick deceleration*/
306+
if (req->damping_factor < 0.0 || req->damping_factor > 1.0) {
307+
RCLCPP_ERROR(get_node()->get_logger(), "The damping factor has to be between 0 and 1. Received %f",
308+
req->damping_factor);
309+
resp->success = false;
310+
return false;
311+
}
306312
force_mode_parameters.damping_factor = req->damping_factor;
313+
307314
/*The gain scaling factor scales the force mode gain. A value larger than 1 may make force mode unstable. */
315+
if (req->gain_scaling < 0.0 || req->gain_scaling > 2.0) {
316+
RCLCPP_ERROR(get_node()->get_logger(), "The gain scaling has to be between 0 and 2. Received %f",
317+
req->gain_scaling);
318+
resp->success = false;
319+
return false;
320+
}
321+
if (req->gain_scaling > 1.0) {
322+
RCLCPP_WARN(get_node()->get_logger(),
323+
"A gain_scaling >1.0 can make force mode unstable, e.g. in case of collisions or pushing against "
324+
"hard surfaces. Received %f",
325+
req->gain_scaling);
326+
}
308327
force_mode_parameters.gain_scaling = req->gain_scaling;
309328

310329
force_mode_params_buffer_.writeFromNonRT(force_mode_parameters);

ur_robot_driver/test/integration_test_force_mode.py

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -445,3 +445,80 @@ def test_deactivating_controller_stops_force_mode(self, tf_prefix):
445445
self.assertAlmostEqual(
446446
trans_before_wait.transform.translation.z, trans_after_wait.transform.translation.z
447447
)
448+
449+
def test_params_out_of_range_fails(self, tf_prefix):
450+
self.assertTrue(
451+
self._controller_manager_interface.switch_controller(
452+
strictness=SwitchController.Request.BEST_EFFORT,
453+
activate_controllers=[
454+
"force_mode_controller",
455+
],
456+
deactivate_controllers=[
457+
"scaled_joint_trajectory_controller",
458+
"joint_trajectory_controller",
459+
],
460+
).ok
461+
)
462+
self._force_mode_controller_interface = ForceModeInterface(self.node)
463+
464+
# Create task frame for force mode
465+
point = Point(x=0.0, y=0.0, z=0.0)
466+
orientation = Quaternion(x=0.0, y=0.0, z=0.0, w=1.0)
467+
task_frame_pose = Pose()
468+
task_frame_pose.position = point
469+
task_frame_pose.orientation = orientation
470+
header = std_msgs.msg.Header(seq=1, frame_id=tf_prefix + "base")
471+
header.stamp.sec = int(time.time()) + 1
472+
header.stamp.nanosec = 0
473+
frame_stamp = PoseStamped()
474+
frame_stamp.header = header
475+
frame_stamp.pose = task_frame_pose
476+
477+
res = self._force_mode_controller_interface.start_force_mode(
478+
task_frame=frame_stamp, gain_scaling=-0.1
479+
)
480+
self.assertFalse(res.success)
481+
482+
res = self._force_mode_controller_interface.start_force_mode(
483+
task_frame=frame_stamp, gain_scaling=0
484+
)
485+
self.assertTrue(res.success)
486+
res = self._force_mode_controller_interface.stop_force_mode()
487+
self.assertTrue(res.success)
488+
489+
res = self._force_mode_controller_interface.start_force_mode(
490+
task_frame=frame_stamp, gain_scaling=2
491+
)
492+
self.assertTrue(res.success)
493+
res = self._force_mode_controller_interface.stop_force_mode()
494+
self.assertTrue(res.success)
495+
496+
res = self._force_mode_controller_interface.start_force_mode(
497+
task_frame=frame_stamp, gain_scaling=2.1
498+
)
499+
self.assertFalse(res.success)
500+
501+
# damping factor
502+
res = self._force_mode_controller_interface.start_force_mode(
503+
task_frame=frame_stamp, damping_factor=-0.1
504+
)
505+
self.assertFalse(res.success)
506+
507+
res = self._force_mode_controller_interface.start_force_mode(
508+
task_frame=frame_stamp, damping_factor=0
509+
)
510+
self.assertTrue(res.success)
511+
res = self._force_mode_controller_interface.stop_force_mode()
512+
self.assertTrue(res.success)
513+
514+
res = self._force_mode_controller_interface.start_force_mode(
515+
task_frame=frame_stamp, damping_factor=1
516+
)
517+
self.assertTrue(res.success)
518+
res = self._force_mode_controller_interface.stop_force_mode()
519+
self.assertTrue(res.success)
520+
521+
res = self._force_mode_controller_interface.start_force_mode(
522+
task_frame=frame_stamp, damping_factor=1.1
523+
)
524+
self.assertFalse(res.success)

0 commit comments

Comments
 (0)