STM32
直播中

王艳

7年用户 1232经验值
私信 关注
[问答]

如何去实现一种基于openmv的自动跟踪小车设计呢

如何去实现一种基于openmv的自动跟踪小车设计呢?有哪些基本步骤?

回帖(1)

李茜

2021-12-22 14:52:08
基于openmv的自动跟踪小车

1、基础工作

(1)首先要能驱动小车

写一个run函数,能够给A、B两个直流电机施加动力,并给出PWM调速参数,给两个PWM引脚施加PWM波。
以下为详细解读:
(1)小车模块:驱动电机运动
使用N20直流减速电机,自带驱动
(2)驱动的作用:
单片机——>弱电——>电机驱动器——>强电——>电机
(3)引脚介绍:
[tr]引脚名称作用[/tr]
AIN1/AIN2控制A路电机转动,一个给高电平,一个给低电平,给的顺序决定转动方向
BIN1/BIN2控制B路电机
PWMA/PWMB与单片机可输出PWM波的IO口相连,控制电机转速
(4)具体代码:
ch1 = tim.channel(1, Timer.PWM, pin=pwma)//tim是一个定时器对象,为这个定时器创建一个通道,向pwma引脚输出PWM波 ch1.pulse_width_percent(value)//value介于0-100之间,设置脉冲活动占定时器周期的百分比 run(30,30)//左右电机都以30%的PWM波驱动,向前运动
(2)PID的初始化及运算:==

创建一个PID class,给定kp,ki,kd值来构造一个PID类。然后能够进行PID运算,输入偏差,输出PWM调速参数==。见上述代码
PID调速原理
公式:Pwm=Kpe(k)+Ki∑e(k)+Kd[e(k)-e(k-1)]
e(k):本次偏差
e(k-1):上一次的偏差
∑e(k):e(k)以及之前的偏差的累积和;其中k为1,2,k;
其中KP为比例系数;Ti为积分时间常数;Td为微分时间常数,每个系统不一样所以需要实验调试获得较为理想的,即能满足稳定性、快速性、准确性。
2、main函数内完成的工作


(1)使用openmv自带图像算法

求得目标物体的相关坐标。不管是apriltag标记还是色块,都有固定的识别算法,获取到物体的坐标、偏移角等参数。
blobs = img.find_blobs([green_threshold])//寻找全部色块
max_blob = find_max(blobs)//寻找最大的那个色块
2)计算两个方向上的误差

(色块的识别例子中的方法,apriltag应该也可以这样用)
左右方向:将物体的中心坐标移到视野的中心位置上
前后方向:使视野内物体的面积达到一定阈值,面积使用“宽X高”来计算,阈值可以自己设置
上下方向:假设该方向固定
计算误差的代码如下:
x_error = max_blob[5]-img.width()/2  //5号索引色块的中心x位置
h_error = max_blob[2]*max_blob[3]-size_threshold   //2号索引边界框的w坐标(宽度),3号索引边界框的h坐标(高度),计算得到视野内的色块面积。后面的是设置的阈值
(3)利用初始参数初始化PID类

这里的参数在实例中已经给出,现实中是需要自己调节的。将上述计算得到的两个方向上的误差作为输入参数进行计算,得到下一步的PWM参数值。代码如下:
x_output=x_pid.get_pid(x_error,1)h_output=h_pid.get_pid(h_error,1)
(4)将PWM参数输入run函数,驱动电机旋转。

car.run(-h_output-x_output,-h_output+x_output) 这里比较有意思。
1、x_output代表左右这个方向的输出值,小车运动过程中的左右调整是通过两电机的差速实现的,所以run函数的参数中x_output的符号不同。
2、h_output是前后方向的输出值,两电机在这个方向上“共进退”,所以参数中是相同符号。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分