Python pybullet.getContactPoints() Examples
The following are 22
code examples of pybullet.getContactPoints().
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example.
You may also want to check out all available functions/classes of the module
pybullet
, or try the search function
.
Example #1
Source File: simulation.py From onshape-to-robot with MIT License | 6 votes |
def contactPoints(self): """Gets all contact points and forces Returns: list -- list of entries (link_name, position in m, force in N) """ result = [] contacts = p.getContactPoints(bodyA=self.floor, bodyB=self.robot) for contact in contacts: link_index = contact[4] if link_index >= 0: link_name = (p.getJointInfo(self.robot, link_index)[12]).decode() else: link_name = 'base' result.append((link_name, contact[6], contact[9])) return result
Example #2
Source File: util.py From assistive-gym with MIT License | 6 votes |
def ik_random_restarts(self, body, target_joint, target_pos, target_orient, world_creation, robot_arm_joint_indices, robot_lower_limits, robot_upper_limits, ik_indices=range(29, 29+7), max_iterations=1000, max_ik_random_restarts=50, random_restart_threshold=0.01, half_range=False, step_sim=False, check_env_collisions=False): orient_orig = target_orient best_ik_joints = None best_ik_distance = 0 for r in range(max_ik_random_restarts): target_joint_positions = self.ik(body, target_joint, target_pos, target_orient, ik_indices=ik_indices, max_iterations=max_iterations, half_range=half_range) world_creation.setup_robot_joints(body, robot_arm_joint_indices, robot_lower_limits, robot_upper_limits, randomize_joint_positions=False, default_positions=np.array(target_joint_positions), tool=None) if step_sim: for _ in range(5): p.stepSimulation(physicsClientId=self.id) if len(p.getContactPoints(bodyA=body, bodyB=body, physicsClientId=self.id)) > 0 and orient_orig is not None: # The robot's arm is in contact with itself. Continually randomize end effector orientation until a solution is found target_orient = p.getQuaternionFromEuler(p.getEulerFromQuaternion(orient_orig, physicsClientId=self.id) + np.deg2rad(self.np_random.uniform(-45, 45, size=3)), physicsClientId=self.id) if check_env_collisions: for _ in range(25): p.stepSimulation(physicsClientId=self.id) gripper_pos, gripper_orient = p.getLinkState(body, target_joint, computeForwardKinematics=True, physicsClientId=self.id)[:2] if np.linalg.norm(target_pos - np.array(gripper_pos)) < random_restart_threshold and (target_orient is None or np.linalg.norm(target_orient - np.array(gripper_orient)) < random_restart_threshold or np.isclose(np.linalg.norm(target_orient - np.array(gripper_orient)), 2, atol=random_restart_threshold)): return True, np.array(target_joint_positions) if best_ik_joints is None or np.linalg.norm(target_pos - np.array(gripper_pos)) < best_ik_distance: best_ik_joints = target_joint_positions best_ik_distance = np.linalg.norm(target_pos - np.array(gripper_pos)) world_creation.setup_robot_joints(body, robot_arm_joint_indices, robot_lower_limits, robot_upper_limits, randomize_joint_positions=False, default_positions=np.array(best_ik_joints), tool=None) return False, np.array(best_ik_joints)
Example #3
Source File: world_creation.py From assistive-gym with MIT License | 6 votes |
def setup_robot_joints(self, robot, robot_joint_indices, lower_limits, upper_limits, randomize_joint_positions=False, default_positions=[1, 1, 0, -1.75, 0, -1.1, -0.5], tool=None): if randomize_joint_positions: # Randomize arm joint positions # Keep trying random joint positions until the end effector is not colliding with anything retry = True while retry: for j, lower_limit, upper_limit in zip(robot_joint_indices, lower_limits, upper_limits): if lower_limit == -1e10: lower_limit = -np.pi upper_limit = np.pi joint_range = upper_limit - lower_limit p.resetJointState(robot, jointIndex=j, targetValue=self.np_random.uniform(lower_limit + joint_range/6.0, upper_limit - joint_range/6.0), targetVelocity=0, physicsClientId=self.id) p.stepSimulation(physicsClientId=self.id) retry = len(p.getContactPoints(bodyA=robot, physicsClientId=self.id)) > 0 if tool is not None: retry = retry or (len(p.getContactPoints(bodyA=tool, physicsClientId=self.id)) > 0) else: default_positions[default_positions < lower_limits] = lower_limits[default_positions < lower_limits] default_positions[default_positions > upper_limits] = upper_limits[default_positions > upper_limits] for i, j in enumerate(robot_joint_indices): p.resetJointState(robot, jointIndex=j, targetValue=default_positions[i], targetVelocity=0, physicsClientId=self.id)
Example #4
Source File: scratch_itch.py From assistive-gym with MIT License | 6 votes |
def get_total_force(self): total_force_on_human = 0 tool_force = 0 tool_force_at_target = 0 target_contact_pos = None for c in p.getContactPoints(bodyA=self.tool, physicsClientId=self.id): tool_force += c[9] for c in p.getContactPoints(bodyA=self.tool, bodyB=self.human, physicsClientId=self.id): total_force_on_human += c[9] linkA = c[3] contact_position = c[6] if linkA in [0, 1]: # Enforce that contact is close to the target location if np.linalg.norm(contact_position - self.target_pos) < 0.025: tool_force_at_target += c[9] target_contact_pos = contact_position for c in p.getContactPoints(bodyA=self.robot, bodyB=self.human, physicsClientId=self.id): total_force_on_human += c[9] return total_force_on_human, tool_force, tool_force_at_target, target_contact_pos
Example #5
Source File: arm_manipulation.py From assistive-gym with MIT License | 6 votes |
def get_total_force(self): tool_left_force = 0 tool_right_force = 0 total_force_on_human = 0 tool_left_force_on_human = 0 tool_right_force_on_human = 0 for c in p.getContactPoints(bodyA=self.robot, physicsClientId=self.id): linkA = c[3] if linkA == (55 if self.robot_type=='pr2' else 24 if self.robot_type=='sawyer' else 31 if self.robot_type=='baxter' else 9 if self.robot_type=='jaco' else 7): tool_right_force += c[9] elif linkA == (78 if self.robot_type=='pr2' else 24 if self.robot_type=='sawyer' else 54 if self.robot_type=='baxter' else 9 if self.robot_type=='jaco' else 7): tool_left_force += c[9] for c in p.getContactPoints(bodyA=self.robot, bodyB=self.human, physicsClientId=self.id): total_force_on_human += c[9] linkA = c[3] linkB = c[4] if linkA == (55 if self.robot_type=='pr2' else 24 if self.robot_type=='sawyer' else 31 if self.robot_type=='baxter' else 9 if self.robot_type=='jaco' else 7): tool_right_force_on_human += c[9] elif linkA == (78 if self.robot_type=='pr2' else 24 if self.robot_type=='sawyer' else 54 if self.robot_type=='baxter' else 9 if self.robot_type=='jaco' else 7): tool_left_force_on_human += c[9] return tool_left_force, tool_right_force, total_force_on_human, tool_left_force_on_human, tool_right_force_on_human
Example #6
Source File: simulation.py From onshape-to-robot with MIT License | 5 votes |
def autoCollisions(self): """Returns the total amount of N in autocollisions (not with ground) Returns: float -- Newtons of collisions not with ground """ total = 0 for k in range(1, p.getNumJoints(self.robot)): contacts = p.getContactPoints(bodyA=k) for contact in contacts: if contact[2] != self.floor: total += contact[9] return total
Example #7
Source File: panda_env.py From pybullet-robot-envs with GNU Lesser General Public License v2.1 | 5 votes |
def check_collision(self, obj_id): # check if there is any collision with an object contact_pts = p.getContactPoints(obj_id, self.robot_id, physicsClientId=self._physics_client_id) # check if the contact is on the fingertip(s) n_fingertips_contact, _ = self.check_contact_fingertips(obj_id) return (len(contact_pts) - n_fingertips_contact) > 0
Example #8
Source File: world_env.py From pybullet-robot-envs with GNU Lesser General Public License v2.1 | 5 votes |
def check_contact(self, body_id, obj_id=None): if obj_id is None: obj_id = self.obj_id pts = p.getContactPoints(obj_id, body_id, physicsClientId=self._physics_client_id) return len(pts) > 0
Example #9
Source File: icub_env_with_hands.py From pybullet-robot-envs with GNU Lesser General Public License v2.1 | 5 votes |
def check_collision(self, obj_id): # check if there is any collision with an object contact_pts = p.getContactPoints(obj_id, self.robot_id, physicsClientId=self._physics_client_id) # check if the contact is on the fingertip(s) n_fingertips_contact, _ = self.check_contact_fingertips(obj_id) return (len(contact_pts) - n_fingertips_contact) > 0
Example #10
Source File: gym_mujoco_xml_env.py From bullet-gym with MIT License | 5 votes |
def contact_list(self): return p.getContactPoints(self.bodies[self.bodyIndex], -1, self.bodyPartIndex, -1)
Example #11
Source File: robot_bases.py From midlevel-reps with MIT License | 5 votes |
def contact_list(self): return p.getContactPoints(self.bodies[self.bodyIndex], -1, self.bodyPartIndex, -1)
Example #12
Source File: robot_bases.py From GtS with MIT License | 5 votes |
def contact_list(self): return p.getContactPoints(self.bodies[self.bodyIndex], -1, self.bodyPartIndex, -1)
Example #13
Source File: condition.py From costar_plan with Apache License 2.0 | 5 votes |
def _check(self, world, state, actor, prev_state=None): ''' Returns true if within tolerance of position or any closer to goal object. ''' # Get position of the object we are grasping. Since we compute a # KDL transform whenever we update the world's state, we can use # that for computing positions and stuff like that. obj = world.getObject(self.goal) T = obj.state.T * self.T dist = (state.T.p - T.p).Norm() arm_v = (prev_state.arm - state.arm) / world.dt #still_moving = np.any(np.abs(state.arm_v) > self.v_tol) still_moving = np.any(np.abs(arm_v) > self.v_tol) dq = quaternion_distance( state.T.M.GetQuaternion(), T.M.GetQuaternion()) # print (self.T.p.Norm()) # print (obj.state.T.p - T.p).Norm() # print T_robot.p, T.p, dist # print "> cond", dist, still_moving, state.arm_v, arm_v ###########Albert temporary code########### points = pb.getContactPoints(actor.robot.handle, obj.handle) if (points != []): return True and (dist > self.pos_tol or still_moving) ########################################### return dist > self.pos_tol or still_moving or dq > self.rot_tol
Example #14
Source File: condition.py From costar_plan with Apache License 2.0 | 5 votes |
def _check(self, world, state, actor, prev_state=None): # Get the pybullet handle for this actor handle = actor.robot.handle # Check for contact points pts = pb.getContactPoints(bodyA=handle, bodyB=self.not_allowed) # If return was empty then we can proceed return len(pts) == 0
Example #15
Source File: kuka_button_gym_env.py From robotics-rl-srl with MIT License | 5 votes |
def _reward(self): gripper_pos = self.getArmPos() distance = np.linalg.norm(self.button_pos - gripper_pos, 2) # print(distance) contact_points = p.getContactPoints(self.button_uid, self._kuka.kuka_uid, BUTTON_LINK_IDX) reward = int(len(contact_points) > 0) self.n_contacts += reward contact_with_table = len(p.getContactPoints(self.table_uid, self._kuka.kuka_uid)) > 0 if distance > self._max_distance or contact_with_table: reward = -1 self.n_steps_outside += 1 else: self.n_steps_outside = 0 if contact_with_table or self.n_contacts >= N_CONTACTS_BEFORE_TERMINATION \ or self.n_steps_outside >= N_STEPS_OUTSIDE_SAFETY_SPHERE: self.terminated = True if self._shape_reward: if self._is_discrete: return -distance else: # Button pushed if self.terminated and reward > 0: return 50 # out of bounds elif self.terminated and reward < 0: return -250 # anything else else: return -distance return reward
Example #16
Source File: feeding.py From assistive-gym with MIT License | 5 votes |
def get_food_rewards(self): # Check all food particles to see if they have left the spoon or entered the person's mouth # Give the robot a reward or penalty depending on food particle status food_reward = 0 food_hit_human_reward = 0 food_mouth_velocities = [] foods_to_remove = [] for f in self.foods: food_pos, food_orient = p.getBasePositionAndOrientation(f, physicsClientId=self.id) distance_to_mouth = np.linalg.norm(self.target_pos - food_pos) if distance_to_mouth < 0.02: # Delete particle and give robot a reward food_reward += 20 self.task_success += 1 food_velocity = np.linalg.norm(p.getBaseVelocity(f, physicsClientId=self.id)[0]) food_mouth_velocities.append(food_velocity) foods_to_remove.append(f) p.resetBasePositionAndOrientation(f, self.np_random.uniform(1000, 2000, size=3), [0, 0, 0, 1], physicsClientId=self.id) continue elif food_pos[-1] < 0.5 or len(p.getContactPoints(bodyA=f, bodyB=self.table, physicsClientId=self.id)) > 0 or len(p.getContactPoints(bodyA=f, bodyB=self.bowl, physicsClientId=self.id)) > 0: # Delete particle and give robot a penalty for spilling food food_reward -= 5 foods_to_remove.append(f) continue if len(p.getContactPoints(bodyA=f, bodyB=self.human, physicsClientId=self.id)) > 0 and f not in self.foods_hit_person: # Record that this food particle just hit the person, so that we can penalize the robot self.foods_hit_person.append(f) food_hit_human_reward -= 1 self.foods = [f for f in self.foods if f not in foods_to_remove] return food_reward, food_mouth_velocities, food_hit_human_reward
Example #17
Source File: feeding.py From assistive-gym with MIT License | 5 votes |
def get_total_force(self): robot_force_on_human = 0 spoon_force_on_human = 0 for c in p.getContactPoints(bodyA=self.robot, bodyB=self.human, physicsClientId=self.id): robot_force_on_human += c[9] for c in p.getContactPoints(bodyA=self.spoon, bodyB=self.human, physicsClientId=self.id): spoon_force_on_human += c[9] return robot_force_on_human, spoon_force_on_human
Example #18
Source File: drinking.py From assistive-gym with MIT License | 5 votes |
def get_total_force(self): robot_force_on_human = 0 cup_force_on_human = 0 for c in p.getContactPoints(bodyA=self.robot, bodyB=self.human, physicsClientId=self.id): robot_force_on_human += c[9] for c in p.getContactPoints(bodyA=self.cup, bodyB=self.human, physicsClientId=self.id): cup_force_on_human += c[9] return robot_force_on_human, cup_force_on_human
Example #19
Source File: bed_bathing.py From assistive-gym with MIT License | 4 votes |
def get_total_force(self): total_force = 0 tool_force = 0 tool_force_on_human = 0 total_force_on_human = 0 new_contact_points = 0 for c in p.getContactPoints(bodyA=self.tool, physicsClientId=self.id): total_force += c[9] tool_force += c[9] for c in p.getContactPoints(bodyA=self.robot, physicsClientId=self.id): bodyB = c[2] if bodyB != self.tool: total_force += c[9] for c in p.getContactPoints(bodyA=self.robot, bodyB=self.human, physicsClientId=self.id): total_force_on_human += c[9] for c in p.getContactPoints(bodyA=self.tool, bodyB=self.human, physicsClientId=self.id): linkA = c[3] linkB = c[4] contact_position = np.array(c[6]) total_force_on_human += c[9] if linkA in [1]: tool_force_on_human += c[9] # Contact with human upperarm, forearm, hand if linkB < 0 or linkB > p.getNumJoints(self.human, physicsClientId=self.id): continue indices_to_delete = [] for i, (target_pos_world, target) in enumerate(zip(self.targets_pos_upperarm_world, self.targets_upperarm)): if np.linalg.norm(contact_position - target_pos_world) < 0.025: # The robot made contact with a point on the person's arm new_contact_points += 1 self.task_success += 1 p.resetBasePositionAndOrientation(target, [1000, 1000, 1000], [0, 0, 0, 1], physicsClientId=self.id) indices_to_delete.append(i) self.targets_pos_on_upperarm = [t for i, t in enumerate(self.targets_pos_on_upperarm) if i not in indices_to_delete] self.targets_upperarm = [t for i, t in enumerate(self.targets_upperarm) if i not in indices_to_delete] self.targets_pos_upperarm_world = [t for i, t in enumerate(self.targets_pos_upperarm_world) if i not in indices_to_delete] indices_to_delete = [] for i, (target_pos_world, target) in enumerate(zip(self.targets_pos_forearm_world, self.targets_forearm)): if np.linalg.norm(contact_position - target_pos_world) < 0.025: # The robot made contact with a point on the person's arm new_contact_points += 1 self.task_success += 1 p.resetBasePositionAndOrientation(target, [1000, 1000, 1000], [0, 0, 0, 1], physicsClientId=self.id) indices_to_delete.append(i) self.targets_pos_on_forearm = [t for i, t in enumerate(self.targets_pos_on_forearm) if i not in indices_to_delete] self.targets_forearm = [t for i, t in enumerate(self.targets_forearm) if i not in indices_to_delete] self.targets_pos_forearm_world = [t for i, t in enumerate(self.targets_pos_forearm_world) if i not in indices_to_delete] return total_force, tool_force, tool_force_on_human, total_force_on_human, new_contact_points
Example #20
Source File: robot_virtual.py From qibullet with Apache License 2.0 | 4 votes |
def isSelfColliding(self, link_names): """ Specifies if a link is colliding with the rest of the virtual robot. Parameters: link_names - String or list of string containing the names of the links to be checked for self collision. WARNING: only the links with corresponding meshes should be used, otherwise the link cannot self collide Returns: self_colliding - Boolean, if True at least one of the links is self colliding """ try: if type(link_names) is str: assert link_names in self.link_dict.keys() names = [link_names] else: assert set(link_names).issubset(self.link_dict.keys()) names = list(link_names) for name in names: contact_tuple = pybullet.getContactPoints( bodyA=self.robot_model, bodyB=self.robot_model, linkIndexA=self.link_dict[name].getIndex(), physicsClientId=self.physics_client) contact_tuple += pybullet.getContactPoints( bodyA=self.robot_model, bodyB=self.robot_model, linkIndexB=self.link_dict[name].getIndex(), physicsClientId=self.physics_client) if len(contact_tuple) != 0: return True return False except AssertionError: raise pybullet.error( "Unauthorized link checking for self collisions")
Example #21
Source File: drinking.py From assistive-gym with MIT License | 4 votes |
def get_water_rewards(self): # Check all water particles to see if they have entered the person's mouth or have left the scene # Delete such particles and give the robot a reward or penalty depending on particle status cup_pos, cup_orient = p.getBasePositionAndOrientation(self.cup, physicsClientId=self.id) cup_pos, cup_orient = p.multiplyTransforms(cup_pos, cup_orient, [0, 0.06, 0], p.getQuaternionFromEuler([np.pi/2.0, 0, 0], physicsClientId=self.id), physicsClientId=self.id) top_center_pos, _ = p.multiplyTransforms(cup_pos, cup_orient, self.cup_top_center_offset, [0, 0, 0, 1], physicsClientId=self.id) bottom_center_pos, _ = p.multiplyTransforms(cup_pos, cup_orient, self.cup_bottom_center_offset, [0, 0, 0, 1], physicsClientId=self.id) top_center_pos = np.array(top_center_pos) bottom_center_pos = np.array(bottom_center_pos) if self.cup_top_center is not None: p.resetBasePositionAndOrientation(self.cup_top_center, top_center_pos, [0, 0, 0, 1], physicsClientId=self.id) p.resetBasePositionAndOrientation(self.cup_bottom_center, bottom_center_pos, [0, 0, 0, 1], physicsClientId=self.id) p.resetBasePositionAndOrientation(self.cup_cylinder, cup_pos, cup_orient, physicsClientId=self.id) water_reward = 0 water_hit_human_reward = 0 water_mouth_velocities = [] waters_to_remove = [] for w in self.waters: water_pos, water_orient = p.getBasePositionAndOrientation(w, physicsClientId=self.id) if not self.util.points_in_cylinder(top_center_pos, bottom_center_pos, 0.05, np.array(water_pos)): distance_to_mouth = np.linalg.norm(self.target_pos - water_pos) if distance_to_mouth < 0.03: # hard # if distance_to_mouth < 0.05: # easy # Delete particle and give robot a reward water_reward += 10 self.task_success += 1 p.resetBasePositionAndOrientation(w, self.np_random.uniform(1000, 2000, size=3), [0, 0, 0, 1], physicsClientId=self.id) water_velocity = np.linalg.norm(p.getBaseVelocity(w, physicsClientId=self.id)[0]) water_mouth_velocities.append(water_velocity) waters_to_remove.append(w) continue elif water_pos[-1] < 0.5: # Delete particle and give robot a penalty for spilling water water_reward -= 1 waters_to_remove.append(w) continue if len(p.getContactPoints(bodyA=w, bodyB=self.human, physicsClientId=self.id)) > 0: # Record that this water particle just hit the person, so that we can penalize the robot waters_to_remove.append(w) water_hit_human_reward -= 1 self.waters = [w for w in self.waters if w not in waters_to_remove] return water_reward, water_mouth_velocities, water_hit_human_reward
Example #22
Source File: panda_env.py From pybullet-robot-envs with GNU Lesser General Public License v2.1 | 4 votes |
def check_contact_fingertips(self, obj_id): # check if there is any contact on the internal part of the fingers, to control if they are correctly touching an object idx_fingers = [self._joint_name_to_ids['panda_finger_joint1'], self._joint_name_to_ids['panda_finger_joint2']] p0 = p.getContactPoints(obj_id, self.robot_id, linkIndexB=idx_fingers[0], physicsClientId=self._physics_client_id) p1 = p.getContactPoints(obj_id, self.robot_id, linkIndexB=idx_fingers[1], physicsClientId=self._physics_client_id) p0_contact = 0 p0_f = [0] if len(p0) > 0: # get cartesian position of the finger link frame in world coordinates w_pos_f0 = p.getLinkState(self.robot_id, idx_fingers[0], physicsClientId=self._physics_client_id)[4:6] f0_pos_w = p.invertTransform(w_pos_f0[0], w_pos_f0[1]) for pp in p0: # compute relative position of the contact point wrt the finger link frame f0_pos_pp = p.multiplyTransforms(f0_pos_w[0], f0_pos_w[1], pp[6], f0_pos_w[1]) # check if contact in the internal part of finger if f0_pos_pp[0][1] <= 0.001 and f0_pos_pp[0][2] < 0.055 and pp[8] > -0.005: p0_contact += 1 p0_f.append(pp[9]) p0_f_mean = np.mean(p0_f) p1_contact = 0 p1_f = [0] if len(p1) > 0: w_pos_f1 = p.getLinkState(self.robot_id, idx_fingers[1], physicsClientId=self._physics_client_id)[4:6] f1_pos_w = p.invertTransform(w_pos_f1[0], w_pos_f1[1]) for pp in p1: # compute relative position of the contact point wrt the finger link frame f1_pos_pp = p.multiplyTransforms(f1_pos_w[0], f1_pos_w[1], pp[6], f1_pos_w[1]) # check if contact in the internal part of finger if f1_pos_pp[0][1] >= -0.001 and f1_pos_pp[0][2] < 0.055 and pp[8] > -0.005: p1_contact += 1 p1_f.append(pp[9]) p1_f_mean = np.mean(p0_f) return (p0_contact > 0) + (p1_contact > 0), (p0_f_mean, p1_f_mean)