The splat system provides the constructor hc-blending-navigation-policy which implements a fuzzy combination of the output associated with a set of controllers (control experts). The code below shows how we could use this constructuor to implement the stopping controller.4.5, 4.6
(depend 'splat-system) (define-splat (stopping-controller robot stopping-distance vmax time-stop) (local-vars (vset 0) (front-distance #f)) (initializer (semaphore-wait (base-control-mutex robot))) (finalizer (halt robot) (semaphore-signal (base-control-mutex robot))) (method #t ;;;; the method is always applicable (define (speed-controller) (let* ((v #t) (xt #f) (k (sqrt (/ (* 2 vmax ) time-stop ))) (xp (sqr (* k (/ time-stop 2.0)))) ) (set! xt (max 0 (- front-distance stopping-distance))) (set! v (if (> xt xp) vmax (* k (sqrt xt)))) )) (run (hc-blending-navigation-policy (loop-delay 0.1) (state-updater (lambda () (bind ((dir dist (min-free-space robot (deg->rad -10) (deg->rad 10)))) (set! front-distance dist)) (set! vset (speed-controller)))) (control-expert (lambda () (values 1.0 0 vset ))) (termination-expert (lambda () (< front-distance stopping-distance))) (control-thunk (lambda (turn drive) (set-drive-and-turn robot drive turn))) )) (method-finish self 'method-succeeded) ) )
The main core of the splat is the hc-blending-navigation-policy which implements a fuzzy combination of the output associated with a set of controllers (control experts). Its general form is
(hc-blending-navigation-policy (loop-delay delay-time) (state-updater code) (control-expert code)... (control-expert code) (termination-expert code) ... (termination-expert code) (control-thunk code) )A hc-blending-navigation-policy returns a splat which is executed until one or more of its termination-experts become true. This type of splat has a built in loop defined as:
1. Execute the code associated with the state-updater 2. Execute the code associated with each control-expert 3. Set output to the fuzzy combination associated of the values returned by the different control-experts 4. Call the code associated with control-thunk with output as a parameter 5. Sleep delay-time seconds
The state-updater code usually calculates values that are shared by the different experts. Any lambda expression could be the code of a state-updater form.
The code associated with a control-expert should return
(values applicability rotational-speed forward-speed)In our example, we only have one control expert and one termination expert. Our control expert always has applicability 1.0, rotational-speed 0 and forward velocity as calculated by the function speed-controller.
Notice that in the body of the splat's method we have the expression (run (hc-blending-navigation-policy ...)) instead of (hc-blending-navigation-policy ...) alone. This latter expression returns (denotes) a splat which is then executed by calling the method run on it.