基于机器视觉识别自动跟踪器
简介
本方案采用了VisonBoard作为主控板,通过OpenMV实现机器视觉的识别和跟踪,通过训练或识别特定的物体后输出控制参数给BearPi -IoT开发板,然后实时控制两个自由度的舵机,一个转向电机,和一个电机。所以跟踪功能除了使用两个自由度的舵机进行上下左右的跟踪外还通过转向舵机和直流电机进行前后跟踪,也就是通过一个小车来实现前后跟踪。前后指令参数也是通过VisonBoard发出的。

视频地址:【24嵌入式设计大赛】基于机器视觉识别自动跟踪器_哔哩哔哩_bilibili
硬件控制:
本次主控芯片采用的VisonBoard开发板,运行的固件是基于RT-Thread的OpenMV,所以通过python就可以轻松实现机器识别,那么本项目主要通过识别到物体后,通过串口输出相关参数给小熊派开发板BearPi-IoT的串口2,然后输出三路PWM波形来控制三个舵机。


3路PWM对应引脚号:

系统总时钟72MHz,以下是PWM的配置参数,实现50Hz的PWM输出。




软件控制:
代码链接:flytianya2010/RT-Thread-VisonBoard机器视觉跟随器 (gitee.com)
软件部分主要实现OpenMV功能的机器视觉识别。在这个之前要先配置和编译提供的SDK,因为要打开读取SD卡功能,把main.py文件拷贝到SD卡中,否则无法离线运行。文件目录:sdk-bsp-ra8d1-vision-board\projects\vision_board_openmv。在这个目录下打开命令窗口输入menuconfig进行配置,配置好之后退出配置界面,输入scons —target=mdk5 -s更新SDK,然后用KEIL软件打开工程编译和烧录代码到板子上。这样就可以使用OpenMV了。




主要代码功能如下:
VisonBoard的OpenMV代码功能如下:
主要功能是识别一个特定物体的颜色并通过VisonBoard的硬件串口输出物体的位置信息。
if largest_blob.elongation() > 0.5:
img.draw_edges(largest_blob.min_corners(), color=(255, 0, 0))
img.draw_line(largest_blob.major_axis_line(), color=(0, 255, 0))
img.draw_line(largest_blob.minor_axis_line(), color=(0, 0, 255))
img.draw_cross(center_x, center_y)
img.draw_keypoints(
[(center_x, center_y, int(math.degrees(largest_blob.rotation())))], size=20
)
# 计算距离
focal_length = 2.80 # 焦距,单位:毫米
real_width = 6.0 # 实际物体宽度,单位:厘米
pixel_width = largest_blob.h()
distance = ((real_width * focal_length) / pixel_width)*100
print("Distance: %.2f cm\r\n" % distance)
#img.draw_string(10,10,"Distance",color={255,0,0})
send_data(center_x,center_y,distance,W,H) # 发送数据
print(center_x,center_y,distance,W,H)
print(f"x={center_x} y={center_y}\r\n W={W} H={H}")
img.draw_string(10, 10, "Distance:%.2f cm"%distance, size=60,color=(0, 255, 0)) # 在坐标(10, 10)处绘制红色文字"Hello OpenMV!"
# img.draw_string(10,30,"distance:" ,color=(0,255,0)) # 在坐标(10, 30)处绘制绿色文字,显示温度值
小熊派开发板代码如下
通过STM32L431的UART2接收VisonBoard发来的串口数据并解析出来物体的X,Y轴信息和距离,这样就可以相应的控制两个自由度舵机云台和一个方向舵机和电机的前后移动。目前测得距离与实际存在一些误差,但是可以满足控制要求了。
while (1)
{
HAL_Delay(50);
HAL_UART_Receive_IT(&huart2, (uint8_t *)&readData, 1);
//320*240
if(finish_flag==1)
{
finish_flag=0;
sscanf(Uart1send_rx_buf, "%d %d %f", &cx, &cy,&distance); //获取OpenMV发过来的X,Y位置信息
//t = 0.5ms——————-舵机会转到 0 ° 占空比为:0.025
//t = 1.0ms——————-舵机会转到 45° 占空比为:0.050
//t = 1.5ms——————-舵机会转到 90° 占空比为:0.075
//t = 2.0ms——————-舵机会转到 135°占空比为:0.1
//t = 2.5ms——————-舵机会转到 180°占空比为:0.125
// double PA6_PWM_x=170;//上电后都处于90° leftmax:220 -170-rightmax:120
// double PA1_PWM_y=145;//上电后都处于45° down:200 145 up:90
// double PA8_PWM_Car=145;//上电后都处于45°left:125-145- 170
PA6_PWM_x=PA6_PWM_x+PIDx_realize(cx,160);//第一参数为实际坐标,第二个参数为设定坐标
if(PA6_PWM_x<120)PA6_PWM_x=120;
if(PA6_PWM_x>220)PA6_PWM_x=220;
TIM16->CCR1=PA6_PWM_x;//PA6
PA1_PWM_y=PA1_PWM_y+PIDy_realize(cy,120);//Y坐标
if(PA1_PWM_y<90 ) PA1_PWM_y=90;
if(PA1_PWM_y>200) PA1_PWM_y=200;
TIM2->CCR2=PA1_PWM_y;
}
//车舵机控制
PA8_PWM_Car=305-PA6_PWM_x;
if(PA8_PWM_Car<125)PA8_PWM_Car=125;
if(PA8_PWM_Car>180)PA8_PWM_Car=180;
TIM1->CCR1=PA8_PWM_Car;
//电机控制
/*全速模式*/
if(distance>30||auto_flag==1)//前进
{
auto_flag=0;
//LCD_ShowCharStr(10,100,"FORWARD ",BACKCOLOR,RED,24);
HAL_GPIO_WritePin(CAR_MOTOR_F_Port,CAR_MOTOR_F_Pin,GPIO_PIN_SET);
HAL_GPIO_WritePin(CAR_MOTOR_R_Port,CAR_MOTOR_R_Pin,GPIO_PIN_RESET);
}
else if(distance<15)//后退
{
//LCD_ShowCharStr(10,100,"BACK ",BACKCOLOR,RED,24);
HAL_GPIO_WritePin(CAR_MOTOR_F_Port,CAR_MOTOR_F_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(CAR_MOTOR_R_Port,CAR_MOTOR_R_Pin,GPIO_PIN_SET);
}
else if(distance<5||(distance<48&&distance>15))//停止
{
//LCD_ShowCharStr(10,100,"STOP ",BACKCOLOR,RED,24);
HAL_GPIO_WritePin(CAR_MOTOR_F_Port,CAR_MOTOR_F_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(CAR_MOTOR_R_Port,CAR_MOTOR_R_Pin,GPIO_PIN_RESET);
}
distance=0;
未来使用扩展
1、未来可增加蓝绿光跟踪定位,捕捉到光后,实时跟踪光,确保光的强度,保证光通讯带宽。
2、增加激光瞄准器,实时打击定位。
3、增加识别火焰功能和喷水枪,实现消防灭火。
4、远程图传功能。
总结
VisonBoard的OpenMV功能强大,机器视觉的识别更加高效,比市面的OpenMV功能更加齐全完善。结合外部的控制器如小熊派开发板能够快速实现外围电路的控制。
不足:刚开始发现板子上是有1路PWM的,也实现了输出PWM波形控制舵机,但是发现不够用,所以通过小熊派开发板进行PWM的扩展。否则一个VisonBoard就可以实现三个舵机的控制。不过现在看来外置控制板还是有好处的,分工明确,调试方便,控制更加合理。
大佬 很强啊 !sdk-bsp-ra8d1-vision-board\projects\vision_board_openmv 这部分的代码好像没在gitee里面
@李肯陪你玩赚嵌入式这个是SDK里面的,就不用了吧。我烧录的固件。没啥改的。
不错呀,学习学习