写在前面

列出一些我之前写的底盘调试的博客,在看这篇文章之前最好看一下,便于理解

在之前的文章里,我已经讲过了光电传感器回传的数据格式以及基本的购物机器人的姿态调整方案,那么在这篇文章里我将分享购物机器人是如何完成转弯类动作

效果展示

流程讲解

自然语言

转弯的速度控制有这么一个特点,那就是起始速度一定是0,终止速度一定是0,因此在速度控制上有特别的写法。速度控制中,在开始的时候肯定是需要先加速到转弯最高速度,达到了最高速度之后进入到减速标志的判断,左转的时候是前面的光电传感器的最左边碰到了白线开始减速,右转的时候是前面的光电传感器的最右边碰到了白线开始减速,减速状态会一直保持到购物机器人到达最低速度,并且最低速度会一直持续到购物机器人感知到停车的信号,当购物机器人感知到停车信号之后就会停止运动,并等待树莓派指令,如果树莓派没发指令,底盘子系统是不会运动的

程序讲解

购物机器人转弯的过程中,4个轮子都给了一样的速度,购物车就能够实现原地转弯。接下来我将从转弯状态速度控制来进行分析

set_spd[motor_b_r]=-1*turn_speed;
set_spd[motor_f_r]=-1*turn_speed;
set_spd[motor_b_l]=-1*turn_speed;
set_spd[motor_f_l]=-1*turn_speed;

转弯状态

首先我们来看程序,all_black可以认为是状态转换的一个标志位,理解的时候可以不用去管它,3个if语句分别对应着3个状态,接下来我将按不同的状态进行分析,这里我以左转为例子进行分析,右转同理

case LEFT : //turn left
    if(((uart7Rx[1]!=0x00)||(uart7Rx[0]!=0x00))&&(all_black!=0x00)){
        all_black=0x20;
    }
    if((uart7Rx[1]==0x00)&&(uart7Rx[0]==0x00)&&(all_black==0x20)){
        all_black=0x00;
    }
    if(((all_black==0x00)&&((uart7Rx[1])&0x10)==0x10)){
        stop_task();
    }
    break;

阶段1

这个阶段用自然语言来描述的话就是开始转弯的时候,前面的光电传感器还没有脱离白线

if(((uart7Rx[1]!=0x00)||(uart7Rx[0]!=0x00))&&(all_black!=0x00)){
        all_black=0x20;
}

阶段2

这个阶段可以认为是购物机器人转弯的时候已经转到了中间的部分,前面的光电传感器感知到的全部都是黑色的背景

if((uart7Rx[1]==0x00)&&(uart7Rx[0]==0x00)&&(all_black==0x20)){
    all_black=0x00;
}

阶段3

在阶段2之后购物机器人的转弯过程中如果前面特定的光电传感灯碰到了白线,说明购物机器人此时已经完成了转弯,可以停车了。

if(((all_black==0x00)&&((uart7Rx[1])&0x10)==0x10)){
        stop_task();
}


uart7Rx[1])&0x10判断的是这颗灯,其他的类似,要获得其他灯的状态换一下&的数字就可以

速度控制

流程图

程序分析

流程图已经比较清晰的表达了这段程序的逻辑,不再做赘述,这里讲解一些细节的东西,mid_speed是转弯的最高速度,这里转弯的最高速度要与直走的最高速度进行区分,因为转弯转太快的话可能停车的时候刹不住车导致停车的时候姿态不好,影响后面的循迹。
理解了上面获取灯的状态的方法之后来看看uart7Rx[0]&0x01uart7Rx[1]&0x80)==0x80分别取的哪2个灯?文末给出答案。

switch(cut_spd){
    case 0:                
        if ((mid_cnt-cross_sta)==(STEP-1)){
            if(turn_speed<=low_speed){
                turn_speed+= add_val;
            }else{
                cut_spd=1;
            }
        }else if(turn_speed<mid_speed){                                                                //加速过程
            turn_speed+= add_val;
        }
        break;
    case 1:
        if(((uart7Rx[0]&0x01)==0x01&&(MOV_STA==LEFT))||((uart7Rx[1]&0x80)==0x80&&(MOV_STA==RIGHT))){
            cut_spd = 2;
        }else if(turn_speed<mid_speed)                                                                //加速过程
            turn_speed += add_val;
        break;
    case 2:
        if((speed>=turn_lowspeed)){
            turn_speed-=cut_val;
        }
        break;
    }

答案很简单,其实就是最左边和最右边的2个灯啦~


(づ ̄3 ̄)づ╭❤~一键三连,这次一定(๑•̀ㅂ•́)و✧