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…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...
蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...
视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)
前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块,…...
R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...
STM32---外部32.768K晶振(LSE)无法起振问题
晶振是否起振主要就检查两个1、晶振与MCU是否兼容;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容(CL)与匹配电容(CL1、CL2)的关系 2. 如何选择 CL1 和 CL…...
