From 56941f7b000f36ea2ed4c77bcfe69409775d70a3 Mon Sep 17 00:00:00 2001 From: Stuart Glaser <sglaser@willowgarage.com> Date: Mon, 26 Mar 2012 20:10:22 -0700 Subject: [PATCH] Following waypoints. Reporting when reached. --- ur5_driver/driver.py | 29 ++++++++++++++++++++++------- ur5_driver/prog | 31 +++++++++++++++++++++---------- 2 files changed, 43 insertions(+), 17 deletions(-) diff --git a/ur5_driver/driver.py b/ur5_driver/driver.py index 1104f0e..c82e32c 100755 --- a/ur5_driver/driver.py +++ b/ur5_driver/driver.py @@ -1,6 +1,7 @@ #!/usr/bin/env python import roslib; roslib.load_manifest('ur5_driver') import time, sys, threading +import datetime import socket import struct import SocketServer @@ -15,6 +16,7 @@ MSG_OUT = 1 MSG_QUIT = 2 MSG_JOINT_STATES = 3 MSG_MOVEJ = 4 +MSG_WAYPOINT_FINISHED = 5 MULT_jointstate = 1000.0 MULT_time = 1000000.0 MULT_blend = 1000.0 @@ -34,6 +36,9 @@ dump_state = open('dump_state', 'wb') class EOF(Exception): pass +def log(s): + print "[%s] %s" % (datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f'), s) + def setConnectedRobot(r): global connected_robot, connected_robot_lock with connected_robot_lock: @@ -81,7 +86,8 @@ class CommanderTCPHandler(SocketServer.BaseRequestHandler): if len(buf) > 2000: raise Exception("Probably forgot to terminate a string: %s..." % buf[:150]) s, buf = buf[:i], buf[i+1:] - print "Out: %s" % s + log("Out: %s" % s) + elif mtype == MSG_JOINT_STATES: while len(buf) < 3*(6*4): buf = buf + self.recv_more() @@ -99,6 +105,12 @@ class CommanderTCPHandler(SocketServer.BaseRequestHandler): elif mtype == MSG_QUIT: print "Quitting" raise EOF() + elif mtype == MSG_WAYPOINT_FINISHED: + while len(buf) < 4: + buf = buf + self.recv_more() + waypoint_id = struct.unpack_from("!i", buf, 0)[0] + buf = buf[4:] + log("Waypoint finished: %i" % waypoint_id) else: raise Exception("Unknown message type: %i" % mtype) @@ -111,9 +123,9 @@ class CommanderTCPHandler(SocketServer.BaseRequestHandler): with self.socket_lock: self.request.send(struct.pack("!i", MSG_QUIT)) - def send_movej(self, q, a=3, v=0.75, t=0, r=0): + def send_movej(self, waypoint_id, q, a=3, v=0.75, t=0, r=0): assert(len(q) == 6) - buf = ''.join([struct.pack("!i", MSG_MOVEJ), + buf = ''.join([struct.pack("!ii", MSG_MOVEJ, waypoint_id), struct.pack("!iiiiii", *[MULT_jointstate * qq for qq in q]), struct.pack("!ii", MULT_jointstate * a, MULT_jointstate * v), struct.pack("!ii", MULT_time * t, MULT_blend * r)]) @@ -150,9 +162,10 @@ def main(): r = getConnectedRobot(wait=True) print "Robot connected" - r.send_movej(Q1) - time.sleep(2) - r.send_movej(Q2) + log("movej Q1") + r.send_movej(1, Q1, t=2.0) + log("movej Q2") + r.send_movej(2, Q2, t=1.0) time.sleep(3) print "Sending quit" @@ -160,7 +173,8 @@ def main(): # Waits for the threads to finish joinAll([thread_commander]) - + + ''' print "Dump" print "="*70 o = "" @@ -169,6 +183,7 @@ def main(): if not r: break o = o + r print o + ''' if __name__ == '__main__': main() diff --git a/ur5_driver/prog b/ur5_driver/prog index 57f43ef..9f5cff9 100644 --- a/ur5_driver/prog +++ b/ur5_driver/prog @@ -4,18 +4,25 @@ def driverProg(): MSG_QUIT = 2 MSG_JOINT_STATES = 3 MSG_MOVEJ = 4 + MSG_WAYPOINT_FINISHED = 5 MULT_jointstate = 1000 MULT_time = 1000000.0 MULT_blend = 1000.0 def send_out(msg): enter_critical - socket_send_int(1) + socket_send_int(MSG_OUT) socket_send_string(msg) socket_send_string("~") exit_critical end - + + def send_waypoint_finished(waypoint_id): + enter_critical + socket_send_int(MSG_WAYPOINT_FINISHED) + socket_send_int(waypoint_id) + exit_critical + end thread statePublisherThread(): def send_joint_state(): @@ -79,25 +86,29 @@ def driverProg(): break elif mtype == MSG_MOVEJ: send_out("Received movej") - params_mult = socket_read_binary_integer(6+4) + params_mult = socket_read_binary_integer(1+6+4) if params_mult[0] == 0: send_out("Received no parameters for movej message") end # Unpacks the parameters - q = [params_mult[1] / MULT_jointstate, - params_mult[2] / MULT_jointstate, + waypoint_id = params_mult[1] + q = [params_mult[2] / MULT_jointstate, params_mult[3] / MULT_jointstate, params_mult[4] / MULT_jointstate, params_mult[5] / MULT_jointstate, - params_mult[6] / MULT_jointstate] - a = params_mult[7] / MULT_jointstate - v = params_mult[8] / MULT_jointstate - t = params_mult[9] / MULT_time - r = params_mult[10] / MULT_blend + params_mult[6] / MULT_jointstate, + params_mult[7] / MULT_jointstate] + a = params_mult[8] / MULT_jointstate + v = params_mult[9] / MULT_jointstate + t = params_mult[10] / MULT_time + r = params_mult[11] / MULT_blend # Sends the command + send_out("movej started") movej(q, a, v, t, r) + send_waypoint_finished(waypoint_id) + send_out("movej finished") else: send_out("Received unknown message type") end -- GitLab