Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
OPENMV
基于机器视觉识别自动跟踪器
发布于 2024-09-10 23:50:38 浏览:641
订阅该版
[tocm] # 基于机器视觉识别自动跟踪器 #### 简介 ##### 本方案采用了VisonBoard作为主控板,通过OpenMV实现机器视觉的识别和跟踪,通过训练或识别特定的物体后输出控制参数给BearPi -IoT开发板,然后实时控制两个自由度的舵机,一个转向电机,和一个电机。所以跟踪功能除了使用两个自由度的舵机进行上下左右的跟踪外还通过转向舵机和直流电机进行前后跟踪,也就是通过一个小车来实现前后跟踪。前后指令参数也是通过VisonBoard发出的。 ![screenshot_跟踪器识别.jpg](https://oss-club.rt-thread.org/uploads/20240910/50e2dc493ec38a0762b851ae03b6476b.jpg.webp) 视频地址:[【24嵌入式设计大赛】基于机器视觉识别自动跟踪器_哔哩哔哩_bilibili](https://www.bilibili.com/video/BV12T4YehEju/?spm_id_from=333.337.search-card.all.click) #### 硬件控制: 本次主控芯片采用的VisonBoard开发板,运行的固件是基于RT-Thread的OpenMV,所以通过python就可以轻松实现机器识别,那么本项目主要通过识别到物体后,通过串口输出相关参数给小熊派开发板BearPi-IoT的串口2,然后输出三路PWM波形来控制三个舵机。 ![screenshot_VisonBoard.jpg](https://oss-club.rt-thread.org/uploads/20240910/ead53b0373875a04b1a84f0d1ef2329e.jpg.webp) ![screenshot_BearPi-IoT-C2kyEjHH.jpg](https://oss-club.rt-thread.org/uploads/20240910/9502cac9fecec08cddc4b0abca20c395.jpg.webp) 3路PWM对应引脚号: ![screenshot_PWM-mx.jpg](https://oss-club.rt-thread.org/uploads/20240910/6988902a14bb9bd610e80efcc3a3a1f8.jpg.webp) 系统总时钟72MHz,以下是PWM的配置参数,实现50Hz的PWM输出。 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20240910/bef6abc5448b3f248e3ef87b8c721988.png) ![screenshot_直流电机全桥驱动板.jpg](https://oss-club.rt-thread.org/uploads/20240910/8d8aa06b6f9c0c50944289d5d540f256.jpg.webp) ![screenshot_2自由度云台.jpg](https://oss-club.rt-thread.org/uploads/20240910/d5c64b02407fb208f26ae103f6e0bd44.jpg.webp) ![screenshot_硬件说明.png](https://oss-club.rt-thread.org/uploads/20240910/6b9c8a8cd65e7cce1da8de8398dddbe5.png.webp) #### 软件控制: 代码链接:[flytianya2010/RT-Thread-VisonBoard机器视觉跟随器 (gitee.com)](https://gitee.com/flytianya2010/rt-thread-vison-board-detect) 软件部分主要实现OpenMV功能的机器视觉识别。在这个之前要先配置和编译提供的SDK,因为要打开读取SD卡功能,把main.py文件拷贝到SD卡中,否则无法离线运行。文件目录:sdk-bsp-ra8d1-vision-board\projects\vision_board_openmv。在这个目录下打开命令窗口输入menuconfig进行配置,配置好之后退出配置界面,输入scons --target=mdk5 -s更新SDK,然后用KEIL软件打开工程编译和烧录代码到板子上。这样就可以使用OpenMV了。 ![screenshot_配置SDK.jpg](https://oss-club.rt-thread.org/uploads/20240910/5519a37e4168e3081159127857e6f989.jpg.webp) ![screenshot_打开SD卡3.jpg](https://oss-club.rt-thread.org/uploads/20240910/d00446b106b46f993aac138172ed74d6.jpg.webp) ![screenshot_打开SD卡2.jpg](https://oss-club.rt -thread.org/uploads/20240910/9136c1e4d965f35e1d8f6f61a9e36891.jpg.webp) ![screenshot_打开SD卡.jpg](https://oss-club.rt-thread.org/uploads/20240910/82747af503a56edde6cdf9b8aef52ae3.jpg.webp) 主要代码功能如下: 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就可以实现三个舵机的控制。不过现在看来外置控制板还是有好处的,分工明确,调试方便,控制更加合理。
3
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
flytianya2010
这家伙很懒,什么也没写!
文章
1
回答
0
被采纳
0
关注TA
发私信
相关文章
1
OPENMV软件包怎么使用
2
OPENMV STM32H7 编译失败
3
openMV+micropy与RT1064的一个尝试
4
Vision Board连接不上OpenMV IDE
5
Vision Board使用openmv无法下载脚本
6
在visonboard开发中尝试在openmv中加载个人训练的YOLOv5模型,报错,超出内存
7
Vision Board 的openmv如何部署socket 模块
8
Vison Board 如何在openmv 、main.py脚本中实现和其它线程通信?
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
ulog
C++_cpp
at_device
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
13
个答案
2
次被采纳
张世争
9
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
本月文章贡献
程序员阿伟
8
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
5
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部