Files
pyrobolearn/examples/robots/rrbot.py
T

151 lines
5.2 KiB
Python

#!/usr/bin/env python
"""Load the RRBot robotic platform.
"""
from itertools import count
from pyrobolearn.simulators import BulletSim
from pyrobolearn.worlds import BasicWorld
from pyrobolearn.robots import RRBot
# Create simulator
sim = BulletSim()
# create world
world = BasicWorld(sim)
# load robot
robot = RRBot(sim)
# robot.addJointSlider()
print("Robot: {}".format(robot))
print("Total number of joints: {}".format(robot.getNumberOfJoints()))
print("Joint names: {}".format(robot.getJointNames(range(robot.getNumberOfJoints()))))
print("Link names: {}".format(robot.getLinkNames(range(robot.getNumberOfJoints()))))
print("Number of DoFs: {}".format(robot.getNumberOfDoFs()))
print("Robot actuated joint ids: {}".format(robot.joints))
print("Actuated joint names: {}".format(robot.getJointNames()))
print("Actuated link names: {}".format(robot.getLinkNames()))
print("Current joint positions: {}".format(robot.getJointPositions()))
print("Number of end-effectors: {}".format(robot.getNumberOfEndEffectors()))
print("End-effector names: {}".format(robot.getEndEffectorNames()))
print("Robot base position: {}".format(robot.getBasePosition()))
robot.changeTransparency()
visuals = robot.sim.getVisualShapeData(robot.id)
visuals = {visual[1]: visual[3] for visual in visuals}
# robot.drawLinkCoMs()
robot.drawLinkFrames()
# robot.drawBoundingBoxes()
for i in robot.joints:
print("Link {}".format(i))
state = robot.sim.getLinkState(robot.id, i)
info = robot.sim.getJointInfo(robot.id, i)
print("\t CoM world position: {}".format(state[0]))
print("\t Local inertial frame position: {}".format(state[2]))
print("\t World link frame position: {}".format(state[4]))
print("\t CoM world orientation: {}".format(state[1]))
print("\t Local inertial frame orientation: {}".format(state[3]))
print("\t World link frame orientation: {}".format(state[5]))
print("\t Joint axis: {}".format(info[-4]))
if i in visuals:
print("\t Dimensions: {}".format(visuals[i]))
for _ in count():
world.step(sleep_dt=1./240)
raw_input('press enter')
print("Inertia matrix: {}".format(np.array(sim.calculateMassMatrix(robot.id, [0.,0.,0.,0.,0.,0.]))))
linkId = 2
com_frame = robot.getLinkStates(linkId)[2]
q = robot.getJointPositions()
print(com_frame)
# com_frame = [0.,0.,0.]
print("Jacobian matrix: {}".format(np.vstack((sim.calculateJacobian(robot.id, linkId, com_frame, q.tolist(), [0.,0.], [0.,0.])))))
Jlin = robot.calculateJacobian(linkId+1, localPosition=(0.,0.,0.))[:3]
print("Jacobian matrix: {}".format(Jlin))
robot.drawVelocityManipulabilityEllipsoid(linkId+1, Jlin)
Jlin = robot.calculateJacobian(linkId)[:3]
robot.drawVelocityManipulabilityEllipsoid(linkId, Jlin, color=(1,0,0,0.7))
cnt = 0
for i in count():
if i%240 == 0:
if cnt < 3:
Jlin = robot.calculateJacobian(linkId + 1, localPosition=(0., 0., 0.))[:3]
robot.drawVelocityManipulabilityEllipsoid(linkId + 1, Jlin)
cnt += 1
world.step(sleep_dt=1./240)
# robot.setJointTorques()
raw_input('press enter')
print(robot.getLinkNames())
force = np.array([1., 0., 0.])
pos = np.array([0., 0., 0.])
sim.applyExternalForce(robot.id, 1, force, pos, flags=p.LINK_FRAME) # link_frame = 1
slider = sim.addUserDebugParameter('force', -1000., 1000., 0)
dq, ddq = [0., 0.], [0., 0.]
J = sim.calculateJacobian(robot.id, 1, [0.,0.,0.], [0.,0.], dq, ddq)
print(np.array(J[0]))
a = robot.getJointPositions()
# print(robot.getJacobianMatrix(1, np.array([0.,0.]))) # TODO: need to convert numpy array to list
linkId = 2
com_frame = robot.getLinkStates(linkId)[2]
xdes = np.array(robot.getLinkWorldPositions(linkId))
K = 100*np.identity(3)
D = 2*np.sqrt(K) # critically damped
D = 3*D # manually increase damping
# run simulator
for i in range(10000):
joint_states = p.getJointStates(robot.id, robot.joints)
# print("joint state: ", joint_states)
q = [joint_state[0] for joint_state in joint_states]
dq = [joint_state[1] for joint_state in joint_states]
# q = robot.getJointPositions().tolist()
# dq = robot.getJointVelocities().tolist()
x = np.array(robot.getLinkWorldPositions(linkId))
dx = np.array(robot.getLinkWorldLinearVelocities(linkId))
tau = robot.calculateID(q, dq, ddq) # Coriolis, centrifugal and gravity compensation
Jlin = np.array(sim.calculateJacobian(robot.id, linkId, com_frame, q, [0.,0.], ddq)[0])
F = K.dot(xdes - x) - D.dot(dx) # compute cartesian forces
# print("force: {}".format(F))
tau += Jlin.T.dot(F) # cartesian PD with gravity compensation
# tau += Jlin.T.dot(- D.dot(dx)) # active compliance
# tau = Jlin.T.dot(F)
# compute manipulability measure :math:`w = sqrt(det(JJ^T))`
Jlin = Jlin[[0, 2], :]
w = np.sqrt(np.linalg.det(Jlin.dot(Jlin.T)))
# print("manipulability: {}".format(w))
# Impedance/Torque control
sim.setJointMotorControlArray(robot.id, robot.joint_indices, sim.TORQUE_CONTROL, forces=tau)
force = sim.readUserDebugParameter(slider)
if force > 0:
force = np.array([0., 0., 1.])
else:
force = np.array([0., 0., 0.])
sim.applyExternalForce(robot.id, linkId, force, pos, flags=p.LINK_FRAME) # p.LINK_FRAME = 1
# robot.updateJointSlider()
world.step(sleep_dt=1./240)