mirror of
https://github.com/PotentiaRobotics/engine-software.git
synced 2025-04-16 02:00:16 -04:00
237 lines
8.7 KiB
Python
237 lines
8.7 KiB
Python
import time
|
|
from shapely.geometry.polygon import Polygon
|
|
from shapely.geometry.point import Point
|
|
from controller import Robot, Supervisor, Display
|
|
|
|
#robot - wb_supervisor_node
|
|
#supervisor - wb_robot
|
|
#so basically supervisor is the robot and robot is the supervisor
|
|
#hooray for poor nomenclature
|
|
supervisor = Supervisor()
|
|
|
|
global TIMESTEP
|
|
TIMESTEP = int(supervisor.getBasicTimeStep())
|
|
startTime = time.time()
|
|
|
|
robotNode = supervisor.getRoot()
|
|
children = robotNode.getField("children")
|
|
robot = children.getMFNode(5)
|
|
|
|
|
|
right_arm_uzi = supervisor.getDevice("RArmUsy")
|
|
left_arm_uzi = supervisor.getDevice("LArmUsy")
|
|
|
|
torso_pitch = supervisor.getDevice("BackMby")
|
|
torso_roll = supervisor.getDevice("BackUbx")
|
|
|
|
right_torso_pitch = supervisor.getDevice("RLegLhy")
|
|
left_torso_pitch = supervisor.getDevice("LLegLhy")
|
|
|
|
|
|
right_ankle_pitch = supervisor.getDevice("RLegUay")
|
|
left_ankle_pitch = supervisor.getDevice("LLegUay")
|
|
|
|
|
|
# print(rightFootSlotPosition,leftFootSlotPosition)
|
|
|
|
|
|
|
|
|
|
# def isCOMInSupportPlane(wantDistance):
|
|
# coordinate1 = ((rightFootSlotPosition[0] + 0.17), (rightFootSlotPosition[2] + 0.05)) #Right Foot, Front Edge
|
|
# coordinate2 = ((rightFootSlotPosition[0] - 0.08), (rightFootSlotPosition[2] + 0.05)) #Right Foot, Back Edge
|
|
|
|
# coordinate3 = ((leftFootSlotPosition[0] - 0.08), (leftFootSlotPosition[2] - 0.05)) #Left Foot, Back Edge
|
|
# coordinate4 = ((leftFootSlotPosition[0] + 0.17), (leftFootSlotPosition[2] - 0.05)) #Left Foot, Front Edge
|
|
|
|
# coordinate5 = ((robot.getCenterOfMass()[0]), (robot.getCenterOfMass()[2]))
|
|
|
|
# supportRectangle = Polygon([coordinate1,coordinate2,coordinate3,coordinate4])
|
|
|
|
# COMPoint = Point(coordinate5)
|
|
|
|
|
|
# if(wantDistance== False):
|
|
# return supportRectangle.contains(COMPoint)
|
|
# elif(wantDistance == True):
|
|
# return supportRectangle.distance(COMPoint)
|
|
|
|
|
|
def distanceToCOMinSupportPlaneCenter():
|
|
|
|
rightFootSlot = robot.getField("rightFootSlot")
|
|
rightFootSlotPosition = rightFootSlot.getMFNode(0).getPosition()
|
|
|
|
|
|
leftFootSlot = robot.getField("leftFootSlot")
|
|
leftFootSlotPosition = leftFootSlot.getMFNode(0).getPosition()
|
|
|
|
|
|
|
|
coordinate1 = ((rightFootSlotPosition[0] + 0.17), (rightFootSlotPosition[2] + 0.05)) #Right Foot, Front Edge
|
|
coordinate2 = ((rightFootSlotPosition[0] - 0.08), (rightFootSlotPosition[2] + 0.05)) #Right Foot, Back Edge
|
|
|
|
coordinate3 = ((leftFootSlotPosition[0] - 0.08), (leftFootSlotPosition[2] - 0.05)) #Left Foot, Back Edge
|
|
coordinate4 = ((leftFootSlotPosition[0] + 0.17), (leftFootSlotPosition[2] - 0.05)) #Left Foot, Front Edge
|
|
|
|
coordinate5 = ((robot.getCenterOfMass()[0]), (robot.getCenterOfMass()[2]))
|
|
|
|
supportRectangle = Polygon([coordinate1,coordinate2,coordinate3,coordinate4])
|
|
|
|
COMPoint = Point(coordinate5)
|
|
|
|
supportRectangleCenter = supportRectangle.centroid
|
|
|
|
return [(COMPoint.x - supportRectangleCenter.x), (COMPoint.y - supportRectangleCenter.y)]
|
|
|
|
|
|
|
|
|
|
# def isCOMInSupportPlaneTight(wantDistance):
|
|
# coordinate1 = ((rightFootSlotPosition[0] + 0.025), (rightFootSlotPosition[2] + 0.05)) #Right Foot, Front Edge
|
|
# coordinate2 = ((rightFootSlotPosition[0] - 0.05), (rightFootSlotPosition[2] + 0.05)) #Right Foot, Back Edge
|
|
|
|
# coordinate3 = ((leftFootSlotPosition[0] - 0.05), (leftFootSlotPosition[2] - 0.05)) #Left Foot, Back Edge
|
|
# coordinate4 = ((leftFootSlotPosition[0] + 0.025), (leftFootSlotPosition[2] - 0.05)) #Left Foot, Front Edge
|
|
|
|
# coordinate5 = ((robot.getCenterOfMass()[0]), (robot.getCenterOfMass()[2]))
|
|
|
|
# supportRectangle = Polygon([coordinate1,coordinate2,coordinate3,coordinate4])
|
|
|
|
# COMPoint = Point(coordinate5)
|
|
|
|
|
|
# if(wantDistance== False):
|
|
# return supportRectangle.contains(COMPoint)
|
|
# elif(wantDistance == True):
|
|
# return supportRectangle.distance(COMPoint)
|
|
|
|
# def isComInSupportPlaneCenter(wantDistance):
|
|
# coordinate1 = ((rightFootSlotPosition[0] + 0.075), (rightFootSlotPosition[2] + 0.05)) #Right Foot, Front Edge
|
|
# coordinate2 = ((rightFootSlotPosition[0] - 0.025), (rightFootSlotPosition[2] + 0.05)) #Right Foot, Back Edge
|
|
|
|
# coordinate3 = ((leftFootSlotPosition[0] - 0.025), (leftFootSlotPosition[2] - 0.05)) #Left Foot, Back Edge
|
|
# coordinate4 = ((leftFootSlotPosition[0] + 0.075), (leftFootSlotPosition[2] - 0.05)) #Left Foot, Front Edge
|
|
|
|
# coordinate5 = ((robot.getCenterOfMass()[0]), (robot.getCenterOfMass()[2]))
|
|
|
|
# supportRectangle = Polygon([coordinate1,coordinate2,coordinate3,coordinate4])
|
|
|
|
# COMPoint = Point(coordinate5)
|
|
|
|
# print("COM is at " + str(COMPoint))
|
|
# print("COM should be at" + str(supportRectangle.centroid))
|
|
|
|
# if (wantDistance == False):
|
|
# if((COMPoint.x > coordinate2[0]) and (COMPoint.x < (coordinate2[0] + 0.03))):
|
|
# return True
|
|
# elif(supportRectangle.centroid != COMPoint):
|
|
# return False
|
|
# elif (wantDistance == True):
|
|
# return ((coordinate2[0] + 0.015) - COMPoint.x)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
shoulderForce = 1.5
|
|
|
|
|
|
# right_shoulder_pitch.setPosition(shoulderForce)
|
|
# left_shoulder_pitch.setPosition(shoulderForce)
|
|
|
|
|
|
|
|
|
|
firstTimeMovingTest = True
|
|
|
|
fallingForward = True
|
|
|
|
# isComInSupportPlaneCenter(False)
|
|
|
|
|
|
while supervisor.step(TIMESTEP) != -1:
|
|
|
|
|
|
if(time.time() - startTime >= 3 and firstTimeMovingTest == True ):
|
|
# right_torso_pitch.setPosition(testForce)
|
|
# left_torso_pitch.setPosition(testForce)
|
|
# forcex = -4550,6000
|
|
forcex = -4500
|
|
robot.addForce([forcex,0,0], False)
|
|
firstTimeMovingTest = False
|
|
|
|
# if(time.time() - startTime >= 6 ):
|
|
# # isComInSupportPlaneCenter()
|
|
# # print(robot.getCenterOfMass())
|
|
# print(isComInSupportPlaneCenter(True))
|
|
|
|
wantActuation = True
|
|
|
|
if( firstTimeMovingTest == False and wantActuation == True):
|
|
|
|
if(robot.getCenterOfMass()[0] > 0):
|
|
fallingForward = True #com is forward so apply backwards motor values (positive motor values)
|
|
elif (robot.getCenterOfMass()[0] < 0):
|
|
fallingForward = False #com is backward so apply forwards motor values (negative motor values)
|
|
|
|
# print(fallingForward)
|
|
|
|
|
|
|
|
# print(error)
|
|
fallModifier = 1
|
|
|
|
if(fallingForward == True):
|
|
fallModifier = 1
|
|
elif(fallingForward == False):
|
|
fallModifier = -1
|
|
|
|
|
|
# print(distanceToCOMinSupportPlaneCenter())
|
|
|
|
#PID CONTROL (ADD DERIVITIVE)
|
|
#CO = CObias + KC * e(t)
|
|
ankleerrorx = distanceToCOMinSupportPlaneCenter()[0] #find error/e(t)
|
|
anklekc = -0.5 * fallModifier
|
|
ankleCObias = 0
|
|
ankleCOx = ankleCObias + (anklekc * ankleerrorx)
|
|
|
|
torsoerrorx = distanceToCOMinSupportPlaneCenter()[0] #find error/e(t)
|
|
torsokc = -1 * fallModifier
|
|
torsoCObias = 0
|
|
torsoCOx = torsoCObias + (torsokc * torsoerrorx)
|
|
|
|
torsoerrory = distanceToCOMinSupportPlaneCenter()[1] #find error/e(t)
|
|
torsokc = -1 * fallModifier
|
|
torsoCObias = 0
|
|
torsoCOy = torsoCObias + (torsokc * torsoerrorx)
|
|
|
|
shouldererrorx = distanceToCOMinSupportPlaneCenter()[0] #find error/e(t)
|
|
shoulderkc = -0.5 * fallModifier
|
|
shoulderCObias = 0
|
|
shoulderCOx = shoulderCObias + (shoulderkc * shouldererrorx)
|
|
|
|
right_ankle_pitch.setPosition(ankleCOx)
|
|
left_ankle_pitch.setPosition(ankleCOx)
|
|
|
|
|
|
torso_pitch.setPosition(torsoCOx)
|
|
torso_roll.setPosition(torsoCOy)
|
|
|
|
right_torso_pitch.setPosition(torsoCOx*-1)
|
|
left_torso_pitch.setPosition(torsoCOx*-1)
|
|
|
|
|
|
right_arm_uzi.setPosition(shoulderCOx)
|
|
left_arm_uzi.setPosition(shoulderCOx)
|
|
|
|
|
|
# print("CO " + str(shoulderCOx))
|
|
|
|
|
|
|
|
|
|
#TODO: make it fix y errors as well as x errors. |