Examples: Action Outil

Cette page explique comment utiliser les outils du Ned

Si vous voulez en savoir plus, vous pouvez regarder PyNiryo - Outils

Important

Dans cette section, il est supposé que vous êtes déjà connecté à un robot calibré. L’instance robot est sauvegarder dans la variable robot

Danger

Si vous utilisez un robot physique, assurez vous que son environnement ne présente aucun obstacle

Contrôle des outils

Equiper l’outil

Afin d’utiliser l’outil, il doit être branché méchaniquement au robot mais aussi connecté d’un point de vue logiciel

Pour ce faire, nous utilisons la fonction update_tool() qui ne prend pas d’argument. Celle-ci vérifie la connexion moteur et règle le nouvel outil !

La ligne pour équiper un nouvel outil est

robot.tool.update_tool()

Note

Pour les sections Grasping et Releasing cette commande doit être ajoutée à vos codes ! Si vous souhaitez utiliser un outil en particulier, vous devez enregistrer le ToolID que vous utilisez dans une variable appelée tool_used

Grasping

Pour saisir avec n’importe quel outil, vous pouvez utiliser la fonction grasp_with_tool(). Cette action correspond à :

  • Ferme le préhenseur pour les préhenseurs

  • Aspire l’air pour la pompe à vide

  • Active pour l’électroaimant

La ligne pour saisir est

robot.tool.grasp_with_tool()

Pour saisir un objet en spécifiant l’outil

if tool_used in [ToolID.GRIPPER_1, ToolID.GRIPPER_2, ToolID.GRIPPER_3]:
    robot.tool.close_gripper(speed=500)
elif tool_used == ToolID.ELECTROMAGNET_1:
    pin_electromagnet = PinID.XXX
    robot.tool.setup_electromagnet(pin_electromagnet)
    robot.tool.activate_electromagnet(pin_electromagnet)
elif tool_used == ToolID.VACUUM_PUMP_1:
    robot.tool.pull_air_vacuum_pump()

Releasing

Pour relaĉher avec n’importe quel outil, vous pouvez utiliser la fonction release_with_tool(). Cette action correspond à:

  • Ouvrir le préhenseur pour les préhenseurs

  • Expulser l’air pour la pompe à vide

  • Désactiver pour l’électroaimant

Pour relâcher un objet en spécifiant les paramètres

if tool_used in [ToolID.GRIPPER_1, ToolID.GRIPPER_2, ToolID.GRIPPER_3]:
    robot.tool.open_gripper(speed=500)
elif tool_used == ToolID.ELECTROMAGNET_1:
    pin_electromagnet = PinID.XXX
    robot.tool.setup_electromagnet(pin_electromagnet)
    robot.tool.deactivate_electromagnet(pin_electromagnet)
elif tool_used == ToolID.VACUUM_PUMP_1:
    robot.tool.push_air_vacuum_pump()

Pick & Place avec les outils

Un Pick & Place est une action qui consiste en : aller à une certaine position pour saisir un objet et ensuite aller à une autre position pour le déposer.

Cette opération se déroule comme ceci :

  1. Se place au dessus d’un objet avec un certain offset pour éviter la collision

  2. Descend jusqu’à atteindre la hauteur de l’objet

  3. Saisie avec l’outil

  4. Retourne à la position de l’étape 1

  5. Se place au dessus de la position de dépôt avec un certain offset pour éviter la collision

  6. Descend jusqu’à la hauteur de la position

  7. Relâche l’objet avec l’outil

  8. Retourne à la position de l’étape 5

Il y a pleins de manières de réaliser un Pick & Place avec PyNiryo2. Les méthodes vous seront présentées du niveau le plus bas au plus haut.

Baseline du code

Par soucis de brièveté, l’ensemble des parties du code, à part celle concernant la fonction Pick & Place, ne seront pas réecrites pour chaque méthode. Il vous faudra donc utiliser le code et y implémenter la fonction de Pick & Place.

# Imports
from pyniryo2 import *

tool_used = ToolID.XXX  # Tool used for picking
robot_ip_address = "x.x.x.x" # Robot address

# The pick pose
pick_pose = PoseObject(
    x=0.25, y=0., z=0.15,
    roll=-0.0, pitch=1.57, yaw=0.0,
)
# The Place pose
place_pose = PoseObject(
    x=0.0, y=-0.25, z=0.1,
    roll=0.0, pitch=1.57, yaw=-1.57)

def pick_n_place_version_x(robot):
    # -- -------------- -- #
    # -- CODE GOES HERE -- #
    # -- -------------- -- #

if __name__ == '__main__':
    # Connect to robot
    client = NiryoRobot(robot_ip_address)
    # Calibrate robot if robot needs calibration
    client.arm.calibrate_auto()
    # Changing tool
    client.arm.update_tool()

    pick_n_place_version_x(client)

    # Releasing connection
    client.end()

Première solution : la plus lourde

Pour cette première fonction, toutes les étapes sont faites à la main, ainsi que le calcul des positions.

Note

Dans cet exemple, l’outil utilisé est un préhenseur. Si vous souhaitez utiliser un outil différent, n’oubliez pas d’adapter les fonctions grasp & release !

def pick_n_place_version_1(robot):
    height_offset = 0.05  # Offset according to Z-Axis to go over pick & place poses
    gripper_speed = 400

    # Going Over Object
    robot.arm.move_pose(pick_pose.x, pick_pose.y, pick_pose.z + height_offset,
                               pick_pose.roll, pick_pose.pitch, pick_pose.yaw)
    # Opening Gripper
    robot.tool.open_gripper(gripper_speed)
    # Going to picking place and closing gripper
    robot.arm.move_pose(pick_pose)
    robot.tool.close_gripper(gripper_speed)

    # Raising
    robot.arm.move_pose(pick_pose.x, pick_pose.y, pick_pose.z + height_offset,
                               pick_pose.roll, pick_pose.pitch, pick_pose.yaw)

    # Going Over Place pose
    robot.arm.move_pose(place_pose.x, place_pose.y, place_pose.z + height_offset,
                               place_pose.roll, place_pose.pitch, place_pose.yaw)
    # Going to Place pose
    robot.arm.move_pose(place_pose)
    # Opening Gripper
    robot.tool.open_gripper(gripper_speed)
    # Raising
    robot.arm.move_pose(place_pose.x, place_pose.y, place_pose.z + height_offset,
                               place_pose.roll, place_pose.pitch, place_pose.yaw)

Seconde solution : utiliser un PoseObject

Pour cette seconde solution, nous utilisons un PoseObject afin de calculer plus facilement la position d’approche.

Note

Pour en apprendre d’avantage à propos de PoseObject, consultez la section dédiée à PoseObject.

def pick_n_place_version_2(robot):
    height_offset = 0.05  # Offset according to Z-Axis to go over pick & place poses

    pick_pose_high = pick_pose.copy_with_offsets(z_offset=height_offset)
    place_pose_high = place_pose.copy_with_offsets(z_offset=height_offset)

    # Going Over Object
    robot.arm.move_pose(pick_pose_high)
    # Opening Gripper
    robot.tool.release_with_tool()
    # Going to picking place and closing gripper
    robot.arm.move_pose(pick_pose)
    robot.tool.grasp_with_tool()
    # Raising
    robot.arm.move_pose(pick_pose_high)

    # Going Over Place pose
    robot.arm.move_pose(place_pose_high)
    # Going to Place pose
    robot.arm.move_pose(place_pose)
    # Opening Gripper
    robot.tool.release_with_tool(gripper_speed)
    # Raising
    robot.arm.move_pose(place_pose_high)

Troisième solution : fonctions Pick from Pose et Place from Pose

Pour ceux ayant déjà pris connaissance de la documentation de l’API, il est possible que vous ayez déjà vu les fonctions dédiées au Pick & Place.

Dans cet exemple, on utilise pick_from_pose() et place_from_pose() afin de séparer notre fonction en deux commandes !

def pick_n_place_version_3(robot):
    # Pick
    robot.pick_place.pick_from_pose(pick_pose)
    # Place
    robot.pick_place.place_from_pose(place_pose)

Quatrième solution : tout en un

Les exemples proposés dans les sections précédentes peuvent être utiles si vous souhaitez qu’une action se produise entre les phases de Pick & Place.

Pour ceux qui souhaiteraient faire tout avec une seule commande, vous pouvez utiliser la fonction pick_and_place()

def pick_n_place_version_4(robot):
    # Pick & Place
    robot.pick_place.pick_and_place(pick_pose, place_pose, dist_smoothing=0.01)