Advertisement
Guest User

Untitled

a guest
Jun 17th, 2019
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.06 KB | None | 0 0
  1. import vrep
  2. import sys
  3. import time
  4. import numpy as np
  5. from PID import PID
  6.  
  7.  
  8. class Robot:
  9. def __init__(self):
  10. vrep.simxFinish(-1)
  11.  
  12. self.timeSleep = 0.1
  13.  
  14. self.distDefault = 0.576
  15. self.speed = 0.2
  16.  
  17. self.pid = PID(0.4, 0.4, 0)
  18.  
  19. self.clientId = vrep.simxStart('127.0.0.1', 19999, True, True, 5000, 5)
  20. assert self.clientId != -1, 'Failed connecting to remote API server'
  21.  
  22. e = vrep.simxStartSimulation(self.clientId, vrep.simx_opmode_oneshot_wait)
  23. self.checkErrorCode(e, "Unable to start simulation", True)
  24.  
  25. e, self.leftMotorHandle = vrep.simxGetObjectHandle(self.clientId, 'Pioneer_p3dx_leftMotor', vrep.simx_opmode_oneshot_wait)
  26. self.checkErrorCode(e, "Can not find left motor", True)
  27.  
  28. e, self.rightMotorHandle = vrep.simxGetObjectHandle(self.clientId, 'Pioneer_p3dx_rightMotor', vrep.simx_opmode_oneshot_wait)
  29. self.checkErrorCode(e, "Can not find right motor", True)
  30.  
  31. e, self.LeftSensorHandle = vrep.simxGetObjectHandle(self.clientId, 'Proximity_sensor',
  32. vrep.simx_opmode_oneshot_wait)
  33. self.checkErrorCode(e, "Can not find left ray sensor", True)
  34.  
  35. e, self.TopSensorHandle = vrep.simxGetObjectHandle(self.clientId, 'Proximity_sensor0', vrep.simx_opmode_oneshot_wait)
  36. self.checkErrorCode(e, "Can not find top ray sensor", True)
  37.  
  38. sec, msecond = vrep.simxGetPingTime(self.clientId)
  39. print("Ping time: %f" % (sec + msecond / 1000.0))
  40. print("Initialization finished")
  41.  
  42. @staticmethod
  43. def checkErrorCode(errorCode, message, need_exit=False):
  44. if errorCode != vrep.simx_return_ok:
  45. print("ERROR: Code {}. {}".format(errorCode, message))
  46. if need_exit:
  47. sys.exit()
  48.  
  49. def setMotorSpeed(self, leftSpeed, rightSpeed):
  50. e = vrep.simxSetJointTargetVelocity(self.clientId, self.leftMotorHandle, leftSpeed,
  51. vrep.simx_opmode_oneshot_wait)
  52. self.checkErrorCode(e, "SetJointTargetVelocity for left motor got error code")
  53. e = vrep.simxSetJointTargetVelocity(self.clientId, self.rightMotorHandle, rightSpeed,
  54. vrep.simx_opmode_oneshot_wait)
  55. self.checkErrorCode(e, "SetJointTargetVelocity for right motor got error code")
  56.  
  57. print("Motor speed set to {} {}".format(leftSpeed, rightSpeed))
  58.  
  59. def getSensorData(self, sensor):
  60. (e, detectionState, detectedPoint, detectedObjectHandle,
  61. detectedSurfaceNormalVector) = vrep.simxReadProximitySensor(self.clientId, sensor, vrep.simx_opmode_buffer)
  62. self.checkErrorCode(e, "simxReadProximitySensor error")
  63.  
  64. return detectionState, np.linalg.norm(detectedPoint), detectedSurfaceNormalVector
  65.  
  66. def getPidCorrection(self, dist):
  67. errorThree = self.distDefault - round(dist, 3)
  68. error = errorThree
  69.  
  70. correction = self.pid(error)
  71.  
  72. return errorThree, correction
  73.  
  74. def startSimulation(self):
  75. vrep.simxReadProximitySensor(self.clientId, self.LeftSensorHandle, vrep.simx_opmode_streaming)
  76. vrep.simxReadProximitySensor(self.clientId, self.TopSensorHandle, vrep.simx_opmode_streaming)
  77.  
  78. while vrep.simxGetConnectionId(self.clientId) != -1:
  79. isDetected, distance, vector = self.getSensorData(self.LeftSensorHandle)
  80. isDetectedTop, distance2, vector2 = self.getSensorData(self.TopSensorHandle)
  81.  
  82. if isDetectedTop:
  83. errorDistanse, pidCorrect = self.getPidCorrection(distance2)
  84. self.setMotorSpeed(self.speed - pidCorrect, self.speed + pidCorrect)
  85. print("distance: {} {} | pid: {} | error: {}".format(distance, vector, pidCorrect, errorDistanse))
  86. else:
  87. self.setMotorSpeed(self.speed + 0.05, self.speed - 0.05)
  88.  
  89. time.sleep(self.timeSleep)
  90. vrep.simxFinish(self.clientId)
  91.  
  92.  
  93. if __name__ == '__main__':
  94. robot = Robot()
  95. robot.startSimulation()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement