Examples: Tool action
This page shows how to control Ned’s tools.
If you want to see more, you can look at PyNiryo - Tools
Important
In this section, you are already supposed to be connected to a calibrated robot.
The robot instance is saved in the variable robot.
Danger
If you are using the real robot, make sure the environment around it is clear.
Tool control
Equip Tool
In order to use a tool, it should be plugged mechanically to the robot but also connected to the software wise.
To do that, we should use the function
update_tool()
which takes no argument. It will scan motor’s connections and set the new tool!
The line to equip a new tool is:
robot.update_tool()
Grasping
To grasp with any tool, you can use the function
grasp_with_tool(). This action corresponds to:
Close gripper for Grippers
Pull Air for Vacuum Pump
Activate for Electromagnet
The line to grasp is:
robot.grasp_with_tool()
To grasp an object by specifying the tool:
if tool_used in [ToolID.GRIPPER_1, ToolID.GRIPPER_2, ToolID.GRIPPER_3]:
robot.close_gripper(speed=500)
elif tool_used == ToolID.ELECTROMAGNET_1:
pin_electromagnet = PinID.XXX
robot.setup_electromagnet(pin_electromagnet)
robot.activate_electromagnet(pin_electromagnet)
elif tool_used == ToolID.VACUUM_PUMP_1:
robot.pull_air_vacuum_pump()
Releasing
To release with any tool, you can use the function
release_with_tool(). This action corresponds to:
Open gripper for Grippers
Push Air for Vacuum pump
Deactivate for Electromagnet
To release an object by specifying parameters:
if tool_used in [ToolID.GRIPPER_1, ToolID.GRIPPER_2, ToolID.GRIPPER_3]:
robot.open_gripper(speed=500)
elif tool_used == ToolID.ELECTROMAGNET_1:
pin_electromagnet = PinID.XXX
robot.setup_electromagnet(pin_electromagnet)
robot.deactivate_electromagnet(pin_electromagnet)
elif tool_used == ToolID.VACUUM_PUMP_1:
robot.push_air_vacuum_pump()
Pick & Place with tools
A Pick & Place is an action which consists in going to a certain pose in order to pick an object and then, going to another pose to place it.
This operation can be proceed as follows:
Going over the object with a certain offset to avoid collision;
Going down to the object’s height;
Grasping with tool;
Going back to step 1’s pose;
Going over the place pose with a certain offset to avoid collision;
Going down to place’s height;
Releasing the object with tool;
Going back to step 5’s pose.
There are plenty of ways to perform a pick and place with PyNiryo. Methods will be presented from the lowest to highest level.
Code Baseline
For the sake of brevity, every piece of code beside the Pick & Place function will not be rewritten for every method. So that, you will need to use the code and implement the Pick & Place function to it.
# Imports
from pyniryo 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.calibrate_auto()
# Changing tool
client.update_tool()
pick_n_place_version_x(client)
# Releasing connection
client.close_connection()
First Solution: the heaviest
For this first function, every steps are done by hand, as well as poses computing.
Note
In this example, the tool used is a Gripper. If you want to use another tool than a gripper, do not forget to adapt grasp & release functions!
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.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.open_gripper(gripper_speed)
# Going to picking place and closing gripper
robot.move_pose(pick_pose)
robot.close_gripper(gripper_speed)
# Raising
robot.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.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.move_pose(place_pose)
# Opening Gripper
robot.open_gripper(gripper_speed)
# Raising
robot.move_pose(place_pose.x, place_pose.y, place_pose.z + height_offset,
place_pose.roll, place_pose.pitch, place_pose.yaw)
Second Solution: Use of PoseObject
For the second solution, we use a PoseObject in
order to calculate approach poses more easily.
Note
To see more about PoseObject, go look at
PoseObject dedicated section
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.move_pose(pick_pose_high)
# Opening Gripper
robot.release_with_tool()
# Going to picking place and closing gripper
robot.move_pose(pick_pose)
robot.grasp_with_tool()
# Raising
robot.move_pose(pick_pose_high)
# Going Over Place pose
robot.move_pose(place_pose_high)
# Going to Place pose
robot.move_pose(place_pose)
# Opening Gripper
robot.release_with_tool(gripper_speed)
# Raising
robot.move_pose(place_pose_high)
Third Solution: Pick from pose & Place from pose functions
For those who have already seen the API Documentation, you may have seen pick & place dedicated functions!
In this example, we use
pick_from_pose() and
place_from_pose() in order
to split our function in only 2 commands!
def pick_n_place_version_3(robot):
# Pick
robot.pick_from_pose(pick_pose)
# Place
robot.place_from_pose(place_pose)
Fourth Solution: All in one
The example exposed in the previous section could be useful if you want to do an action between the pick & the place phases.
For those who want to do everything in one command, you can use
the pick_and_place() function!
def pick_n_place_version_4(robot):
# Pick & Place
robot.pick_and_place(pick_pose, place_pose)