user3356789
user3356789

Reputation: 91

Tell a turtle in netlogo what position to go after procedure is complete

So, I have my robot successfully watering the plants as per this project NetLogo Turtle position

and after completion of all the plants (turtles) being 'watered' I would like the turtle to return at the base. So, I have this line: if count leaves = 0 [move-to base 0] then, if at-base-no-leaves [stop]

where at-base-no-leaves is defined as

to-report at-base-no-leaves
  ifelse any? bases-here and count leaves = 0
  [report true]
  [report false]
end 

But I get this error:

You can't use tick in a turtle context, because tick is observer only.

How can I get robot to move at base and stop there? Any help is appreciated.

Here's my complete code:

;plant watering agent


breed [robots robot]       ; Name of the breed of plant robots
breed [leaves leaf]        ; Name of the breed of plants in need of water
breed [ watered water-1]   ; Name of the breed of watered plants
breed [ bases base]        ; Name of the breed of charging station

globals
[
  background-colour ; colour of the background except for obstacles
  obstacles-colour  ; colour of the obstacles
  robot-colour      ; colour of the robot
  clock             ; tracking time
  watered-plants    ; plants watered
  distance-traveled ; distance traveled by the robot
  battery-life      ; battery life left
  water-poured      ; how much water has been used

]

to setup
  ;clear all
  clear-all
  set-default-shape robots "ufo side" ; sets shapes for agent
  set background-colour green + 3 ; set colour of background light green
  set obstacles-colour brown ; set colour of obstacles brown

  set robot-colour gray ; set colour of robot to gray
  setup-base
  set clock 0 ;initialize time
  set distance-traveled 0 ;initialize distance
  set battery-life 100 ;initialize battery life to 100%
  set water-poured 0 ;initialize water used to 0

  ;set boundary obstacles. These patches tell the robot to stay within identified bounds.
  ask patches                                
  [
    set pcolor background-colour             ; set colour of background
    if (pxcor >= max-pxcor - boundary-width) ; boundary width can vary
      [ set pcolor brown ]
    if (pxcor <= min-pxcor + boundary-width)
      [ set pcolor brown ]
    if (pycor >= max-pycor - boundary-width)
      [ set pcolor brown ]
    if (pycor <= min-pycor + boundary-width)
      [ set pcolor brown ]
  ]

  setup-leaves ;add plants to the world. These are added after the border is created so not to create the plants outside of the 'border of the house'

  ; creates colour, size and random location of single robot 
  create-robots 1
  [
    set size robot-size
    set color robot-colour
    ;let this-patch one-of patches with [pcolor != obstacles-colour]  ; sets an initial random position within the outside boundary; this works if we want to set a random position every time for the robot
    ;set xcor [pxcor] of this-patch
    ;set ycor [pycor] of this-patch
    setxy 15 -14 ; robot starts at the charging station
  ]
end   


; creating plants (leaves)
to setup-leaves
  create-leaves num-plants [  ; number of plants can vary
  rand-xy-co                 ; set random positions for the plants
  set shape "flower"         ; initialize the plant to color red and size 2
  set color red
  set size 2
  ]
end 

;setup base (charging station)
to setup-base
  create-bases 1 [
    set shape "electric outlet"
    set color white
    setxy 16 -15     
    set heading 0
    set size 3

  ] 


end


;detecting a plant (leaf)
to-report detect-leaf
  ifelse any? leaves-here 
    [report true]           ; set as true if plant breed is detected
    [report false]
end


;watering a leaf (plant)
to water-leaf
  set watered-plants watered-plants + 1  ;when a plant is watered, increase counter by 1
  set water-poured  watered-plants * ((4 * (100 - soil-moisture)) / 50) ; when plant is watered, increase water-poured counter
                                                                        ; this formula is based on the average amount of water a houseplant needs >> 4 oz at 50% soil moisture
  set clock clock + 10                                                  ; add 10 ticks to the clock when watering plants since the robot has to spend time to water
  set battery-life battery-life - 5                                     ; 5% of battery life is spent for each plant watered
  ask one-of leaves-here [                                              ; mark breed as watered when plant is watered; change flower color to yellow
    set breed watered
    set shape "flower"
    set color yellow
    set size 3                                                          ;increase the size of the flower (grown)
    ]
end

to-report at-base
  ifelse any? bases-here 
    [report true]
    [report false]
end

to-report at-base-no-leaves
  ifelse any? bases-here and count leaves = 0
  [report true]
  [report false]
end  


to charge 
  set battery-life 100 ;charge with 100% battery
  set clock clock + 10     ;add additional time to the clock
end  

; This defines how the robot should move.
to make-move                                                         
  if battery-life <= 0 [stop]                                          ; robot cannot run if it doesn't have any battery life
  if at-base and battery-life <= 99  [charge]

   ;This behaviour is modified from the Look Ahead Example model in the Models Library
   let this-patch patch-ahead 1
      if detect-leaf [water-leaf stop]
         ifelse (this-patch != nobody) and ([pcolor] of this-patch = obstacles-colour)
            [ lt random-float 360 ]                                   ; We see an obstacle patch in front of us. Turn a random amount.
            [ fd 1 ]                                                  ; Otherwise, it is safe to move forward.
        set distance-traveled distance-traveled + 1                   ; every step increases distance-traveled counter by 1
  end


;Procedure when the button Go is pressed
to go
;The robot moves around.
  if count leaves = 0 [move-to base 0]
  if at-base-no-leaves  [stop]                                         ;stop when all leaves are watered
  set clock clock + 1                                                ;update time
  ;wait .05                                                          ; wait for better viewing  
  set battery-life 100 - (distance-traveled / 900)                   ; battery life varies based on distance traveled 
  ask robots [without-interruption [make-move]]                      ;robots move
  update-and-plot                                                    ;update the graphs         
   tick
end

;plot velocity graph
to update-and-plot-velocity
  set-current-plot "Velocity"
  plotxy distance-traveled clock
end

;plot water usage graph
to update-and-plot-water-usage
  set-current-plot "Water Usage"
  plotxy water-poured watered-plants
end

;plot energy usage graph
to update-and-plot-energy-usage
  set-current-plot "Energy Usage"
  plotxy  clock (100 - battery-life)
end

;plot watered plants graph
to update-and-plot-watered-plants
  set-current-plot "Watered Plants"
  plotxy clock watered-plants
end

;plot wilting plants graph
to update-and-plot-wilting-plants
  set-current-plot "Wilting Plants"
  plotxy clock count leaves
end

;call all the graphs
to update-and-plot
  update-and-plot-velocity
  update-and-plot-water-usage
  update-and-plot-energy-usage
  update-and-plot-watered-plants
  update-and-plot-wilting-plants
end

; Creates obstacles in the environment by drawing them on the world
to make-obstacles
 if mouse-down?
 [ ask patches
   [ if ((abs (pxcor - mouse-xcor)) < 1) and ((abs (pycor - mouse-ycor)) < 1)
     [set pcolor obstacles-colour]]
 ]
end


; Removes obtacles in the environment.
to erase-obstacles
  if mouse-down?
 [ ask patches
   [ if ((abs (pxcor - mouse-xcor)) < 1) and ((abs (pycor - mouse-ycor)) < 1)
     [set pcolor background-colour]]
 ]
end

; Detecting obstacles 
; Obstacles are obstacles and other agents.
to-report detect-obstacle
ifelse any? patches in-cone 2 90 with [pcolor = brown] or any? other robots in-cone 2 90 
 [report true]
 [report false]
end  



; The robot avoids any obstacles in the environment.   
;to avoid-obstacles
  ;if (count patches in-cone radius-length radius-angle with [pcolor = obstacles-colour] > 0)  ; there is an obstacle nearby
  ;[ 
    ;set heading heading + random 45 - random 45
   ;]
;end

; This instructs the agent to move the pen up if it is down, or vice versa.
to plot-paths
  ifelse (pen-mode = "up")
    [ pen-down ]
    [ pen-up ]
end

; Utilities. Positions a new turtle randomly on the grid, taking care not to 
;place it on top of another turtle
to rand-xy-co
  move-to one-of patches with [ pcolor != obstacles-colour and not any? turtles-here ]

end

Upvotes: 2

Views: 1564

Answers (1)

Nicolas Payette
Nicolas Payette

Reputation: 14972

Your are using bases-here in your at-base-no-leaves reporter, which makes it a "turtle or patch" reporter. You are then calling at-base-no-leaves directly in your go procedure, which in turns makes go a "turtle or patch" procedure... in which you can't call tick.

To avoid this problem, simply call at-base-no-leaves from the context it is supposed to be called from, i.e., a turtle context:

ask robots [
  if count leaves = 0 [move-to base 0]
  if at-base-no-leaves  [stop]  
]

As an inside, there is a pattern that you use in at-base-no-leaves and some other reporters that you should avoid:

to-report at-base-no-leaves
  ifelse any? bases-here and count leaves = 0
  [report true]
  [report false]
end  

There is no need for the ifelse, here: you are basically just using it to turn a boolean expression into... a boolean expression of the same value (e.g., true if true, false if false). Just use your condition directly:

to-report at-base-no-leaves
  report any? bases-here and count leaves = 0
end  

You could also replace count leaves = 0 with not any? leaves for consistency and clarity.

Finally, you'll probably need to put reset-ticks at the end of your setup procedure.

Upvotes: 1

Related Questions