-
Notifications
You must be signed in to change notification settings - Fork 1
/
joycontrol_nogui.py
138 lines (111 loc) · 4.33 KB
/
joycontrol_nogui.py
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
#!/usr/bin/python
# coding: utf-8
# Logicool F310の裏面にあるX-D switchをDに設定するとTX2で認識する
# Logicool F710の場合は、X-D switchをDにして、正面の電源ボタン(Logicoolロゴのボタン)を押すとTX2で認識する
# roscore&
# python run_roscar.py
# python joycontrol.py
# https://www.pygame.org/docs/ref/joystick.html
import pygame
import curses
from lib.rostopic import RosTopicSetter
def map(x, in_min, in_max, out_min, out_max):
value = (x - in_min) * (out_max - out_min) // (in_max - in_min) + out_min
if value < out_min:
value = out_min
elif value > out_max:
value = out_max
return value
def main(win):
win.nodelay(True)
win.keypad(True)
key=-1
ros_topic_setter = RosTopicSetter()
speed = 0
steering_angle = 0
MAX_STEERING_ANGLE = 45
pygame.init()
#Loop until the user clicks the close button.
done = False
# Used to manage how fast the screen updates
clock = pygame.time.Clock()
# Initialize the joysticks
pygame.joystick.init()
# -------- Main Program Loop -----------
while done == False:
msg = ""
key = win.getch()
if key == ord('q') or key == 27: # push q or ESC key
done = True
pygame.quit()
break
# EVENT PROCESSING STEP
for event in pygame.event.get(): # User did something
if event.type == pygame.QUIT: # If user clicked close
done = True # Flag that we are done so we exit this loop
break
# Possible joystick actions: JOYAXISMOTION JOYBALLMOTION JOYBUTTONDOWN JOYBUTTONUP JOYHATMOTION
if event.type == pygame.JOYBUTTONDOWN:
msg += "Joystick button pressed.\n"
if event.type == pygame.JOYBUTTONUP:
msg += "Joystick button released.\n"
if done:
break
# Get count of joysticks
joystick_count = pygame.joystick.get_count()
# For each joystick:
for i in range(joystick_count):
joystick = pygame.joystick.Joystick(i)
joystick.init()
# Get the name from the OS for the controller/joystick
name = joystick.get_name()
msg += "Joystick name: {}\n".format(name)
# Usually axis run in pairs, up/down for one, and left/right for
# the other.
axes = joystick.get_numaxes()
msg += "Number of axes: {}\n".format(axes)
for i in range( axes ):
axis = joystick.get_axis( i )
msg += "Axis {} value: {:>6.3f}\n".format(i, axis)
"""
Steering
axis(0): LEFT: <0, RIGHT: >0
STEERING: LEFT: <0, RIGHT: >0
"""
axis = joystick.get_axis(3)
steering_angle = map(axis, -1.0, 0.99, -1*MAX_STEERING_ANGLE, MAX_STEERING_ANGLE)
msg += "=============================\n"
msg += "steering_angle:{}\n".format(steering_angle)
ros_topic_setter.angle(int(steering_angle))
"""
Speed
axis(3): UP: <0, DOWN: >0
"""
axis = -1.0*joystick.get_axis(1)
speed = int(map(axis, -1.0, 0.99, -100, 100))
msg += "speed:{}\n".format(speed)
ros_topic_setter.motor(int(speed))
buttons = joystick.get_numbuttons()
msg += "Number of buttons: {}\n".format(buttons)
for i in range( buttons ):
button = joystick.get_button( i )
msg += "Button {:>2} value: {}\n".format(i,button)
# Hat switch. All or nothing for direction, not like joysticks.
# Value comes back in an array.
hats = joystick.get_numhats()
msg += "Number of hats: {}\n".format(int(hats))
for i in range( hats ):
hat = joystick.get_hat( i )
msg += "Hat {} value: {}\n".format(i, str(hat))
msg += "Press q or ESC to quit."
win.clear()
win.addstr(msg)
win.refresh()
# ALL CODE TO DRAW SHOULD GO ABOVE THIS COMMENT
# Limit to 20 frames per second
clock.tick(20)
# Close the window and quit.
# If you forget this line, the program will 'hang'
# on exit if running from IDLE.
pygame.quit()
curses.wrapper(main)