Simple Maze – Cartesian Space
What you will learn
How to use several of pitasc’s most common skills, including linear movements, a guarded approach and different ways of using the slide skill.
Requirements
Hardware
Item |
Details |
|---|---|
3D printer |
For the parts listed in Provided 3D models |
Fasteners |
Screws ISO 4762 – M3x35 and nuts ISO 4032 – M3 (or comparable), 7 pcs each |
Robot |
Any pitasc-compatible robot with a force/torque sensor. This example uses a UR5. |
Table (recommended) |
Welding table with 50 × 50 hole pattern, hole diameter 16 mm |
Positioning bolts |
16 mm, 4 – 6 pcs |
Supported grippers
Used in this example. Requires either:
F-WSG-FMFsensor fingers, or2 × custom fingers (model 05 below)
Supported out of the box.
Supported out of the box.
Supported out of the box.
Provided 3D models
All models are hosted on GrabCAD and available as .step, .stl and
.sldprt.
Setup
Step 1 - Print the parts
Print the lower and upper section, the cylindrical peg carrier and the cylindrical peg. Also as per your gripper, print the custom gripper fingers to hold the cylindrical peg.
Warning
Tolerances were tested on a Bambu Lab X1 - adjust if needed..
Step 2 - Assemble the station
Assemble the lower and upper section using the screws and nuts.
Assembly of the 3D-printed parts with bottom stand and top layer with maze.
Step 3 - Clamp everything to the table
Clamp the assembled station and the workpiece carrier to your table.
Example configuration, allowing easy access to the cylindrical peg and a minimal distance between the cylindrical peg holder and the simple maze.
Step 4 - Position the cylindrical peg on the peg holder
Place the cylindrical peg in the peg holder as shown below.
Cylindrical peg in the peg holder.
Step 5 - Mount the gripper fingers
If needed, screw the custom 3D-printed gripper fingers onto the Weiss WSG 50-110 gripper.
How to solve this parkour task
The task is to solve a maze using a cylindrical peg, as shown in the video below.
Try it yourself
You can try to solve the task on your own by selecting appropriate skills and teaching the required poses.
Add your solution to:
.../pitasc_realworld_tutorial_p0/apps/parkour_0.xml
Then start RViz and the frame editor with:
roslaunch pitasc_realworld_tutorial_p0 bringup_ur5_parkour_0.launch
Increasing levels of assistance
The following sections progressively reveal more detail. Stop reading at whichever level still leaves you with an interesting challenge.
Level 1 – Rough steps - the three high-level actions
Level 2 – Example steps in detail - every individual motion, no code
Level 3 – Tips on using skills - which pitasc skills to reach for
Level 4 – Step-by-step sample solution - the full annotated XML
Level 1 – Rough steps
The sample solution comprises the following rough steps. Each step is implemented as a skill sequence containing several skills:
Pick up the rod from the holder.
Solve the maze by moving from the start position to the end position.
Place the rod back into the holder.
Level 2 – Example steps in detail
Note
For safety reasons, each step begins and ends with the robot moving to its home pose by linear movement.
Step 1 - Pick up the rod from the holder
Move to home pose (position controlled)
Move to a position above the workpiece carrier (position controlled)
Lower the end effector to the gripping position (position controlled)
Grip the rod (command to your specific gripper)
Push down on the rod to ensure a safe grip (force controlled - only needed for flat gripper fingers)
Move upwards (position controlled)
Move to home pose (position controlled)
Step 2 - Solve the maze
Move to home pose with the rod between the gripper fingers (position controlled)
Move linearly to a hover position above the maze (position controlled)
Move to the approach position close to the maze start point (position controlled)
Establish contact between rod and maze (force controlled)
Slide the rod through the maze while keeping a constant force of at least 5 N between rod and maze (force controlled).
Warning
Write this skill without hardcoding the maze waypoints.
Note
The example code moves the robot so that the rod reaches the goal position by utilising rod–wall interactions. The walls along the slot can be used to guide the rod using force feedback.
Once the rod reaches the goal position, the skill ends and the end effector moves upwards.
Move to home pose (position controlled)
Step 3 - Place the rod back into the holder
Move to home pose (position controlled)
Move to a position above the workpiece carrier (position controlled)
Place the rod in the holder by pushing down with a force of e.g. 10 N (force controlled)
Open the gripper to release the rod (command to your specific gripper)
Move back up to the pre-grasp pose (position controlled)
Move to home pose (position controlled)
Level 3 – Tips on using skills
Goal |
Recommended approach |
|---|---|
Establish contact with the surroundings |
Use a guarded approach. |
Predictable linear motion with minimal jerk |
Use |
Follow a wall under constant force |
Use the pitasc slide skill. |
End a skill on a condition |
Attach monitors to react to a force threshold or travelled distance. |
Danger
Always tare the force/torque sensor before running force-controlled skills.
Tip
Add user confirms between skills. This makes it much easier to spot problems and abort execution safely while developing.
Level 4 – Step-by-step sample solution
Preamble
The preamble handles all imports of relevant models and configures the application environment, in which every component (robots, sensors, actuators) must be specified in order to be controlled later on. It also defines a boolean parameter to activate or deactivate all user confirmations at once.
0_preamble.xml
<?xml version="1.0" encoding="UTF-8"?>
<pitasc>
<models>
<!-- Include relevant models -->
<include package="pitasc_library" file="models/pitasc.xml"/>
<include package="pitasc_library" file="models/skills.xml"/>
<include package="pitasc_library" file="utils/gravity_compensator.xml"/>
<include package="pitasc_library" file="universal_robots/ur.xml"/>
<include package="pitasc_library" file="weiss_robotics/kms40.xml"/>
<include package="pitasc_weiss_wsg" file="models/wsg50.xml"/>
<include package="pitasc_library" file="frame_editor/frame_editor.xml"/>
<include package="pitasc_library" file="frame_editor/frame_editor.xml" />
<include package="package_door_opening" file="scripts/script_temp_frame_offset.xml"/>
<include package="pitasc_webinar" file="skills/skill_solve_puzzle.xml"/>
</models>
<!-- Create an application -->
<clone prototype="project">
<!-- Parameter to ignore all user confirms. If set to True, all user
confirms are skipped. If set to False, all user confirms are active -->
<type id="ignore_uc" prototype="bool_parameter">
<meta>
<member id="description">Parameter to ignore user confirms (uc) and fire the (success) event immediately</member>
<member id="visibility">basic</member>
</meta>
<data>False</data>
</type>
<!-- Configure pitasc (set update rate, relevant for controllers)-->
<member id="configuration">
<clone id="configuration" prototype="default_configuration">
<member id="update_rate">250</member>
</clone>
</member>
<!-- Set up environment -->
<member id="environment">
<!-- Specify and configure robot -->
<clone id="ur5" prototype="robot_ur5">
<member id="robot_driver.max_velocity">0.4</member>
<member id="robot_driver.max_acceleration">1.0</member>
<member id="robot_driver.topic_in">ur5/joint_states</member>
<member id="robot_driver.topic_out">ur5/joint_vel</member>
<member id="robot_driver.urdf_key">ur5/robot_description</member>
<member id="urdf_prefix">ur5_</member>
<member id="components">
<!-- Specify used force/torque sensor (in this example the robots internal f/t-sensor) -->
<clone id="force_sensor" prototype="weiss_kms40">
<member id="wrench_topic">/wrench_compensated</member>
<member id="namespace">/ur5</member>
</clone>
<!-- Specify used gripper -->
<clone id="gripper" prototype="weiss_wsg50">
<member id="namespace">/ur5/wsg50</member>
</clone>
</member>
</clone>
</member>
<member id="applications">
<!-- ######################################### -->
<!-- -->
<!-- Skill sequences need to be specified here -->
<!-- -->
<!-- ######################################### -->
</member>
</clone>
</pitasc>
Homing sequence for the gripper
This short skill sequence commands the WSG 50-110 gripper to run its homing sequence.
0.1_home_gripper.xml
<!-- Skill sequence for homing the gripper -->
<clone id="Home gripper" prototype="skill_sequence">
<!-- Specify which robot will be controlled -->
<member id="robot" reference_id="environment.ur5"/>
<!-- The skills that will be carried out by the specified robot -->
<member id="skills">
<!-- Wait, until transformations are available -->
<clone prototype="skill_wait_for_transform">
<member id="frame">ur5_weiss_wsg50_grip_center</member>
<member id="parent_frame">world</member>
</clone>
<clone prototype="skill_user_confirm">
<member id="title">Confirmation required</member>
<member id="text">Home gripper?</member>
<member id="ignore" reference_id="ignore_uc" />
</clone>
<!-- Home the gripper.
Caution: the gripper will open completely -->
<clone prototype="weiss_wsg50_homing" />
</member>
</clone>
Step 1: Pick up the rod from the holder
Picks up the rod from its holder and carries it to the robot’s home pose.
1_pick_rod.xml
<!-- Skill sequence for picking up the Rod from the workpiece holder -->
<clone id="Pick up rod" prototype="skill_sequence">
<!-- Specify which robot will be controlled -->
<member id="robot" reference_id="environment.ur5"/>
<!-- The skills that will be carried out by the specified robot -->
<member id="skills">
<!-- Wait, until transformations are available -->
<clone prototype="skill_wait_for_transform">
<member id="frame">ur5_weiss_wsg50_grip_center</member>
<member id="parent_frame">world</member>
</clone>
<!-- Home the gripper fingers -->
<clone prototype="weiss_wsg50_homing" />
<clone prototype="skill_user_confirm">
<member id="title">Confirmation required</member>
<member id="text">Start picking up rod?</member>
<member id="ignore" reference_id="ignore_uc"/>
</clone>
<!-- Move end effector to home position -->
<clone prototype="skill_lin">
<member id="tool_frame">ur5_weiss_wsg50_grip_center</member>
<member id="target_frame">home_pos</member>
</clone>
<!-- Move end effector to a safe pickup pose above the holder by defining target offest to the pickup_pose -->
<clone prototype="skill_lin">
<member id="tool_frame">ur5_weiss_wsg50_grip_center</member>
<member id="target_frame">rod_pick_up</member>
<member id="axes">x, y, z, a, b, c</member>
<member id="target_offsets">0.0, 0.0, -0.05, 0.0, 0.0, 0.0</member>
</clone>
<!-- Lower the end effector to the grasp position -->
<clone prototype="skill_lin">
<member id="tool_frame">ur5_weiss_wsg50_grip_center</member>
<member id="target_frame">rod_pick_up</member>
</clone>
<clone prototype="skill_user_confirm">
<member id="title">Confirmation required</member>
<member id="text">Grip rod</member>
<member id="ignore" reference_id="ignore_uc"/>
</clone>
<!-- Set the force to grip the object with the fingers -->
<clone prototype="skill_idle_duration">
<member id="duration">0.1</member>
<member id="scripts">
<clone prototype="script_weiss_wsg50_set_force" >
<member id="force">70.0</member>
</clone>
</member>
</clone>
<!-- Perform gripping with set speed and position -->
<clone prototype="weiss_wsg50_grip">
<member id="position">0.0</member>
<member id="speed">50.0</member>
</clone>
<!-- Move the end effector back up to a position with a relative
offset in vertical direction -->
<clone prototype="skill_lin">
<member id="tool_frame">ur5_weiss_wsg50_grip_center</member>
<member id="target_frame">rod_pick_up</member>
<member id="axes">x, y, z, a, b, c</member>
<member id="target_offsets">0.0, 0.0, -0.05, 0.0, 0.0, 0.0</member>
</clone>
<!-- Return to home pose while holding the rod -->
<clone prototype="skill_lin">
<member id="tool_frame">ur5_weiss_wsg50_grip_center</member>
<member id="target_frame">home_pos</member>
</clone>
</member>
</clone>
Step 2: Solve the maze
Guides the rod through the maze from the start pose to the end goal.
2.1_solve_puzzle.xml - invocation
<?xml version="1.0" encoding="UTF-8"?>
<pitasc>
<!-- This is a custom defined skill to solve the maze puzzle -->
<models>
<include package="pitasc_library" file="skills/skill_lin.xml" />
<include package="pitasc_library" file="skills/skill_wait_for_transform.xml" />
<include package="pitasc_library" file="utils/gravity_compensator.xml" />
<include package="pitasc_weiss_wsg" file="models/wsg50.xml" />
<include package="pitasc_library" file="skills/skill_guarded_approach.xml"/>
<!-- Refer to pitasc_docs How-to's to define a custom skill to understand in detail the parameters defined here -->
<type id="skill_solve_puzzle" prototype="skill_sequence">
<meta>
<member id="description"></member>
<member id="categories"></member>
</meta>
<data>
<type id="tool_frame" prototype="frame">
<meta>
<member id="description">Name of the tool frame of robot.</member>
</meta>
</type>
<type id="control_frame" prototype="frame">
<meta>
<member id="description">Name of the frame in which to move.</member>
</meta>
<data>
table
</data>
</type>
<member id="skills">
<!-- This skill works by executing a guarded slide in four directions [right, bottom, left, up] -->
<!-- The rod slides on each direction and if it encounters a force (meaning it ran into a "wall") it goes back to the start pose and moves in a differnt direction -->
<!-- This ensures that the the maze is solved in any orientation without hardcoding values -->
<!-- the skill follows the walls of the maze till it reaches the goal position -->
<clone id="slideoperation_x_positive" prototype="skill_guarded_slide">
<member id="control_frame" reference_id="control_frame"/>
<member id="tool_frame" reference_id="tool_frame"/>
<member id="max_forces">5.0</member>
<member id="operator">absolute_greater</member>
<member id="move_axes">x</member>
<member id="velocities">0.007</member>
<member id="force_axes">z</member>
<member id="target_forces">-5.0</member>
</clone>
<clone prototype="skill_push_duration">
<member id="tool_frame" reference_id="tool_frame"/>
<member id="force_frame" reference_id="control_frame"/>
<member id="duration">1.0</member>
<member id="target_forces">0.0, 0.0, 0.0</member>
<member id="axes">x, y, z</member>
</clone>
<clone id="slideoperation_y_negative" prototype="skill_guarded_slide">
<member id="control_frame" reference_id="control_frame"/>
<member id="tool_frame" reference_id="tool_frame"/>
<member id="max_forces">5.0</member>
<member id="operator">absolute_greater</member>
<member id="move_axes">y</member>
<member id="velocities">-0.007</member>
<member id="force_axes">z</member>
<member id="target_forces">-5.0</member>
</clone>
<clone prototype="skill_push_duration">
<member id="tool_frame" reference_id="tool_frame"/>
<member id="force_frame" reference_id="control_frame"/>
<member id="duration">1.0</member>
<member id="target_forces">0.0, 0.0, 0.0</member>
<member id="axes">x, y, z</member>
</clone>
<clone id="slideoperation_x_negative" prototype="skill_guarded_slide">
<member id="control_frame" reference_id="control_frame"/>
<member id="tool_frame" reference_id="tool_frame"/>
<member id="max_forces">5.0</member>
<member id="operator">absolute_greater</member>
<member id="move_axes">x</member>
<member id="velocities">-0.007</member>
<member id="force_axes">z</member>
<member id="target_forces">-5.0</member>
</clone>
<clone prototype="skill_push_duration">
<member id="tool_frame" reference_id="tool_frame"/>
<member id="force_frame" reference_id="control_frame"/>
<member id="duration">1.0</member>
<member id="target_forces">0.0, 0.0, 0.0</member>
<member id="axes">x, y, z</member>
</clone>
<clone id="slideoperation_y_positive" prototype="skill_guarded_slide">
<member id="control_frame" reference_id="control_frame"/>
<member id="tool_frame" reference_id="tool_frame"/>
<member id="max_forces">5.0</member>
<member id="operator">absolute_greater</member>
<member id="move_axes">y</member>
<member id="velocities">0.007</member>
<member id="force_axes">z</member>
<member id="target_forces">-5.0</member>
</clone>
<clone prototype="skill_push_duration">
<member id="tool_frame" reference_id="tool_frame"/>
<member id="force_frame" reference_id="control_frame"/>
<member id="duration">1.0</member>
<member id="target_forces">0.0, 0.0, 0.0</member>
<member id="axes">x, y, z</member>
<member id="transitions">
<clone prototype="transition">
<member id="event">succeeded</member>
<member id="target">slideoperation_x_positive</member>
</clone>
</member>
</clone>
</member>
</data>
</type>
</models>
</pitasc>
2.0_solve_maze_skill.xml - definition of skill_solve_puzzle
<!-- Skill sequence for solving the maze task with the picked up rod -->
<clone id="Solve maze task" prototype="skill_sequence">
<!-- Specify which robot will be controlled -->
<member id="robot" reference_id="environment.ur5"/>
<!-- The skills that will be carried out by the specified robot -->
<member id="skills">
<!-- Name the skill sequence by providing an I.D -->
<clone id="slide puzzle" prototype="skill_sequence">
<member id="skills">
<!-- Wait, until transformations are available -->
<clone prototype="skill_wait_for_transform">
<member id="frame">ur5_weiss_wsg50_grip_center</member>
<member id="parent_frame">world</member>
</clone>
<!-- Move end effector gripper center to home position -->
<clone prototype="skill_lin_time_optimal_ruckig">
<member id="tool_frame">ur5_weiss_wsg50_grip_center</member>
<member id="target_frame">home_pos</member>
</clone>
<clone prototype="skill_user_confirm">
<member id="title">Confirmation required</member>
<member id="text">Home position reached?</member>
<member id="ignore" reference_id="ignore_uc"/>
</clone>
<!-- Move end effector gripper center to safe hover position -->
<clone prototype="skill_lin_time_optimal_ruckig">
<member id="tool_frame">ur5_weiss_wsg50_grip_center</member>
<member id="target_frame">puzzle_hover_pos</member>
</clone>
<clone prototype="skill_user_confirm">
<member id="title">Confirmation required</member>
<member id="text">Before approach pos</member>
<member id="ignore" reference_id="ignore_uc"/>
</clone>
<!-- Move end effector gripper center to close hover position above the start point-->
<clone prototype="skill_lin_time_optimal_ruckig">
<member id="tool_frame">ur5_weiss_wsg50_grip_center</member>
<member id="target_frame">puzzle_approach_pos</member>
</clone>
<clone prototype="skill_user_confirm">
<member id="title">Confirmation required</member>
<member id="text">Before guarded approach</member>
<member id="ignore" reference_id="ignore_uc"/>
</clone>
<!-- Skill to tare the force torque sensor -->
<clone prototype="skill_tare_gravity_compensator">
<member id="duration">0.1</member>
<member id="namespace">ur5</member>
</clone>
<!-- Move rod in z axis until physical contact has been established -->
<clone prototype="skill_guarded_approach">
<member id="max_forces">5.0</member>
<member id="tool_frame">ur5_weiss_wsg50_grip_center</member>
<member id="control_frame">ur5_weiss_wsg50_grip_center</member>
<member id="axes">z</member>
<member id="velocities">0.005</member>
</clone>
<!-- Push the rod down with a force of 5 N -->
<clone id="place rod" prototype="skill_push_duration">
<member id="tool_frame">ur5_weiss_wsg50_grip_center</member>
<member id="force_frame">ur5_weiss_wsg50_grip_center</member>
<member id="duration">1.0</member>
<member id="target_forces">0.0, 0.0, 5.0</member>
<member id="axes">x, y, z</member>
</clone>
<!-- Align the frame level_1_contact with the frame ur5_weiss_wsg50_grip_center -->
<clone prototype="frame_editor_align">
<member id="frame">level_1_contact</member>
<member id="source">ur5_weiss_wsg50_grip_center</member>
<member id="axes">x,y,z,a,b,c</member>
</clone>
<clone prototype="skill_user_confirm">
<member id="title">Confirmation required</member>
<member id="text">Is the frame aligned?</member>
<member id="ignore" reference_id="ignore_uc"/>
</clone>
<!-- use the defined and imported skill "skill_solve_puzzle" and setup monitors -->
<!-- The skill is defined in a separate file : note the import file name in the preamble has to be adjusted according to the skill file name -->
<clone prototype="skill_solve_puzzle">
<!-- Set the unset tool_frame defined in skill_solve_puzzle -->
<member id="tool_frame">ur5_weiss_wsg50_grip_center</member>
<!-- Set the unset control_frame defined in skill_solve_puzzle -->
<member id="control_frame">table</member>
<!-- setup monitors to monitor if the ur5_weiss_wsg50_grip_center frame deviates from level_1_contact frame by 10cms -->
<member id="monitors">
<clone prototype="monitor_distance">
<member id="event">succeeded</member>
<member id="reference_frame">level_1_contact</member>
<member id="frame">ur5_weiss_wsg50_grip_center</member>
<member id="coordinates">z</member>
<member id="distances">0.010</member>
<member id="operator">absolute_greater_equal</member>
</clone>
</member>
</clone>
<clone prototype="skill_idle_duration">
<member id="duration">1.5</member>
</clone>
<!-- Move the end effector back up to a position with a relative offset to the frame ur5_weiss_wsg50_grip_center in vertical direction -->
<clone prototype="skill_relative_lin">
<member id="tool_frame">ur5_weiss_wsg50_grip_center</member>
<member id="axes">x,y,z,a,b,c</member>
<member id="target_offsets">0.0, 0.0,-0.05,0.0,0.0,0.0</member>
</clone>
<!-- Return to home pose -->
<clone prototype="skill_lin_time_optimal_ruckig">
<member id="tool_frame">ur5_weiss_wsg50_grip_center</member>
<member id="target_frame">home_pos</member>
</clone>
</member>
</clone>
</member>
</clone>
Step 3: Place the rod back into the holder
Places the rod back into its holder and returns the robot to its home pose.
3_place_rod.xml
<!-- Skill sequence for placing the Rod back in the workpiece holder -->
<clone id="Place rod" prototype="skill_sequence">
<!-- Specify which robot will be controlled -->
<member id="robot" reference_id="environment.ur5"/>
<!-- The skills that will be carried out by the specified robot -->
<member id="skills">
<!-- Wait, until transformations are available -->
<clone prototype="skill_wait_for_transform">
<member id="frame">ur5_weiss_wsg50_grip_center</member>
<member id="parent_frame">world</member>
</clone>
<!-- Skill to tare the force torque sensor -->
<clone prototype="skill_tare_gravity_compensator">
<member id="duration">0.1</member>
<member id="namespace">ur5</member>
</clone>
<clone prototype="skill_user_confirm">
<member id="title">Confirmation required</member>
<member id="text">Start placing rod?</member>
<member id="ignore" reference_id="ignore_uc"/>
</clone>
<!-- Move end effector to home position -->
<clone prototype="skill_lin">
<member id="tool_frame">ur5_weiss_wsg50_grip_center</member>
<member id="target_frame">home_pos</member>
</clone>
<!-- Move end effector to a safe pose above the holder by defining target offsets to the pickup_pose -->
<clone id="place_rod_hover" prototype="skill_lin">
<member id="tool_frame">ur5_weiss_wsg50_grip_center</member>
<member id="target_frame">rod_pick_up</member>
<member id="axes">x, y, z, a, b, c</member>
<member id="target_offsets">-0.003, 0.0, -0.035, 0.0, 0.0, 0.0</member>
</clone>
<clone prototype="skill_user_confirm">
<member id="title">Confirmation required</member>
<member id="text">Insert rod</member>
<member id="ignore" reference_id="ignore_uc"/>
</clone>
<!-- Push the rod vertically down for a target duration and force -->
<clone id="place rod" prototype="skill_push_duration">
<member id="tool_frame">ur5_weiss_wsg50_grip_center</member>
<member id="force_frame">ur5_weiss_wsg50_grip_center</member>
<member id="duration">2.0</member>
<member id="target_forces">0.0, 0.0, 10.0</member>
<member id="axes">x, y, z</member>
</clone>
<!-- Open gripper to release the rod -->
<clone id="release rod" prototype="weiss_wsg50_release">
<member id="position">110.0</member>
<member id="speed">50.0</member>
</clone>
<!-- Move the end effector back up to a position with a relative
offset in vertical direction -->
<clone prototype="skill_lin">
<member id="tool_frame">ur5_weiss_wsg50_grip_center</member>
<member id="target_frame">rod_pick_up</member>
<member id="axes">x, y, z, a, b, c</member>
<member id="target_offsets">0.0, 0.0, -0.05, 0.0, 0.0, 0.0</member>
</clone>
<!-- Return to home pose -->
<clone prototype="skill_lin">
<member id="tool_frame">ur5_weiss_wsg50_grip_center</member>
<member id="target_frame">home_pos</member>
</clone>
</member>
</clone>
Complete sample solution
For completeness, the full application is shown below. It includes all previously described steps, from homing the gripper to placing the rod back in the workpiece carrier.
4_complete_application.xml - full application
1<?xml version="1.0" encoding="UTF-8"?>
2<!-- This example application shows the usage of a skill sequence. Please provide the following tf frames: target1, target2, target3, tool (e.g. by loading the frames.yaml file in the FrameEditor)-->
3<pitasc>
4 <models>
5 <include package="pitasc_library" file="models/pitasc.xml"/>
6 <include package="pitasc_library" file="models/skills.xml"/>
7 <include package="pitasc_library" file="utils/gravity_compensator.xml"/>
8 <include package="pitasc_library" file="universal_robots/ur.xml"/>
9 <include package="pitasc_library" file="weiss_robotics/kms40.xml"/>
10 <include package="pitasc_weiss_wsg" file="models/wsg50.xml"/>
11 <include package="pitasc_library" file="frame_editor/frame_editor.xml" />
12 <include package="package_door_opening" file="scripts/script_temp_frame_offset.xml"/>
13 <!-- Adapt the package and sill file's name to use the skill -->
14 <include package="pitasc_webinar" file="skills/skill_solve_puzzle.xml"/>
15
16 </models>
17
18 <!-- Create an application -->
19 <clone prototype="project">
20 <member id="configuration">
21 <clone id="configuration" prototype="default_configuration">
22 <member id="update_rate">250</member>
23 </clone>
24 </member>
25 <member id="environment">
26 <clone id="ur5" prototype="robot_ur5">
27 <member id="robot_driver.max_velocity">0.4</member>
28 <member id="robot_driver.max_acceleration">1.0</member>
29 <member id="robot_driver.topic_in">ur5/joint_states</member>
30 <member id="robot_driver.topic_out">ur5/joint_vel</member>
31 <member id="robot_driver.urdf_key">ur5/robot_description</member>
32 <member id="urdf_prefix">ur5_</member>
33 <member id="components">
34 <clone id="force_sensor" prototype="weiss_kms40">
35 <member id="wrench_topic">/wrench_compensated</member>
36 <member id="namespace">/ur5</member>
37 </clone>
38 <clone id="gripper" prototype="weiss_wsg50">
39 <member id="namespace">/ur5/wsg50</member>
40 </clone>
41
42 </member>
43 </clone>
44 </member>
45 <member id="applications">
46
47 <clone id="Home gripper" prototype="skill_sequence">
48 <member id="robot" reference_id="environment.ur5"/>
49 <member id="skills">
50 <!-- <clone prototype="wait"/> -->
51
52 <clone prototype="skill_wait_for_transform">
53 <member id="frame">ur5_weiss_wsg50_grip_center</member>
54 <member id="parent_frame">world</member>
55 </clone>
56
57 <clone prototype="weiss_wsg50_homing" />
58 </member>
59 </clone>
60
61 <clone id="Pick up rod" prototype="skill_sequence">
62 <member id="robot" reference_id="environment.ur5"/>
63 <member id="skills">
64
65 <clone prototype="skill_wait_for_transform">
66 <member id="frame">ur5_weiss_wsg50_grip_center</member>
67 <member id="parent_frame">world</member>
68 </clone>
69
70 <clone prototype="weiss_wsg50_homing" />
71
72 <clone prototype="skill_user_confirm">
73 <member id="title">Confirmation required</member>
74 <member id="text">Start picking up rod?</member>
75 <member id="ignore">True</member>
76 </clone>
77
78 <clone prototype="skill_lin">
79 <member id="tool_frame">ur5_weiss_wsg50_grip_center</member>
80 <member id="target_frame">home_pos</member>
81 </clone>
82
83 <clone prototype="skill_lin">
84 <member id="tool_frame">ur5_weiss_wsg50_grip_center</member>
85 <member id="target_frame">rod_pick_up</member>
86 <member id="axes">x, y, z, a, b, c</member>
87 <member id="target_offsets">0.0, 0.0, -0.05, 0.0, 0.0, 0.0</member>
88 </clone>
89
90 <clone prototype="skill_lin">
91 <member id="tool_frame">ur5_weiss_wsg50_grip_center</member>
92 <member id="target_frame">rod_pick_up</member>
93 </clone>
94
95 <clone prototype="skill_user_confirm">
96 <member id="title">Confirmation required</member>
97 <member id="text">Grip rod</member>
98 <member id="ignore">True</member>
99 </clone>
100
101 <clone prototype="skill_idle_duration">
102 <member id="duration">0.1</member>
103 <member id="scripts">
104 <clone prototype="script_weiss_wsg50_set_force" >
105 <member id="force">70.0</member>
106 </clone>
107 </member>
108 </clone>
109
110 <clone prototype="weiss_wsg50_grip">
111 <member id="position">0.0</member>
112 <member id="speed">50.0</member>
113 </clone>
114
115 <clone prototype="skill_lin">
116 <member id="tool_frame">ur5_weiss_wsg50_grip_center</member>
117 <member id="target_frame">rod_pick_up</member>
118 <member id="axes">x, y, z, a, b, c</member>
119 <member id="target_offsets">0.0, 0.0, -0.05, 0.0, 0.0, 0.0</member>
120 </clone>
121
122 <clone prototype="skill_lin">
123 <member id="tool_frame">ur5_weiss_wsg50_grip_center</member>
124 <member id="target_frame">home_pos</member>
125 </clone>
126 </member>
127 </clone>
128
129
130 <clone id="Solve maze task" prototype="skill_sequence">
131 <member id="robot" reference_id="environment.ur5"/>
132 <member id="skills">
133 <clone id="slide puzzle" prototype="skill_sequence">
134 <member id="skills">
135
136 <clone prototype="skill_wait_for_transform">
137 <member id="frame">ur5_weiss_wsg50_grip_center</member>
138 <member id="parent_frame">world</member>
139 </clone>
140
141 <clone prototype="skill_lin_time_optimal_ruckig">
142 <member id="tool_frame">ur5_weiss_wsg50_grip_center</member>
143 <member id="target_frame">home_pos</member>
144 </clone>
145
146 <clone prototype="skill_user_confirm">
147 <member id="title">Confirmation required</member>
148 <member id="text">Home position reached?</member>
149 <member id="ignore">True</member>
150 </clone>
151
152 <clone prototype="skill_lin_time_optimal_ruckig">
153 <member id="tool_frame">ur5_weiss_wsg50_grip_center</member>
154 <member id="target_frame">puzzle_hover_pos</member>
155 </clone>
156
157 <clone prototype="skill_user_confirm">
158 <member id="title">Confirmation required</member>
159 <member id="text">Before approach pos</member>
160 <member id="ignore">True</member>
161 </clone>
162
163 <clone prototype="skill_lin_time_optimal_ruckig">
164 <member id="tool_frame">ur5_weiss_wsg50_grip_center</member>
165 <member id="target_frame">puzzle_approach_pos</member>
166 </clone>
167
168 <clone prototype="skill_user_confirm">
169 <member id="title">Confirmation required</member>
170 <member id="text">Before guarded approach</member>
171 <member id="ignore">True</member>
172 </clone>
173
174 <clone prototype="skill_tare_gravity_compensator">
175 <member id="duration">0.1</member>
176 <member id="namespace">ur5</member>
177 </clone>
178
179 <clone prototype="skill_guarded_approach">
180 <member id="max_forces">5.0</member>
181 <member id="tool_frame">ur5_weiss_wsg50_grip_center</member>
182 <member id="control_frame">ur5_weiss_wsg50_grip_center</member>
183 <member id="axes">z</member>
184 <member id="velocities">0.005</member>
185 </clone>
186
187 <clone id="place rod" prototype="skill_push_duration">
188 <member id="tool_frame">ur5_weiss_wsg50_grip_center</member>
189 <member id="force_frame">ur5_weiss_wsg50_grip_center</member>
190 <member id="duration">1.0</member>
191 <member id="target_forces">0.0, 0.0, 5.0</member>
192 <member id="axes">x, y, z</member>
193 </clone>
194
195 <clone prototype="frame_editor_align">
196 <member id="frame">level_1_contact</member>
197 <member id="source">ur5_weiss_wsg50_grip_center</member>
198 <member id="axes">x,y,z,a,b,c</member>
199 </clone>
200
201 <clone prototype="skill_user_confirm">
202 <member id="title">Confirmation required</member>
203 <member id="text">Is the frame aligned?</member>
204 <member id="ignore">True</member>
205 </clone>
206
207 <clone prototype="skill_solve_puzzle">
208 <member id="tool_frame">ur5_weiss_wsg50_grip_center</member>
209 <member id="control_frame">table</member>
210
211 <member id="monitors">
212 <clone prototype="monitor_distance">
213 <member id="event">succeeded</member>
214 <member id="reference_frame">level_1_contact</member>
215 <member id="frame">ur5_weiss_wsg50_grip_center</member>
216 <member id="coordinates">z</member>
217 <member id="distances">0.010</member>
218 <member id="operator">absolute_greater_equal</member>
219 </clone>
220 </member>
221 </clone>
222
223 <clone prototype="skill_guarded_approach">
224 <member id="max_forces">10.0</member>
225 <member id="tool_frame">ur5_weiss_wsg50_grip_center</member>
226 <member id="control_frame">table</member>
227 <member id="axes">z</member>
228 <member id="velocities">-0.005</member>
229 </clone>
230
231 <clone prototype="skill_idle_duration">
232 <member id="duration">1.5</member>
233 </clone>
234
235 <clone prototype="skill_relative_lin">
236 <member id="tool_frame">ur5_weiss_wsg50_grip_center</member>
237 <member id="axes">x,y,z,a,b,c</member>
238 <member id="target_offsets">0.0, 0.0,-0.05,0.0,0.0,0.0</member>
239 </clone>
240
241 <clone prototype="skill_lin_time_optimal_ruckig">
242 <member id="tool_frame">ur5_weiss_wsg50_grip_center</member>
243 <member id="target_frame">home_pos</member>
244 </clone>
245 </member>
246 </clone>
247 </member>
248 </clone>
249
250
251 <clone id="Place rod" prototype="skill_sequence">
252 <member id="robot" reference_id="environment.ur5"/>
253 <member id="skills">
254
255 <clone prototype="skill_wait_for_transform">
256 <member id="frame">ur5_weiss_wsg50_grip_center</member>
257 <member id="parent_frame">world</member>
258 </clone>
259
260 <clone prototype="skill_tare_gravity_compensator">
261 <member id="duration">0.1</member>
262 <member id="namespace">ur5</member>
263 </clone>
264
265 <clone prototype="skill_user_confirm">
266 <member id="title">Confirmation required</member>
267 <member id="text">Start placing rod?</member>
268 <member id="ignore">True</member>
269 </clone>
270
271 <clone prototype="skill_lin">
272 <member id="tool_frame">ur5_weiss_wsg50_grip_center</member>
273 <member id="target_frame">home_pos</member>
274 </clone>
275
276 <clone id="place_rod_hover" prototype="skill_lin">
277 <member id="tool_frame">ur5_weiss_wsg50_grip_center</member>
278 <member id="target_frame">rod_pick_up</member>
279 <member id="axes">x, y, z, a, b, c</member>
280 <member id="target_offsets">-0.003, 0.0, -0.035, 0.0, 0.0, 0.0</member>
281 </clone>
282
283 <clone prototype="skill_user_confirm">
284 <member id="title">Confirmation required</member>
285 <member id="text">Insert rod</member>
286 <member id="ignore">True</member>
287 </clone>
288
289 <clone id="place rod" prototype="skill_push_duration">
290 <member id="tool_frame">ur5_weiss_wsg50_grip_center</member>
291 <member id="force_frame">ur5_weiss_wsg50_grip_center</member>
292 <member id="duration">2.0</member>
293 <member id="target_forces">0.0, 0.0, 10.0</member>
294 <member id="axes">x, y, z</member>
295 </clone>
296
297 <clone id="release rod" prototype="weiss_wsg50_release">
298 <member id="position">110.0</member>
299 <member id="speed">50.0</member>
300 </clone>
301
302 <clone prototype="skill_lin">
303 <member id="tool_frame">ur5_weiss_wsg50_grip_center</member>
304 <member id="target_frame">rod_pick_up</member>
305 <member id="axes">x, y, z, a, b, c</member>
306 <member id="target_offsets">0.0, 0.0, -0.05, 0.0, 0.0, 0.0</member>
307 </clone>
308
309 <clone prototype="skill_lin">
310 <member id="tool_frame">ur5_weiss_wsg50_grip_center</member>
311 <member id="target_frame">home_pos</member>
312 </clone>
313 </member>
314 </clone>
315 </member>
316 </clone>
317</pitasc>




