Both sides previous revisionPrevious revisionNext revision | Previous revisionNext revisionBoth sides next revision |
tutorials:beginner:process_modules [2016/01/22 16:54] – gkazhoya | tutorials:beginner:process_modules [2016/01/25 10:30] – [A process module for the turtlesim] gkazhoya |
---|
"action-designators" | "action-designators" |
"turtle-action-client")))))) | "turtle-action-client")))))) |
| </code> |
| |
| Finally, let's also add '':cram-process-modules'' to the use list of our Lisp package for convenience: |
| <code lisp> |
| (:use :cpl :roslisp :cl-transforms :cram-designators :cram-process-modules) |
</code> | </code> |
| |
(in-package :tut) | (in-package :tut) |
| |
(cram-process-modules:def-process-module turtle-actuators (action-designator) | (def-process-module turtle-actuators (action-designator) |
(roslisp:ros-info (turtle-process-modules) | (roslisp:ros-info (turtle-process-modules) |
"Turtle navigation invoked with action designator `~a'." | "Turtle navigation invoked with action designator `~a'." |
action-designator) | action-designator) |
(destructuring-bind (cmd action-goal) (reference action-designator) | (destructuring-bind (command action-goal) (reference action-designator) |
(ecase cmd | (ecase command |
(shape | (draw-shape |
(call-shape-action | (call-shape-action |
:edges (turtle-shape-edges action-goal) | :edges (turtle-shape-edges action-goal) |
:radius (turtle-shape-radius action-goal)))))) | :radius (turtle-shape-radius action-goal)))))) |
</code> | |
| |
First, we use the ''cram-process-modules:def-process-module'' macro to define turtle-actuators as a process module taking one parameter (action-designator). The other lines in the def-process-module are comprise the code for turtle-actuators. | (defmacro with-turtle-process-modules (&body body) |
| `(with-process-modules-running |
| (turtle-actuators) |
| ,@body)) |
| </code> |
| |
destructuring-bind will map the results from (reference action-designator) to the variables cmd and action-goal respectively. Note that the inference rules we defined previously provide a name for the kind of action goal we have (currently, all are "shape"), and a turtle-shape object. We run an ecase on the kind of goal (currently, we only have the shape case) and use the call-shape-action to tell the lower level to move the turtle around, given these parameters we infer from designator resolution. | First, we use the ''cram-process-modules:def-process-module'' macro to define ''turtle-actuators'' as a process module taking one parameter (''action-designator''). The process module then chooses which action to perform depending on the command specified in the designator: ''destructuring-bind'' maps the results from ''(reference action-designator)'' to the variables ''command'' and ''action-goal'' respectively. Note that the inference rules we defined previously provide a name for the kind of action goal we have (currently, all are ''draw-shape''), and a ''turtle-shape'' object. We run an ''ecase'' on the kind of goal (currently, we only have the shape case) and use ''call-shape-action'' to tell the lower level to move the turtle around, given these parameters we infer from designator resolution. |
| |
The with-turtle-process-modules macro is a macro we define for convenience. It allows us to set up a context in which to run commands, knowing that the turtle process modules are all running concurrently. Right now we only have one defined, turtle-actuators. When we will have several, we will add them to the list we pass to cpm:with-process-modules-running. Note that the cpm:with-process-modules-running macro (and therefore with-turtle-process-modules too) needs to be run inside a top-level macro. We will see this below. | The ''with-turtle-process-modules'' macro is a macro we define for convenience. It allows us to set up a context in which to run commands, knowing that the turtle process modules are all running concurrently. Right now we only have one defined, turtle-actuators. When we will have several, we will add them to the list we pass to cpm:with-process-modules-running. Note that the cpm:with-process-modules-running macro (and therefore with-turtle-process-modules too) needs to be run inside a top-level macro. We will see this below. |
| |
Let's try this out. Make sure you have roscore, turtlesim, and turtle_actionlib running. In a terminal tab for each, | Let's try this out. Make sure you have roscore, turtlesim, and turtle_actionlib running. In a terminal tab for each, |