Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| tutorials:intermediate:new_actions [2018/12/30 15:42] – [Pick-action-designator] vanessa | tutorials:intermediate:new_actions [2019/01/02 17:46] (current) – [Pick-action-designator] vanessa | ||
|---|---|---|---|
| Line 2: | Line 2: | ||
| When implementing new type of actions, such as placing, pouring or cutting there are 4 important steps to do. | When implementing new type of actions, such as placing, pouring or cutting there are 4 important steps to do. | ||
| - | In the following Tutorial it is assumed that the basic knowledge about [[http:// | + | In the following Tutorial it is assumed that the basic knowledge about [[http:// |
| ====== Atomic-action-designator ====== | ====== Atomic-action-designator ====== | ||
| Line 162: | Line 162: | ||
| </ | </ | ||
| + | Here also failure-handling takes place. At least all low-level-failures should be caught here. | ||
| ====== Pick-action-designator ====== | ====== Pick-action-designator ====== | ||
| - | TODO: Write when the new manipulation interface is done. | ||
| + | |||
| + | Now it is necessary to define a action designator of the new type for pick-up e.g. | ||
| + | |||
| + | <code lisp> | ||
| + | ;; | ||
| + | (def-fact-group pick-and-place-plans (desig: | ||
| + | (<- (desig: | ||
| + | ? | ||
| + | ? | ||
| + | ? | ||
| + | ? | ||
| + | </ | ||
| + | |||
| + | First extract all information from ? | ||
| + | | ||
| + | <code lisp> | ||
| + | (spec: | ||
| + | (spec: | ||
| + | (desig: | ||
| + | (spec: | ||
| + | (spec: | ||
| + | (-> (spec: | ||
| + | (true) | ||
| + | (man-int: | ||
| + | (lisp-fun man-int: | ||
| + | | ||
| + | </ | ||
| + | | ||
| + | Infer missing information like ?grasp type, gripping ? | ||
| + | |||
| + | < | ||
| + | |||
| + | (lisp-fun man-int: | ||
| + | (-> (man-int: | ||
| + | (equal ? | ||
| + | (equal ? | ||
| + | (-> (spec: | ||
| + | (true) | ||
| + | (and (lisp-fun man-int: | ||
| + | | ||
| + | (lisp-fun man-int: | ||
| + | (lisp-fun man-int: | ||
| + | (lisp-fun man-int: | ||
| + | ? | ||
| + | ? | ||
| + | (lisp-fun man-int: | ||
| + | ? | ||
| + | ? | ||
| + | (lisp-fun extract-pick-up-manipulation-poses ?arm ?left-poses ? | ||
| + | (? | ||
| + | ? | ||
| + | ? | ||
| + | |||
| + | | ||
| + | </ | ||
| + | |||
| + | |||
| + | |||
| + | | ||
| ====== Get-trajectory ====== | ====== Get-trajectory ====== | ||
| + | <code lisp> | ||
| + | ;; | ||
| + | (defgeneric get-object-grasping-poses (object-name object-type arm grasp object-transform) | ||
| + | (: | ||
| + | (:method (object-name object-type arm grasp object-transform) | ||
| + | (declare (type symbol object-name object-type arm grasp) | ||
| + | (type cl-transforms-stamped: | ||
| + | (when (prolog `(object-rotationally-symmetric , | ||
| + | (setf object-transform | ||
| + | (cram-tf: | ||
| + | | ||
| + | : | ||
| + | </ | ||
| + | First correct the object transform such that rotationally-symmetric objects would not be grasped in an awkward way with weird orientations. | ||
| + | |||
| + | <code lisp> | ||
| + | (let* ((gripper-tool-frame | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | object-type object-name arm grasp | ||
| + | object-to-standard-gripper-transform)) | ||
| + | | ||
| + | | ||
| + | object-type object-name arm grasp | ||
| + | object-to-standard-gripper-transform)) | ||
| + | | ||
| + | | ||
| + | object-type object-name arm grasp | ||
| + | object-to-standard-gripper-transform)) | ||
| + | | ||
| + | | ||
| + | object-type object-name arm grasp | ||
| + | object-to-standard-gripper-transform)) | ||
| + | | ||
| + | | ||
| + | gripper-tool-frame | ||
| + | gripper-tool-frame | ||
| + | 0.0 | ||
| + | (cut: | ||
| + | '? | ||
| + | (car (prolog: | ||
| + | `(and (cram-robot-interfaces: | ||
| + | | ||
| + | ?robot ? | ||
| + | | ||
| + | </ | ||
| + | Next step is to transform all the poses for the action. | ||
| + | * standard gripper transform oTg | ||
| + | * standard gripper pregrasp transform oTg | ||
| + | * standard gripper second pregrasp transform oTg | ||
| + | * standard gripper lift transform oTg | ||
| + | * standard gripper second lift transform oTg | ||
| + | * particular gripper transform gTg | ||
| + | <code lisp> | ||
| + | (when (and object-to-standard-gripper-transform standard-to-particular-gripper-transform) | ||
| + | |||
| + | (flet ((object-to-standard-gripper-> | ||
| + | (when object-to-standard-gripper | ||
| + | (let ((base-to-standard-gripper-transform | ||
| + | | ||
| + | cram-tf: | ||
| + | object-transform | ||
| + | object-to-standard-gripper ; oTg' | ||
| + | : | ||
| + | | ||
| + | cram-tf: | ||
| + | base-to-standard-gripper-transform | ||
| + | standard-to-particular-gripper-transform ; g'Tg | ||
| + | : | ||
| + | |||
| + | (mapcar #' | ||
| + | (list object-to-standard-gripper-pregrasp-transform | ||
| + | object-to-standard-gripper-2nd-pregrasp-transform | ||
| + | object-to-standard-gripper-transform | ||
| + | object-to-standard-gripper-lift-transform | ||
| + | object-to-standard-gripper-2nd-lift-transform))))))) | ||
| + | |||
| + | |||
| + | |||
| + | </ | ||
| + | |||
| + | The last step is to calculate the base-to-standard-gripper-transform so that a transformation from object-to-standard-gripper to base-to-particular-gripper can be done. | ||
| ====== Write a Demo====== | ====== Write a Demo====== | ||
| + | |||
| + | Depending on what the scenario will be a different demo has to take place. In cram/ | ||
| + | |||
| + | All that is needed: | ||
| + | |||
| + | * Launch file with all important nodes. | ||
| + | * Resources includes all .stl and .dae files from the spawned object in the scenario. | ||
| + | * Then a costmap needs to be defined. | ||
| + | * In projection-demo.lisp all the function that will be called in the demo are implemented e.g. place-object | ||
| + | * In demo.lisp the demo is written and trainings-data. | ||

