Skip to content
Snippets Groups Projects
prog 5.61 KiB
def driverProg():
  HOSTNAME = "%(driver_hostname)s"
  PORT = %(driver_reverseport)d
  MSG_OUT = 1
  MSG_QUIT = 2
  MSG_JOINT_STATES = 3
  MSG_MOVEJ = 4
  MSG_WAYPOINT_FINISHED = 5
  MSG_STOPJ = 6
  MSG_SERVOJ = 7
  MULT_jointstate = 10000.0
  MULT_time = 1000000.0
  MULT_blend = 1000.0
  pi = 3.14159265359
  
  def send_out(msg):
    enter_critical
    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():
      q = get_joint_positions()
      qdot = get_joint_speeds()
      tau = get_joint_torques()
      enter_critical
      socket_send_int(MSG_JOINT_STATES)
      socket_send_int(floor(MULT_jointstate * q[0]))
      socket_send_int(floor(MULT_jointstate * q[1]))
      socket_send_int(floor(MULT_jointstate * q[2]))
      socket_send_int(floor(MULT_jointstate * q[3]))
      socket_send_int(floor(MULT_jointstate * q[4]))
      socket_send_int(floor(MULT_jointstate * q[5]))
      socket_send_int(floor(MULT_jointstate * qdot[0]))
      socket_send_int(floor(MULT_jointstate * qdot[1]))
      socket_send_int(floor(MULT_jointstate * qdot[2]))
      socket_send_int(floor(MULT_jointstate * qdot[3]))
      socket_send_int(floor(MULT_jointstate * qdot[4]))
      socket_send_int(floor(MULT_jointstate * qdot[5]))
      socket_send_int(floor(MULT_jointstate * tau[0]))
      socket_send_int(floor(MULT_jointstate * tau[1]))
      socket_send_int(floor(MULT_jointstate * tau[2]))
      socket_send_int(floor(MULT_jointstate * tau[3]))
      socket_send_int(floor(MULT_jointstate * tau[4]))
      socket_send_int(floor(MULT_jointstate * tau[5]))
      #socket_send_int(7895160)  # Recognizable  ".xxx" or 00787878
      exit_critical
    end
    #socket_open(HOSTNAME, 50002)
    send_joint_state()
    while True:
      send_joint_state()
      sync()
    end
    sync()
  end

  SERVO_IDLE = 0
  SERVO_RUNNING = 1
  cmd_servo_state = SERVO_IDLE
  cmd_servo_id = 0  # 0 = idle, -1 = stop
  cmd_servo_q = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
  cmd_servo_dt = 0.0
  def set_servo_setpoint(id, q, dt):
    enter_critical
    cmd_servo_state = SERVO_RUNNING
    cmd_servo_id = id
    cmd_servo_q = q
    cmd_servo_dt = dt
    exit_critical
  end
  thread servoThread():
    state = SERVO_IDLE
    while True:
      # Latches the new command
      enter_critical
      q = cmd_servo_q
      dt = cmd_servo_dt
      id = cmd_servo_id
      do_brake = False
      if (state == SERVO_RUNNING) and (cmd_servo_state == SERVO_IDLE):
        # No command pending
        do_brake = True
      end
      state = cmd_servo_state
      cmd_servo_state = SERVO_IDLE
      exit_critical

      #do_brake = False

      # Executes the command
      if do_brake:
        #stopj(1.0)  # TODO
        send_out("Braking")
        sync()
      elif state == SERVO_RUNNING:
        servoj(q, 0, 0, dt)
        #send_out("Servoed")
      else:
        #send_out("Idle")
        sync()
      end
    end
    
  end

  socket_open(HOSTNAME, PORT)
  send_out("hello")

  thread_state = run statePublisherThread()
  thread_servo = run servoThread()

  # Servoes in a circle
  #movej([1.5,-0.4,-1.57,0,0,0], 3, 0.75, 1.0)
  #t = 0
  #while True:
  #  q = [1.5,0,-1.57,0,0,0]
  #  q[0] = q[0] + 0.2 * sin(0.25 * t*(2*pi))
  #  q[1] = q[1] - 0.2 + 0.2 * cos(0.25 * t*(2*pi))
  #  #servoj(q, 3, 1, 0.08)
  #  #send_out("servoed")
  #  set_servo_setpoint(t, q, 0.08)
  #  t = t + 0.08
  #  sleep(0.08)
  #end

  while True:
    #send_out("Listening")
    ll = socket_read_binary_integer(1)
    if ll[0] == 0:
      #send_out("Received nothing")
    elif ll[0] > 1:
      send_out("Received too many things")
    else:
      mtype = ll[1]
      if mtype == MSG_QUIT:
        send_out("Received QUIT")
        break
      elif mtype == MSG_MOVEJ:
        send_out("Received movej")
  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
  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,
             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")
      elif mtype == MSG_SERVOJ:
        # Reads the parameters
  params_mult = socket_read_binary_integer(1+6+1)
  if params_mult[0] == 0:
    send_out("Received no parameters for movej message")
  end

  # Unpacks the parameters
        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,
             params_mult[7] / MULT_jointstate]
  t = params_mult[8] / MULT_time

        # Servos
        #servoj(q, 3, 0.1, t)
        #send_waypoint_finished(waypoint_id)
        set_servo_setpoint(waypoint_id, q, t)
      elif mtype == MSG_STOPJ:
        send_out("Received stopj")
  stopj(1.0)
      else:
        send_out("Received unknown message type")
      end
    end
  end

  #sleep(1)
  kill thread_state
  socket_send_int(MSG_QUIT)
end
driverProg()