diff --git a/universal_robot/package.xml b/universal_robot/package.xml index a61b77233a5df276baa725e4729af9358f7682e5..669fada9d42d9e0cb24ec0597c9b93e1ce8df590 100644 --- a/universal_robot/package.xml +++ b/universal_robot/package.xml @@ -24,6 +24,7 @@ <run_depend>ur_driver</run_depend> <run_depend>ur_gazebo</run_depend> <run_depend>ur_kinematics</run_depend> + <run_depend>ur_msgs</run_depend> <export> <metapackage/> diff --git a/ur_bringup/launch/ur10_bringup.launch b/ur_bringup/launch/ur10_bringup.launch index 445e0b3c89b57d8e47487a4cf6a98a9540a1d957..311bf5574ac1c7aed882b80515fdd579bb8d9ca8 100644 --- a/ur_bringup/launch/ur10_bringup.launch +++ b/ur_bringup/launch/ur10_bringup.launch @@ -12,6 +12,8 @@ <arg name="robot_ip"/> <arg name="reverse_port" default="50001"/> <arg name="limited" default="false"/> + <arg name="min_payload" default="0.0"/> + <arg name="max_payload" default="20.0"/> <!-- robot model --> <include file="$(find ur_description)/launch/ur10_upload.launch"> @@ -22,6 +24,8 @@ <include file="$(find ur_bringup)/launch/ur_common.launch"> <arg name="robot_ip" value="$(arg robot_ip)"/> <arg name="reverse_port" value="$(arg reverse_port)"/> + <arg name="min_payload" value="$(arg min_payload)"/> + <arg name="max_payload" value="$(arg max_payload)"/> </include> </launch> diff --git a/ur_bringup/launch/ur10_bringup_joint_limited.launch b/ur_bringup/launch/ur10_bringup_joint_limited.launch index 9964be4721aedf94f28b74397175a07a70748a32..b95ce8c10cb7f2f750019a793315039254047eae 100644 --- a/ur_bringup/launch/ur10_bringup_joint_limited.launch +++ b/ur_bringup/launch/ur10_bringup_joint_limited.launch @@ -11,10 +11,14 @@ <!-- robot_ip: IP-address of the robot's socket-messaging server --> <arg name="robot_ip"/> <arg name="reverse_port" default="50001"/> + <arg name="min_payload" default="0.0"/> + <arg name="max_payload" default="20.0"/> <include file="$(find ur_bringup)/launch/ur10_bringup.launch"> <arg name="robot_ip" value="$(arg robot_ip)"/> <arg name="reverse_port" value="$(arg reverse_port)"/> <arg name="limited" value="true"/> + <arg name="min_payload" value="$(arg min_payload)"/> + <arg name="max_payload" value="$(arg max_payload)"/> </include> </launch> diff --git a/ur_bringup/launch/ur5_bringup.launch b/ur_bringup/launch/ur5_bringup.launch index 6e2bfd7c273768f8a79bccf51dd0d85bb70198aa..52f7ebd67b5cb0f357127b9cd42fc2dc370aafad 100644 --- a/ur_bringup/launch/ur5_bringup.launch +++ b/ur_bringup/launch/ur5_bringup.launch @@ -12,6 +12,8 @@ <arg name="robot_ip"/> <arg name="reverse_port" default="50001"/> <arg name="limited" default="false"/> + <arg name="min_payload" default="0.0"/> + <arg name="max_payload" default="10.0"/> <!-- robot model --> <include file="$(find ur_description)/launch/ur5_upload.launch"> @@ -22,6 +24,8 @@ <include file="$(find ur_bringup)/launch/ur_common.launch"> <arg name="robot_ip" value="$(arg robot_ip)"/> <arg name="reverse_port" value="$(arg reverse_port)"/> + <arg name="min_payload" value="$(arg min_payload)"/> + <arg name="max_payload" value="$(arg max_payload)"/> </include> </launch> diff --git a/ur_bringup/launch/ur5_bringup_joint_limited.launch b/ur_bringup/launch/ur5_bringup_joint_limited.launch index 4aa7a04f18170c11b7c4e367482cb8a238043df2..dfa7560e814601e4afd4f1e7ae134766e8460fe9 100644 --- a/ur_bringup/launch/ur5_bringup_joint_limited.launch +++ b/ur_bringup/launch/ur5_bringup_joint_limited.launch @@ -11,10 +11,14 @@ <!-- robot_ip: IP-address of the robot's socket-messaging server --> <arg name="robot_ip"/> <arg name="reverse_port" default="50001"/> + <arg name="min_payload" default="0.0"/> + <arg name="max_payload" default="10.0"/> <include file="$(find ur_bringup)/launch/ur5_bringup.launch"> <arg name="robot_ip" value="$(arg robot_ip)"/> <arg name="reverse_port" value="$(arg reverse_port)"/> <arg name="limited" value="true"/> + <arg name="min_payload" value="$(arg min_payload)"/> + <arg name="max_payload" value="$(arg max_payload)"/> </include> </launch> diff --git a/ur_bringup/launch/ur_common.launch b/ur_bringup/launch/ur_common.launch index 73eff943c287cc956b03cf7941396005a67a09df..cd3b292caa6eb98df20ed788f474bc7fb31d47a1 100644 --- a/ur_bringup/launch/ur_common.launch +++ b/ur_bringup/launch/ur_common.launch @@ -13,6 +13,8 @@ <!-- robot_ip: IP-address of the robot's socket-messaging server --> <arg name="robot_ip"/> <arg name="reverse_port" default="50001"/> + <arg name="min_payload"/> + <arg name="max_payload"/> <!-- copy the specified IP address to be consistant with ROS-Industrial spec. NOTE: The ip address is actually passed to the driver on the command line --> @@ -22,7 +24,10 @@ <node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher" /> <!-- driver --> - <node name="ur_driver" pkg="ur_driver" type="driver.py" args="$(arg robot_ip) $(arg reverse_port)" output="screen" /> + <node name="ur_driver" pkg="ur_driver" type="driver.py" args="$(arg robot_ip) $(arg reverse_port)" output="screen"> + <param name="min_payload" type="double" value="$(arg min_payload)"/> + <param name="max_payload" type="double" value="$(arg max_payload)"/> + </node> <!-- TF Buffer Server --> <node pkg="tf2_ros" type="buffer_server" name="tf2_buffer_server"> diff --git a/ur_driver/prog b/ur_driver/prog index 6f118e1a5880171dd56f9cb3e14f73ec34aaaae0..18d6671705cf9d1a716434620e121a2b21b90a3f 100644 --- a/ur_driver/prog +++ b/ur_driver/prog @@ -8,6 +8,7 @@ def driverProg(): MSG_WAYPOINT_FINISHED = 5 MSG_STOPJ = 6 MSG_SERVOJ = 7 + MSG_SET_PAYLOAD = 8 MSG_WRENCH = 9 MSG_SET_DIGITAL_OUT = 10 MSG_GET_IO = 11 @@ -15,6 +16,7 @@ def driverProg(): MSG_SET_TOOL_VOLTAGE = 13 MSG_SET_ANALOG_OUT = 14 MULT_wrench = 10000.0 + MULT_payload = 1000.0 MULT_jointstate = 10000.0 MULT_time = 1000000.0 MULT_blend = 1000.0 @@ -217,6 +219,16 @@ def driverProg(): #servoj(q, 3, 0.1, t) #send_waypoint_finished(waypoint_id) set_servo_setpoint(waypoint_id, q, t) + elif mtype == MSG_SET_PAYLOAD: + params = socket_read_binary_integer(1) + if params[0] == 0: + send_out("Received no parameters for setPayload message") + end + + payload = params[1] / MULT_payload + #send_out(payload) + send_out("Received new payload") + set_payload(payload) elif mtype == MSG_STOPJ: send_out("Received stopj") stopj(1.0) @@ -228,7 +240,7 @@ def driverProg(): send_out("Received no parameters for set_out message") end if params_mult[2] > 0: - set_digital_out(params_mult[1], True) + set_digital_out(params_mult[1], True) elif params_mult[2] == 0: set_digital_out(params_mult[1], False) end @@ -240,7 +252,7 @@ def driverProg(): send_out("Received no parameters for set_out message") end if params_mult[2] != 0: - set_flag(params_mult[1], True) + set_flag(params_mult[1], True) elif params_mult[2] == 0: set_flag(params_mult[1], False) end diff --git a/ur_driver/src/ur_driver/driver.py b/ur_driver/src/ur_driver/driver.py index 85e6785377ad99ec168987d6aa4fea64f178e929..f213ddd4b029163dc2ab98c768766910883e5542 100755 --- a/ur_driver/src/ur_driver/driver.py +++ b/ur_driver/src/ur_driver/driver.py @@ -19,7 +19,7 @@ from geometry_msgs.msg import WrenchStamped from ur_driver.deserialize import RobotState, RobotMode -from ur_msgs.srv import SetIO +from ur_msgs.srv import SetPayload, SetIO from ur_msgs.msg import * # renaming classes @@ -46,17 +46,25 @@ MSG_MOVEJ = 4 MSG_WAYPOINT_FINISHED = 5 MSG_STOPJ = 6 MSG_SERVOJ = 7 +MSG_SET_PAYLOAD = 8 MSG_WRENCH = 9 MSG_SET_DIGITAL_OUT = 10 MSG_GET_IO = 11 MSG_SET_FLAG = 12 MSG_SET_TOOL_VOLTAGE = 13 MSG_SET_ANALOG_OUT = 14 +MULT_payload = 1000.0 MULT_wrench = 10000.0 MULT_jointstate = 10000.0 MULT_time = 1000000.0 MULT_blend = 1000.0 +#Bounds for SetPayload service +MIN_PAYLOAD = 0.0 +MAX_PAYLOAD = 1.0 +#Using a very conservative value as it should be set throught the parameter server + + FUN_SET_DIGITAL_OUT = 1 FUN_SET_FLAG = 2 FUN_SET_ANALOG_OUT = 3 @@ -432,7 +440,7 @@ class CommanderTCPHandler(SocketServer.BaseRequestHandler): def send_quit(self): with self.socket_lock: self.request.send(struct.pack("!i", MSG_QUIT)) - + def send_servoj(self, waypoint_id, q_actual, t): assert(len(q_actual) == 6) q_robot = [0.0] * 6 @@ -444,6 +452,12 @@ class CommanderTCPHandler(SocketServer.BaseRequestHandler): buf = struct.pack("!%ii" % len(params), *params) with self.socket_lock: self.request.send(buf) + + #Experimental set_payload implementation + def send_payload(self,payload): + buf = struct.pack('!ii', MSG_SET_PAYLOAD, payload * MULT_payload) + with self.socket_lock: + self.request.send(buf) #Experimental set_digital_output implementation def set_digital_out(self, pinnum, value): @@ -594,6 +608,25 @@ def within_tolerance(a_vec, b_vec, tol_vec): return False return True +class URServiceProvider(object): + def __init__(self, robot): + self.robot = robot + rospy.Service('ur_driver/setPayload', SetPayload, self.setPayload) + + def set_robot(self, robot): + self.robot = robot + + def setPayload(self, req): + if req.payload < min_payload or req.payload > max_payload: + print 'ERROR: Payload ' + str(req.payload) + ' out of bounds (' + str(min_payload) + ', ' + str(max_payload) + ')' + return False + + if self.robot: + self.robot.send_payload(req.payload) + else: + return False + return True + class URTrajectoryFollower(object): RATE = 0.02 def __init__(self, robot, goal_time_tolerance=None): @@ -860,6 +893,15 @@ def main(): # Reads the maximum velocity global max_velocity max_velocity = rospy.get_param("~max_velocity", 2.0) + + # Reads the minimum payload + global min_payload + min_payload = rospy.get_param("~min_payload", MIN_PAYLOAD) + # Reads the maximum payload + global max_payload + max_payload = rospy.get_param("~max_payload", MAX_PAYLOAD) + rospy.loginfo("Bounds for Payload: [%s, %s]" % (min_payload, max_payload)) + # Sets up the server for the robot to connect to server = TCPServer(("", reverse_port), CommanderTCPHandler) @@ -874,7 +916,8 @@ def main(): connection.send_reset_program() set_io_server() - + + service_provider = None action_server = None try: while not rospy.is_shutdown(): @@ -904,6 +947,12 @@ def main(): break rospy.loginfo("Robot connected") + #provider for service calls + if service_provider: + service_provider.set_robot(r) + else: + service_provider = URServiceProvider(r) + if action_server: action_server.set_robot(r) else: diff --git a/ur_msgs/CMakeLists.txt b/ur_msgs/CMakeLists.txt index f9bd5a2a98906411f9901c8660a0d159f095633d..1fc2dd9b027babcb8db1996ab0de0265aeb45ba5 100644 --- a/ur_msgs/CMakeLists.txt +++ b/ur_msgs/CMakeLists.txt @@ -18,6 +18,7 @@ find_package(catkin REQUIRED COMPONENTS message_generation std_msgs) ## Generate services in the 'srv' folder add_service_files( FILES + SetPayload.srv SetIO.srv ) diff --git a/ur_msgs/srv/SetPayload.srv b/ur_msgs/srv/SetPayload.srv new file mode 100644 index 0000000000000000000000000000000000000000..d68eb5c86d4c251e1a94ad8ae3ab329b19070cbe --- /dev/null +++ b/ur_msgs/srv/SetPayload.srv @@ -0,0 +1,3 @@ +float32 payload +----------------------- +bool success