|
2 | 2 | import sys
|
3 | 3 | import time
|
4 | 4 | import unittest
|
| 5 | +import re |
5 | 6 |
|
6 | 7 | import rospy
|
7 | 8 | import actionlib
|
|
12 | 13 | FollowJointTrajectoryResult,
|
13 | 14 | JointTolerance)
|
14 | 15 | from ur_dashboard_msgs.msg import SetModeAction, SetModeGoal, RobotMode
|
| 16 | +from ur_dashboard_msgs.srv import RawRequest |
15 | 17 | from std_srvs.srv import Trigger, TriggerRequest
|
16 | 18 | import tf
|
17 | 19 | from trajectory_msgs.msg import JointTrajectoryPoint
|
@@ -90,6 +92,13 @@ def init_robot(self):
|
90 | 92 | "Could not reach cartesian controller action. Make sure that the driver is actually running."
|
91 | 93 | " Msg: {}".format(err))
|
92 | 94 |
|
| 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 | + |
93 | 102 | self.set_io_client = rospy.ServiceProxy('/ur_hardware_interface/set_io', SetIO)
|
94 | 103 | try:
|
95 | 104 | self.set_io_client.wait_for_service(timeout)
|
@@ -121,6 +130,19 @@ def init_robot(self):
|
121 | 130 | self.tf_listener = tf.TransformListener()
|
122 | 131 | self.twist_pub = rospy.Publisher("/twist_controller/command", geometry_msgs.msg.Twist, queue_size=1)
|
123 | 132 |
|
| 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 | + |
124 | 146 | def set_robot_to_mode(self, target_mode):
|
125 | 147 | goal = SetModeGoal()
|
126 | 148 | goal.target_robot_mode = target_mode
|
@@ -364,6 +386,18 @@ def test_cartesian_trajectory_pose_interface(self):
|
364 | 386 | FollowCartesianTrajectoryResult.SUCCESSFUL)
|
365 | 387 | rospy.loginfo("Received result SUCCESSFUL")
|
366 | 388 |
|
| 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 | + |
367 | 401 | def test_twist_interface(self):
|
368 | 402 | #### Power cycle the robot in order to make sure it is running correctly####
|
369 | 403 | self.assertTrue(self.set_robot_to_mode(RobotMode.POWER_OFF))
|
@@ -405,13 +439,67 @@ def test_twist_interface(self):
|
405 | 439 |
|
406 | 440 | (trans_end, rot_end) = self.tf_listener.lookupTransform('base', 'tool0_controller', rospy.Time(0))
|
407 | 441 |
|
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 |
414 | 473 |
|
| 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) |
415 | 503 |
|
416 | 504 | def switch_on_controller(self, controller_name):
|
417 | 505 | """Switches on the given controller stopping all other known controllers with best_effort
|
|
0 commit comments