Example #1
0
masterArr2 = np.zeros([len(velArr1),4])
masterArr2[:,0] = velArr1
masterArr2[:,1] = velArr2
masterArr2[:,2] = velArr3
masterArr2[:,3] = velArr4

'''
colors = ['red','green','purple','blue','black']
label = ['limb 1','limb 2','limb 3','limb 4']
fig, (ax1, ax2) = plt.subplots(2)
for i in range(4):
  test = ax1.plot(masterArr[:,0,i],masterArr[:,1,i],color=colors[i], label=label[i])
  ax1.scatter(masterArr[0,0,i],masterArr[0,1,i],color='black')
ax1.legend()
for i in range(4):
  ax2.plot(np.linspace(0, 10, num=len(velArr1)), masterArr2[:,i],color=colors[i], label=label[i])
ax1.set(xlabel='x position (m)', ylabel='y position (m)')
ax2.set(xlabel='time (s)', ylabel='x velocity (m/s)')
ax2.legend()
'''
np.save("limbPos.npy",masterArr)
np.save("limbVels.npy",masterArr2)
fig,ax1,ax2 = m.make_graded_limb_plot(masterArr,masterArr2,0,endtime,"Limb Position: Constant Force","Limb X Velocities vs Time: Constant Force")
fig2,ax3 = m.make_plot(posArr5,0,endtime)
if save:
  title=argv[1]+'kp_'+argv[2]+'ki_'+argv[3]+'kd.png'
  plt.savefig(title)
  raise(EOFError)
plt.show()
# raise(EOFError)
Example #2
0
import numpy as np
import make_body_plot as m
import matplotlib.pyplot as plt

numPts = 1800
vels = np.load("limbVels.npy")
pos = np.load("limbPos.npy")
m.make_graded_limb_plot(pos[:numPts], vels[:numPts], 0, 20)
plt.show()
def runSim(t,kp,ki,kd):
  modArr,bodyId = startSim()
  global goal_pos_y
  mods = modArr
  mod1 = modArr[0]
  mod2 = modArr[1]
  mod3 = modArr[2]
  mod4 = modArr[3]
  k_i = ki
  k_p = kp
  k_d = kd
  time_prev = time.time()
  start_time = time.time()
  store_data_time = time.time()
  for i in range(4):
    print(p.getBasePositionAndOrientation(modArr[i]))
  #raise(ArithmeticError)
  
  posArr1 = []
  posArr2 = []
  posArr3 = []
  posArr4 = []
  posArr5 = []
  
  velArr1 = []
  velArr2 = []
  velArr3 = []
  velArr4 = []
  bodyPos = []
  bodyPos.append(p.getBasePositionAndOrientation(bodyId)[0])
  
  q = False
  numIts = 0
  #run for 10 seconds
  endtime = 8
  bodygoal = []
  while numIts < 240*endtime:
    time.sleep(1./100.)
    numIts += 1
    print(numIts)
    try:
      bodyPos.append(p.getBasePositionAndOrientation(bodyId)[0])
    #   if time.time()-start_time < 5:
    #     k_p = 0.2
    #     k_d = 0
    #     k_i = 0
    #   else:
    #     k_p = kp
    #     k_i = ki
    #     k_d = kd
      if time.time()-start_time > 1:
        
        # Get velocity of each wheel in x direction
        vel_x = []
        for i in range(4):
          temp = p.getBaseVelocity(mods[i])
          temp = temp[0][0] # Get index of x velocity
          vel_x.append(temp)
        # print(vel_x)

        # Get position of each wheel
        pos_y = []
        for i in range(4):
          temp,_ = p.getBasePositionAndOrientation(mods[i])
          pos_y.append(temp[1]) # Get index of y position
        #   temp = p.getBaseVelocity(mods[i])
        #   temp = temp[0][1] # Get index of y velocity
        #   pos_y.append(temp)

        # print(pos_y)
        
        # noise. Use noise of 3 for simulation
        for i in range(4):
        #   p.applyExternalForce(mods[i],-1,[np.random.normal(0, 5),np.random.normal(0, 5),0],[0,0,0],p.LINK_FRAME)
          pass
        
        # Apply force: either random noise or control
        if True:#time.time() - lastControlTime > 0.005: # Control every .1 second
          # Velocity control for x axis
          control_x = []
          for i in range(4):
            error = (vel_x[i] - goal_vel_x[i])
            P = k_p * error
            I = control_x_prev[i] + k_i * error * (time.time() - time_prev)
            D = k_d * (error - error_x_prev[i]) / (time.time() - time_prev)
            control_x.append(- P)
            if control_x[i] > 100:
              control_x[i] = 100
            elif control_x[i] < -100:
              control_x[i] = -100
              control_x_prev[i] = control_x[i]
              error_x_prev[i] = error
              #   print(control_x)

          # Position control for y axis
          control_y = []
          for i in range(4):
            error = pos_y[i] - goal_pos_y[i]
            P = k_p * error * 10
            I = control_y_prev[i] + k_i*3 * error * (time.time() - time_prev)
            D = k_d * (error - error_y_prev[i]) / (time.time() - time_prev)
            control_y.append(-P-D)
            # control_y.append(0)
            control_y_prev[i] = control_y[i]
            error_y_prev[i] = error
            #   print(control_y)
            
          time_prev = time.time()


          # Apply control as force
          for i in range(2):
            # p.applyExternalForce(mods[i],-1,[control_x[i],control_y[i],0],[0,0,0],p.LINK_FRAME)
            p.applyExternalForce(mods[i],-1,np.array([control_x[i] ,control_y[i]/1,0]),[0,-0.0,0],p.LINK_FRAME)
            p.applyExternalForce(mods[i],-1,np.array([control_x[i] ,control_y[i]/1,0]),[0,0.0,0],p.LINK_FRAME)
          for i in range(3,4):
            # p.applyExternalForce(mods[i],-1,[control_x[i],control_y[i],0],[0,0,0],p.LINK_FRAME)
            p.applyExternalForce(mods[i],-1,np.array([control_x[i]*0.1 ,control_y[i]/1,0]),[0,-0.0,0],p.LINK_FRAME)
            p.applyExternalForce(mods[i],-1,np.array([control_x[i]*0.1 ,control_y[i]/1,0]),[0,0.0,0],p.LINK_FRAME)
          

            # if i == 1 or i == 2:
            #   p.applyExternalForce(mods[i],-1,[control_x[i] - control_y[i]/5,0,0],[0,1/4,0],p.LINK_FRAME)
            #   p.applyExternalForce(mods[i],-1,[control_x[i] + control_y[i]/5,0,0],[0,-1/4,0],p.LINK_FRAME)
            # else:
            #   p.applyExternalForce(mods[i],-1,[control_x[i] + control_y[i]/5,0,0],[0,-1/4,0],p.LINK_FRAME)
            #   p.applyExternalForce(mods[i],-1,[control_x[i] - control_y[i]/5,0,0],[0,1/4,0],p.LINK_FRAME)
          pass
        
        #lastControlTime = time.time()


        # Store
        pos1,ort = p.getBasePositionAndOrientation(mod1)
        pos2,ort = p.getBasePositionAndOrientation(mod2)
        pos3,ort = p.getBasePositionAndOrientation(mod3)
        pos4,ort = p.getBasePositionAndOrientation(mod4)
        pos5,ort = p.getBasePositionAndOrientation(bodyId)
        posArr1.append(pos1)
        posArr2.append(pos2)
        posArr3.append(pos3)
        posArr4.append(pos4)
        posArr5.append(pos5)
        
        velArr1.append(vel_x[0])
        velArr2.append(vel_x[1])
        velArr3.append(vel_x[2])
        velArr4.append(vel_x[3])
      p.stepSimulation()

      if numIts/240 > 2 and numIts/240 < 5:
          #print(goal_pos_y)
          goal_pos_y += np.ones(4)/240
          bodygoal.append(bodygoal[-1]+np.ones(4)/240



    except(KeyboardInterrupt):
      return
      posArr1 = np.array(posArr1)
      posArr2 = np.array(posArr2)
      posArr3 = np.array(posArr3)
      posArr4 = np.array(posArr4)
      posArr5 = np.array(posArr5)

      # Master array for position
      masterArr = np.zeros([posArr1.shape[0],posArr1.shape[1],5])
      masterArr[:,:,0] = posArr1
      masterArr[:,:,1] = posArr2
      masterArr[:,:,2] = posArr3
      masterArr[:,:,3] = posArr4
      masterArr[:,:,4] = posArr5

      # Master array for velocity in x direction
      masterArr2 = np.zeros([len(velArr1),4])
      masterArr2[:,0] = velArr1
      masterArr2[:,1] = velArr2
      masterArr2[:,2] = velArr3
      masterArr2[:,3] = velArr4

      colors = ['red','green','purple','blue','black']
      fig, (ax1, ax2) = plt.subplots(2)
      for i in range(4):
        ax1.plot(masterArr[:,0,i],masterArr[:,1,i],color=colors[i])
        ax1.scatter(masterArr[0,0,i],masterArr[0,1,i],color='black')
      for i in range(4):
        ax2.plot(np.linspace(1, len(velArr1), num=len(velArr1)), masterArr2[:,i],color=colors[i])
      ax1.set(xlabel='x', ylabel='y')
      ax2.set(xlabel='time', ylabel='x velocity')
      plt.savefig()
      p.resetSimulation(p.RESET_USE_DEFORMABLE_WORLD)
      return


  posArr1 = np.array(posArr1)
  posArr2 = np.array(posArr2)
  posArr3 = np.array(posArr3)
  posArr4 = np.array(posArr4)
  posArr5 = np.array(posArr5)

      # Master array for position
  masterArr = np.zeros([posArr1.shape[0],posArr1.shape[1],5])
  masterArr[:,:,0] = posArr1
  masterArr[:,:,1] = posArr2
  masterArr[:,:,2] = posArr3
  masterArr[:,:,3] = posArr4
  masterArr[:,:,4] = posArr5

      # Master array for velocity in x direction
  masterArr2 = np.zeros([len(velArr1),4])
  masterArr2[:,0] = velArr1
  masterArr2[:,1] = velArr2
  masterArr2[:,2] = velArr3
  masterArr2[:,3] = velArr4

  colors = ['red','green','purple','blue','black']
  label = ['limb 1','limb 2','limb 3','limb 4','body']
  fig, (ax1, ax2) = plt.subplots(2)
  for i in range(5):
    test = ax1.plot(masterArr[:,0,i],masterArr[:,1,i],color=colors[i], label=label[i])
    ax1.scatter(masterArr[0,0,i],masterArr[0,1,i],color='black')
  ax1.legend()
  ax1.set_ylim([-0.5, 3.5])
  for i in range(4):
    ax2.plot(np.linspace(0, t, num=len(velArr1)), masterArr2[:,i],color=colors[i], label=label[i])
  ax1.set(xlabel='x position (m)', ylabel='y position (m)')
  ax2.set(xlabel='time (s)', ylabel='x velocity (m/s)')
  ax2.legend()
  title = str(kp)+"kp_"+str(ki)+"ki_"+str(kd)+"kd.png"
  #plt.savefig(title)
  fig2,ax3 = plt.subplots(1,1)
  N=len(bodyPos)
  if N % 2 == 0:
    Ndiv2 = int(N/2)
    blueMagenta = np.zeros([Ndiv2,4])
    magentaRed = np.zeros([Ndiv2,4])
    blueMagenta[:,0] = np.linspace(0,1,Ndiv2)
    blueMagenta[:,2] = 1
    magentaRed[:,2] = np.linspace(1,0,Ndiv2)
    magentaRed[:,0] = 1
  else:
    N = N-1
    Ndiv2 = int(N/2)
    blueMagenta = np.zeros([Ndiv2,4])
    magentaRed = np.zeros([Ndiv2+1,4])
    blueMagenta[:,0] = np.linspace(0,1,Ndiv2)
    blueMagenta[:,2] = 1
    magentaRed[:,2] = np.linspace(1,0,Ndiv2+1)
    magentaRed[:,0] = 1
    N = N+1

  blueMagenta[:,3] = 1
  magentaRed[:,3] = 1

  twocolors = np.vstack((blueMagenta,magentaRed))
  print(np.shape(twocolors))
  cmap = ListedColormap(twocolors)
  colors = np.array([[0,x/(len(bodyPos)-1),1] for x in range(len(bodyPos)-1)])
  for i in range(len(bodyPos)-1):
    ax3.plot([bodyPos[i][0],bodyPos[i+1][0]],[bodyPos[i][1],bodyPos[i+1][1]],color=twocolors[i,:3],linewidth=2)
  ax3.set(xlabel='Body X Position', ylabel='Body Y Position')
  fig2.colorbar(cm.ScalarMappable(cmap=cmap))

  m.make_graded_limb_plot(masterArr,masterArr2,0,endtime)

  plt.show()
  p.resetSimulation(p.RESET_USE_DEFORMABLE_WORLD)

  print(np.sum(abs(masterArr[:,1,0] - 0.0833)))
  print(np.sum(abs(masterArr[:,1,1] + 0.0833)))
  print(np.sum(abs(masterArr[:,1,2] - 0.0833)))
  print(np.sum(abs(masterArr[:,1,3] + 0.0833)))
  avedev = np.sum(abs(masterArr[:,1,0] - 0.0833)) + np.sum(abs(masterArr[:,1,1] + 0.0833)) + np.sum(abs(masterArr[:,1,2] - 0.0833)) + np.sum(abs(masterArr[:,1,3] + 0.0833))
  avedev = avedev / 4
  print(avedev)
  print(np.sum(abs(masterArr[:,1,4])))
  print((avedev - np.sum(abs(masterArr[:,1,4])))/avedev)
  return
  # raise(EOFError)

for i in range(1):
#  runSim(30,0.2,0.2,0.5)
  runSim(40,1,0,0.01)
  #runSim(10,10,0,0.01)
Example #4
0
def runSim(t,kp,ki,kd):
  modArr,bodyId = startSim()
  mods = modArr
  mod1 = modArr[0]
  mod2 = modArr[1]
  mod3 = modArr[2]
  mod4 = modArr[3]
  startTime = time.time()
  posArr = np.zeros([1,4,3])
  forces = posArr.copy()
  velArr = forces.copy()
  x=True
  add = np.zeros([4,3])
  add[:,0] += 1
  speed = 30
  des = np.zeros([4,3])
  tics = 0
  numits = 0
  endtime=9
  xvels = []
  while True:
    try:
      numits += 1
      if time.time()-startTime > 1:
        poses = get_positions(modArr)
        f=pid(kp,ki,kd,modArr,des,poses)
        #p.setJointMotorControl2(bodyId,0,controlMode=p.VELOCITY_CONTROL,targetVelocity=20)
        #f = apply_forces(modArr,poses,des,poly,1)
        des[:,0] += tstep*20 #10 units/sec
        des = poses[-1] + add*speed
        des[0,1] = 0.0833
        des[1,1] = -des[0,1]
        des[2,1] = des[0,1]
        des[3,1] = des[1,1]
        posArr = np.append(posArr,poses,0)
        velArr = np.append(velArr,getVels(modArr),0)
        xvels.append(getVels(modArr)[0,:,0])
        #forces = np.append(forces,f,0)
      p.stepSimulation()
      time.sleep(1/100.)
      tics += 1
      #print(tics)
      if tics > 1400:
        raise(KeyboardInterrupt)
      #print(des)
      
    except(KeyboardInterrupt):
      masterArr = posArr
      #print(posArr.shape)
      colors = ['red','green','purple','blue']
      labels = ['limb 1','limb 2','limb 3','limb 4']
      fig,(ax1,ax2) = plt.subplots(2)
      for i in range(4):
        ax1.plot(masterArr[1:,i,0],masterArr[1:,i,1],color=colors[i],label=labels[i])
        #ax1.scatter(masterArr[0,0,i],masterArr[0,1,i],color='black')
        ax2.plot(np.linspace(1,len(velArr),num=len(velArr))/100,velArr[:,i,0],color=colors[i],label=labels[i])
      ax1.set(xlabel='x position(m)',ylabel='y position (m)')
      ax2.set(xlabel='time (s)',ylabel='x velocity (m/s)')
      ax2.legend()
      ax1.legend()

      title = "morepics/"+str(kp)+"kP_"+str(ki)+"kI_"+str(kd)+"kD.png"
      #plt.savefig(title)
      posArr = np.transpose(posArr,(0,2,1))
      velArr = np.transpose(velArr,(0,2,1))
      #print(posArr.shape)
      #print(velArr.shape)
      #print("A")
      xvels = np.array(xvels)
      m.make_graded_limb_plot(posArr[1:],xvels[1:],0,endtime-1)
      plt.show()

      
      #plt.figure()
      #plt.plot(np.arange(forces.shape[0]),forces[:,2,1])
      #plt.xlabel("step num")
      #plt.ylabel("Applied X force")
      x=False
      p.resetSimulation(p.RESET_USE_DEFORMABLE_WORLD)
  return
Example #5
0
posArr4 = np.array(posArr4)
posArr5 = np.array(posArr5)

# Master array for position
masterArr = np.zeros([posArr1.shape[0], posArr1.shape[1], 5])
masterArr[:, :, 0] = posArr1
masterArr[:, :, 1] = posArr2
masterArr[:, :, 2] = posArr3
masterArr[:, :, 3] = posArr4
masterArr[:, :, 4] = posArr5

# Master array for velocity in x direction
masterArr2 = np.zeros([len(velArr1), 4])
masterArr2[:, 0] = velArr1
masterArr2[:, 1] = velArr2
masterArr2[:, 2] = velArr3
masterArr2[:, 3] = velArr4

np.save("limbPos.npy", masterArr)
np.save("limbVels.npy", masterArr2)
#fig,ax1,ax2 = m.make_graded_limb_plot(masterArr,masterArr2,0,20)
#fig2,ax3 = m.make_plot(posArr5,0,endTime)
m.make_graded_limb_plot(masterArr, masterArr2, 0, 20)
#plt.plot(masterArr[:,0,0],masterArr[:,0,0],color='blue')
if save:
    title = argv[1] + 'kp_' + argv[2] + 'ki_' + argv[3] + 'kd.png'
    plt.savefig(title)
    raise (EOFError)
plt.show()
# raise(EOFError)