def set_robot_pose(self, robot, frame): """Moves the robot to a given pose, specified as a frame. Args: robot (:class:`compas_fab.robots.Robot`): Robot instance to move. frame (:class:`Frame`): Target or goal frame. Returns: An instance of :class:`Configuration` found for the given pose. """ assert_robot(robot) # First check if the start state is reachable joints = len(robot.get_configurable_joints()) options = { 'num_joints': joints, 'metric_values': [0.] * joints, } config = self.inverse_kinematics(robot, frame, group=robot.model.attr['index'], options=options)[-1] if not config: raise ValueError('Cannot find a valid config for the given pose') self.set_robot_config(robot, config) return config
def set_robot_config(self, robot, config): """Moves the robot to the specified configuration. Args: robot (:class:`compas_fab.robots.Robot`): Robot instance to move. config (:class:`Configuration` instance): Describes the position of the robot as an instance of :class:`Configuration`. Examples: >>> from compas_fab.robots import * >>> with VrepClient() as client: ... config = Configuration.from_prismatic_and_revolute_values([7.600, -4.500, -5.500], ... to_radians([90, 0, 0, 0, 0, -90])) ... client.set_robot_config(rfl.Robot('A'), config) ... """ assert_robot(robot) if not config: raise ValueError('Unsupported config value') values = config_to_vrep(config, self.scale) self.set_robot_metric(robot.model.attr['index'], [0.0] * len(config.values)) self.run_child_script('moveRobotFK', [], values, ['robot' + robot.name])
def pick_building_member(self, robot, building_member_mesh, pickup_frame, metric_values=None): """Picks up a building member and attaches it to the robot. Args: robot (:class:`compas_fab.robots.Robot`): Robot instance to use for pick up. building_member_mesh (:class:`compas.datastructures.Mesh`): Mesh of the building member that will be attached to the robot. pickup_frame (:class:`Frame`): Pickup frame. metric_values (:obj:`list` of :obj:`float`): List containing one value per configurable joint. Each value ranges from 0 to 1, where 1 indicates the axis/joint is blocked and cannot move during inverse kinematic solving. Returns: int: Object handle (identifier) assigned to the building member. """ assert_robot(robot) joints = len(robot.get_configurable_joints()) if not metric_values: metric_values = [0.1] * joints self.client.set_robot_pose(robot, pickup_frame) return self.add_attached_collision_mesh( building_member_mesh, options={'robot_name': robot.name})
def get_robot_config(self, robot): """Gets the current configuration of the specified robot. Args: robot (:class:`compas_fab.robots.Robot`): Robot instance. Examples: >>> from compas_fab.robots import * >>> with VrepClient() as client: ... config = client.get_robot_config(rfl.Robot('A')) Returns: An instance of :class:`.Configuration`. """ assert_robot(robot) _res, _, config, _, _ = self.run_child_script( 'getRobotState', [robot.model.attr['index']], [], []) return config_from_vrep(config, self.scale)