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()
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 :
Se place au dessus d’un objet avec un certain offset pour éviter la collision
Descend jusqu’à atteindre la hauteur de l’objet
Saisie avec l’outil
Retourne à la position de l’étape 1
Se place au dessus de la position de dépôt avec un certain offset pour éviter la collision
Descend jusqu’à la hauteur de la position
Relâche l’objet avec l’outil
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)