Advertisement
Guest User

Untitled

a guest
Jun 17th, 2019
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.86 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. ##PID INIT
  18. self._get_time = kwargs.pop('get_time', None) or time.time
  19.  
  20. self.Kp = 0.4
  21. self.Ki = 0.4
  22. self.Kd = 0
  23.  
  24. self._target = 0
  25. self._prev_tm = self._get_time()
  26. self._prev_feedback = 0
  27. self._error = None
  28.  
  29. self.clientId = vrep.simxStart('127.0.0.1', 19999, True, True, 5000, 5)
  30. assert self.clientId != -1, 'Failed connecting to remote API server'
  31.  
  32. e = vrep.simxStartSimulation(self.clientId, vrep.simx_opmode_oneshot_wait)
  33. self.checkErrorCode(e, "Unable to start simulation", True)
  34.  
  35. e, self.leftMotorHandle = vrep.simxGetObjectHandle(self.clientId, 'Pioneer_p3dx_leftMotor', vrep.simx_opmode_oneshot_wait)
  36. self.checkErrorCode(e, "Can not find left motor", True)
  37.  
  38. e, self.rightMotorHandle = vrep.simxGetObjectHandle(self.clientId, 'Pioneer_p3dx_rightMotor', vrep.simx_opmode_oneshot_wait)
  39. self.checkErrorCode(e, "Can not find right motor", True)
  40.  
  41. e, self.LeftSensorHandle = vrep.simxGetObjectHandle(self.clientId, 'Proximity_sensor',
  42. vrep.simx_opmode_oneshot_wait)
  43. self.checkErrorCode(e, "Can not find left ray sensor", True)
  44.  
  45. e, self.TopSensorHandle = vrep.simxGetObjectHandle(self.clientId, 'Proximity_sensor0', vrep.simx_opmode_oneshot_wait)
  46. self.checkErrorCode(e, "Can not find top ray sensor", True)
  47.  
  48. sec, msecond = vrep.simxGetPingTime(self.clientId)
  49. print("Ping time: %f" % (sec + msecond / 1000.0))
  50. print("Initialization finished")
  51.  
  52. @staticmethod
  53. def checkErrorCode(errorCode, message, need_exit=False):
  54. if errorCode != vrep.simx_return_ok:
  55. print("ERROR: Code {}. {}".format(errorCode, message))
  56. if need_exit:
  57. sys.exit()
  58.  
  59. def setMotorSpeed(self, leftSpeed, rightSpeed):
  60. e = vrep.simxSetJointTargetVelocity(self.clientId, self.leftMotorHandle, leftSpeed,
  61. vrep.simx_opmode_oneshot_wait)
  62. self.checkErrorCode(e, "SetJointTargetVelocity for left motor got error code")
  63. e = vrep.simxSetJointTargetVelocity(self.clientId, self.rightMotorHandle, rightSpeed,
  64. vrep.simx_opmode_oneshot_wait)
  65. self.checkErrorCode(e, "SetJointTargetVelocity for right motor got error code")
  66.  
  67. print("Motor speed set to {} {}".format(leftSpeed, rightSpeed))
  68.  
  69. def getSensorData(self, sensor):
  70. (e, detectionState, detectedPoint, detectedObjectHandle,
  71. detectedSurfaceNormalVector) = vrep.simxReadProximitySensor(self.clientId, sensor, vrep.simx_opmode_buffer)
  72. self.checkErrorCode(e, "simxReadProximitySensor error")
  73.  
  74. return detectionState, np.linalg.norm(detectedPoint), detectedSurfaceNormalVector
  75.  
  76. @property
  77. def error(self):
  78. return self._error
  79.  
  80. def pid(self, feedback, curr_tm=None):
  81. error = self._error = self._target - feedback
  82.  
  83. if curr_tm is None:
  84. curr_tm = self._get_time()
  85. dt = curr_tm - self._prev_tm
  86.  
  87. alpha = 0
  88.  
  89. alpha -= self.Kp * error
  90.  
  91. alpha -= self.Ki * (error * dt)
  92.  
  93. if dt > 0:
  94. alpha -= self.Kd * ((feedback - self._prev_feedback) / float(dt))
  95.  
  96. self._prev_tm = curr_tm
  97. self._prev_feedback = feedback
  98.  
  99. return alpha
  100.  
  101. def getPidCorrection(self, dist):
  102. errorThree = self.distDefault - round(dist, 3)
  103. error = errorThree
  104.  
  105. correction = self.pid(error)
  106.  
  107. return errorThree, correction
  108.  
  109. def startSimulation(self):
  110. vrep.simxReadProximitySensor(self.clientId, self.LeftSensorHandle, vrep.simx_opmode_streaming)
  111. vrep.simxReadProximitySensor(self.clientId, self.TopSensorHandle, vrep.simx_opmode_streaming)
  112.  
  113. while vrep.simxGetConnectionId(self.clientId) != -1:
  114. isDetected, distance, vector = self.getSensorData(self.LeftSensorHandle)
  115. isDetectedTop, distance2, vector2 = self.getSensorData(self.TopSensorHandle)
  116.  
  117. if isDetectedTop:
  118. errorDistanse, pidCorrect = self.getPidCorrection(distance2)
  119. self.setMotorSpeed(self.speed - pidCorrect, self.speed + pidCorrect)
  120. print("distance: {} {} | pid: {} | error: {}".format(distance, vector, pidCorrect, errorDistanse))
  121. else:
  122. self.setMotorSpeed(self.speed + 0.05, self.speed - 0.05)
  123.  
  124. time.sleep(self.timeSleep)
  125. vrep.simxFinish(self.clientId)
  126.  
  127.  
  128. if __name__ == '__main__':
  129. robot = Robot()
  130. robot.startSimulation()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement