任务2 匀加速/减速运动
在前面机器人运动过程中,你是否发现机器人在每次启动和停止的时候,是不是有些太快,从而导致机器人几乎要倾倒。为什么会这样呢?
回忆一下学过的物理知识,还记得牛顿第二定律和运动学知识吗?前面的程序总是直接就给机器人伺服电机输出最大速度控制命令。根据运动学知识,一个物体要从零加速到最大运动速度时,时间越短,所需加速度就越大。而根据牛顿定律,加速度越大,物体所受的惯性力就越大。因此,前面的程序因为没有给机器人足够的加速时间,所以受到的惯性力就比较大,从而导致机器人在启动和停止时有一个较大的前倾力或者后坐力。要消除这种情况,就必须让机器人速度逐渐增加或逐渐减小。采用均匀加速或减速是一种比较好的速度控制策略,这样不仅可以让机器人运动得更加平稳,还可以增加机器人电机的使用寿命。
编写匀加速运动程序
匀加速运动程序片段示例:
for(pulseCount=10;pulseCount<=200;pulseCount=pulseCount+1) { P1_1=1; delay_nus(1500+pulseCount); P1_1=0; P1_0=1; delay_nus(1500-pulseCount); P1_0=0; delay_nms(20); }
上述for循环语句能使机器人的速度由停止到全速。循环每重复执行一次,变量pulseCount就增加1:第一次循环时,变量pulseCount的值是10,此时发给P1_1、P1_0的脉冲的宽度分别为1.51ms、1.49ms;第二次循环时,变量pulseCount的值是11,此时发给P1_1、P1_0的脉冲的宽度分别为1.511ms、1.489ms。随着变量pulseCount值的增加,电机的速度也在逐渐增加。到执行第190次循环时,变量pulseCount的值是200,此时发给P1_1、P1_0的脉冲的宽度分别为1.7ms、1.3ms,电机全速运转。
回顾第2讲的任务3,for循环也可以由高向低计数。可以通过使用for(pulseCount=200;pulseCount>=0;pulseCount=pulseCount-1)来实现速度的逐渐减小。下面是一个使用for循环实现电机速度逐渐增加到全速然后逐步减小的例子。
例程:StartAndStopWithRamping.c
#include<BoeBot.h> #include<uart.h> int main(void) { int pulseCount; uart_Init(); printf("Program Running!\n"); for(pulseCount=10;pulseCount<=200;pulseCount=pulseCount+1) { P1_1=1; delay_nus(1500+pulseCount); P1_1=0; P1_0=1; delay_nus(1500-pulseCount); P1_0=0; delay_nms(20); } for(pulseCount=1;pulseCount<=75;pulseCount++) { P1_1=1; delay_nus(1700); P1_1=0; P1_0=1; delay_nus(1300); P1_0=0; delay_nms(20); } for(pulseCount=200;pulseCount>=0;pulseCount=pulseCount-1) { P1_1=1; delay_nus(1500+pulseCount); P1_1=0; P1_0=1; delay_nus(1500-pulseCount); P1_0=0; delay_nms(20); } while(1); }
● 输入、保存并运行程序StartAndStopWithRamping.c;
● 验证机器人是否逐渐加速到全速,保持一段时间,然后逐渐减速到停止。
该你了
可以创建一个程序,将加速或减速与其他的运动结合起来。下面是一个逐渐增加速度向后走而不是向前走的例子。加速向后走与向前走的唯一不同之处在于发给P1_1的脉冲的宽度由1.5ms逐渐减小,而向前走是逐渐增加的;相应的,发给P1_0的脉冲的宽度由1.5ms逐步增加。
for(pulseCount=10;pulseCount<=200;pulseCount=pulseCount+1) { P1_1=1; delay_nus(1500-pulseCount); P1_1=0; P1_0=1; delay_nus(1500+pulseCount); P1_0=0; delay_nms(20); }
也可以通过增加程序中两个pulseCount的值到1500来创建一个在旋转中匀变速的程序。通过逐渐减小程序中两个pulseCount的值,可以沿另一个方向匀变速旋转。这是一个匀变速旋转四分之一周的例子。
for(pulseCount=1;pulseCount<=65;pulseCount++)//匀加速向右转 { P1_1=1; delay_nus(1500+pulseCount); P1_1=0; P1_0=1; delay_nus(1500+pulseCount); P1_0=0; delay_nms(20); } for(pulseCount=65;pulseCount>=0;pulseCount--)//匀减速向右转 { P1_1=1; delay_nus(1500+pulseCount); P1_1=0; P1_0=1; delay_nus(1500+pulseCount); P1_0=0; delay_nms(20); }
从任务1中打开程序ForwardLeftRightBackward.c,另存为ForwardLeftRightBackward-Ramping.c。
更改新的程序,使机器人的每一个动作都能够匀加速和匀减速。
提示:你可以使用上面的代码片段和StartAndStopWithRamping.c程序中相似的片段。