def computeCollisions(self, q, vq=None): res = pio.computeCollisions(self.rmodel, self.rdata, self.gmodel, self.gdata, q, False) pio.computeDistances(self.rmodel, self.rdata, self.gmodel, self.gdata, q) pio.computeJointJacobians(self.rmodel, self.rdata, q) if not (vq is None): pio.forwardKinematics(self.rmodel, self.rdata, q, vq, 0 * vq) return res
def collisionDistance(q): '''Return the minimal distance between robot and environment. ''' threshold = 1e-2 pin.updateGeometryPlacements(robot.model,robot.data,robot.collision_model,robot.collision_data,q) if pin.computeCollisions(robot.collision_model,robot.collision_data,False): return -threshold idx = pin.computeDistances(robot.collision_model,robot.collision_data) return pin.computeDistance(robot.collision_model,robot.collision_data,idx).min_distance - threshold
def testGeomConfig(x_rot, y_rot, collisionPair): test_config = robot_config.copy() test_config[7] = x_rot test_config[8] = y_rot pio.computeDistances(rmodel,rdata,gmodel,gdata, test_config) pio.computeCollisions(rmodel, rdata, gmodel, gdata, test_config, True) # Get distance and collision results from collision data collisions_dist = gdata.distanceResults collisions = gdata.collisionResults is_col = collisions[collisionPair].isCollision() # pair 0 is between the leg and the body dist = collisions_dist[collisionPair].min_distance p1 = collisions_dist[collisionPair].getNearestPoint1() p2 = collisions_dist[collisionPair].getNearestPoint2() # get nearest points on the segments return is_col, dist, [p1,p2]
def update_quantities(robot: jiminy.Model, position: np.ndarray, velocity: Optional[np.ndarray] = None, acceleration: Optional[np.ndarray] = None, update_physics: bool = True, update_com: bool = True, update_energy: bool = True, update_jacobian: bool = False, update_collisions: bool = True, use_theoretical_model: bool = True) -> None: """Compute all quantities using position, velocity and acceleration configurations. Run multiple algorithms to compute all quantities which can be known with the model position, velocity and acceleration. This includes: - body spatial transforms, - body spatial velocities, - body spatial drifts, - body transform acceleration, - body transform jacobians, - center-of-mass position, - center-of-mass velocity, - center-of-mass drift, - center-of-mass acceleration, - center-of-mass jacobian, - articular inertia matrix, - non-linear effects (Coriolis + gravity) - collisions and distances .. note:: Computation results are stored internally in the robot, and can be retrieved with associated getters. .. warning:: This function modifies the internal robot data. .. warning:: It does not called overloaded pinocchio methods provided by `jiminy_py.core` but the original pinocchio methods instead. As a result, it does not take into account the rotor inertias / armatures. One is responsible of calling the appropriate methods manually instead of this one if necessary. This behavior is expected to change in the future. :param robot: Jiminy robot. :param position: Robot position vector. :param velocity: Robot velocity vector. :param acceleration: Robot acceleration vector. :param update_physics: Whether or not to compute the non-linear effects and internal/external forces. Optional: True by default. :param update_com: Whether or not to compute the COM of the robot AND each link individually. The global COM is the first index. Optional: False by default. :param update_energy: Whether or not to compute the energy of the robot. Optional: False by default :param update_jacobian: Whether or not to compute the jacobians. Optional: False by default. :param use_theoretical_model: Whether the state corresponds to the theoretical model when updating and fetching the robot's state. Optional: True by default. """ if use_theoretical_model: pnc_model = robot.pinocchio_model_th pnc_data = robot.pinocchio_data_th else: pnc_model = robot.pinocchio_model pnc_data = robot.pinocchio_data if (update_physics and update_com and update_energy and update_jacobian and velocity is not None and acceleration is None): pin.computeAllTerms(pnc_model, pnc_data, position, velocity) else: if velocity is None: pin.forwardKinematics(pnc_model, pnc_data, position) elif acceleration is None: pin.forwardKinematics(pnc_model, pnc_data, position, velocity) else: pin.forwardKinematics( pnc_model, pnc_data, position, velocity, acceleration) if update_com: if velocity is None: pin.centerOfMass(pnc_model, pnc_data, position) elif acceleration is None: pin.centerOfMass(pnc_model, pnc_data, position, velocity) else: pin.centerOfMass( pnc_model, pnc_data, position, velocity, acceleration) if update_jacobian: if update_com: pin.jacobianCenterOfMass(pnc_model, pnc_data) pin.computeJointJacobians(pnc_model, pnc_data) if update_physics: if velocity is not None: pin.nonLinearEffects(pnc_model, pnc_data, position, velocity) pin.crba(pnc_model, pnc_data, position) if update_energy: if velocity is not None: pin.computeKineticEnergy(pnc_model, pnc_data) pin.computePotentialEnergy(pnc_model, pnc_data) pin.updateFramePlacements(pnc_model, pnc_data) if update_collisions: pin.updateGeometryPlacements( pnc_model, pnc_data, robot.collision_model, robot.collision_data) pin.computeCollisions( robot.collision_model, robot.collision_data, stop_at_first_collision=False) pin.computeDistances(robot.collision_model, robot.collision_data) for dist_req in robot.collision_data.distanceResults: if np.linalg.norm(dist_req.normal) < 1e-6: pin.computeDistances( robot.collision_model, robot.collision_data) break