速度环+直立环+转向环

2023-05-16

文章目录

  • 直立环
  • 直立环调节
  • 速度环
  • 速度环调节
  • 转向环


直立环

  车模平衡控制也是通过负反馈来实现的,与上面保持木棒直立比较则相对简单。因为车模有两个轮子着地,车体只会在轮子滚动的方向上发生倾斜。控制轮子转动,抵消在一个维度上倾斜的趋势便可以保持车体平衡了
在这里插入图片描述

    平衡小车直立环使用PD(比例微分)控制器,其实一般的控制系统单纯的P控制或者PI控制就可以了,但是那些对干扰要做出迅速响应的控制过程需要D(微分)控制。
//形参:(float Angle):小车的俯仰角 /(float Gyro):x轴的角速度
Int    Vertical_Ring_PD(float Angle, float Gyro)
{
	 float Bias;
	 int balance;
   	 Bias=Angle-Mechanical_balance; 					//求出平衡的角度中值 和机械相关
   balance=PID.Balance_Kp*Bias +  Gyro*PID.Balance_Kd;	//计算直立PWM
	
return balance; 										//返回直立PWm
}

分析:
  Mechanical_balance一般取0,因为想要小车平衡,期望值的角度就是0°,用小车的俯仰角来作为反馈,让小车保持在0°周围。
角速度的积分等于角度、那么角度的微分就是角速度
使用PD调节
在这里插入图片描述
E(k)            =      Bias
(E(k) - E(k-1))       =      Gyro
PID.Balance_Kp           比例系数
PID.Balance_Kd           微分系数

直立环调节

  平衡小车直立环的调试过程包括确定平衡小车的机械中值、确定kp值的极性(也就是正负号)和大小、kd值的极性和大小等步骤。
1、确定平衡小车的机械中值:
  把平衡小车放在地面上,绕电机轴旋转平衡小车,记录能让小车接近平衡的角度,一般都在0°附近的。我们调试的小车正好是0度,所以就是Bias=Angle-0
2. 确定kp值的极性(令kd=0)
  首先我们估计kp的取值范围。我们的PWM设置的是8000代表占空比100%,再考虑避免电机的死区,我们直立环返回的PWM在6000左右的时候电机就会满载。
  假如我们设定kp值为800,那么平衡小车在±10°的时候就会满转。根据我们的感性认识,这显然太大了,那我们就可以估计kp值在0~800之间。
  首先大概我们给一个值kp=-200,我们可以观察到,小车往哪边倒,电机会往那边加速让小车到下,就是一个我们不愿看到的正反馈的效果。说明kp值的极性反了,接下来我们设定kp=200,这个时候可以看到平衡小车有直立的趋势,虽然响应太慢,但是,我们可以确定kp值是正的。具体的数据接下来再仔细调试。
  设定kp=100,这个时候我们可以看到,小车虽然有平衡的趋势,但是显然响应有点慢了。
  设定kp=250,这个时候我们可以看到,小车虽然有平衡的趋势,而且响应有所加快,总体感觉良好。
  设定kp=400,这个时候我们可以看到,小车的响应明显加快,而且来回推动小车的时候,会有一定幅度的低频抖动。说明这个时候kp值已经足够大了,需要增加微分控制削弱p控制,抑制低频抖动。
  经过总体比较: 我们选择参数为kp = 200;
  我们得到的MPU6050输出的陀螺仪的原始数据,通过观察数据,我们发现最大值不会超过4位数,再根据8000代表占空比100%,所以我们估算kd值应该在0~2之间
  我们先设定kd=-0.5,当我们拿起小车旋转的时候,车轮会反向转动,并没有能够实现跟随效果。这说明了kd的极性反了。
  接下来,我们设定kd=0.5,这个时候我们可以看到,当我们旋转小车的时候,车轮会同向以相同的速度跟随转动,这说明我们实现了角速度闭环,至此,我们可以确定kd的极性是正的。具体的数据接下来再仔细调试。
最终我们选择kd = 1;

速度环

(1)假设车模在上面直立控制调节下已经能够保持平衡了,但是由于安装误差,传感器实际测量的角度与车模角度有偏差,因此车模实际不是保持与地面垂直,而是存在一个倾角。在重力的作用下,车模就会朝倾斜的方向加速前进。如果没有速度调节是难以维持0速度的
(2)对于直立车模速度的控制相对于普通车模的速度控制则比较复杂。由于在速度控制过程中需要始终保持车模的平衡,因此车模速度控制不能够直接通过改变电机转速来实现。也是需要通过PID速度调节来实现

在这里插入图片描述
    在这里插入图片描述

/**************************************************************************************************************
*函数名:Vertical_speed_PI()
*功能;速度环PI控制
*形参:(int encoder_left):左轮编码器值/
(int encoder_right):编码器右轮的值/
(float Angle):x轴角度值
*返回值:
**************************************************************************************************************/

int Vertical_speed_PI(int encoder_left,int encoder_right,float Angle,float Movement )
{
	static float Velocity,Encoder_Least,Encoder;
	static float Encoder_Integral;
	Encoder_Least =(encoder_left+encoder_right)-0;    //获取最新速度偏差=测量速度(左右编码器之和)-目标速度(此处为零)
	Encoder *= 0.8f;																	//一阶低通滤波器 ,上次的速度占85%
	Encoder += Encoder_Least*0.2f;                   //一阶低通滤波器, 本次的速度占15% 
	Encoder_Integral +=Encoder;                       //积分出位移 积分时间:10ms
	Encoder_Integral=Encoder_Integral-Movement; 
	
	if(Encoder_Integral>10000)  	Encoder_Integral=10000;           //积分限幅
	if(Encoder_Integral<-10000)	  Encoder_Integral=-10000;            //积分限幅

	Velocity=Encoder*PID.Velocity_Kp+Encoder_Integral*PID.Velocity_Ki;      //速度控制
	
	
	if(Turn_off(Angle)==1)   Encoder_Integral=0;            //电机关闭后清除积分
	return Velocity;
}

PID.Velocity_Kp = Kp        比例系数
PID.Velocity_Ki = Ki         积分系数
Movement :正数就前进、负数就后退
encoder_left,encoder_right 是左电机、右电机的编码
Angle :是平衡的角度
注意:这里的电机速度为什么是两个编码器之和,按道理应该要除以2.很多人不理解这里。因为这个参数可以放在Kp里面去调节,相当于参数整合。

速度环调节

确定kp的范围:
  积分项由偏差的积分得到,所以积分控制和比例控制的极性相同的,而根据工程经验,在不同的系统中,PID 参数相互之间会有一定的比例关系。在我们的平衡小车速度控制系统里面,一般我们可以把ki 值设置为
  ki = kp/200
  这样,只要我们可以得到kp 值的大小和极性,就可以完成速度控制部分的参数整定了。显然,这样大大缩短了PID 参数整定的时间。
  我们通过STM32定时器的编码器接口模式对编码器进行四倍频,并使用M 法测速(每10ms 的脉冲数)得到小车的速度信息,通过观察数据,我们发现两路编码器相加最大值在160左右,而由经验可知,一般平衡小车行驶的最快速度不会超过电机最大速度的40%,再根据PWM = 6000时,在加上电机死区、占空比接近100%,我们可以大概估算
  kp 最大值=6000/(160*40%)=93.75
确定速度环调节为正负馈的调节:
  当小车以一定的速度运行的时候,我们要让小车停下来,小车需要行驶更快的速度去“追”,小车运行的速度越快,去“追”的速度也就越快,所以这是一个正反馈的效果。如果使用常规的速度负反馈,当小车以一定的速度运行的时候,我们通过减速让小车慢下来,小车会因为惯性向前倒下。
判断速度控制是正反馈还是负反馈:
  根据之前的估计,先设定kp=50,ki=kp/200,当我们拿起小车,旋转其中一个小车轮胎的时候,根据我们设定的速度偏差
  Encoder_Least =(Encoder_Left+Encoder_Right)-0;
  另外一个车轮会反向转动,让偏差趋向于零。这就是常规的速度控制里面的负反馈,不是我们需要的效果。接下来设定kp=-50,ki=kp/200,此时,当我们旋转其中一个小车轮胎的时候,两个轮胎会往相同的方向加速,直至电机的最大速度,这是典型的正反馈效果,也是我们期望看到的。至此,我们可以确定kp,ki
  首先,设定kp=-30,ki=kp/200这个时候我们可以看到,小车的速度控制比较弱,很难让速度恒定。
  设定kp=-50,ki=kp/200这个时候我们可以看到,小车的速度控制的响应有所加快, 静止抖动可接受。
  设定kp=-70,ki=kp/200这个时候我们可以看到,小车虽然回正力度增大了,而且响应更加快了,但是稍微加入一点的干扰都会让小车大幅度摆动,抗干扰能力明显不足,所以这组参数不可取。

转向环

  转向环是最不重要的一环,所以网上资料都是同样的,摸棱两可没说清楚,自己整理了一下
  如果需要转向,其实需要左轮右轮有一个速度差就行了
  转向是对六轴传感器的z轴的旋转,就是偏航角作为反馈信息
  PD环节可能有些同学看不懂,我们一个一个来看
在这里插入图片描述
E(k)     :是期望值和反馈值的差
E(k) - E(k-1) : 是E(k)的微分
带进转向环
E(K) = (期望的角度 -反馈的角度 )
E(k) - E(k-1) 就是角度的微分就是角速度
注:角速度的积分等于角度、那么角度的微分就是角速度

int Vertical_turn_PD(short yaw)
{
		float Turn;     
	    float Bias;	  
	  Bias=90-Yaw;
	  Turn=-Bias*PID.Turn_Kp-yaw*PID.Turn_Kd;
	  return Turn;
}

Bias=90-Yaw;
90是我期望的角度
Yaw是当前的偏航角
这样就能完成原地转向90°的算法了
但是一般人脸识别,CCD模块中我们是不会这样去算的,
Bias直接取差值就行

/**************************************************************************************************************
*函数名:Vertical_turn_PD()
*功能:转向环PD
*形参:无  CCD小于64左转、CCD大于64右转。 yaw = z轴陀螺仪数值
*返回值:无
***************************************************************************************************************/
int Vertical_turn_PD(u8 CCD,short yaw)
{
		float Turn;     
	    float Bias;	  
	  Bias=CCD-64;
	  Turn=-Bias*PID.Turn_Kp-yaw*PID.Turn_Kd;
	  return Turn;
}

Bias=CCD-64
64是ccd模块的中值

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

速度环+直立环+转向环 的相关文章

  • FreeRTOS系统的一些理解

    最近在学些FreeRTOS xff0c 从初学者的角度 xff0c 需系统优势 xff0c 运行原理以及框架结构做以总结 FreeRTOS系统的优势 1 协议栈代码完全开源 xff0c 而且官网相关补充资料也完全免费 2 FreeRTOS使
  • NVIDIA JETSON TX2上运行yolo3

    以下为我参考JK Jung s blog YOLOv3 on Jetson TX2在自己的TX2上测试yolo v3的过程 0 刷机安装JetPack 3 2 1 安装opencv3 4 0 因为目前安装的3 4 1不能跑yolo Step
  • 记DeeCamp 2019夏面试

    本周完成创新工场DeeCamp2019面试 本来还准备蛮多 把笔试题目重新过了一遍 把自己简历里的知识点和项目重新回顾了一下 xff0c 根据面试情况来说 后者是非常有用的 由于第一次参加视频面试 xff0c 记录一下过程 1 先进行2分钟
  • TX2刷机Jetpack3.2教程——亲测记录

    一 开机 xff0c 按照提示安装系统 cd NVIDIA INSTALLER sudo installer sh 默认密码nvidia 按确认 等待安装完成后 xff0c 输入reboot 即可重启进入图形界面 二 刷机 安装Jetpac
  • TX2(Ubuntu16.04)更换清华镜像源

    一 备份 sudo cp etc apt sources list etc apt sources list bak 先备份原文件sources list sudo vim etc apt sources list sudo打开source
  • TX2使用技巧记录---scp传输、切换默认python版本、自动补全依赖、安装中文输入法

    一 从服务器上下载文件夹 安装ssh scp r user 64 10 20 3 1 地址 dir Download dir 二 切换默认python版本 echo alias python 61 python3 gt gt bashrc
  • TX2安装pip和cmake

    一 安装setuptools 下载网址 setuptools下载网址 下载setuptools 41 0 1 zip 解压 cd进目录 sudo python3 setup py install 二 安装pip 下载网址 pip下载网址 下
  • Ubuntu22.04分区设置

    今天刚安装了Ubuntu的系统 xff0c 安装过程中遇到了磁盘分配的问题 xff0c 个人总结后分区如下 xff0c 具体使用有待验证 磁盘总容量 xff1a 250G固态 43 1T机械 实际分配完毕之后固态和机械硬盘各留了一部分空间以
  • 【信号去噪】基于卡尔曼滤波和维纳滤波实现信号去噪附matlab代码

    1 简介 卡尔曼滤波算法是一种线性 递归的估值方法 在多领域 尤其在导航领域得到了非常广泛的应用 本文利用MATLAB仿真软件实现卡尔曼滤波器 通过实例来验证基于MATLAB设计的卡尔曼滤波器的滤波效果良好 观察噪声越小 系统噪声越大 递推
  • 【信号去噪】基于卡尔曼滤波实现信号去噪附matlab代码

    1 内容介绍 1 1 卡尔曼滤波理论的背景及意义 信号是信息的载体 一般可以分为两类 xff0c 分别为确定性信号与随机信号 服从 某种固定函数的关系的信号 xff0c 就是确定性信号 xff0c 它的变化是遵循一定规律的 xff0c 具有
  • 【无人机】基于虚拟leader实现无人机编队仿真附matlab代码

    作者简介 xff1a 热爱科研的Matlab仿真开发者 xff0c 修心和技术同步精进 xff0c matlab项目合作可私信 x1f34e 个人主页 xff1a Matlab科研工作室 x1f34a 个人信条 xff1a 格物致知 更多M
  • SSL单向认证详细流程

    SSL 单向认证流程如下 xff1a 1 拿到申请到的证书后 xff0c 需要安装到服务器中 3 客户端向服务器发送接入请求 4 服务器将证书发送给客户端 5 客户端开始对证书进行认证 xff0c 认证过程如下 在证书中获取证书的颁发机构字
  • 《自己动手写Docker》书摘之三---Union File System介绍

    Union File System UnionFS unionfs是一种为Linux xff0c FreeBSD和NetBSD操作系统设计的把其他文件系统联合到一个联合挂载点的文件系统服务 它使用branch把不同文件系统的文件和目录 透明
  • 【无人机】基于Matlab实现复杂三维地形的无人机路径规划问题

    作者简介 xff1a 热爱科研的Matlab仿真开发者 xff0c 修心和技术同步精进 xff0c matlab项目合作可私信 x1f34e 个人主页 xff1a Matlab科研工作室 x1f34a 个人信条 xff1a 格物致知 更多M
  • 【LSTM分类】基于卷积神经网络结合长短时记忆LSTM实现数据分类含Matlab源码

    作者简介 xff1a 热爱科研的Matlab仿真开发者 xff0c 修心和技术同步精进 xff0c matlab项目合作可私信 x1f34e 个人主页 xff1a Matlab科研工作室 x1f34a 个人信条 xff1a 格物致知 更多M
  • ardupilot飞控源码框架认识

    ardupilot飞控源码框架认识 转载 xff1a https blog csdn net csshuke article details 78850898 希望对更多的人有帮助 此篇blog的目的是对px4工程有一个整体认识 xff0c
  • 使用VSCode打造APM飞控的编译+烧录+调试一体的终极开发环境

    版权声明 xff1a 本文为博主原创文章 xff0c 遵循 CC 4 0 BY SA 版权协议 xff0c 转载请附上原文出处链接和本声明 本文链接 xff1a https blog csdn net loveuav article det
  • APM-mavlink添加消息和命令

    Mavlink资源 https mavlink io en url 61 git github com ArduPilot mavlink 事先准备好消息和命令内容 1 DO OPEN SPRAY 33002 命令实例 字段 数据类型 值
  • APM多旋翼参数

    持续更新中 ABPS AB点模式 ABPS ENABLE 1 ABPS LINE NUM 1 ABPS SPRAYER EN 1 ABPS WP DELAY 1 ACRO Acro特技模式 ACRO RP P 4 5 ACRO Y EXPO
  • APM-MP日志分析参数索引

    MP日志分析参数索引 通过 ctrl 43 F 查找获取需要对应参数信息 AP Logger 64 LoggerMessage ADSB ADSB 64 Description Automatic Dependent Serveillanc

随机推荐

  • 百度2014校园招聘研发工程师笔试题+答案

    一 xff0c 简答题 30分 1 xff0c 当前计算机系统一般会采用层次结构存储数据 xff0c 请介绍下典型计算机存储系统一般分为哪几个层次 xff0c 为什么采用分层存储数据能有效提高程序的执行效率 xff1f 10分 xff08
  • 教大家看官方技术文档(一)- Spring MVC

    每当学习一门新技术时候 xff0c 大部分人直接就是百度Bing搜索 xff0c 借鉴别人的博客例子等 我也是一样 xff0c 但是我经常想 xff0c 这些牛人的例子如何写出来的 xff0c 如何深入扩展其它功能等等 所以 xff0c 我
  • OpenCv学习笔记(二)--Mat矩阵(图像容器)的创建及CV_8UC1,CV_8UC2等参数详解

    xff08 一 xff09 Mat矩阵 图像容器 创建时CV 8UC1 CV 8UC2等参数详解 1 Mat不但是一个非常有用的图像容器类 同时也是一个通用的矩阵类 2 创建一个Mat对象的方法很多 我们现在先看一下Mat矩阵 图像容器类在
  • IP地址和MAC地址的作用和相互关系

    IP地址和MAC地址的作用和相互关系 关于IP地址和MAC地址相互关系以及数据包在网络中的寻址过程 xff0c 这两天盘了一下 xff0c 十多年前的计算机网络课程 xff0c 还是没有完全忘记的 概念说明 xff1a MAC地址 xff1
  • git commit –amend命令修改comment

    当git commit m your comment 后 xff0c 想修改提交后的comment xff0c 可以使用git commit amend命令 1 git commit amend xff0c 会出现上一次提交时的commen
  • php 设置允许跨域请求

    php 设置允许跨域请求 跨域 xff0c 指的是浏览器不能执行其他网站的脚本 它是由浏览器的同源策略造成的 xff0c 是浏览器施加的安全限制 同源策略 xff1a 是指域名 xff0c 协议 xff0c 端口均相同 xff0c 有任一不
  • TortoiseGit-git工具

    git小乌龟 git工具 xff0c 贼好用 下载地址 Download TortoiseGit Windows Shell Interface to Git
  • FAST-LIO, ikd-Tree, FAST-LIO2, FASTER-LIO论文总结

    目录 一 FAST LIO 本文的三个创新点 xff1a FAST LIO框架 二 ikd Tree 三 FAST LIO2 四 FASTER LIO 一 FAST LIO FAST LIO三个创新点 xff1a 将IMU和雷达点特征点紧耦
  • Realsense D435i运行ORB-SLAM3

    ORB SLAM3 根目录下的CMakeList txt opencv版本改为3 xff0c 目的是与ROS下的CMakeList txt指定的opencv版本相同 xff0c 都为3 否则会段错误 build sh build ros s
  • VINS-Fusion运行相关

    如何安装VINS Fusion 根据网址安装 xff1a https github com HKUST Aerial Robotics VINS Fusion 先装ceres xff08 网址中的改成 xff1a sudo make ins
  • jetson xavier nx 上 bash: nvcc: command not found

    jetson Xavier nx上已经默认安装好了cuda cuda 10 2和cudnn等 出现这个问题是因为 我们需要把cuda目录下的bin文件添加到环境变量中 解决方案 vim bashrc 按 i 进入输入模式 xff0c 在最后
  • ROS下使用intel Realsense摄像头进行人脸检测

    使用准备条件 xff1a ROS indigo intel Realsense摄像头 xff08 我使用的依旧是R200 xff09 确保已经正常安装驱动 xff0c 安装方法见博文 http blog csdn net may0324 a
  • 【VINS-MONO】RealsenseD435i运行VINS-Mono

    1 查看需要的 camera imu的topic内容格式 xff1a roscore rosbag play lt bag gt rostopic list rostopic echo lt topic gt 2 对齐XJ2 bag中的IM
  • vsCode如何自动保存代码

    文件 勾选自动保存 xff0c 即可
  • 智能设备WIFI配网方式汇总

    当前很多物联网设备大都无没有人机交互界面 xff0c 也就没有像手机或者PC那样有wifi的配置界面 xff0c 汇总了一下设备入网的方式大概有如下几种 xff1a 1 xff1a AP 模式流程如下 1 将Dev手动设置为AP模式 xff
  • 平凡的人生or开挂的人生——对知乎相关问题的回答

    知乎原题 xff1a 为什么有些人的人生和开了挂一样 xff1f https www zhihu com question 37106162 楼上说的都特别好 xff0c 我很想补充一点 我先抛出一个背景概念 我认为开挂人生 xff0c 本
  • Linux内核机制总结中断异常和系统调用之系统调用(三十三)

    文章目录 1 系统调用1 1 定义系统调用1 2 执行系统调用 重要 xff1a 本系列文章内容摘自 lt Linux内核深度解析 gt 基于ARM64架构的Linux4 x内核一书 xff0c 作者余华兵 系列文章主要用于记录Linux内
  • Web前端工程化之VSCode+Git 解决冲突和error

    多人协作开发使用版本控制难免会有冲突 xff0c 在前端使用VSCode和Git过程中 xff0c 就会遇到大大小小的冲突 xff0c 有的merge一下 xff0c 然后提交推送就可解决 xff0c 有的是因为HEAD指针混乱造成 xff
  • 平时积累(四)

    1 重启Android运行环境 xff1a xff08 1 xff09 sudo adb shell stop xff08 2 xff09 sudo adb shell start 2 设置Android系统属性 xff1a xff08 1
  • 速度环+直立环+转向环

    文章目录 直立环直立环调节速度环速度环调节转向环 直立环 车模平衡控制也是通过负反馈来实现的 xff0c 与上面保持木棒直立比较则相对简单 因为车模有两个轮子着地 xff0c 车体只会在轮子滚动的方向上发生倾斜 控制轮子转动 xff0c 抵