智能车心得分享(六)-- 电磁入环

这篇具有很好参考价值的文章主要介绍了智能车心得分享(六)-- 电磁入环。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

这一篇算是为智能车画上个句号吧,之后看会不会分享下其他的东西,有点懒,一开始还想着能不能周更,最后变成年更了,hhh,不知道之前说的东西有没有帮助到大家。

电磁入环分几部分来讲,首先要给大家介绍一个思想,就是摄像头可以补线,为什么电磁不能补线呢?我们可以通过补偿差比和的值来达到入环的需要。

电磁入环分为下面几部分:1.检测环岛(预环岛),2.确定环岛,3.入环,4.再次检测环岛,5.出环

以左环岛为例子:
智能车心得分享(六)-- 电磁入环
根据代码来讲解:
链接
https://gitee.com/HSqian/zhinengchexiaosaisanlun.git
智能车心得分享(六)-- 电磁入环

  1. 差比和结果(adc_RTT文件中)
if (Compensate_flag == 1)
		{
			dif_and_add = ADC_Compensate + 100 * err_get(Horizontal_L, Chevron_inL, Chevron_inR, Horizontal_R, Turn_A, Turn_B);
		}
else
		{	
			//滑动均值滤波
			cur_tem = 100 * err_get(Horizontal_L, Chevron_inL, Chevron_inR, Horizontal_R, Turn_A, Turn_B); //差比和(差)求偏离程度
			dif_and_add = 0.5 * cur_tem + 0.5 * last_nine;
			last_nine = moving_filter(cur_tem);
		}

这一部分就是计算差比和的结果,如果需要补偿,会给一个补偿值Compensate,不然就进行一阶滤波和窗口滤波。
这里比较精髓的就是Compensate这个值,所有的入环和出环都是通过补偿来进行操作的。
Turn_A是用来控制横电感的,Turn_B是用来控制内八字电感的
Turn_A是用来控制横电感的,Turn_B是用来控制内八字电感的
Turn_A是用来控制横电感的,Turn_B是用来控制内八字电感的
Turn_A是用来控制横电感的,Turn_B是用来控制内八字电感的
Turn_A是用来控制横电感的,Turn_B是用来控制内八字电感的
Turn_A是用来控制横电感的,Turn_B是用来控制内八字电感的
为了防止没看懂,多重复几遍
走直线用的主要是横电感,故Turn_A大;入环用的是内八,故Turn_B大

下面的(图中X处)都是if判断的位置!!!
2. 预环岛(图中1处)

 switch (ring_state)
    {
    case ring_noring:
    {
        /*
        	@明显可以看出 Chevron_outR/Chevron_outL 中的某一个为判断到了环岛的必要条件
        	@主要区别和十字还有车身歪了的时候导致的误判
        	@
        */

           if (Chevron_outL > 15) //右侧环岛,此时需要保证右侧水平的值大于一个值,保证不是因为车歪了导致达到较大值
        {
            ring_state = ring_rightring;
            right_ring_mode = 1; //此标志位是为了在real_out阶段中使用,判断左侧出环还是右侧出环

            flag_buzzer = 1;
            flag.ring = 1;
            flag.fork = 0;
            flag.ramp = 0; //当在进入环岛时将其他所有的标志位记为0

            //------------------此处修改三岔大小
            Ring_Size = Midring;
#if TIMES //多环岛?
            if (right_time == 0)
            {
                Ring_Size = Midring;
            }
            else if (right_time == 1)
            {
                Ring_Size = Midring;
            }

#endif

        } //-------第一声

        //if (Chevron_outL >= 90 && Horizontal_L > 20 && Chevron_inL > 15 && Chevron_inR >10&&((30>Chevron_outR)&& (Chevron_outR>15)))//力创条件
        else if (Chevron_outL >= 90 && Horizontal_L > 20 && Chevron_inL > 15 && Chevron_inR > 10 && zebra_flag == 0)//斑马线标志位0菜鸟判断
        {
            ring_state = ring_leftring;
            left_ring_mode = 1; //此标志位是为了在real_out阶段中使用,判断左侧出环还是右侧出环

            flag_buzzer = 1;
            flag.ring = 1;
            flag.fork = 0;
            flag.ramp = 0; //当在进入环岛时将其他所有的标志位记为0

            //------------------此处修改三岔大小
            Ring_Size = Midring;
#if TIMES //多环岛?
            if (left_time == 0)
            {
                Ring_Size = Midring;
            }
            else if (left_time == 1)
            {
                Ring_Size = Midring;
            }
#endif
        }
    };
    break; //-------第一声

这一部分是用来判断是左环岛还是右环岛,并修改环岛的大小(不同环岛的补偿和补偿时间需要调整),只是进行判断,以及给定 Ring_Size的大小(后面需要使用)。

  1. 入左环(图中2处)
   case ring_leftring:
    {
        Turn_B = 0.8;
        Turn_A = 0.2;
        if (Compensate_flag == 0)
        {
            Ringin_Size_Chose(Ring_Size);
        }

        if (Ring_Delay == 0) //根据引导长度修改“Ring_Delay”的值
        {
            ring_state = ring_prein;
            flag_buzzer = 1;
#if TIMES //多环岛?
            left_time += 1;
#endif
        }
    };

Turn_B = 0.8,Turn_A = 0.2;修改差比和差中电感的权重,并且执行 Ringin_Size_Chose()函数。
接下来讲解 Ringin_Size_Chose()

void Ringin_Size_Chose(int Size)
{
    Compensate_flag = 1;

    switch (Size)
    {
    case Bigring:
    {
        if (right_ring_mode == 1)
        {
            Ring_Delay = 130;
            ADC_Compensate = -30; //左侧要补正,右侧为负
        }
        else if (left_ring_mode == 1)
        {
            Ring_Delay = 130;
            ADC_Compensate = 30; //左侧要补正,右侧为负
        }
    }
    break;

    case Midring:
    {
        if (right_ring_mode == 1)
        {
            Ring_Delay = 100;
            ADC_Compensate = -30; //左侧要补正,右侧为负
        }
        else if (left_ring_mode == 1)
        {
            Ring_Delay = 200;
            ADC_Compensate = 30; //左侧要补正,右侧为负
        }
    }
    break;

    case Smallring:
    {
        if (right_ring_mode == 1)
        {
            Ring_Delay = 80;
            ADC_Compensate = -30; //左侧要补正,右侧为负
        }
        else if (left_ring_mode == 1)
        {
            Ring_Delay = 80;
            ADC_Compensate = 30; //左侧要补正,右侧为负
        }
    }
    break;

    default:
        break;
    }
}

首先,将Compensate_flag = 1,意味着1中差比和的值需要进行补偿,而补充的大小则是通过Ring_Size左右环来确定,Ring_Delay就是补偿的时间,不同的车速,这个值是有区别的,需要修改,相当于强制把车推进环岛的时间。

  1. 预入环(图中3处)
   case ring_prein:
    {
        Compensate_flag = 0;
        if (Horizontal_R + Horizontal_R < 120)
        {
            ring_state = ring_ringin;
            flag_buzzer = 1;
            Ring_Delay = 50;
        }
    };
    break; //-------第三声

把补偿置0,停止补偿

  1. 入环(图中3处)(没错和预入环差不多是在一个位置)
   case ring_ringin:
    {
        Target_Speed = Gear[0];
        Turn_A = 0.8;
        Turn_B = 0.2;
        if (Chevron_outL > 90 || Chevron_outR > 90 || Ring_Delay == 0)
        {
            ring_state = ring_out;
            flag_buzzer = 1;
            Ring_Delay = 50;
        }
    };
    break; //-------第四声

修改权值,改变环内速度

  1. 出环(图中4处)
   case ring_out:
    {
        Target_Speed = Gear[0];
        Turn_A = 0.8;
        Turn_B = 0.2;
        if ((GFP_abs(Horizontal_R - Horizontal_L) < 10 &&
             (Horizontal_R < 90 || Horizontal_L < 90)) ||
            Ring_Delay == 0)
        {
            ring_state = ring_realout;
            flag_buzzer = 1;
            Ring_Delay = 50;
        }
    }
    break;

重新给权值,用来出环

  1. 雀食出环(图中5处)
   case ring_realout:
    {
        Ringout_Size_Chose(Ring_Size);

        if (Horizontal_L + Horizontal_R < 100 || Ring_Delay == 0)
        {
            Turn_A = 1;
            flag_buzzer = 1;
            ring_state = ring_noring;
            Compensate_flag = 0;

            flag.ring = 0; //将环岛标志位置为0
            left_ring_mode = 0;
            right_ring_mode = 0;
        }
    };
    break;

Ringout_Size_Chose(Ring_Size)这个和进去的类似,就是补偿值是反的。

会发现里面有很多 Ring_Delay,一个目的是为了防止连续判断标志位,做间隔(防误判),另一个目的是为了做延时进入。

以上就是所有了。江湖有缘再见。文章来源地址https://www.toymoban.com/news/detail-406433.html

到了这里,关于智能车心得分享(六)-- 电磁入环的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 动态规划学习心得分享

    最近在代码随想录(代码随想录)刷了一些有关动态规划的算法题,收获还蛮大的,下面是我的一些学习心得分享,不足之处敬请批评指正~ 首先来简单介绍一下什么是动态规划以及动规与贪心有何区别?         动态规划(Dynamic Programming),简称DP,用以解决有很多重叠

    2024年02月08日
    浏览(30)
  • 探索微软Edge:使用方法和心得分享

        了解微软Edge的基本功能和使用方法。 掌握在微软Edge上进行浏览、搜索和书签管理的技巧。 学习如何使用微软Edge进行隐私和安全管理。 探索微软Edge的扩展和其他高级功能。 微软Edge的简介:了解微软Edge的起源、特点和与其他浏览器的区别。 基本功能和界面:学习打开

    2024年02月04日
    浏览(81)
  • 2022 届大四学长实习心得、职场经验分享、转型思考

    博主简介: Developer 小马,全栈领域创作者; 2022年本科应届毕业生,网络工程专业,北京某司前端开发工程师; 未来发展方向研发项目管理,已考过软考中项(系统集成项目管理工程师);正着手准备软考高项。  2022 年 4 月 27 日,作为前端开发实习生的最后一天,小马也从公

    2024年02月09日
    浏览(33)
  • FPGA学习心得分享——交通灯(EGO1)

      学期快结束了,学了一个学期FPGA课程,通过自己思索加上老师的指导我完成了自己第一份交通灯的作业,我希望把经验分享给学习Verilog遇到困难的同学,更希望大家都能顺利完成自己的作业。   灯能左右改变方向,作品能够模拟红、黄、绿、左右转弯灯等形式,按键可以

    2024年02月07日
    浏览(50)
  • 第十三届蓝桥杯EDA赛项国奖心得分享

    一、前言 本文作者参与了十三届蓝桥杯EDA赛项,通过自我准备成功拿到省一,最终获得国奖 本文将对如何准备省赛国赛及本届省赛国赛难易度进行一些简单分享,希望能够为广大学子更好参与这项赛事,使用好嘉立创EDA平台进行原理图设计和PCB设计有一定的借鉴价值。 二、

    2023年04月09日
    浏览(39)
  • 人工智能课程心得

            我第一次听说人工智能这个词源自初中的时候AlphaGo与李世石的围棋比赛,印象中的AlphaGo以大比分的优势击败了李世石,后来经过了解知道了在2016年比赛时的李世石是近十年来获得世界冠军最多的棋手。从表面上来看,李世石当时是和一台机器下棋,实际上也是与

    2024年02月12日
    浏览(52)
  • k-means聚类算法 心得分享(含python实现代码)

    目录 1.K-means聚类算法 1.1 引言: 1.2 K-Means 算法的基本思想 1.3 K-Means 算法的优缺点: 1.4 K-Means 算法的应用: 2.K-means聚类算法的实现具体步骤 2.1初始化聚类中心 2.2计算每个数据点到聚类中心的距离 2.3确定每个数据点所属聚类簇 2.4更新聚类中心 2.5循环执行步骤2-4,直到达到最

    2024年02月02日
    浏览(46)
  • AI绘图学习心得分享-Midjourney绘画AI,让你少走一些弯路

    本教程收集于:AIGC从入门到精通教程 AI绘图学习心得分享-Midjourney绘画AI,让你少走一些弯路 本篇没有什么长篇大论,全部都是实用心得总结。接下来,我们将分享关于Midjourney绘画AI的实用心得总结,包括构图指令结构、常用指令、操作技巧、常用风格词汇和构图词汇。 如果

    2024年02月09日
    浏览(54)
  • ChatGpt3.5已经应用了一段时间,分享一些自己的使用心得.

             首先ChatGpt3.5的文本生成功能 十分强大 ,但是chatgpt有一些使用规范大家需要注意,既然chat是一种工具,我们就需要学会它的使用说明,学会chatgpt的引用语句,会极大的方便我们的使用。我们需要做以下的准备。 明确任务和目的:在使用ChatGPT进行文本生成之前,

    2024年02月04日
    浏览(48)
  • 看美团阿里大佬分享:程序员职业规划?大数据职业规划心得

    那我就给大家来分享一下 我作为一个 技术人员怎么从一个岗位 然后转行到另外一个岗位的 首先前面的一个介绍呢 也已经给大家做了一个简单的介绍 目前的话我是在职 然后是做数据方面的一个工作 然后之前的话也在国企 还有一些主流的一些大厂也待过 然后的话 我讲一下

    2023年04月24日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包