source: remote_control/puzzlebox_brainstorms_remote_control.py @ 84

Last change on this file since 84 was 84, checked in by sc, 11 years ago

remote_control/puzzlebox_brainstorms_network_client.py:

  • power transmission settings added

remote_control/puzzlebox_brainstorms_remote_control.py:

  • custom power settings added

remote_control/puzzlebox_brainstorms_client_interface.py:

  • power transmission settings added
  • udpateSpeed method tracks and calculates power settings
  • power transmission settings added

remote_control/puzzlebox_brainstorms_configuration.ini:

  • DEFAULT_NXT_POWER_LEVEL added and set to 80

remote_control/interface/qt4_form.py:

  • font sizes tweaked

remote_control/puzzlebox_brainstorms_configuration.py:

  • DEFAULT_NXT_POWER_LEVEL added and set to 80

remote_control/puzzlebox_brainstorms_network_server.py

  • power transmission settings added
  • Property svn:executable set to *
File size: 9.6 KB
Line 
1#!/usr/bin/env python
2# -*- coding: utf-8 -*-
3#
4# Puzzlebox - Brainstorms - Remote Control
5#
6# Copyright Puzzlebox Productions, LLC (2010)
7#
8# This code is released under the GNU Pulic License (GPL) version 2
9# For more information please refer to http://www.gnu.org/copyleft/gpl.html
10#
11# Last Update: 2010.07.01
12#
13#####################################################################
14
15import sys, time
16import serial
17
18import jaraco.nxt
19import jaraco.nxt.messages
20
21import puzzlebox_brainstorms_configuration as configuration
22
23#####################################################################
24# Globals
25#####################################################################
26
27DEBUG = 2
28
29DISCRETE_CONTROL_COMMANDS = configuration.BRAINSTORMS_DISCRETE_CONTROL_COMMANDS
30
31DEFAULT_NXT_POWER_LEVEL = configuration.DEFAULT_NXT_POWER_LEVEL
32
33BLUETOOTH_DEVICE = configuration.NXT_BLUETOOTH_DEVICE
34
35MOTORS_MOUNTED_BACKWARDS = configuration.NXT_MOTORS_MOUNTED_BACKWARDS
36MOTOR_PORT_RIGHT = configuration.NXT_MOTOR_PORT_RIGHT
37MOTOR_PORT_LEFT = configuration.NXT_MOTOR_PORT_LEFT
38DEFAULT_RC_COMMAND = configuration.NXT_DEFAULT_RC_COMMAND
39
40#####################################################################
41# Classes
42#####################################################################
43
44class puzzlebox_brainstorms_remote_control:
45       
46        def __init__(self, \
47                     device=BLUETOOTH_DEVICE, \
48                     command=DEFAULT_RC_COMMAND, \
49                     DEBUG=DEBUG):
50               
51                self.DEBUG = DEBUG
52               
53                self.device = device
54                self.command = command
55               
56                self.connection = None
57               
58                try:
59                        self.connection = self.connect_to_nxt(self.device)
60                except:
61                        if self.DEBUG:
62                                print "--> [RC] Connection failed to NXT device [%s]" % self.device
63       
64       
65        ##################################################################
66       
67        def connect_to_nxt(self, device):
68               
69                connection = jaraco.nxt.Connection(self.device)
70               
71                if self.DEBUG:
72                        battery_voltage = self.get_battery_voltage(connection)
73                        print "--> [RC] Battery voltage:",
74                        print battery_voltage
75               
76               
77                return(connection)
78       
79       
80        ##################################################################
81       
82        def connect_to_port(self, device_port):
83       
84                if isinstance(device_port, basestring):
85                        port = getattr(jaraco.nxt.messages.OutputPort, device_port)
86               
87                assert port in jaraco.nxt.messages.OutputPort.values()
88               
89                return(port)
90       
91       
92        ##################################################################
93       
94        def get_battery_voltage(self, connection):
95               
96                cmd = jaraco.nxt.messages.GetBatteryLevel()
97                connection.send(cmd)
98               
99                response = connection.receive()
100                voltage = response.get_voltage()
101               
102                return(voltage)
103       
104       
105        ##################################################################
106       
107        def cycle_motor(self, connection, motor_port='a'):
108               
109                "Turn the motor one direction, then the other, then stop it"
110               
111                port = self.connect_to_port(motor_port)
112                cmd = jaraco.nxt.messages.SetOutputState(port, \
113                                                         motor_on=True, \
114                                                         set_power=60, \
115                                   run_state=jaraco.nxt.messages.RunState.running)
116                connection.send(cmd)
117               
118                time.sleep(2)
119               
120                cmd = jaraco.nxt.messages.SetOutputState(port, \
121                                                         motor_on=True, \
122                                                         set_power=-60, \
123                                   run_state=jaraco.nxt.messages.RunState.running)
124                connection.send(cmd)
125               
126                time.sleep(2)
127               
128                cmd = jaraco.nxt.messages.SetOutputState(port)
129                connection.send(cmd)
130       
131       
132        ##################################################################
133       
134        def drive(self, connection, left_power, right_power, duration):
135               
136                "Operate both motors, each at certain power, for a certain duration"
137               
138                left_motor = self.connect_to_port(MOTOR_PORT_LEFT)
139                right_motor = self.connect_to_port(MOTOR_PORT_RIGHT)
140               
141               
142                # If motors are mounted on the robot in reverse then all
143                # power settings need to be reversed
144                if MOTORS_MOUNTED_BACKWARDS:
145                        left_power = -left_power
146                        right_power = -right_power
147               
148                # Issue operation settings to both motors
149                cmd = jaraco.nxt.messages.SetOutputState(left_motor, \
150                                                                                                                          motor_on=True, \
151                                                                                                                          set_power=left_power, \
152                                                                 run_state=jaraco.nxt.messages.RunState.running)
153                connection.send(cmd)
154               
155                cmd = jaraco.nxt.messages.SetOutputState(right_motor, \
156                                                                                                                          motor_on=True, \
157                                                                                                                          set_power=right_power, \
158                                                                 run_state=jaraco.nxt.messages.RunState.running)
159                connection.send(cmd)
160               
161                # Continue operating motors while control program pauses
162                if DISCRETE_CONTROL_COMMANDS:
163                        time.sleep(duration)
164                       
165                        self.stop_motors(connection)
166       
167       
168        ##################################################################
169       
170        def stop_motors(self, connection):
171               
172                "Stop both motors"
173               
174                left_motor = self.connect_to_port(MOTOR_PORT_LEFT)
175                right_motor = self.connect_to_port(MOTOR_PORT_RIGHT)
176               
177                # Issue command to stop both motors
178                cmd = jaraco.nxt.messages.SetOutputState(left_motor)
179                connection.send(cmd)
180                cmd = jaraco.nxt.messages.SetOutputState(right_motor)
181                connection.send(cmd)
182       
183       
184        ##################################################################
185       
186        def drive_forward(self, connection, power=DEFAULT_NXT_POWER_LEVEL, duration=2):
187               
188                "Drive the robot forward at a certain speed for a certain duration"
189               
190                self.drive(connection, power, power, duration)
191       
192       
193        ##################################################################
194       
195        def drive_reverse(self, connection, power=DEFAULT_NXT_POWER_LEVEL, duration=2):
196               
197                "Drive the robot reverse at a certain speed for a certain duration"
198               
199                power = -power
200               
201                self.drive(connection, power, power, duration)
202       
203       
204        ##################################################################
205       
206        def turn_left_in_reverse(self, connection, power=DEFAULT_NXT_POWER_LEVEL, duration=3):
207               
208                "Turn the robot counter-clockwise while backing up at a"
209                " certain speed for a certain duration"
210               
211                left_power = -(power/3)
212                right_power = -power
213               
214                self.drive(connection, left_power, right_power, duration)
215       
216       
217        ##################################################################
218       
219        def turn_right_in_reverse(self, connection, power=DEFAULT_NXT_POWER_LEVEL, duration=3):
220               
221                "Turn the robot clockwise while backing up at a"
222                " certain speed for a certain duration"
223               
224                left_power = -power
225                right_power = -(power/3)
226               
227                self.drive(connection, left_power, right_power, duration)
228       
229       
230        ##################################################################
231       
232        def turn_left(self, connection, power=DEFAULT_NXT_POWER_LEVEL, duration=2):
233               
234                "Turn the robot counter-clockwise at a"
235                " certain speed for a certain duration"
236               
237                left_power = -(power/2)
238                right_power = power
239               
240                self.drive(connection, left_power, right_power, duration)
241       
242       
243        ##################################################################
244       
245        def turn_right(self, connection, power=DEFAULT_NXT_POWER_LEVEL, duration=2):
246               
247                "Turn the robot counter-clockwise at a"
248                " certain speed for a certain duration"
249               
250                left_power = power
251                right_power = -(power/2)
252               
253                self.drive(connection, left_power, right_power, duration)
254       
255       
256        ##################################################################
257       
258        def test_drive(self, connection):
259               
260                #self.cycle_motor(self.connection, motor_port='a')
261               
262                self.drive_forward(self.connection, power=100, duration=3)
263               
264                # half turn in reverse
265                self.turn_right_in_reverse(self.connection, power=100, duration=2)
266               
267                self.drive_forward(self.connection, power=80, duration=2)
268               
269                # quarter turn left
270                self.turn_left(self.connection, power=80, duration=2)
271               
272                self.drive_forward(self.connection, power=80, duration=1)
273               
274                # half turn right
275                self.turn_right(self.connection, power=80, duration=2)
276               
277                self.drive_forward(self.connection, power=80, duration=1)
278               
279                self.drive_reverse(self.connection, power=80, duration=1)
280       
281       
282        ##################################################################
283       
284        def run(self, command, power=DEFAULT_NXT_POWER_LEVEL):
285               
286                # If the LEGO Mindstorms NXT is instructed to drive with
287                # power less than 50% performance is so poor that we'd be
288                # better off simply stopping the motors.
289                if power < 50:
290                        command = 'stop_motors'
291               
292                if (command == 'drive_forward'):
293                        self.drive_forward(self.connection, power=power, duration=3)
294               
295                elif (command == 'drive_reverse'):
296                        self.drive_reverse(self.connection, power=power)
297               
298                elif (command == 'turn_left'):
299                        self.turn_left(self.connection, power=power)
300               
301                elif (command == 'turn_right'):
302                        self.turn_right(self.connection, power=power)
303               
304                elif (command == 'turn_left_in_reverse'):
305                        self.turn_left_in_reverse(self.connection, power=power)
306               
307                elif (command == 'turn_right_in_reverse'):
308                        self.turn_right_in_reverse(self.connection, power=power)
309               
310                elif (command == 'stop_motors'):
311                        self.stop_motors(self.connection)
312               
313                elif (command == 'test_drive'):
314                        self.test_drive(self.connection)
315       
316       
317        ##################################################################
318       
319        def stop(self):
320               
321                self.connection.close()
322
323
324#####################################################################
325# Functions
326#####################################################################
327
328#####################################################################
329# Main
330#####################################################################
331
332if __name__ == '__main__':
333       
334        # Collect default settings and command line parameters
335        device = BLUETOOTH_DEVICE
336        command = DEFAULT_RC_COMMAND
337       
338        for each in sys.argv:
339               
340                if each.startswith("--device="):
341                        device = each[ len("--device="): ]
342                elif each.startswith("--command="):
343                        command = each[ len("--command="): ]
344       
345       
346        rc = puzzlebox_brainstorms_remote_control(device=device, command=command, DEBUG=DEBUG)
347       
348        if rc.connection == None:
349                sys.exit()
350       
351        rc.run(rc.command)
352        rc.stop()
353
Note: See TracBrowser for help on using the repository browser.