智能车镜头组入门(六)车模的控制

news/2024/9/21 19:51:51 标签: 自动化, 单片机

本文会简单的介绍一些车模控制的方法。前文也说到过,因为我是写摄像头部分的,所以车模的控制部分我只能给大家简单的介绍下。

大家可能有所听说,智能车竞赛又被称为调参竞赛。显然好的参数决定了小车车速的上限。

调参调的是哪呢?大家肯定会听说过PID,镜头组还有一个是权重。

PID

有关pid的教程,csdn上有很多,大家可以去参考下他们的文章。但是pid为什么会用在智能车上呢?

每一个电机的机械参数都是不同的,有可能有一个电机给定7v的时候是10000转,其他相同型号相同流水线下来的电机给定7v的时候是12000转,转速的不同会引起小车左右两边的动力不平衡,会损伤电机,所以需要pid这个控制算法来控制左右舵机的电压。

有关pid的教程,大家可以去找其他大佬写的文章。很重要的一点是,电机带轮空转和轮放在地上跑的pid是不同的,空转的p会比在地上跑的p小很多。我们的车有一个特点是,小车在地上跑的pid,如果把车的后轮悬空,那么后轮会来回震荡(反复正反转)。

pid的输入有两个,一个是期望速度,一个是实际速度。

float PID_PWM_R(float Target,float Measur)
{
    float err,P_out,I_out,D_out;
    static float err_last_1,err_last_2,PID_output;

    err = Target - Measur;

    P_out = R_Kp * (err - err_last_1);
    I_out = R_Ki * err;
    D_out = R_Kd * (err - 2.0f*err_last_1 + err_last_2);

    PID_output += P_out + I_out + D_out;

    if(PID_output>6000)PID_output = 6000;
    if(PID_output<-6000)PID_output = -6000;

    err_last_2 = err_last_1;
    err_last_1 = err;

    return PID_output;
}

每个电机的pid都是不一样的,更换新的电机需要新的pid。

小车的实际速度是由编码器测出的,某飞的编码器是1024线的,意味着编码器转一圈会输出1024个脉冲。

权重

好的权重决定了小车的上限。其实权重的原理就是:权重 =累计的,每一行赛道中线离画面中线的距离。近端的权重决定了舵机的打角。

我们采用的是逐飞给的m4610d舵机,这个舵机的驱动方式和其他舵机不一样,是靠pwm的占空比来决定角度的,使用之前需要给舵机的打角做限制,比如10000的重装值, 5000是中点,4300是机械结构(转向拉杆)允许的机械最大角,那么就要把写到最后的输出限定里,不然容易损伤机械结构。

如何确定这个5000的中点值呢?就是在5000的情况下 推着小车走,如果走了一定距离能走直线,说明这个中点值是对的。

速度决策和前瞻

我们的速度决策是跟舵机的打角值和最长上升白列的长度有关的。同一个舵机的打角值,速度不同,转弯半径也不同。

别的文章可能提到过动态前瞻,这个算法比较高级,根据速度去计算前瞻的角度。这个算法比较高级,我们用过这个。大家可以自行尝试。

后轮差速

我只给出了我们计算后轮差速的方式,不知道是否正确,供大家参考

我们先来计算编码器的值和实际距离的转换

编码器的齿轮是30齿,电机从动轮是50齿,编码器是1024线的

那么他们的角速度比是5:3

那么轮胎转过一圈,编码器就转过5/3圈,产生1024*5/3个脉冲,轮胎走过5πcm

那么编码器有一个脉冲,实际距离是 (5π)/(1024*5/3)。

好,有了这个数据,就可以分析转弯的轮速差了


http://www.niftyadmin.cn/n/5669351.html

相关文章

OpenCV特征检测(3)计算图像中每个像素处的特征值和特征向量函数cornerEigenValsAndVecs()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 计算图像块的特征值和特征向量用于角点检测。 对于每一个像素 p &#xff0c;函数 cornerEigenValsAndVecs 考虑一个 blockSize blockSize 的邻…

java -- 枚举和注解

枚举 枚举介绍 &#xff08;1&#xff09;枚举&#xff1a;&#xff08;enumeration&#xff0c;简写 enum&#xff09; &#xff08;2&#xff09;枚举是一组常量的集合 &#xff08;3&#xff09;枚举属于一种特殊的类&#xff0c;里面只包含一组有限的特定的对象 枚举的两…

如何成立一家自己的等级保护测评机构?需要哪些条件?有哪些要求?

给大家的福利&#xff0c;点击下方蓝色字 即可免费领取↓↓↓ &#x1f91f; 基于入门网络安全/黑客打造的&#xff1a;&#x1f449;黑客&网络安全入门&进阶学习资源包 前言 各省、自治区、直辖市公安厅、局网络安全保卫总队&#xff0c;新疆生产建设兵团公安局网络安…

YOLOv5白皮书-第Y1周:调用官方权重进行检测

>- **&#x1f368; 本文为[&#x1f517;365天深度学习训练营](小团体&#xff5e;第八波) 中的学习记录博客** >- **&#x1f356; 原作者&#xff1a;[K同学啊](K同学啊-CSDN博客)** 一、前言 拖了好久&#xff0c;终于要开始目标检测系列了。自己想过好几次&#xf…

Windows没有gpedit.msc组件怎么办?

gpedit.msc 是组策略编辑器(Group Policy Editor)的管理控制台,主要用于配置 Windows 操作系统中的组策略。它允许用户和管理员管理计算机和用户的各种设置。 配置范围: 计算机配置:设置应用于所有计算机用户。用户配置:设置仅应用于特定用户。常见用例: 管理安全设置。…

【已解决】编译报错:fatal error: Eigen/Core: 没有那个文件或目录 #include <Eigen/Core>

1、如果没有安装过Eigen&#xff0c;可以使用以下git指令进行下载&#xff0c;或者也可以通过以下网址下载 git clone https://gitlab.com/libeigen/eigen.git网址1&#xff1a;https://eigen.tuxfamily.org/index.php?titleMain_Page 网址2: https://gitlab.com/libeigen/ei…

使用Renesas R7FA8D1BH (Cortex®-M85)实现多功能UI

目录 概述 1 系统框架介绍 1.1 模块功能介绍 1.2 UI页面功能 2 软件框架结构实现 2.1 软件框架图 2.1.1 应用层API 2.1.2 硬件驱动层 2.1.3 MCU底层驱动 2.2 软件流程图 4 软件功能实现 4.1 状态机功能核心代码 4.2 页面功能函数 4.3 源代码文件 5 功能测试 5.1…

98-策略模式的理解

‌策略模式是一种软件设计模式&#xff0c;它定义了一系列算法&#xff0c;并将每个算法封装起来&#xff0c;使它们可以相互替换。这种模式允许算法的变化不会影响使用算法的客户端&#xff0c;通过将使用算法的责任和算法的实现分割开来&#xff0c;并委派给不同的对象对这些…