|
11 | 11 |
|
12 | 12 | import ev3dev2 |
13 | 13 | from ev3dev2.sensor.lego import InfraredSensor |
14 | | -from ev3dev2.motor import Motor, MediumMotor, MoveTank, MoveSteering, MoveJoystick, SpeedPercent, SpeedDPM, SpeedDPS, SpeedRPM, SpeedRPS, SpeedNativeUnits, OUTPUT_A, OUTPUT_B |
| 14 | +from ev3dev2.motor import \ |
| 15 | + Motor, MediumMotor, LargeMotor, \ |
| 16 | + MoveTank, MoveSteering, MoveJoystick, \ |
| 17 | + SpeedPercent, SpeedDPM, SpeedDPS, SpeedRPM, SpeedRPS, SpeedNativeUnits, \ |
| 18 | + OUTPUT_A, OUTPUT_B |
15 | 19 |
|
16 | 20 | ev3dev2.Device.DEVICE_ROOT_PATH = os.path.join(FAKE_SYS, 'arena') |
17 | 21 |
|
@@ -128,20 +132,133 @@ def test_medium_motor_write(self): |
128 | 132 | m.speed_sp = 500 |
129 | 133 | self.assertEqual(m.speed_sp, 500) |
130 | 134 |
|
131 | | - def test_move_tank(self): |
| 135 | + def test_motor_on_for_degrees(self): |
| 136 | + clean_arena() |
| 137 | + populate_arena([('large_motor', 0, 'outA')]) |
| 138 | + |
| 139 | + m = LargeMotor() |
| 140 | + |
| 141 | + # simple case |
| 142 | + m.on_for_degrees(75, 100) |
| 143 | + self.assertEqual(m.speed_sp, int(round(0.75 * 1050))) |
| 144 | + self.assertEqual(m.position_sp, 100) |
| 145 | + |
| 146 | + # various negative cases; values act like multiplication |
| 147 | + m.on_for_degrees(-75, 100) |
| 148 | + self.assertEqual(m.speed_sp, int(round(0.75 * 1050))) |
| 149 | + self.assertEqual(m.position_sp, -100) |
| 150 | + |
| 151 | + m.on_for_degrees(75, -100) |
| 152 | + self.assertEqual(m.speed_sp, int(round(0.75 * 1050))) |
| 153 | + self.assertEqual(m.position_sp, -100) |
| 154 | + |
| 155 | + m.on_for_degrees(-75, -100) |
| 156 | + self.assertEqual(m.speed_sp, int(round(0.75 * 1050))) |
| 157 | + self.assertEqual(m.position_sp, 100) |
| 158 | + |
| 159 | + # zero speed (on-device, this will return immediately due to reported stall) |
| 160 | + m.on_for_degrees(0, 100) |
| 161 | + self.assertEqual(m.speed_sp, 0) |
| 162 | + self.assertEqual(m.position_sp, 100) |
| 163 | + |
| 164 | + # zero distance |
| 165 | + m.on_for_degrees(75, 0) |
| 166 | + self.assertEqual(m.speed_sp, int(round(0.75 * 1050))) |
| 167 | + self.assertEqual(m.position_sp, 0) |
| 168 | + |
| 169 | + # zero speed and distance |
| 170 | + m.on_for_degrees(0, 0) |
| 171 | + self.assertEqual(m.speed_sp, 0) |
| 172 | + self.assertEqual(m.position_sp, 0) |
| 173 | + |
| 174 | + # None speed |
| 175 | + with self.assertRaises(ValueError): |
| 176 | + m.on_for_degrees(None, 100) |
| 177 | + |
| 178 | + # None distance |
| 179 | + with self.assertRaises(ValueError): |
| 180 | + m.on_for_degrees(75, None) |
| 181 | + |
| 182 | + def test_motor_on_for_rotations(self): |
| 183 | + clean_arena() |
| 184 | + populate_arena([('large_motor', 0, 'outA')]) |
| 185 | + |
| 186 | + m = LargeMotor() |
| 187 | + |
| 188 | + # simple case |
| 189 | + m.on_for_rotations(75, 5) |
| 190 | + self.assertEqual(m.speed_sp, int(round(0.75 * 1050))) |
| 191 | + self.assertEqual(m.position_sp, 5 * 360) |
| 192 | + |
| 193 | + # None speed |
| 194 | + with self.assertRaises(ValueError): |
| 195 | + m.on_for_rotations(None, 5) |
| 196 | + |
| 197 | + # None distance |
| 198 | + with self.assertRaises(ValueError): |
| 199 | + m.on_for_rotations(75, None) |
| 200 | + |
| 201 | + def test_move_tank_relative_distance(self): |
132 | 202 | clean_arena() |
133 | 203 | populate_arena([('large_motor', 0, 'outA'), ('large_motor', 1, 'outB')]) |
134 | 204 |
|
135 | 205 | drive = MoveTank(OUTPUT_A, OUTPUT_B) |
| 206 | + |
| 207 | + # simple case (degrees) |
| 208 | + drive.on_for_degrees(50, 25, 100) |
| 209 | + self.assertEqual(drive.left_motor.position_sp, 100) |
| 210 | + self.assertEqual(drive.left_motor.speed_sp, 0.50 * 1050) |
| 211 | + self.assertEqual(drive.right_motor.position_sp, 50) |
| 212 | + self.assertAlmostEqual(drive.right_motor.speed_sp, 0.25 * 1050, delta=0.5) |
| 213 | + |
| 214 | + # simple case (rotations, based on degrees) |
136 | 215 | drive.on_for_rotations(50, 25, 10) |
| 216 | + self.assertEqual(drive.left_motor.position_sp, 10 * 360) |
| 217 | + self.assertEqual(drive.left_motor.speed_sp, 0.50 * 1050) |
| 218 | + self.assertEqual(drive.right_motor.position_sp, 5 * 360) |
| 219 | + self.assertAlmostEqual(drive.right_motor.speed_sp, 0.25 * 1050, delta=0.5) |
| 220 | + |
| 221 | + # negative distance |
| 222 | + drive.on_for_rotations(50, 25, -10) |
| 223 | + self.assertEqual(drive.left_motor.position_sp, -10 * 360) |
| 224 | + self.assertEqual(drive.left_motor.speed_sp, 0.50 * 1050) |
| 225 | + self.assertEqual(drive.right_motor.position_sp, -5 * 360) |
| 226 | + self.assertAlmostEqual(drive.right_motor.speed_sp, 0.25 * 1050, delta=0.5) |
| 227 | + |
| 228 | + # negative speed |
| 229 | + drive.on_for_rotations(-50, 25, 10) |
| 230 | + self.assertEqual(drive.left_motor.position_sp, -10 * 360) |
| 231 | + self.assertEqual(drive.left_motor.speed_sp, 0.50 * 1050) |
| 232 | + self.assertEqual(drive.right_motor.position_sp, 5 * 360) |
| 233 | + self.assertAlmostEqual(drive.right_motor.speed_sp, 0.25 * 1050, delta=0.5) |
137 | 234 |
|
138 | | - self.assertEqual(drive.left_motor.position, 0) |
| 235 | + # negative distance and speed |
| 236 | + drive.on_for_rotations(-50, 25, -10) |
139 | 237 | self.assertEqual(drive.left_motor.position_sp, 10 * 360) |
140 | | - self.assertEqual(drive.left_motor.speed_sp, 1050 / 2) |
| 238 | + self.assertEqual(drive.left_motor.speed_sp, 0.50 * 1050) |
| 239 | + self.assertEqual(drive.right_motor.position_sp, -5 * 360) |
| 240 | + self.assertAlmostEqual(drive.right_motor.speed_sp, 0.25 * 1050, delta=0.5) |
141 | 241 |
|
142 | | - self.assertEqual(drive.right_motor.position, 0) |
143 | | - self.assertEqual(drive.right_motor.position_sp, 5 * 360) |
144 | | - self.assertAlmostEqual(drive.right_motor.speed_sp, 1050 / 4, delta=0.5) |
| 242 | + # both speeds zero but nonzero distance |
| 243 | + drive.on_for_rotations(0, 0, 10) |
| 244 | + self.assertEqual(drive.left_motor.position_sp, 10 * 360) |
| 245 | + self.assertAlmostEqual(drive.left_motor.speed_sp, 0) |
| 246 | + self.assertEqual(drive.right_motor.position_sp, 10 * 360) |
| 247 | + self.assertAlmostEqual(drive.right_motor.speed_sp, 0) |
| 248 | + |
| 249 | + # zero distance |
| 250 | + drive.on_for_rotations(25, 50, 0) |
| 251 | + self.assertEqual(drive.left_motor.position_sp, 0) |
| 252 | + self.assertAlmostEqual(drive.left_motor.speed_sp, 0.25 * 1050, delta=0.5) |
| 253 | + self.assertEqual(drive.right_motor.position_sp, 0) |
| 254 | + self.assertAlmostEqual(drive.right_motor.speed_sp, 0.50 * 1050) |
| 255 | + |
| 256 | + # zero distance and zero speed |
| 257 | + drive.on_for_rotations(0, 0, 0) |
| 258 | + self.assertEqual(drive.left_motor.position_sp, 0) |
| 259 | + self.assertAlmostEqual(drive.left_motor.speed_sp, 0) |
| 260 | + self.assertEqual(drive.right_motor.position_sp, 0) |
| 261 | + self.assertAlmostEqual(drive.right_motor.speed_sp, 0) |
145 | 262 |
|
146 | 263 | def test_tank_units(self): |
147 | 264 | clean_arena() |
@@ -172,6 +289,21 @@ def test_steering_units(self): |
172 | 289 | self.assertEqual(drive.right_motor.position, 0) |
173 | 290 | self.assertEqual(drive.right_motor.position_sp, 5 * 360) |
174 | 291 | self.assertEqual(drive.right_motor.speed_sp, 200) |
| 292 | + |
| 293 | + def test_steering_large_value(self): |
| 294 | + clean_arena() |
| 295 | + populate_arena([('large_motor', 0, 'outA'), ('large_motor', 1, 'outB')]) |
| 296 | + |
| 297 | + drive = MoveSteering(OUTPUT_A, OUTPUT_B) |
| 298 | + drive.on_for_rotations(-100, SpeedDPS(400), 10) |
| 299 | + |
| 300 | + self.assertEqual(drive.left_motor.position, 0) |
| 301 | + self.assertEqual(drive.left_motor.position_sp, -10 * 360) |
| 302 | + self.assertEqual(drive.left_motor.speed_sp, 400) |
| 303 | + |
| 304 | + self.assertEqual(drive.right_motor.position, 0) |
| 305 | + self.assertEqual(drive.right_motor.position_sp, 10 * 360) |
| 306 | + self.assertEqual(drive.right_motor.speed_sp, 400) |
175 | 307 |
|
176 | 308 | def test_joystick_units(self): |
177 | 309 | clean_arena() |
|
0 commit comments