1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 import struct
34 import logging
35 import time
36 import math
37 import roslib
38
39 import rospy
40 import eddiebot_driver
41
42 import std_msgs.msg as std_msgs
43
44 import robot_types
45
47
48 EDDIE_PULSES_TO_M = 0.000445558279992234
49
51 self._robot = robot
52 self._sensor_state_struct = struct.Struct(">12B2hBHhb7HBH5B4h2HB6H2B4hb")
53 self._last_encoder_counts = None
54
56 """Reqeust a sensor packet."""
57 with self._robot.sci.lock:
58 self._robot.sci.flush_input()
59
60 output = self._robot.sensors()
61
62
63
64
65 stamp = time.time()
66
67
68 return output, stamp
69
71 try:
72 (bumps_wheeldrops,
73 wall,
74 cliff_left,
75 cliff_front_left,
76 cliff_front_right,
77 cliff_right,
78 virtual_wall,
79 motor_overcurrents,
80 dirt_detector_left,
81 dirt_detector_right,
82 remote_opcode,
83 buttons,
84 distance,
85 angle,
86 charging_state,
87 voltage,
88 current,
89 temperature,
90 charge,
91 capacity,
92 wall_signal,
93 cliff_left_signal,
94 cliff_front_left_signal,
95 cliff_front_right_signal,
96 cliff_right_signal,
97 user_digital_inputs,
98 user_analog_input,
99 charging_sources_available,
100 oi_mode,
101 song_number,
102 song_playing,
103 number_of_stream_packets,
104 requested_velocity,
105 requested_radius,
106 requested_right_velocity,
107 requested_left_velocity,
108 encoder_counts_left,
109 encoder_counts_right,
110 light_bumper,
111 light_bump_left,
112 light_bump_front_left,
113 light_bump_center_left,
114 light_bump_center_right,
115 light_bump_front_right,
116 light_bump_right,
117 ir_opcode_left,
118 ir_opcode_right,
119 left_motor_current,
120 right_motor_current,
121 main_brish_current,
122 side_brush_current,
123 statis ) = (buffer[0],
124 buffer[1],
125 buffer[2],
126 buffer[3],
127 buffer[4],
128 buffer[5],
129 buffer[6],
130 buffer[7],
131 buffer[8],
132 buffer[9],
133 buffer[10],
134 buffer[11],
135 buffer[12],
136 buffer[13],
137 buffer[14],
138 buffer[15],
139 buffer[16],
140 buffer[17],
141 buffer[18],
142 buffer[19],
143 buffer[20],
144 buffer[21],
145 buffer[22],
146 buffer[23],
147 buffer[24],
148 buffer[25],
149 buffer[26],
150 buffer[27],
151 buffer[28],
152 buffer[29],
153 buffer[30],
154 buffer[31],
155 buffer[32],
156 buffer[33],
157 buffer[34],
158 buffer[35],
159 buffer[36],
160 buffer[37],
161 buffer[38],
162 buffer[39],
163 buffer[40],
164 buffer[41],
165 buffer[42],
166 buffer[43],
167 buffer[44],
168 buffer[45],
169 buffer[46],
170 buffer[47],
171 buffer[48],
172 buffer[49],
173 buffer[50],
174 buffer[51])
175 except struct.error, e:
176 raise roslib.message.DeserializationError(e)
177
178
179
180
181
182
183
184
185
186
187 self.header = std_msgs.Header(stamp=rospy.Time.from_seconds(timestamp))
188
189
190
191
192
193 self.requested_velocity = 0.
194 self.requested_radius = 0.
195 self.requested_right_velocity = 0.
196 self.requested_left_velocity = 0.
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216 self.encoder_counts_left = 0.
217 self.encoder_counts_right = 0.
218 self.angle = 0.
219 self._last_encoder_counts = 0.
220
221
222 self.bumps_wheeldrops = bumps_wheeldrops
223 self.wall = wall
224 self.cliff_left = cliff_left
225 self.cliff_front_left = cliff_front_left
226 self.cliff_front_right = cliff_front_right
227 self.cliff_right = cliff_right
228 self.virtual_wall = virtual_wall
229 self.motor_overcurrents = motor_overcurrents
230 self.dirt_detector_left = dirt_detector_left
231 self.dirt_detector_right = dirt_detector_right
232 self.remote_opcode = remote_opcode
233 self.buttons = buttons
234 self.distance = distance
235 self.angle = angle
236 self.charging_state = charging_state
237 self.voltage = voltage
238 self.current = current
239 self.temperature = temperature
240 self.charge = charge
241 self.capacity = capacity
242 self.wall_signal = wall_signal
243 self.cliff_left_signal = cliff_left_signal
244 self.cliff_front_left_signal = cliff_front_left_signal
245 self.cliff_front_right_signal = cliff_front_right_signal
246 self.cliff_right_signal = cliff_right_signal
247 self.user_digital_inputs = user_digital_inputs
248 self.user_analog_input = user_analog_input
249 self.charging_sources_available = charging_sources_available
250 self.oi_mode = oi_mode
251 self.song_number = song_number
252 self.song_playing = song_playing
253 self.number_of_stream_packets = number_of_stream_packets
254 self.requested_velocity = requested_velocity
255 self.requested_radius = requested_radius
256 self.requested_right_velocity = requested_right_velocity
257 self.requested_left_velocity = requested_left_velocity
258 self.encoder_counts_left = encoder_counts_left
259 self.encoder_counts_right = encoder_counts_right
260 self.light_bumper = light_bumper
261 self.light_bump_left = light_bump_left
262 self.light_bump_front_left = light_bump_front_left
263 self.light_bump_center_left = light_bump_center_left
264 self.light_bump_center_right = light_bump_center_right
265 self.light_bump_front_right = light_bump_front_right
266 self.light_bump_right = light_bump_right
267 self.ir_opcode_left = ir_opcode_left
268 self.ir_opcode_right = ir_opcode_right
269 self.left_motor_current = left_motor_current
270 self.right_motor_current = right_motor_current
271 self.main_brish_current = main_brish_current
272 self.side_brush_current = side_brush_current
273 self.statis = statis
274
275
277 if count_delta >= maximal_count / 2:
278 return count_delta - maximal_count + 1
279 elif count_delta <= -maximal_count / 2:
280 return count_delta + maximal_count + 1
281 return count_delta
282
322
324 buff, timestamp = self._request_packet(100)
325 if buff is not None:
326 self._deserialize(buff, timestamp)
327 self._encode_message(sensor_state)
328