在乐高 Powered Up 编程进阶教程(一)中,我们分享了实现转向控制的几个基本功能(转向车辆基本控制、方向自动回正、方向初始化找中)的编程实现方法。利用上述功能能够实现基本的转向控制,但是还有几个方面可以进行优化,包括转向范围控制、转向速度控制等,本文就转向范围控制问题进行分享。
一、转向范围控制
通常我们会利用滑动控制器来控制车辆方向,但是滑动控制器的取值范围为(-100,100),而车辆的实际转向角度各不相同。


为了有更好的转向控制体验,我们需要将控制器的取值范围(-100,100)与车辆转向电机实际能够转动的角度范围进行线性对应。假如转向电机的转动度数范围为(-180°,180°),那么我们需要在控制器设置为100时,电机转动至180°,在控制器设置为50时, 电机转动至90°,以此类推。
然而不同车辆的转向系统不一样,其转向电机的转动范围也不同,并且我们很难事先得到电机转动范围的精确值,因此需要用程序自动实现上述线性对应。下面是实现思路和编程实现过程。
一、实现思路
(1)利用方向初始化找中程序,记录下车辆转向电机的可转动范围,最左侧位置记为a,最右侧位置记为b;
(2)计算电机转动范围(b-a)的绝对值与控制器取值范围(200)的比值,记为g,即g=|b-a|/200
(3)在转向控制时,将控制器的设定值(记为x)乘以g,记为转向电机需要转动的角度值(记为y)即
y = g x = |b-a|x/200
假设转向电机的转动度数范围为(-180°,180°) ,则 a=-180,b=180,那么 y = 1.8x,其对应关系如下图所示。

二、编程实现过程
(1)执行初始化找中程序,同时记录最左侧位置记为a,最右侧位置记为b。该程序已经在进阶教程(一)中进行了详细说明。
(2)在转向控制时,将控制器的取值乘以系数(|b-a|/200)后,赋值给转动电机,注意考虑电机精度问题,设置一个误差冗余度(本例中设置为3度。关于电机精度问题,详见进阶教程(一))。


转向电机抖动,怎么解决?
这个应该是因为电机控制精度问题,因为电机实际到达的位置跟指令位置会有一两度的偏差,所以导致电机不停地在调整,解决措施的话一个是考虑增加一个误差冗余量,就是当电机实际位置跟目标位置的差大于某个值时,才动作。具体可以看https://www.legofind.com/archives/879
这个误差冗余量可以通过测试调整取值。
还有一种处理方式,原理跟上面类似,是将转向位置划分为几个区域(比如8个),当控制指令在某个区域内时,转向位置就在该区域内保持不变,只有当指令到达其他区域是,转向位置才会动作到对应的区域。这个我会在后面单独写一篇文章介绍。