0


智能车——三轮差速

在之前摄像头组都是用的4轮的车,我之前也是用四轮车练手的,后来比赛规则出来了,变成要用三轮车了,三轮的前轮就是个摆设,任何移动转弯都要靠后边的两个轮,所以差速就尤为重要了,之前在学校写了2套三轮的差速,但是一直没时间上赛道,(因为学校没有),后来放假回家买了一套赛道,结果赛道刚来就得新冠了,兜兜转转昨天才铺好赛道,元旦第一次上道,从上午10点一直搞到晚上11点,代码修修改改,删删减减,最后能跑直道和弯道。S弯道按照理论来说也是可以跑得,但是因为一共用了4个pid,以及驱动没有最终确认,所以嘛就没有太精细的调参数,大概调一调,能用就行了,不然的话,换了驱动还要重新调12个参数调起来还是很累的。

下面说一说思路:速度我是用了两个pid(左轮一个pid右轮一个pid,因为我这个左右轮有点误差),

差速我用了两个pid,先用差速pid得到一个轮的速度,再把这个轮的速度和另一个轮的速度误差pid,就是让这个轮追上那个轮,然后把两个轮的速度分别进行pid,就是相当于一个串级pid。你先看这些就行,把串级pid的概念和摄像头获取图像的原理和摄像头扫线的原理好好看看,我下午给你讲一下差速的代码。

上一下代码

void chasu_zhidao(float you_speed,float zuo_speed)//直道差速PID,让两个电机速度相等
{
//清零
     speed_you=0;
     speed_zuo=0;
    float xunxian_cha_T=0;
    float cha_puchang_T=0;
//让电机跑起来,前边是左轮右轮,后边是速度
    PID.INC_pid(&rmor_spd,you_speed);
    PID.INC_pid(&lmor_spd,zuo_speed);
    //得到两个轮的实际转速
    speed_you=rmor_spd.act;
    speed_zuo=lmor_spd.act;

    temp=(float)(centerline[70]);
    xunxian_cha=94-temp;//括号内的数代表中线的y坐标,根据摄像头高度进行调整100 40
   xunxian_cha=kp1*xunxian_cha+ki1*xunxian_cha+kd1*(xunxian_cha-xunxian_cha);//误差的PID运算公式
    lastxunxian_cha=xunxian_cha;//上一次的误差
        if(xunxian_cha>0)
        {
            speed_you+=xunxian_cha;//右轮加速
        }
         if(xunxian_cha<0)
        {
             xunxian_cha_T=-(xunxian_cha);
            speed_zuo+=xunxian_cha_T;//右轮
        }

    //差速PID补偿右轮速度

        cha_puchang=speed_zuo-speed_you;
        cha_puchang=kp2*cha_puchang+ki2*cha_puchang+kd2*(cha_puchang-last_cha_puchang);//误差的PID运算公式
        last_cha_puchang=cha_puchang;//上一次的误差
        if(cha_puchang>0)//左轮比右轮快
        {
            speed_you+=cha_puchang;

        }
         if(cha_puchang<0)//右轮比左轮块
        {
            cha_puchang_T=-(cha_puchang);
            speed_zuo+=cha_puchang_T;

        }

}

本文转载自: https://blog.csdn.net/chu_kuang_/article/details/128519194
版权归原作者 -chu_kuang- 所有, 如有侵权,请联系我们删除。

“智能车——三轮差速”的评论:

还没有评论