Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
tutorials:demo:fetch_and_place [2019/09/13 11:12] – [Recovering from Failures] amar | tutorials:demo:fetch_and_place [2021/12/13 10:42] (current) – [Tutorial 0: Getting into Emacs] arthur | ||
---|---|---|---|
Line 3: | Line 3: | ||
This tutorial is from the "Demo Tutorials" | This tutorial is from the "Demo Tutorials" | ||
+ | ===== Important Links ===== | ||
+ | * The {{ : | ||
+ | * The [[https:// | ||
+ | * An explanation of the setup and first tutorial is also available with voice explanations (around 1h) as [[https:// | ||
+ | ===== Motivation ===== | ||
+ | |||
+ | The aim of the tutorial is to give an intuition about the complexity of robot mobile manipulation tasks and about the knowledge that is required to execute actions successfully. | ||
+ | |||
+ | The tutorial: | ||
+ | - Gives an intuition of what knowledge does the robot need (and how much knowledge) to execute even a simple fetch and place, e.g., robot needs to answer questions such as "where should I stand?", | ||
+ | - Shows how many different things can go wrong, and teaches writing simple failure handling strategies. | ||
+ | - Teaches how to call existing actions from the CRAM framework, i.e. how to use designators (but not program new ones). | ||
+ | | ||
===== Setting Up ===== | ===== Setting Up ===== | ||
Line 15: | Line 28: | ||
==== Technical Requirements ==== | ==== Technical Requirements ==== | ||
- | The VM image with VirtualBox has been successfully tested | + | * The VM image with VirtualBox has been successfully tested |
- | + | * Some kind of GPU, dedicated or integrated, is required | |
- | The machine on which you will be running the system needs a graphics card, it can be a built in laptop GPU as well. | + | * At least 8GB of excess |
- | + | ||
- | We recommend | + | |
- | (The VM itself needs 4 GB of RAM, so the host machine should have at least 5 GB but 8 GB or more would be optimal.) | + | |
Line 42: | Line 52: | ||
== Windows == | == Windows == | ||
- | Download [[https:// | + | Download [[https:// |
The CPU needs to support virtualization to run a VM on Windows. The virtualization can be enabled in the BIOS. To get into the BIOS settings restart your machine, hit the settings button while booting (try F2, F8 and F10) and go into the CPU settings. There is something like 'Intel Virtual Technology' | The CPU needs to support virtualization to run a VM on Windows. The virtualization can be enabled in the BIOS. To get into the BIOS settings restart your machine, hit the settings button while booting (try F2, F8 and F10) and go into the CPU settings. There is something like 'Intel Virtual Technology' | ||
Line 48: | Line 58: | ||
== MacOS == | == MacOS == | ||
- | Download [[https:// | + | Download [[https:// |
Hint: If the VirtualBox installer fails with The **installation failed** where it encountered an //error that caused the installation to fail.// Go to System Preferences > Security & Privacy. Click the **‘Allow’** button at the bottom and re-run the installer. | Hint: If the VirtualBox installer fails with The **installation failed** where it encountered an //error that caused the installation to fail.// Go to System Preferences > Security & Privacy. Click the **‘Allow’** button at the bottom and re-run the installer. | ||
Line 54: | Line 64: | ||
==== VirtualBox Setup ==== | ==== VirtualBox Setup ==== | ||
- | First of all, download the Virtual Disk Image [[https:// | + | First of all, download the Virtual Disk Image [[https:// |
Then, launch VirtualBox, which you installed in the previous step. | Then, launch VirtualBox, which you installed in the previous step. | ||
Line 68: | Line 78: | ||
* the OS as ' | * the OS as ' | ||
* the version as ' | * the version as ' | ||
- | Choose the VM's memory size (RAM), depending on your machine' | + | Choose the VM's memory size (RAM), depending on your machine' |
- | We suggest 4096 MB (or you can also give it 8192 MB as shown in the screenshot): | + | We recommend to offer as much as possible, when working with unreal. CRAM on it's own can get by with less. |
{{ : | {{ : | ||
Line 77: | Line 87: | ||
=== Settings (optional) === | === Settings (optional) === | ||
- | For better performance | + | If the VM needs to communicate with the host or other machines in the network, especially when running the UnrealEngine on the host machine, VirtualBox needs to allow Bridged Networking for the VM. Choose the newly created VM and hit ' |
- | {{ : | + | |
- | + | ||
- | Everything is set up. The VM can now be started. The Ubuntu 16.04 system should start and automatically log into the only account, with the username and password | + | |
+ | {{ : | ||
+ | For better performance the VM could use some of the CPU's power. Go to ' | ||
+ | {{ : | ||
+ | Everything is set up. The VM can now be started. The Ubuntu 18.04 system should start and automatically log into the only account, with the username and password ' | ||
+ | === Last adjustments === | ||
+ | There are two versions of CRAM available in the VM. By default, the setup is designed to connect and work with a project from the Unreal Engine, for intricate physics simulation. We don't need any of that for the upcoming tutorials, instead we change to the stable, standalone version of CRAM. In the VM, launch a terminal with Ctrl-Alt-T and open up the file '' | ||
+ | < | ||
+ | nano .bashrc | ||
+ | </ | ||
+ | Put a ''#'' | ||
+ | By doing so, the terminal uses a different ROS workspace. Sourcing a ROS workspace enables the terminal session to access everything from that workspace, like loading a programming environment, | ||
===== Understanding the Basics ===== | ===== Understanding the Basics ===== | ||
Line 105: | Line 122: | ||
Alternatively, | Alternatively, | ||
- | ==== Emacs ==== | + | |
+ | ==== ROS ==== | ||
+ | |||
+ | ROS stands for Robot Operating System. | ||
+ | It is software that makes a robot programmer' | ||
+ | For example, it allows programs written in different programming languages to talk to each other. | ||
+ | |||
+ | |||
+ | ==== Lisp ==== | ||
+ | |||
+ | We are going to program our robot in the Lisp programming language. | ||
+ | |||
+ | This language has a convenient command line. | ||
+ | If you are curious why Lisp, [[http:// | ||
+ | |||
+ | |||
+ | |||
+ | ===== Tutorial 0: Getting into Emacs ===== | ||
Emacs is one of the oldest text editors and one of the two most popular text editors in the Linux world. | Emacs is one of the oldest text editors and one of the two most popular text editors in the Linux world. | ||
Line 127: | Line 161: | ||
To see useful key shortcuts for your Emacs IDE, [[http:// | To see useful key shortcuts for your Emacs IDE, [[http:// | ||
+ | {{ : | ||
- | ==== ROS ==== | + | Run and play the orc-battle.lisp program to get a feeling for Emacs. |
- | ROS stands for Robot Operating System. | + | ===== Tutorial 1: Simple Fetch and Place ===== |
- | It is software that makes a robot programmer' | + | |
- | For example, it allows programs written in different programming languages to talk to each other. | + | |
+ | Head to the [[http:// | ||
- | ==== Lisp ==== | + | ===== Tutorial 2 & 3: Failure Handling ===== |
- | We are going to program our robot in the Lisp programming language. | + | When you got the fetch and place plan go to the [[http:// |
- | This language has a convenient command line. | + | ===== Tutorial 4: Alternative Grasping Poses (Advanced) ===== |
- | If you are curious why Lisp, [[http:// | + | |
+ | Picking objects from different angles can be helpful in occluded environments. Go to the [[http:// | ||
+ | |||
+ | |||
+ | |||
+ | < | ||
Line 217: | Line 256: | ||
Pressing and dragging the right mouse button translates the camera. | Pressing and dragging the right mouse button translates the camera. | ||
Pressing and dragging the middle click doesn' | Pressing and dragging the middle click doesn' | ||
+ | |||
+ | If the bullet simulation is stuck call the following function in the REPL to reset the window: | ||
+ | <code lisp> | ||
+ | PP-TUT> (btr-utils: | ||
+ | </ | ||
==== Moving Around ==== | ==== Moving Around ==== | ||
Line 439: | Line 483: | ||
(defparameter *base-pose-near-counter* | (defparameter *base-pose-near-counter* | ||
- | (make-pose "base_footprint" ' | + | (make-pose "map" ' |
</ | </ | ||
Line 493: | Line 537: | ||
(defparameter *base-pose-near-counter* | (defparameter *base-pose-near-counter* | ||
- | (make-pose "base_footprint" ' | + | (make-pose "map" ' |
(defparameter *final-object-destination* | (defparameter *final-object-destination* | ||
Line 552: | Line 596: | ||
After spawning the object, '' | After spawning the object, '' | ||
- | To compile all the contents in this file, press '' | + | First, save the file using the shortcut '' |
- | Now to go back to the REPL to run the code. Press '' | + | Now to go back to the REPL to run the code, press '' |
Now, run '' | Now, run '' | ||
Line 577: | Line 621: | ||
<code lisp> | <code lisp> | ||
PP-TUT> | PP-TUT> | ||
+ | [(PICK-AND-PLACE PERCEIVE) WARN] 1292688669.674: | ||
+ | [(PICK-AND-PLACE PERCEIVE) WARN] 1292688669.674: | ||
+ | [(PICK-AND-PLACE PERCEIVE) WARN] 1292688669.674: | ||
+ | [(PICK-AND-PLACE PERCEIVE) WARN] 1292688669.674: | ||
; Evaluation aborted on #< | ; Evaluation aborted on #< | ||
</ | </ | ||
Line 770: | Line 818: | ||
The robot has failed to grasp again, even though the bottle is well within perception and grasping range. | The robot has failed to grasp again, even though the bottle is well within perception and grasping range. | ||
+ | **Note:** //You might also encounter an error of a different type called "'' | ||
So what went wrong? For this, we have to think back to the definition of our ''? | So what went wrong? For this, we have to think back to the definition of our ''? | ||
Line 792: | Line 841: | ||
- When attempted with all arms and grasps, error out. | - When attempted with all arms and grasps, error out. | ||
- | Let's encapsulate all this in a method called '' | + | Let's encapsulate all this in a method called '' |
<code lisp> | <code lisp> | ||
(defun pick-up-object (? | (defun pick-up-object (? | ||
- | (let* ((? | + | (let* ((? |
- | (?grasp (first ? | + | (?remaining-grasps |
- | (setf ?possible-grasps | + | |
- | + | | |
- | (cpl: | + | |
- | ;; Outer handle failure handling arm change | + | |
- | (handle-failure object-unreachable | + | ;; Outer handle-failure handling arm change |
- | ;; Iner handle-failure handling grasp change | + | |
- | ((handle-failure (or manipulation-pose-unreachable gripper-closed-completely) | + | |
+ | (setf ?grasp (first ? | ||
+ | (setf ? | ||
+ | |||
+ | ;; Inner handle-failure handling grasp change | ||
+ | (handle-failure (or manipulation-pose-unreachable gripper-closed-completely) | ||
;; Try to perform the pick up | ;; Try to perform the pick up | ||
| | ||
Line 810: | Line 864: | ||
| | ||
| | ||
- | ;; When pick-up fails this block gets executed | + | |
- | | + | ;; When pick-up fails this block gets executed |
- | e ?grasp ? | + | |
- | | + | ;; |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | ?grasp ? | + | |
- | | + | (when (first ?remaining-grasps) |
- | | + | (setf ?grasp (first ?remaining-grasps)) |
- | | + | (setf ?remaining-grasps (rest ?remaining-grasps)) |
- | | + | (format t " |
- | | + | |
- | | + | (cpl: |
- | | + | ;; This will get executed when there are no more elements in the |
- | | + | ;; ? |
- | | + | ;; which will be caught by the outer handle-failure |
- | + | (print | |
- | ;; This is the failure management of the outer handle-failure call | + | (cpl:fail ' |
- | ;; It changes the arm that is used to grasp | + | |
- | (print " | + | |
- | (print e) | + | |
- | | + | ;; This is the failure management of the outer handle-failure call |
- | (cpl: | + | ;; It changes the arm that is used to grasp |
- | ;; if the current grasping arm is right set left, else set right | + | |
- | (setf ? | + | ;; (print e) ; |
- | :left | + | ;; Here we use the retry counter we defined. The value is decremented automatically |
- | :right)) | + | |
- | (cpl: | + | ;; if the current grasping arm is right set left, else set right |
- | ;; When all retries are exhausted print the error message. | + | (setf ? |
- | (print "No more arm change retries left : | + | :left |
- | ? | + | :right)) |
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | ? | ||
</ | </ | ||
With this, the '' | With this, the '' | ||
Line 855: | Line 911: | ||
And only upon the failure of all these will the error be bubbled up. The method also returns the grasping arm which it used to pick the object up so that the rest of the code is aware of the arm in which the bottle rests. We have also written appropriate warning statements to be informed about the actions the robot is taking. | And only upon the failure of all these will the error be bubbled up. The method also returns the grasping arm which it used to pick the object up so that the rest of the code is aware of the arm in which the bottle rests. We have also written appropriate warning statements to be informed about the actions the robot is taking. | ||
- | Also let's redefine '' | + | Also let's redefine '' |
<code lisp> | <code lisp> | ||
(defun move-bottle (bottle-spawn-pose) | (defun move-bottle (bottle-spawn-pose) | ||
Line 893: | Line 949: | ||
(park-arm ? | (park-arm ? | ||
</ | </ | ||
- | You should see a result that looks like the one below. | + | Save the file, compile and switch back to the REPL. |
+ | |||
+ | You should see a result that looks like the one below. | ||
+ | [Some messages | ||
<code lisp> | <code lisp> | ||
PP-TUT> (move-bottle ' | PP-TUT> (move-bottle ' | ||
- | [(PICK-PLACE PICK-UP) INFO] 1550504321.279: Opening gripper | + | … |
- | [(PICK-PLACE PICK-UP) INFO] 1550504321.279: Reaching | + | [(PICK-PLACE PICK-UP) INFO] 1621250741.518: Opening gripper |
- | [(GRASP-FAILURE) WARN] Failed to grasp from LEFT-SIDE | + | [(PICK-PLACE PICK-UP) INFO] 1621250741.522: Reaching |
- | [(TRYING-NEW-GRASP) INFO] 1550504800.749: | + | … |
- | [(PICK-PLACE PICK-UP) INFO] 1550504800.789: Opening gripper | + | Grasping failed with RIGHT arm and LEFT-SIDE |
- | [(PICK-PLACE PICK-UP) INFO] 1550504800.789: Reaching | + | Retrying with RIGHT arm and RIGHT-SIDE |
- | [(GRASP-FAILURE) WARN] Failed to grasp from RIGHT-SIDE | + | [(PICK-PLACE PICK-UP) INFO] 1621250742.709: Opening gripper |
- | [(TRYING-NEW-GRASP) INFO] 1550504801.577: Trying to grasp from BACK using RIGHT arm | + | [(PICK-PLACE PICK-UP) INFO] 1621250742.709: Reaching |
- | [(PICK-PLACE PICK-UP) INFO] 1550504801.601: Opening gripper | + | … |
- | [(PICK-PLACE PICK-UP) INFO] 1550504801.602: Reaching | + | Grasping failed with RIGHT arm and RIGHT-SIDE |
- | [(PICK-PLACE PICK-UP) INFO] 1550504801.939: Gripping | + | Retrying with RIGHT arm and FRONT grasp |
- | [(PICK-PLACE PICK-UP) INFO] 1550504801.973: Assert grasp into knowledge base | + | [(PICK-PLACE PICK-UP) INFO] 1621250744.157: Opening gripper |
- | [(PICK-PLACE PICK-UP) INFO] 1550504801.974: Lifting | + | [(PICK-PLACE PICK-UP) INFO] 1621250744.159: |
- | [(PICK-PLACE PLACE) INFO] 1550504802.356: Reaching | + | … |
- | [(PICK-PLACE PLACE) INFO] 1550504802.508: Putting | + | Grasping failed with RIGHT arm and FRONT grasp |
- | [(PICK-PLACE PLACE) INFO] 1550504802.619: Opening gripper | + | Retrying with RIGHT arm and BACK grasp |
- | [(PICK-PLACE PLACE) INFO] 1550504802.655: Retract grasp in knowledge base | + | [(PICK-PLACE PICK-UP) INFO] 1621250745.425: Opening gripper |
- | [(PICK-PLACE PLACE) INFO] 1550504802.660: Retracting | + | [(PICK-PLACE PICK-UP) INFO] 1621250745.430: Reaching |
+ | [(PICK-PLACE PICK-UP) INFO] 1621250746.218: Gripping | ||
+ | [(PICK-PLACE PICK-UP) INFO] 1621250746.273: Assert grasp into knowledge base | ||
+ | [(PICK-PLACE PICK-UP) INFO] 1621250746.277: Lifting | ||
+ | [(PICK-PLACE PLACE) INFO] 1621250746.751: Reaching | ||
+ | [(PICK-PLACE PLACE) INFO] 1621250746.961: Putting | ||
+ | [(PICK-PLACE PLACE) INFO] 1621250747.064: Opening gripper | ||
+ | [(PICK-PLACE PLACE) INFO] 1621250747.142: Retract grasp in knowledge base | ||
+ | [(PICK-PLACE PLACE) INFO] 1621250747.185: Retracting | ||
</ | </ | ||
{{: | {{: | ||
+ | |||
+ | The robot has once again succeeded in grasping the object. | ||
+ | |||
+ | Now let's move the bottle even further away from the robot so that it is out of reach of the right arm. This time, after trying all of the grasp poses with the right arm, it should switch to the left arm. | ||
+ | <code lisp> | ||
+ | PP-TUT> (spawn-object ' | ||
+ | </ | ||
+ | You should see a result that looks like the one below, succeeding in grasping the bottle with the first grasp (LEFT-SIDE) using the LEFT arm. | ||
+ | [Again, some messages have been suppressed here for readability.] | ||
+ | <code lisp> | ||
+ | PP-TUT> (move-bottle ' | ||
+ | … | ||
+ | [(PICK-PLACE PICK-UP) INFO] 1621251445.989: | ||
+ | [(PICK-PLACE PICK-UP) INFO] 1621251445.993: | ||
+ | … | ||
+ | Grasping failed with RIGHT arm and LEFT-SIDE grasp | ||
+ | Retrying with RIGHT arm and RIGHT-SIDE grasp | ||
+ | [(PICK-PLACE PICK-UP) INFO] 1621251447.290: | ||
+ | [(PICK-PLACE PICK-UP) INFO] 1621251447.291: | ||
+ | … | ||
+ | Grasping failed with RIGHT arm and RIGHT-SIDE grasp | ||
+ | Retrying with RIGHT arm and FRONT grasp | ||
+ | [(PICK-PLACE PICK-UP) INFO] 1621251448.443: | ||
+ | [(PICK-PLACE PICK-UP) INFO] 1621251448.454: | ||
+ | … | ||
+ | Grasping failed with RIGHT arm and FRONT grasp | ||
+ | Retrying with RIGHT arm and BACK grasp | ||
+ | [(PICK-PLACE PICK-UP) INFO] 1621251449.628: | ||
+ | [(PICK-PLACE PICK-UP) INFO] 1621251449.650: | ||
+ | … | ||
+ | [(PICK-PLACE PICK-UP) INFO] 1621251450.450: | ||
+ | [(PICK-AND-PLACE GRIP) WARN] 1621251450.480: | ||
+ | Retrying | ||
+ | [(PICK-AND-PLACE GRIP) WARN] 1621251450.491: | ||
+ | #< | ||
+ | Grasping failed with RIGHT arm and BACK grasp | ||
+ | "No more grasp retries left : | ||
+ | #< | ||
+ | [(PICK-PLACE PICK-UP) INFO] 1621251450.606: | ||
+ | [(PICK-PLACE PICK-UP) INFO] 1621251450.608: | ||
+ | [(PICK-PLACE PICK-UP) INFO] 1621251451.151: | ||
+ | [(PICK-PLACE PICK-UP) INFO] 1621251451.234: | ||
+ | [(PICK-PLACE PICK-UP) INFO] 1621251451.235: | ||
+ | [(PICK-PLACE PLACE) INFO] 1621251451.709: | ||
+ | [(PICK-PLACE PLACE) INFO] 1621251451.892: | ||
+ | [(PICK-PLACE PLACE) INFO] 1621251451.988: | ||
+ | [(PICK-PLACE PLACE) INFO] 1621251452.027: | ||
+ | [(PICK-PLACE PLACE) INFO] 1621251452.074: | ||
+ | </ | ||
+ | {{: | ||
The robot has once again succeeded in grasping the object. | The robot has once again succeeded in grasping the object. | ||
Line 1080: | Line 1197: | ||
===== Defining a New Grasp ===== | ===== Defining a New Grasp ===== | ||
- | We discussed predefined possible grasps for a bottle in the previous section, which were 4 in number. Even though there are a lot of different possible grasps in real life, using only 4 limited | + | We discussed predefined possible grasps for a bottle in the previous section, which were 4 in number. Even though there are a lot of different possible grasps in real life, using only 4 limits |
- | There are two things to be carried out during | + | The grasps are defined as '' |
- | You car refer the image below again to see what axes correspond to what face of the object. | + | |
- | {{ : | + | The gripper frame in '' |
+ | |||
+ | There are two things | ||
- | For a front-left-diagonal grasp, the gripper has to come positive x and y-axis side and then close in and finally do a lift to complete the object pick-up. So we'll define some parameters | + | To calculate the translation part, we'll define some offsets as parameters. The values are taken from the predefined grasp offset values in |
<code lisp> | <code lisp> | ||
Line 1097: | Line 1216: | ||
</ | </ | ||
- | As for the orientation, first, we need to know what the axes of the gripper | + | For the orientation, |
+ | A front-left-diagonal grasp means that the gripper has to come from the positive x and y-axis side of the object. | ||
+ | You car refer to the image below again to see what axes correspond to what face of the object. | ||
+ | {{ : | ||
+ | |||
+ | The coordinate frame of a standard | ||
+ | |||
+ | {{: | ||
- | To visualize this easily, open your left palm with the thumb perpendicular | + | Thus, to make the front-left diagonal grasp, the Z-axis of the gripper should point 45 degrees in between the X and Y-axes of the object. And since we are grasping across the Z-axis of the bottle |
<code lisp> | <code lisp> | ||
Line 1110: | Line 1236: | ||
(0 1 0))) | (0 1 0))) | ||
</ | </ | ||
- | The rotation matrix given above is the rotation matrix required to bring the gripper from the identity pose to the pose that we need to make a left-diagonal grasp. This is achieved by rotating the identity pose along the x-axis by +90 degrees first, and then rotating the new pose-along | + | The rotation matrix given above is the rotation matrix required to bring the gripper from the identity pose to the pose that we need to make a left-diagonal grasp. This is achieved by rotating the identity pose around |
Note:-Since sin(pi/4) = cos(pi/4), we have only defined one variable and used it interchangeably in the defined rotation matrix | Note:-Since sin(pi/4) = cos(pi/4), we have only defined one variable and used it interchangeably in the defined rotation matrix | ||
- | Now let's define the method that tie up all this and let ROS know that a new grasp is available | + | Now let's define the method that tie up all this and let CRAM know that a new grasp is available |
<code lisp> | <code lisp> | ||
(cram-object-interfaces: | (cram-object-interfaces: | ||
: | : | ||
: | : | ||
- | : | + | : |
- | : | + | :2nd-pregrasp-offsets `(, |
+ | : | ||
+ | :2nd-lift-offsets *lift-offset*) | ||
</ | </ | ||
- | The summary of this code is pretty simple, we have defined a grasp called '' | + | The summary of this code is pretty simple, we have defined a grasp called '' |
Now that we have defined our new grasp let's see it in action. First, spawn the bottle again and position the robot ready to pick up. | Now that we have defined our new grasp let's see it in action. First, spawn the bottle again and position the robot ready to pick up. | ||
Line 1164: | Line 1292: | ||
| | ||
</ | </ | ||
- | You will see that PR2 will successfully grasp the bottle from the grasp pose that we defined. | + | You will see that PR2 will successfully grasp the bottle from the grasp pose that we defined. Another useful documentation on this point is [[http:// |
+ | |||
+ | {{ : | ||
+ | |||
+ | To visualize the gripper coordinates, | ||
+ | |||
+ | <code lisp> | ||
+ | (visualize-coordinates (btr: | ||
+ | </ | ||
+ | where ''" | ||
+ | |||
+ | There is one caveat: PR2's gripper coordinate frame is not defined according to the common industry standard that we just described. But in order to keep our grasps applicable to any gripper, we define the grasps for the standard gripper and each robot that transforms the standard grasp into its own gripper frame. Therefore, even if we're defining the grasps for the PR2, whose gripper frames are defined as following: | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | we still define them for a standard gripper coordinate frame. PR2 transforms our standard grasp into its own grasp under the hood through the CRAM hardware abstraction layer. | ||
- | {{: | ||
Line 1191: | Line 1333: | ||
===== Credits ===== | ===== Credits ===== | ||
- | This tutorial was created with the combined efforts of Amar Fayaz, Arthur Niedzwiecki and Gayane Kazhoyan. | + | This tutorial was created with the combined efforts of Amar Fayaz, Arthur Niedzwiecki, and Gayane Kazhoyan. |
+ | |||
+ | |||
+ | |||
+ | --></ | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | < | ||
+ | |||
+ | ===== FEEDBACK ===== | ||
+ | |||
+ | Arthur got the following feedback from students: 3h isn't enough to complete the tasks, the intro of the tutorial was too long, designators should be explained. Maybe put a link to those topics at appropriate position. | ||
+ | |||
+ | Alina got the following feedback from students: | ||
+ | - an introduction to how to navigate and handle Emacs would have been nice at the start | ||
+ | - VM is too slow for some. Laptops' | ||
+ | - Too little time. Nobody finished Exercise 1 | ||
+ | - visualization of poses could be done better (we used Rviz and "point clicked", | ||
+ | - Someone also suggested to do the following: Emacs crash course + basic shortcuts introduction, | ||
+ | |||
+ | Some questions the students had and some answers we weren' | ||
+ | - What licence is cram uder (bsd?) | ||
+ | - Can it be used without ROS? -> no. unless someone writes something for it since it's open source | ||
+ | - How does the PR2 know that he dropped something | ||
+ | - Would the belief state work with multiple robots at the same time? -> yes? | ||
+ | |||
+ | |||
+ | --></ |