前面我们讲了如何遥控小车前进后退,以及使用传感器自动停止。但是,细心的童鞋可能发现了,这个小车不能拐弯,只能走直线,这样就少了很多乐趣。
为啥这个小车不能拐弯呢?因为要拐弯,需要控制前轮转向,或者控制两个轮子的转速,通过转速差实现转向。
控制前轮转向比较麻烦,而控制两个轮子的转速比较简单。我们把小车升级一下,用两个马达搭建一个坦克:
这个坦克除了有两个马达控制左右轮之外,还有一个马达控制炮台转动。
通过两个马达控制转速实现转向时,我们只要根据轮子的直径、轮距,就可以计算出在给定速度和转向角度时两个马达的转速,计算过程如下:
$#%&^@!&$#;!~%¥%:(……
因为计算过程比较繁琐,所以EV3直接提供了一个DriveBase类自动计算并设定两个马达的转速。我们用一个Driver类包装一下,实现如下:
class Driver():
def __init__(self, leftMotor, rightMotor, diameter, axle):
self.driver = DriveBase(leftMotor, rightMotor, diameter, axle)
self.x = 0
self.y = 0
self.speed = 0
self.steering = 0
def drive(self, speed, steering):
self.speed = speed
self.steering = steering
if self.speed == 0:
self.driver.stop()
else:
self.driver.drive(self.speed, self.steering)
在Robot类中,我们需要传入必要的参数以构造Driver:
class Robot():
def __init__(self, leftMotor, rightMotor, diameter, axle, maxSpeed=300, maxSteering=180):
self.driver = Driver(leftMotor, rightMotor, diameter, axle)
self.speedStep = 32767 // maxSpeed
self.steeringStep = 32767 // maxSteering
...
def drive(self, x, y):
speed = -y // self.speedStep
steering = x // self.steeringStep
self.driver.drive(speed, steering)
当我们从摇杆接收到x、y坐标后,先转换成速度和转向角度,再调用DriveBase.drive(speed, steering)方法,即可按指定速度和角度转向。注意到x、y坐标先处理成以(0, 0)为原点的坐标,以便于计算。
最后来看看实际效果: