前面我们讲了如何遥控小车前进后退,以及使用传感器自动停止。但是,细心的童鞋可能发现了,这个小车不能拐弯,只能走直线,这样就少了很多乐趣。
为啥这个小车不能拐弯呢?因为要拐弯,需要控制前轮转向,或者控制两个轮子的转速,通过转速差实现转向。
控制前轮转向比较麻烦,而控制两个轮子的转速比较简单。我们把小车升级一下,用两个马达搭建一个坦克:
这个坦克除了有两个马达控制左右轮之外,还有一个马达控制炮台转动。
通过两个马达控制转速实现转向时,我们只要根据轮子的直径、轮距,就可以计算出在给定速度和转向角度时两个马达的转速,计算过程如下:
$#%&^@!&$#;!~%¥%:(……
因为计算过程比较繁琐,所以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) 为原点的坐标,以便于计算。
最后来看看实际效果:
参考源码
tank
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://www.haodehen.cn/did92711