【智能车学习】电磁车算法优化总结

目录

  • 前言
  • 电感排布方案
  • 舵机算法修正
    • 分段式PD算法
    • 使用函数曲线整定PD参数
  • 电机控制
    • 目标速度的确定
    • 差速控制算法
  • 特殊元素处理
    • 环岛处理
    • 防坡道误判
  • 其他辅助结构
    • 屏幕显示
    • 按键控制与拨码开关
  • 写在最后

前言

随着省赛的落幕,近一年的智能车的生涯也就此画上了句号,虽然结果没有那么耀眼,但也算对得起三个大一萌新这么久以来不分昼夜所付出的心血。
在此我想对电磁车中的算法和赛场上一些的状况作进一步总结,也算是给自己一个交代。

电感排布方案

我们知道,电感的基本排布分为水平,竖直和八字几种方案,而电感摆放位置的不同,可能会影响车体循迹的姿态。
通过实测我们发现:水平电感有助于直道循迹,八字电感,则有赛车助于过弯,竖直电感在普通赛道上值几乎很小,只有在某些特殊元素(如环岛)才会突增。
我们采用的是水平和八字电感共同循迹的方式,即在左右两端分别放上八字和水平电感,在电磁杆的中间和靠近赛车的中心位置各放置一个水平电感,用于特殊元素判断。具体排布可参考下图。
另外,为了更精确的采集赛道电磁值以至于不失真,需将电磁前瞻的高度稍微降低。
前瞻方案

舵机算法修正

基本的舵机控制算法在上篇文章中已经提过,这里对其部分优化方案进行说明。

分段式PD算法

而在PD参数中,P参数控制响应速度,D参数消除稳差,那么可以想到,如果全局使用同一个PD参数,则会出现无法控制既在直道上平稳运行,又能很好的过各种弯道的局面。这时候就需要我们对PD参数进行分段控制。
而由于电磁车只能依靠电感传回的电磁信号判断赛道路况,所以可以将左右两边的电感值差作为分段控制的依据。
具体代码如下:

    /* * * 分段PD * * */if(backup<=15)    angle_P=60;else              angle_P=95;

其中backup即为左右电感求得的偏差值,backup的值可以根据具体赛道及电感情况进行缩放处理。

使用函数曲线整定PD参数

上述的分段PD的办法是对其参数进行直接赋值,这种方法虽然可行,却不能达到很好的连续性效果,对此可以想到一种函数曲线的方法,将P的值关联backup,利用函数曲线对P值进行输出,从而更好的控制赛车在各个赛道元素上行驶的状态。
以下提供两种方案:

    /* * * 舵机算法1 * * */if(backup<=15)    angle_P=63+backup*2;if(15<backup<22)  angle_P=33+backup*4;if(22<backup<=30) angle_P=backup*5.5;
	int k;angle_P=22+(int)(n*n*k);

电机控制

目标速度的确定

上篇文章的末尾提到了目标速度的确定,由于不同路况赛车的最高速度不同,需要对不同路况分别设置目标速度,具体代码如下:

	set_speed_L=90+(int)((30-backup)*1.2);   //弯道最低+直道加速

差速控制算法

利用舵机控制赛车转向的同时,我们也可以利用差速对其进行辅助。同样根据backup的值对赛道路况进行判断,分别控制对赛车的两个轮子进行控制,达到差速的效果。程序设计上可以将上述set_speed_L计算公式中的90改为动态的bend_L/bend_R,再在具体bend_L/bend_R的计算中控制差速。
具体代码如下:

      bend_L=(int)(90*cs_L);bend_R=(int)(90*cs_R);set_speed_L=bend_L+(int)((30-backup)*1.2);    set_speed_R=bend_R+(int)((30-backup)*1.2);   

其中cs_L/cs_R为差速控制系数。

特殊元素处理

环岛处理

由于环岛的特殊性,可以选择在识别到环岛的同时令目标速度降低,增加其稳定性。识别到环岛后可以采用强制打角或切换曾八字电感循迹的方式进环,确定进环后再切换成普通元素循迹方式,出环前再判断一次标志位,采用编码器计步的方式强制出环,一段时间后清楚标志位。

防坡道误判

在调试过程中经常会看到有赛车在坡道的位置突然转向,很多情况就是因为在坡道时误判成了环岛,这就需要我们对环条件加以限制,来避免此类问题的发生。
此时加在前瞻以及车头位置的中间电感便发挥了作用,一般来说,在坡道的位置,这两个电感的值不会与两侧水平电感同时增大,所以这也就是我们解决坡道误判问题的方法之一。
部分代码如下:

    /* * * 环岛处理 * * */ if(huan_dw==1)   //拨码开关2向下 执行环岛程序{if((AD_M_Left[0]>90&&AD_M_Left[1]>90&&AD_M_Right[1]>=65&&AD_M_Right[1]<=70&&AD_M_Right[0]>=65&&AD_M_Right[0]<=70)   //环标志||(AD_M_Right[0]>90&&AD_M_Right[1]>90&&AD_M_Left[1]>=65&&AD_M_Left[1]<=70&&AD_M_Left[0]>=65&&AD_M_Left[0]<70))//||(AD_M_Right[0]>=99&&AD_M_Right[1]>=99&&AD_M_hou<=25&&AD_M_hou>=13)){if(huanw_a==1){huan_ru=1;set_speed_L=80;set_speed_R=80;huanw_a=0;LED_ON(3);}}if(huan_ru==1){if((int)(AD_M_hou-AD_M_qian)==-2||(int)(AD_M_hou-AD_M_qian)==-1){huan_ru=2;        set_speed_L=80;set_speed_R=80;force_angle=0;}}}    

到此,环岛识别结束,由于不同路况以及赛车本身的不同,环岛标志位都不同,以上标志位仅供参考。另外,出环结束后一定不要忘记清标志位,否则无法二次进环。

        if(force>huanchu_over)  {         LED_OFF(2); LED_OFF(3); LED_OFF(4); LED_OFF(5); huan_ru=0;huan_zhong=0;huan_chu=0;huanw_a=1;  force=0;         }

其他辅助结构

屏幕显示

由于比赛现场调试时间短暂,如果用IAR里的live watch观察数据不太方便,所以我们选择将需要观察的数据显示在OLED上,尤其是由于信号发生器的不同而造成的电磁值误差,若将其获取的值打印到OLED上,则方便现场调试。
具体代码如下:

// 电感值输出在OLED //
void AD_oled()      
{char  txt[30];OLED_Print(15,0,"[满天星]智能车");   //显示队伍名称sprintf((char*)txt,"L1 :%4d",AD_M_Left[0]);OLED_P6x8Str(0,2,(u8*)txt);sprintf((char*)txt,"L2 :%4d",AD_M_Left[1]);OLED_P6x8Str(0,3,(u8*)txt);  sprintf((char*)txt,"R2 :%4d",AD_M_Right[1]);OLED_P6x8Str(80,3,(u8*)txt);    sprintf((char*)txt,"R1 :%4d",AD_M_Right[0]);OLED_P6x8Str(80,2,(u8*)txt);sprintf((char*)txt,"QZ :%4d",(int)(AD_M_qian));OLED_P6x8Str(0,4,(u8*)txt);  sprintf((char*)txt,"HZ :%4d",(int)(AD_M_hou));OLED_P6x8Str(80,4,(u8*)txt);    sprintf((char*)txt,"P  :%4d",angle_P);OLED_P6x8Str(0,6,(u8*)txt);    sprintf((char*)txt,"b  :%4d",(int)backup);OLED_P6x8Str(80,6,(u8*)txt); delayms(100);}

按键控制与拨码开关

两者原理基本相同,都是先读取接口状态(如电平的高低),再根据此状态对具体程序进行控制,比赛中我用了两个拨码开关,分别控制高低速和环岛屏蔽与否,并在发车时利用按键选择出入库方向,最大可能的为正式比赛提供便利。
具体代码如下:

// 车档位选择 //
void Select_car()    //向上为0,向下为1
{    V_dw=GPIO_PinRead(PTC8);      //速度档,向上为低速,向下为高速huan_dw=GPIO_PinRead(PTC9);   //环岛档,向上屏蔽环岛程序char  txt[30];sprintf((char*)txt,"start_direction :%4d",start_direction_dw);   //出库方向:OLED_P6x8Str(0,2,(u8*)txt);                                      //1为左出库 左按键触发  2为右出库 右按键触发while(start_direction_dw==0){switch(KEY_Read(0)) {case 1:       break;           case 2:  start_direction_dw=1;break;case 3:      start_direction_dw=2;break;default:break;}}sprintf((char*)txt,"start_direction :%4d",start_direction_dw);OLED_P6x8Str(0,2,(u8*)txt);delayms(2000);}

写在最后

十五届到这里就结束了,怀念的同时,也感谢那些日子为梦想而星夜兼程的自己。我们行于黑暗,奉于光明。希望每位智能车人,都能摘到属于自己的那颗星星。

如有疑问或错误,欢迎和我私信交流指正。
W.By Xyq

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/30255.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于蒙特卡洛模拟法的电动汽车充电负荷研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

电动汽车充电接口通信协议

EV&#xff08;electricity vehicle&#xff09; - 充电接口 - 协议 德标DIN、欧标EN、国际ISO、国标GB对照表&#xff0c;做出口必备资料 在这里插 入图片描述 通讯协议 DIN70121、ISO 15118、GB/T 27930三者都是针对电动汽车充电设施的充电接口通信这种特定应用场景设计的通…

基于Android新能源电动汽车充电服务导航

1系统的基本业务需求 1.1 用户注册与登录模块 1.1.1注册 通过填写用户昵称&#xff0c;手机号码&#xff0c;密码&#xff0c;性别来注册 1.1.2登陆 用户登陆可以通过用户昵称和密码进行登录也可以通过手机短信验证登陆 1.2 用户个人信息模块 1.2.1身份认证&#xff08;实名验证…

基于蒙特卡洛法的规模化电动汽车充电负荷预测(PythonMatlab实现)

目录 0 概述 1 蒙特卡洛模拟方法介绍 2 规模化电动汽车充电负荷预测计算方法 3 完整代码 0 概述 对于本文的研究,依据不同用途电动汽车影响因素的分布函数和设定参数&#xff0c;采用蒙特卡洛法,对各用途电动汽车的日行驶里程、起始充电时间概率分布参数进行随机抽样&#…

罗翔|ChatGPT没法回答的问题

湖南大学法学院 2023-05-21 08:45 发表于湖南 01 人工智能 会不会替代法律行业&#xff1f; “ChatGPT可应用于司法量刑么&#xff1f;”“人工智能会取代法律人吗&#xff1f;” 近日&#xff0c;罗翔在在华南师范大学附属中学以“培育法治信念”为主题作专题报告&#xff…

crmchat客服系统部署

1.安装宝塔面板 安装所需要的软件nginx、mysql和redis 2. 下载源代码&#xff0c;解压 将crmchat压缩 3. 新建站点 上传crmchat压缩包然后解压 4. 安装扩展 安装PHP插件&#xff1a;fileinfo、redis、swoole4 删除PHP对应版本中的 proc_open禁用函数。 5. …

刚刚!ChatGPT-5发布时间定了,这一次将重新彻底引爆

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 我新建了人工智能中文站https://ai.weoknow.com 每天给大家更新可用的国内可用chatGPT资源 ChatGPT4.0发布还没多久&#xff0c;根据ChatGPT NFT Club爆料&#xff0c;ChatGPT将会2023年12月发布。ChatGPT-5将会是跨时代…

Postman 重复发送多个请求

之前 Postman 用的不多&#xff0c;今天需要用&#xff0c;找了下&#xff0c;发现有连续发送多个请求的功能 &#xff1a; 运行即可。但是每个请求的结果好像无法获取。

零代码编程:用ChatGPT自动批量下载电子书并重命名

喜欢在网上寻找电子书资源的肯定了解Z-Library。这是目前互联网最大的电子书网站&#xff0c;不过被封了。有一个网站叫“安娜的档案”&#xff0c;集合了 Z-Library、Library Genesis、Sci-Hub等电子书搜索引擎的资源&#xff0c;网站是https://zh.annas-archive.org/ &#x…

零代码编程:用ChatGPT批量提取网页上的文本信息内容

现在有很多个网页&#xff1a; 要批量提取网页内的文本&#xff1a; 可以在ChatGPT中这样写提示词&#xff1a; 你是一个Python专家&#xff0c;写一段Python程序&#xff0c;完全提取网页文本内容的任务&#xff0c;下面是一步步的步骤&#xff1a; 打开表格文件&#xff0c…

用不同作家风格编写知乎文,练习写作技巧,我竟然发现了这个秘密!

文 / 韩彬&#xff08;微信公众号&#xff1a;量子论&#xff09; 今天尝试着用不同作家的风格编写知乎文。 太严肃的文章没人看&#xff0c;所以我要找一些语言幽默的作家&#xff0c;通过模仿他们的风格写文章。 我列举了一些风格幽默较为知名作家&#xff0c;这些作家的作品…

国内大模型研究

自从chatgpt发布以来&#xff0c;国内大模型发展非常迅速。我对这项目技术也保持了非常多的持续关注&#xff0c;我一直认识&#xff0c;chatGPT以及其他GPT会给社会带来更大的变革。经过专业训练的大模型可以替代部分客服&#xff0c;部分程序员&#xff0c;部分美工&#xff…

如何获取用户当前位置并生成国际拨号前缀+验证不同国家的手机号格式

文章目录 前言一、引入并启用API二、js和html页面代码1.js代码2.html代码 三、将原生js写在vue项目中 前言 该demo使用了HTML5的Geolocation API和Google Maps API来获取用户的位置信息&#xff0c;应用libphonenumber库将位置信息转换为国际拨号前缀并在页面默认展示&#xf…

国际手机号码检查纠正 API 接口

国际手机号码检查纠正 API 接口 有效性检查及智能纠正&#xff0c;遵循 E.164 标准&#xff0c;智能统一格式。 1. 产品功能 智能检测国际手机号码有效性&#xff1b;可根据提供的国家编码参数&#xff0c;判断提供的手机号码是否为该国家有效手机号码&#xff1b;智能纠正提…

国际电话区号--各国或地区电话国际区号对照表

具体参考&#xff1a;国际电话区号--各国或地区电话国际区号对照表

ChatGPT与人类大脑相比:揭示AI的优缺点

与人类大脑相比&#xff0c; ChatGPT这种AI机器人拥有一些优点和缺点&#xff0c;下面小编会简单说下 优点&#xff1a; 1. 学习和处理速度&#xff1a; ChatGPT能够快速处理和学习大量信息&#xff0c;比人类大脑更快。 2. 综合知识&#xff1a; ChatGPT可以整合大量来自各个…

ChatGPT 和 Elasticsearch:分面、过滤和更多上下文

作者&#xff1a;Luca Wintergerst 在最近的一篇博客文章中&#xff0c;我们讨论了 ChatGPT 和 Elasticsearch 如何协同工作以帮助更有效地管理专有数据。 通过利用 Elasticsearch 的搜索功能和 ChatGPT 的上下文理解&#xff0c;我们演示了如何改进结果。 在这篇文章中&#…

Elasticsearch:如何使用 Elasticsearch 以自然语言提示 ChatGPT

作者&#xff1a;Enrico Zimuel 这些天每个人都在谈论 ChatGPT。 这种大型语言模型 (LLM) 的一项很酷的功能是能够生成代码。 我们用它来生成 Elasticsearch DSL 查询。 目标是在 Elasticsearch 中搜索 “给我股票指数中 2017 年的前 10 个文档&#xff08;Give me the first 1…

Elasticsearch:在 Elastic 中访问机器学习模型

作者&#xff1a;Bernhard Suhm, Josh Devins Elastic 支持你需要的机器学习模型 Elastic 让你可以应用适合你的用例和 ML 专业水平的机器学习 (ML)。 你有多种选择&#xff1a; 利用内置的模型。 除了我们的可观察性和安全解决方案中针对特定安全威胁和系统问题类型的模型外…

谁是Al生成内容的作者?从法律视角的探讨

我们知道Al作品也可以具有独创性&#xff0c;并具备成为作品的条件。那么谁才是Al作品的作者呢&#xff1f;这次我们来一起分析下。 一、作者的定义 在版权法中&#xff0c;作者通常被定义为作品的创造者&#xff0c;是作品的原始所有者&#xff0c;并享有对作品的各种权利。通…