Skip to content

Commit b0f5c1e

Browse files
committed
Added test for joint based cartesian trajectory interface
Added test of the robot moving slightly over time for both cartessian controllers.
1 parent ec2beb6 commit b0f5c1e

File tree

2 files changed

+95
-6
lines changed

2 files changed

+95
-6
lines changed

ur_robot_driver/test/driver.test

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
<remap from="forward_cartesian_trajectory" to="/forward_cartesian_traj_controller/follow_cartesian_trajectory" />
1818
<remap from="forward_joint_trajectory" to="/forward_joint_traj_controller/follow_joint_trajectory" />
1919
<remap from="follow_cartesian_trajectory" to="/pose_based_cartesian_traj_controller/follow_cartesian_trajectory" />
20+
<remap from="follow_joint_based_cartesian_trajectory" to="/joint_based_cartesian_traj_controller/follow_cartesian_trajectory" />
2021

2122
<test test-name="integration test" pkg="ur_robot_driver" type="integration_test.py" name="integration_test" time-limit="300.0"/>
2223

ur_robot_driver/test/integration_test.py

Lines changed: 94 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import sys
33
import time
44
import unittest
5+
import re
56

67
import rospy
78
import actionlib
@@ -12,6 +13,7 @@
1213
FollowJointTrajectoryResult,
1314
JointTolerance)
1415
from ur_dashboard_msgs.msg import SetModeAction, SetModeGoal, RobotMode
16+
from ur_dashboard_msgs.srv import RawRequest
1517
from std_srvs.srv import Trigger, TriggerRequest
1618
import tf
1719
from trajectory_msgs.msg import JointTrajectoryPoint
@@ -90,6 +92,13 @@ def init_robot(self):
9092
"Could not reach cartesian controller action. Make sure that the driver is actually running."
9193
" Msg: {}".format(err))
9294

95+
self.joint_based_cartesian_trajectory_client = actionlib.SimpleActionClient(
96+
'follow_joint_based_cartesian_trajectory', FollowCartesianTrajectoryAction)
97+
if not self.cartesian_trajectory_client.wait_for_server(timeout):
98+
self.fail(
99+
"Could not reach cartesian controller action. Make sure that the driver is actually running."
100+
" Msg: {}".format(err))
101+
93102
self.set_io_client = rospy.ServiceProxy('/ur_hardware_interface/set_io', SetIO)
94103
try:
95104
self.set_io_client.wait_for_service(timeout)
@@ -121,6 +130,19 @@ def init_robot(self):
121130
self.tf_listener = tf.TransformListener()
122131
self.twist_pub = rospy.Publisher("/twist_controller/command", geometry_msgs.msg.Twist, queue_size=1)
123132

133+
# Get polyscope major version
134+
raw_request_srv = rospy.ServiceProxy('/ur_hardware_interface/dashboard/raw_request',
135+
RawRequest)
136+
try:
137+
raw_request_srv.wait_for_service(timeout)
138+
except rospy.exceptions.ROSException as err:
139+
self.fail(
140+
"Could not reach raw request service. Make sure that the driver is actually running."
141+
" Msg: {}".format(err))
142+
result = str(raw_request_srv("PolyscopeVersion"))
143+
match = re.search(r"\d", str(result))
144+
self.major_version = int(result[match.start()])
145+
124146
def set_robot_to_mode(self, target_mode):
125147
goal = SetModeGoal()
126148
goal.target_robot_mode = target_mode
@@ -364,6 +386,18 @@ def test_cartesian_trajectory_pose_interface(self):
364386
FollowCartesianTrajectoryResult.SUCCESSFUL)
365387
rospy.loginfo("Received result SUCCESSFUL")
366388

389+
# This will test that the controller is not moving the robot slightly, when no trajectory is running
390+
(trans_before, rot_before) = self.tf_listener.lookupTransform('base', 'tool0_controller', rospy.Time(0))
391+
rospy.sleep(5)
392+
(trans_after, rot_after) = self.tf_listener.lookupTransform('base', 'tool0_controller', rospy.Time(0))
393+
394+
self.assertAlmostEqual(rot_before[0], rot_after[0], delta=3e-6)
395+
self.assertAlmostEqual(rot_before[1], rot_after[1], delta=3e-6)
396+
self.assertAlmostEqual(rot_before[2], rot_after[2], delta=3e-6)
397+
self.assertAlmostEqual(trans_before[0], trans_after[0], delta=3e-6)
398+
self.assertAlmostEqual(trans_before[1], trans_after[1], delta=3e-6)
399+
self.assertAlmostEqual(trans_before[2], trans_after[2], delta=3e-6)
400+
367401
def test_twist_interface(self):
368402
#### Power cycle the robot in order to make sure it is running correctly####
369403
self.assertTrue(self.set_robot_to_mode(RobotMode.POWER_OFF))
@@ -405,13 +439,67 @@ def test_twist_interface(self):
405439

406440
(trans_end, rot_end) = self.tf_listener.lookupTransform('base', 'tool0_controller', rospy.Time(0))
407441

408-
self.assertAlmostEqual(rot_start[0], rot_end[0], delta=3e-6)
409-
self.assertAlmostEqual(rot_start[1], rot_end[1], delta=1e-6)
410-
self.assertAlmostEqual(rot_start[2], rot_end[2], delta=1e-6)
411-
self.assertAlmostEqual(trans_start[1], trans_end[1], delta=1e-6)
412-
self.assertAlmostEqual(trans_start[2], trans_end[2], delta=1e-6)
413-
self.assertTrue(trans_end[0] > trans_start[0])
442+
if self.major_version == 3:
443+
self.assertAlmostEqual(rot_start[0], rot_end[0], delta=3e-6)
444+
self.assertAlmostEqual(rot_start[1], rot_end[1], delta=3e-6)
445+
self.assertAlmostEqual(rot_start[2], rot_end[2], delta=3e-6)
446+
self.assertAlmostEqual(trans_start[1], trans_end[1], delta=3e-6)
447+
self.assertAlmostEqual(trans_start[2], trans_end[2], delta=3e-6)
448+
self.assertTrue(trans_end[0] > trans_start[0])
449+
else:
450+
self.assertAlmostEqual(rot_start[0], rot_end[0], delta=3e-6)
451+
self.assertAlmostEqual(rot_start[1], rot_end[1], delta=1e-6)
452+
self.assertAlmostEqual(rot_start[2], rot_end[2], delta=1e-6)
453+
self.assertAlmostEqual(trans_start[1], trans_end[1], delta=1e-6)
454+
self.assertAlmostEqual(trans_start[2], trans_end[2], delta=1e-6)
455+
self.assertTrue(trans_end[0] > trans_start[0])
456+
457+
458+
def test_joint_based_cartesian_trajectory_interface(self):
459+
#### Power cycle the robot in order to make sure it is running correctly####
460+
self.assertTrue(self.set_robot_to_mode(RobotMode.POWER_OFF))
461+
rospy.sleep(0.5)
462+
self.assertTrue(self.set_robot_to_mode(RobotMode.RUNNING))
463+
rospy.sleep(0.5)
464+
465+
# Make sure the robot is at a valid start position for our cartesian motions
466+
self.script_publisher.publish("movej([1, -1.7, -1.7, -1, -1.57, -2])")
467+
# As we don't have any feedback from that interface, sleep for a while
468+
rospy.sleep(5)
469+
470+
471+
self.send_program_srv.call()
472+
rospy.sleep(0.5) # TODO properly wait until the controller is running
414473

474+
self.switch_on_controller("joint_based_cartesian_traj_controller")
475+
476+
position_list = [geometry_msgs.msg.Vector3(0.4,0.4,0.4)]
477+
position_list.append(geometry_msgs.msg.Vector3(0.5,0.5,0.5))
478+
duration_list = [3.0, 6.0]
479+
goal = FollowCartesianTrajectoryGoal()
480+
481+
for i, position in enumerate(position_list):
482+
point = CartesianTrajectoryPoint()
483+
point.pose = geometry_msgs.msg.Pose(position, geometry_msgs.msg.Quaternion(0,0,0,1))
484+
point.time_from_start = rospy.Duration(duration_list[i])
485+
goal.trajectory.points.append(point)
486+
self.joint_based_cartesian_trajectory_client.send_goal(goal)
487+
self.joint_based_cartesian_trajectory_client.wait_for_result()
488+
self.assertEqual(self.joint_based_cartesian_trajectory_client.get_result().error_code,
489+
FollowCartesianTrajectoryResult.SUCCESSFUL)
490+
rospy.loginfo("Received result SUCCESSFUL")
491+
492+
# This will test that the controller is not moving the robot slightly, when no trajectory is running
493+
(trans_before, rot_before) = self.tf_listener.lookupTransform('base', 'tool0_controller', rospy.Time(0))
494+
rospy.sleep(5)
495+
(trans_after, rot_after) = self.tf_listener.lookupTransform('base', 'tool0_controller', rospy.Time(0))
496+
497+
self.assertAlmostEqual(rot_before[0], rot_after[0], delta=3e-6)
498+
self.assertAlmostEqual(rot_before[1], rot_after[1], delta=3e-6)
499+
self.assertAlmostEqual(rot_before[2], rot_after[2], delta=3e-6)
500+
self.assertAlmostEqual(trans_before[0], trans_after[0], delta=3e-6)
501+
self.assertAlmostEqual(trans_before[1], trans_after[1], delta=3e-6)
502+
self.assertAlmostEqual(trans_before[2], trans_after[2], delta=3e-6)
415503

416504
def switch_on_controller(self, controller_name):
417505
"""Switches on the given controller stopping all other known controllers with best_effort

0 commit comments

Comments
 (0)