STC32G 三轮车负压电磁
文章目录
- 前言
- 整车效果
- 控制思路
- 循迹
- 环岛处理
- 障碍处理
- 关键代码部分
- 差比和以及当前速度计算
- 角速度环
- 速度环
- 环岛处理
- 障碍处理
前言
年后就没怎么碰车了,到3月中旬换三轮了,可算有一点成效了,做个记录。
整车效果
三轮负压电磁
慢速元素识别
控制思路
循迹
角速度环以及速度环
差比和的结果与0做差得到的误差作为角速度环的输入。
角速度环的输出输出作为我们期望小车转向的角速度。
简单对差速小车建模,以顺时针方向的角速度为正参考方向,推导数学公式可得
vLref=vm+ωL2v_{Lref}=v_m+\frac{\omega L}{2}vLref=vm+2ωL
vRref=vm−ωL2v_{Rref}=v_m-\frac{\omega L}{2}vRref=vm−2ωL
其中vLrefv_{Lref}vLref是左轮的参考速度,vRrefv_{Rref}vRref是右轮的参考速度,vmv_mvm是小车整体的运行速度,或假想小车中心有一个轮子的运行速度,LLL是车模后轮的轮距,我测量的D车模的后轮距为0.17m,ω\omegaω为小车的角速度,即角速度环的输出。
得到左右两轮子的参考速度以后,经过速度环控制后得到左右电机的占空比并幅值即可。
其中角速度环用PD控制,P环节用于放大误差送入矫正环节(在这里的三轮车矫正环节即控制两个轮子的速度以矫正误差),D环节用于抑制车体的震荡;速度环用PI控制,P放大误差进行速度调节,I用于消除静差,尤其是当我们上负压以后,I尤为重要。
由于三轮车的运动轨迹完全取决于两个轮子速度之间的关系,两个轮子的速度环控制必须做到快速而精准,需花时间调节速度环的参数。
电机PID参数整定
环岛处理
- 检测到圆环(预圆环)(某个电感大于某个阈值)
- 到达最佳入环位置(强制入环,直到陀螺仪大于某个,开始园内循迹)
- 圆内循迹
- 出环。
障碍处理
- 识别障碍**(TOF测距小于某个限制)**
- 避开障碍(左右轮固定差速,直到陀螺仪积分大于某个角度)
- 回到赛道(左右轮固定差速,直到陀螺仪为小于某个角度)
- 姿态调整(让小车的姿态基本与赛道平齐,直到陀螺仪角度在某个范围内或误差在某个范围内)
关键代码部分
差比和以及当前速度计算
三电感电磁循迹小车
角速度环
void dir_loop()
{float temp;pid_steer.ek = 0 - error;temp = pid_steer.KP * pid_steer.ek+ imu660ra_gyro_z / 65.6;
// + 300 * (pid_steer.ek - pid_steer.ek_1); // 参考角速度pid_motor_L.SetValue = speed_rate * speed_goal - temp * 0.0875;pid_motor_R.SetValue = speed_rate * speed_goal + temp * 0.0875;
}
速度环
void speed_loop()
{float inc_L, inc_R;// 限制内轮速度if(pid_motor_L.SetValue < 0)pid_motor_L.SetValue = 0;if(pid_motor_R.SetValue < 0)pid_motor_R.SetValue = 0;// 外轮速度限制if(pid_motor_L.SetValue > 2 * speed_goal * speed_rate)pid_motor_L.SetValue = 2 * speed_goal * speed_rate;if(pid_motor_R.SetValue > 2 * speed_goal * speed_rate)pid_motor_R.SetValue = 2 * speed_goal * speed_rate;inc_L = PID_Control_Inc(&pid_motor_L, 0);inc_R = PID_Control_Inc(&pid_motor_R, 0);duty_L += inc_L;duty_R += inc_R;if(duty_L > Motor_UpperLimit)duty_L = Motor_UpperLimit;if(duty_L < Motor_LowerLimit)duty_L = Motor_LowerLimit;if(duty_R > Motor_UpperLimit)duty_R = Motor_UpperLimit;if(duty_R < Motor_LowerLimit)duty_R = Motor_LowerLimit;
}
环岛处理
void circ_handler()
{static uint16 count_delay_R_circ_pre;static uint16 count_delay;if(flag_L_circ_pre) // 预圆环阶段{count_delay_R_circ_pre++;if(count_delay_R_circ_pre > 0.5 / speed_goal * 60 * TIM1_ISR_F) //{flag_L_circ_pre = 0;flag_L_circ_frc = 1; // force to get into circ}}if(flag_L_circ_frc){Angle_circ += imu660ra_gyro_z * 0.002 / 65.6;if(Angle_circ < -35){flag_L_circ_frc = 0;flag_L_circ_in = 1;flag_L_circ_out = 0;}else{pid_motor_L.SetValue = 0 * speed_rate * speed_goal;pid_motor_R.SetValue = 2 * speed_rate * speed_goal;}}if(flag_L_circ_in){Angle_circ += imu660ra_gyro_z * 0.002 / 65.6;if(Angle_circ <= -300)flag_L_circ_in = 0;}if(flag_L_circ_in == 0 && flag_L_circ_out == 0){count_delay++;if(count_delay > 5 * TIM1_ISR_F){flag_L_circ_out = 1; // 已出环count_delay = 0;Angle_circ = 0;}}
}
障碍处理
void block_handler()
{if(flag_block_detected){pid_motor_L.SetValue = 0 * speed_rate * speed_goal;pid_motor_R.SetValue = 2 * speed_rate * speed_goal;Angle_block += imu660ra_gyro_z * 0.002 / 65.6;}if(Angle_block < -45){flag_block_detected = 0;flag_block_back = 1;}if(flag_block_back){if(Angle_block < 50){pid_motor_R.SetValue = 0 * speed_rate * speed_goal;pid_motor_L.SetValue = 2 * speed_rate * speed_goal;}elseflag_block_adjust = 1;if(flag_block_adjust){pid_motor_L.SetValue = 0.3 * speed_rate * speed_goal;pid_motor_R.SetValue = 1.7 * speed_rate * speed_goal;}Angle_block += imu660ra_gyro_z * 0.002 / 65.6;}if(Angle_block < 10 && Angle_block > -10 && flag_block_adjust){flag_block_detected = 0;flag_block_back = 0;flag_block_adjust = 0;Angle_block = 0;}
}
相关文章:
STC32G 三轮车负压电磁
文章目录前言整车效果控制思路循迹环岛处理障碍处理关键代码部分差比和以及当前速度计算角速度环速度环环岛处理障碍处理前言 年后就没怎么碰车了,到3月中旬换三轮了,可算有一点成效了,做个记录。 整车效果 三轮负压电磁慢速元素识别控制思…...
【编程小记】位运算 x -x 表示含义
位运算 x & -x 表示含义一、原码反码补码二、位运算 x & -x 表示含义三、最终结论一、原码反码补码 在计算机中,整数的数据的存储是按照补码的方式进行存储的 按照数据与0的大小,数据又被分为正数与负数 正数的原码反码补码相同。负数的原码&…...
信创PC利旧管理新模式,麒麟信安助力国家某部委实现高效云办公
2022年,国家某部委所有桌面终端均已完成信创PC替换,并将日常办公所需的办公Office套件、OA无纸化办公系统、即时通讯系统等全部迁移至信创PC,但在进行生产业务系统迁移时,该单位信创PC仍存在业务系统与不同芯片PC难适配、应用难兼…...
【玩转RT-Thread】RT-Thread内核宏定义详解(rtdef.h)
文章目录1.RT-Thread版本信息2.RT-Thrad基础数据类型定义3.RT-Thread基本数据类型的范围4.RT-Thread系统滴答时钟最大计数值5.RT-Thread IPC数据类型范围6.RT-Thread避免未使用变量警告7.编译器相关定义8.编译器相关定义9.RT-Thread错误码定义1.RT-Thread版本信息 /* RT-Threa…...
PDF转化器免费版有哪些?这几款办公达人们都在用
在现代办公中,文件的排版和格式是非常重要的,无论是发布通知或提交策划书、投档简历或是发表论文、宣传海报或是产品说明书等,我们经常使用PDF文件格式发送给他人。然而,很多人需要对PDF进行编辑修改,通常会先将其转换…...
2022MathorCup赛题B
以下所有文字均基于作者的实际经验,并不具有完全的合理性,请谨慎参考 目录 一、问题分析 (一)问题一 (二)问题二 二、预处理 (一)训练集预处理 (二)测…...
适合销售使用的CRM系统特点
销售人员抱怨CRM系统太复杂,这是一个很重要的问题。毕竟,如果系统太难使用,会导致CRM实用率和效率下降,最终影响公司的运作。在这篇文章中,我们来探讨当销售抱怨crm客户系统太复杂了,企业该如何解决。 缺少…...
项目中获取resource下文件路径的方法
String filepathrequest.getServletContext().getRealPath("/")"files\\"; 获取的当前文件在实际运行的tomcat地址目录 String path ClassUtils.getDefaultClassLoader().getResource("").getPath()"tmp/files/"; 获取的是当前文件…...
Air32F103CBT6|CCT6|KEIL-uVsion5|本地编译|STClink|(6)、Air32F103编译下载
目录 一、环境搭建 准备工作 安装支持包 二、新建工程 添加外设库支持 测试代码 三、下载烧录 一、环境搭建 准备工作 安装MDK5,具体方法请百度,安装后需要激活才能编译大文件 下载安装AIR32F103的SDK:luatos-soc-air32f103: Air32f…...
结构(c的数据类型)
我们知道数组是相同类型元素的集合,那么结构就是不同类型的元素的集合,这些不同元素叫结构中的成员。是因为这些集合都有一定的联系才会归为一类的。 形式:我们知道,平时学习的int,double都叫类型,而结构是…...
前端常用的开工具库
常用的开发工具库 打包工具webpack webpack是现在最流行的打包工具之一,是javaScript的静态模块的打包器。会根据业务逻辑构建一个依赖的关系图,每一个依赖的单元都是一个模块,模块可以是js文件 可以图片资源或者css资源。在使用webpack的时…...
爬虫之数据库存储
在对于爬取数量数量较少时,我们可以将爬虫数据保存于CSV文件或者其他格式的文件中,既简单又方便,但是如果需要存储的数据量大,又要频繁访问这些数据时,就应该考虑将数据保存到数据库中了。目前主流的数据库有关系性数据…...
面试官:你可以用 for of 遍历 Object 吗?
本文以 用 for of遍历 Object 为引 来聊聊 迭代器模式。 什么是迭代器模式 迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。 ——《设计模式:可复用面向对象软件的基础》 可以说迭代器模式就是为了遍历存在的。提…...
蓝桥杯基础12:BASIC-3试题 字母图形
资源限制 内存限制:256.0MB C/C时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s 问题描述 利用字母可以组成一些美丽的图形,下面给出了一个例子: ABCDEFG BABCDEF CBABCDE DCBABCD EDC…...
基于PaddleOCR开发懒人精灵文字识别插件
目的 懒人精灵是 Android 平台上的一款自动化工具,它通过编写 lua 脚本,结合系统的「 无障碍服务 」对 App 进行自动化操作。在文字识别方面它提供的有一款OCR识别插件,但是其中有识别速度慢,插件大的缺点,所以这里将讲…...
PyTorch 深度学习实战 | DIEN 模拟兴趣演化的序列网络
01、实例:DIEN 模拟兴趣演化的序列网络深度兴趣演化网络(Deep Interest Evolution Network,DIEN)是阿里巴巴团队在2018年推出的另一力作,比DIN 多了一个Evolution,即演化的概念。在DIEN 模型结构上比DIN 复杂许多,但大家丝毫不用担心,我们将DIEN 拆解开来详细地说明…...
pyspark null类型 在 json.dumps(null) 之后,会变为字符串‘null‘
在将 hive 数仓数据写入 MySQL 时候,有时我们需将数据转为 json 字符串,然后再存入 MySQL。但 hive 数仓中的 null 类型遇到 json 函数之后会变为 ‘null’ 字符串,这时我们只需在使用 json 函数之前对值进行判断即可,当值为 null…...
LeetCode - 两数相加
题目信息 源地址:两数相加 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字…...
Office 2021专业版安装包及激活教程
[软件名称]: Office 2021 [软件大小]: 4.33GB [安装环境]: Win11/Win 10 [软件安装包下载]:https://pan.quark.cn/s/169ed49988b2 “Microsoft Office 2021是Microsoft推出的办公软件。2021年10月5日,Office 2021 for Mac发布,其中包含许多新功能 Micro…...
git版本规范-前端
前言 本文档适用于前端的小伙伴。针对目前前端只有测试环境和生产环境,为更好管理前端代码和适用于自动化部署,编写次文档,有不同意见的小伙伴可以进行讨论。 分支 由于没有目前没有预发环境,简化开发、测试、部署和发布流程&a…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...
解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...
uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...
关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
【网络安全】开源系统getshell漏洞挖掘
审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...
【 java 虚拟机知识 第一篇 】
目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...
