28
28
from pubsub import pub
29
29
pub.sendMessage('behaviour', type=Personality.INPUT_TYPE_FUN)
30
30
"""
31
+ from jetsensor import JetsonMotionSensor
31
32
32
33
class Personality :
33
34
34
-
35
35
def __init__ (self , ** kwargs ):
36
36
self .mode = kwargs .get ('mode' , Config .MODE_LIVE )
37
37
self .state = Config .STATE_SLEEPING
38
38
self .eye = 'blue'
39
+ self .boredom_level = 0
39
40
40
41
pub .subscribe (self .loop , 'loop:1' )
41
42
pub .subscribe (self .process_sentiment , 'sentiment' )
42
-
43
+ pub . subscribe ( self . on_motion_detected , 'motion' )
43
44
behaviours = { 'boredom' : Boredom (self ),
44
45
'dream' : Dream (self ),
45
46
'faces' : Faces (self ),
@@ -51,24 +52,53 @@ def __init__(self, **kwargs):
51
52
'sentiment' : Sentiment (self )}
52
53
53
54
self .behaviours = SimpleNamespace (** behaviours )
55
+ self .motion_sensor = JetsonMotionSensor (pin = 17 )
54
56
55
57
def loop (self ):
56
58
# pub.sendMessage('speech', msg="Hello, I am happy") # for testing sentiment responses
57
59
if not self .is_asleep () and not self .behaviours .faces .face_detected and not self .behaviours .motion .is_motion () and not self .behaviours .objects .is_detected :
60
+ self .boredom_level += 1
58
61
self .set_eye ('red' )
62
+ else :
63
+ self .boredom_level = 0
64
+
65
+
66
+ if self .boredom_level > 10 :
67
+ self .random_servo_movement ()
68
+
69
+
70
+ self .motion_sensor .loop ()
59
71
72
+
60
73
if self .state == Config .STATE_ALERT and self .lt (self .behaviours .faces .last_face , self .past (2 * 60 )) and self .lt (self .behaviours .objects .last_detection , self .past (2 * 60 )):
61
74
# reset to idle position after 2 minutes inactivity
62
75
pub .sendMessage ('animate' , action = "wake" )
63
76
self .set_state (Config .STATE_IDLE )
64
77
65
78
def process_sentiment (self , score ):
66
- pub .sendMessage ('log' , msg = "[Personality] Sentiment: " + str (score ))
67
- if score > 0 :
68
- pub .sendMessage ('piservo:move' , angle = 0 )
69
- else :
70
- pub .sendMessage ('piservo:move' , angle = 40 )
71
-
79
+
80
+ if self .boredom_level <= 10 :
81
+ pub .sendMessage ('log' , msg = "[Personality] Sentiment: " + str (score ))
82
+ if score > 0 :
83
+ pub .sendMessage ('jetservo:left_move' , angle = 0 )
84
+ pub .sendMessage ('jetservo:right_move' , angle = 0 )
85
+ else :
86
+ pub .sendMessage ('jetservo:left_move' , angle = 40 )
87
+ pub .sendMessage ('jetservo:right_move' , angle = 40 )
88
+
89
+ def random_servo_movement (self ):
90
+ pub .sendMessage ('log' , msg = "[Personality] Random Servo Movement due to boredom" )
91
+ left_angle = randint (- 30 , 30 )
92
+ right_angle = randint (- 30 , 30 )
93
+ pub .sendMessage ('jetservo:left_move' , angle = left_angle )
94
+ pub .sendMessage ('jetservo:right_move' , angle = right_angle )
95
+
96
+ def on_motion_detected (self ):
97
+
98
+ pub .sendMessage ('log' , msg = "[Personality] Motion detected, servos moving up like ears" )
99
+ pub .sendMessage ('jetservo:left_move' , angle = - 90 )
100
+ pub .sendMessage ('jetservo:right_move' , angle = - 90 )
101
+
72
102
def set_eye (self , color ):
73
103
if self .eye == color :
74
104
return
@@ -79,36 +109,35 @@ def set_eye(self, color):
79
109
def set_state (self , state ):
80
110
if self .state == state :
81
111
return
82
-
83
112
pub .sendMessage ('log' , msg = "[Personality] State: " + str (state ))
84
113
if state == Config .STATE_SLEEPING :
85
114
pub .sendMessage ("sleep" )
86
115
pub .sendMessage ("animate" , action = "sleep" )
87
116
pub .sendMessage ("animate" , action = "sit" )
88
117
pub .sendMessage ("led:off" )
89
118
pub .sendMessage ("led" , identifiers = ['status1' ], color = "off" )
90
- pub .sendMessage ('piservo :move' , angle = 0 )
119
+ pub .sendMessage ('jetservo :move' , angle = 0 )
91
120
elif state == Config .STATE_RESTING :
92
121
pub .sendMessage ('rest' )
93
122
pub .sendMessage ("animate" , action = "sit" )
94
123
pub .sendMessage ("animate" , action = "sleep" )
95
124
self .set_eye ('blue' )
96
125
pub .sendMessage ("led" , identifiers = ['status1' ], color = "red" )
97
- pub .sendMessage ('piservo :move' , angle = - 40 )
126
+ pub .sendMessage ('jetservo :move' , angle = - 40 )
98
127
elif state == Config .STATE_IDLE :
99
128
if self .state == Config .STATE_RESTING or self .state == Config .STATE_SLEEPING :
100
129
pub .sendMessage ('wake' )
101
130
pub .sendMessage ('animate' , action = "wake" )
102
131
pub .sendMessage ('animate' , action = "sit" )
103
132
pub .sendMessage ("led" , identifiers = ['status1' ], color = "green" )
104
- pub .sendMessage ('piservo :move' , angle = - 20 )
133
+ pub .sendMessage ('jetservo :move' , angle = - 20 )
105
134
self .set_eye ('blue' )
106
135
elif state == Config .STATE_ALERT :
107
136
if self .state == Config .STATE_RESTING or self .state == Config .STATE_SLEEPING :
108
137
pub .sendMessage ('wake' )
109
138
pub .sendMessage ('animate' , action = "wake" )
110
139
# pub.sendMessage('animate', action="stand")
111
- pub .sendMessage ('piservo :move' , angle = 0 )
140
+ pub .sendMessage ('jetservo :move' , angle = 0 )
112
141
pub .sendMessage ("led" , identifiers = ['status1' ], color = "blue" )
113
142
self .state = state
114
143
@@ -122,4 +151,4 @@ def lt(self, date, compare):
122
151
return date is None or date < compare
123
152
124
153
def past (self , seconds ):
125
- return datetime .now () - timedelta (seconds = seconds )
154
+ return datetime .now () - timedelta (seconds = seconds )
0 commit comments