2024电赛H题参考方案(+视频演示+核心控制代码)——自动行使小车

目录

一、题目要求

二、参考资源获取

三、参考方案

1、环境搭建及工程移植

2、相关模块的移植 

4、整体控制方案+视频演示

5、视频演示部分核心代码

总结

一、题目要求

         小编自认为:此次H题属于控制类题目,相较于往年较为简单,功能也算单一,四个题目的时间要求都不是很高,容易得分,其中主要难点可能是TI芯片了,但是资源丰富,那也就不是问题了。

二、参考资源获取

        嘉立创官方为了助力电赛,特地推广了一款TI的开发板——MSP0系列刚好是题目要求的),其中覆盖开发环境的搭建(直接最熟悉的用Keil进行开发,同时搭配图形化配置,简直就是Keil+STM32Cube的开发模式),同时配套各种外设的开发教程以及各类传感器等模块的开发教程,附加源码示例,直接移植即可。

嘉立创电赛开发板x2icon-default.png?t=N7T8https://lceda001.feishu.cn/wiki/JNu0wa35pi4feikXbmlcJRwLnGl

 MSPM0G3507开发板icon-default.png?t=N7T8https://wiki.lckfb.com/zh-hans/dmx/

三、参考方案

1、环境搭建及工程移植

        参考立创平台,搭建开发平台,使用Keil进行开发:

环境配置流程icon-default.png?t=N7T8https://wiki.lckfb.com/zh-hans/dmx/beginner/install.html

         重点是:在Keil环境下安装SysConfig 工具。SysConfig 是一个直观而全面的图形实用程序集合,用于配置引脚、外设、子系统和其他组件。它可助我们直观地管理、发现和解决配置冲突,以便有更多时间去编写核心逻辑代码。如下,其配置界面:

2、相关模块的移植 

 1、移植MPU6050模块

        该模块主要用来转向角度控制等,可以使小车走直,平稳角度转向等。

 2、移植TB6612电机驱动模块

        用以驱动电机。

 控制电机时,最好加上速度环控制,所以需要对编码器进行测速,可以通过配置定时器和外部中断实现测速,可以参考esp32测速方式。

参考内容:编码器相关知识及ESP32-Arduino程序_esp32解算ab编码器-CSDN博客

其他模块根据需要自行移植。。。。。。

4、整体控制方案+视频演示

        这里只是为了验证方案,采用的是STM32为主控,OpenMV摄像头巡线,但巡线原理都一样,都是通过控制黑线与小车灰度的偏差关系。

        最后根据速度环、转向环、巡线环的控制方式验证一下方案。以速度环为整体控制内环,外环由转向环和巡线环选择作用,在遇到黑线时开启巡线环,脱离黑线时开启转向环,其中转向环主要控制小车转向,并且按照某一方向直线行驶。

控制流程框图为:

以下为相关演示视频(原视频,去原声):

2024电赛H题方案演示一

2024电赛H题方案演示二

        方案基本可行,速度稳定且并未到达该车上限,需要进一步的优化控制逻辑,这里使用的是统一速度行驶,可采取变速行使,可进一步提高稳定性和减少整体耗时。明显缺陷:MPU6050存在零漂等,准确度不好,如能用算法解决,稳定性可进一步提高,其次该车的初始摆放位置较为重要, 初始角度为后续转向的参考。若采用四轮小车,只需将左边两轮和右边两轮进行分别同步即可,可能还需要微调参数。

5、视频演示部分核心代码

#define limit_180_Z(n) ((n>0)?(n-360):n)
#define limit_180_F(n) ((n<0)?(n+360):n)int base_speed = 70;// cm/s
int Target_angle = 0;#define OpenMV_Kp 1.1
#define Line_Kp 2
uint8_t ABCD_flag = 0;
uint8_t TI_flag = 2;void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{float anglo_Err = 0;static uint8_t last_line_flag = 0;if(htim->Instance == TIM2 ){motorA.speed = get_speed_motorA();motorB.speed = get_speed_motorB(); 
//        motorA.S += motorA.speed*0.01;//路程等于速度积分,单位:cm
//        motorB.S += motorB.speed*0.01;//cmif(last_line_flag != line_flag) {ABCD_flag++;}last_line_flag = line_flag;if(line_flag == 1)//巡线{motorA.Target_Speed = base_speed - rho_org * OpenMV_Kp;motorB.Target_Speed = base_speed + rho_org * OpenMV_Kp;}else //转向和直线行使{   if(TI_flag == 1)//视频一演示,不交叉走圈{                if(ABCD_flag == 2||ABCD_flag == 6||ABCD_flag == 10||ABCD_flag == 14){Target_angle = -180;anglo_Err = limit_180_Z(MPU6050.yaw)-(Target_angle+ABCD_flag*0.6);}else{Target_angle = 0;anglo_Err = MPU6050.yaw-(Target_angle+ABCD_flag*0.5);}}else if(TI_flag == 2)//视频二演示,交叉走圈{if(ABCD_flag == 0||ABCD_flag == 4||ABCD_flag == 8||ABCD_flag == 12){Target_angle = -33;anglo_Err = MPU6050.yaw-Target_angle;}if(ABCD_flag == 2||ABCD_flag == 6||ABCD_flag == 10||ABCD_flag == 14){Target_angle = 215;anglo_Err = limit_180_F(MPU6050.yaw)-Target_angle;      }                    }motorA.Target_Speed = base_speed - anglo_Err * Line_Kp;motorB.Target_Speed = base_speed + anglo_Err * Line_Kp;               if(ABCD_flag == 16) //走完四圈停下来{motorA.Target_Speed = 0;motorB.Target_Speed = 0;}           }motorA.out = pid_control(POSITION_PID,motorA.speed,motorA.Target_Speed,200,18,15);motorB.out = pid_control(POSITION_PID,motorB.speed,motorB.Target_Speed,200,18,15);        Load(motorA.out, motorB.out);}
}

        其中,代码较为粗糙,可以进一步改善:

1、交叉走圈时,可以先转到指定角度,然后再加基础速度,稳定性可能要好的多,方便提速。

2、再经过ABCD点一定距离或时间时,可以加快速,快到ABCD点时或到ABCD点时减速,甚至去掉基础速度,整体采用变速运行,前提是巡线和直线行驶部分要稳。

3、MPU6050零漂处理,有条件直接换更好的陀螺仪使用,如果要继续使用,可以采用:

        (1)在小车运行前,要等待其初始化完成,并稳定读取初始值,然后再启动小车的运动控制。

        (2)更好的是,等待其初始化完成后,多次进行数据读取并采用均值滤波,将处理后的值作为初始值,最后再进行小车运动控制。

4、等待大家发言,有更好方法欢迎评论留言。


总结

        控制的难点就在与ABCD四点之间的丝滑连接,如何让小车又快又稳的运行,最后比拼的就是时间了,可能也是比赛现场的重点评判标准,毕竟选择该题的人多

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

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

相关文章

科普文:『 码到三十五 』Java微服务中Token鉴权设计的4种方案

吐槽~~~~~~~ Java微服务中Token鉴权设计的几种方案: 1. JWT鉴权 「概述」&#xff1a;JWT是一种用于双方之间安全传输信息的简洁的、URL安全的令牌标准。它基于JSON格式&#xff0c;包含三个部分&#xff1a;头部&#xff08;Header&#xff09;、负载&#xff08;Payload&a…

ubuntu Ubuntu 20.04.6 LTS 安装vtk 报错缺少opengl

ubuntu编译9.3.0 vtk报错 -- Could NOT find OpenGL (missing: OPENGL_opengl_LIBRARY OPENGL_glx_LIBRARY OpenGL) CMake Error at CMake/vtkModule.cmake:4793 (message): Could not find the OpenGL external dependency. Call Stack (most recent call first): CMake/vtkMo…

typescript 断言

/* 断言 确定后期一定是某种格式 可用于表单大对象初始化是空&#xff0c;赋值时有具体字段。前期断言是会是某种格式 */interface obj {name: stringlocation: stringage?: number }// 会报错 // let data: obj { // // } let data: obj {} as obj; // 断言data会有obj里…

PHP框架详解之Symfony框架

一、框架概述 起源与开发者&#xff1a;Symfony由SensioLabs&#xff08;现为Symfony公司&#xff09;开发&#xff0c;最初由Fabien Potencier于2005年创建。功能定位&#xff1a;Symfony通过提供一套可重用的组件和标准化的框架&#xff0c;帮助开发者快速构建Web应用、API、…

如何将WordPress文章中的外链图片批量导入到本地

在使用采集软件进行内容创作时&#xff0c;很多文章中的图片都是远程链接&#xff0c;这不仅会导致前端加载速度慢&#xff0c;还会在微信小程序和抖音小程序中添加各种域名&#xff0c;造成管理上的麻烦。特别是遇到没有备案的外链&#xff0c;更是让人头疼。因此&#xff0c;…

Monte Carlo Tree Search Boosts Reasoning via Iterative Preference Learning

Monte Carlo Tree Search Boosts Reasoning via Iterative Preference Learning Github&#xff1a;https://github.com/YuxiXie/MCTS-DPO 一、动机 大语言模型在偏好对齐环节可以提高模型的性能。目前有诸多工作尝试将偏好对齐通过迭代的形式进行改进: It involves a cycle …

CentOS下通过yum搭建完整lnmp环境(多版本PHP共存)

lnmp即 Linux Nginx Mysql PHP&#xff0c;在同一台服务器&#xff0c;可以支持多版本PHP共存使用&#xff0c;本文以 CentOS 7.x 为例介绍如何通过 yum 的方式搭建多版本 PHP 的 lnmp 环境。 前置条件 假设服务器已经通过 yum 方式搭建 lnmp 环境&#xff08;单版本PHP&a…

Linux下50个基本命令的使用说明【按首字母排序】

1. alias 用于为命令创建别名&#xff0c;以简化命令的输入。 alias llls -l # 现在输入ll将等同于ls -l2. apt-get 用于Debian及其衍生发行版的包管理工具。 sudo apt-get update # 更新包列表 sudo apt-get install package_name # 安装软件包3. cat 用于连接和显示文件内…

Scrapy框架在处理大规模数据抓取时有哪些优化技巧?

在使用Scrapy框架处理大规模数据抓取时&#xff0c;优化技巧至关重要&#xff0c;可以显著提高爬虫的性能和效率。以下是一些实用的优化技巧&#xff1a; 1. 并发请求 增加并发请求的数量可以提高爬虫的响应速度和数据抓取效率。可以通过设置CONCURRENT_REQUESTS参数来调整。…

装修行业办公家具销售公司网站带模版 附带完整的源代码包以及搭建部署教程

系统概述 这款网站源码系统是针对装修行业办公家具销售公司的特点定制的&#xff0c;它融合了现代化的设计理念和先进的技术架构&#xff0c;旨在为用户提供极佳的浏览和购物体验。系统采用了响应式设计&#xff0c;能够自适应不同设备的屏幕尺寸&#xff0c;确保用户在手机、…

git 鉴权失败

这条错误信息通常出现在使用Git进行远程操作时&#xff0c;比如克隆仓库、拉取更新或推送代码。错误的含义是&#xff1a; HTTP Basic: Access denied&#xff1a;访问被拒绝。The provided password or token is incorrect&#xff1a;提供的密码或令牌不正确。Your account …

邦芒秘诀:学会这3招在职场中让自己变得强大

职场上我们总希望自己掌握主动&#xff0c;能够有一定的能力“控场”&#xff0c;但往往事实上并不如此&#xff0c;甚至是不受领导们待见。 ​想要让自己变得强大&#xff0c;要注意做到这三点。 ​1、多展示自己&#xff0c;雁过留痕。 有些人就是实干派&#xff0c;努力做出…

【ai】 2005年 rule based expert system学习笔记1

PPT 是2005年的? Negnevitsky, Pearson Education 使用两种推理引擎的选择 backward chaining(逆向链接)推理过程 backward chaining(逆向链接)推理过程的GPT解释 这幅图展示了一个基于规则的专家系统如何通过backward chaining(逆向链接)推理过程来达到最终的推理目标…

C++ 设计模式--工厂模式

工厂模式&#xff1a;利用C多态的特性&#xff0c;对对象的创建进行封装。 定义一个创建对象的接口&#xff0c;让其子类自己决定实力化哪一个工厂类&#xff0c;工厂模式使其创建过程延迟到子类进行 参考链接 简单工厂 #include <iostream> #include <string> u…

Java并发编程(三)

Java并发编程 1、什么是 Executors 框架 Executors框架是一个根据一组执行策略调用&#xff0c;调度&#xff0c;执行和控制的异步任务的框架。 无限制的创建线程会引起应用程序内存溢出。所以创建一个线程池是个更好的的解决方案&#xff0c;因为可以限制线程的数量并且可以…

大数据-55 Kafka sh脚本使用 与 JavaAPI使用 topics.sh producer.sh consumer.sh kafka-clients

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

如何测量嵌入式软件程序(段)的执行时间?

测量嵌入式软件程序&#xff08;段&#xff09;的执行时间对于评估系统性能和优化代码至关重要。根据调研结果&#xff0c;汇总一些常用的方法如下&#xff1a; 1.插桩技术&#xff1a;这是一种纯软件的性能分析方法&#xff0c;通过在关键代码位置插入信息收集代码来实现。这…

禁毒教育展厅应如何创新展示方式,提升教育意义?

为了深刻揭示毒品的危害&#xff0c;促进禁毒知识的广泛传播&#xff0c;并显著提升公众的防范意识&#xff0c;禁毒教育展厅的推广举措正紧锣密鼓地展开。在这一关键进程中&#xff0c;展厅的空间布局与内容设计的合理性与针对性成为了至关重要的环节。接下来&#xff0c;我们…

angular入门基础教程(二)第一个angular组件

ng中的语法跟vue中是一样的插值语法&#xff0c;其实也是早期vue抄的ng的思路&#xff0c;使用{{variable}}形式&#xff0c;vue借鉴了ng和react&#xff0c;这个我们就不多了。 新建一个子组件 在项目根目录下面&#xff0c;执行 ng g component ./components/UserList这样…

【RL】强化学习入门:从基础到应用

本篇文章是博主强化学习RL领域学习时&#xff0c;用于个人学习、研究或者欣赏使用&#xff0c;并基于博主对相关等领域的一些理解而记录的学习摘录和笔记&#xff0c;若有不当和侵权之处&#xff0c;指出后将会立即改正&#xff0c;还望谅解。文章强化学习&#xff1a; 强化学习…