2022 电赛C题 巡线基础模块代码(带控制)
巡线功能模块
from maix import camera, display, gpio, pwm
class FindLine():
def __init__(self):
self.THRESHOLD = (4, 53, -99, 87, -72, 70) # 黑色
self.roi = [(i*48, j*48, 48, 48) for i in range(5) for j in range(5)]
self.round = 0 # 定义走了几圈
# 左轮
self.left_round_1 = gpio.gpio(0, "H", 1)
self.left_round_2 = gpio.gpio(1, "H", 1)
self.left_pwm = pwm.PWM(6)
# 右轮
self.right_round_1 = gpio.gpio(2, "H", 1)
self.right_round_2 = gpio.gpio(3, "H", 1)
self.right_pwm = pwm.PWM(7)
# PWM数据初始化
self.forward = 10000000
self.fast = 7000000
self.slow = 13000000
# 激活
self.left_pwm.export()
self.right_pwm.export()
self.left_pwm.period = 20000000
self.right_pwm.period = 20000000
self.left_pwm.duty_cycle = self.forward
self.right_pwm.duty_cycle = self.forward
self.left_pwm.enable = True
self.right_pwm.enable = True
def forward_move(self):
self.left_pwm.duty_cycle = self.forward
self.right_pwm.duty_cycle = self.forward
def left(self):
self.left_pwm.duty_cycle = self.slow
self.right_pwm.duty_cycle = self.fast
def right(self):
self.left_pwm.duty_cycle = self.fast
self.right_pwm.duty_cycle = self.slow
# 获取黑线中心
def get_black_center(self, img, roi):
most_pixels = 0
max_x = 0
if img:
blob0 = img.find_blobs([self.THRESHOLD], roi=roi, pixels_threshold=100, area_threshold=100, merge=True)
if blob0:
for n in range(len(blob0)):
if blob0[n]["pixels"] > most_pixels:
most_pixels = blob0[n]["pixels"]
max_x = n
return blob0[max_x]["x"] + int(blob0[max_x]["w"] / 2), blob0[max_x]["y"] + int(blob0[max_x]["h"] / 2)
else:
return 0
else:
return 0
# 连线函数(可用可不用,看性能)
def connect_line(self, img, dot_list):
x_orl = 0
y_orl = 0
c = 0
for i in dot_list:
if i == 0:
continue
else:
if c != 0:
img.draw_line(x_orl, y_orl, i[0],
i[1], color=(255, 0, 0), thickness=1)
c = 1
x_orl = i[0]
y_orl = i[1]
return img
# 扫描停止标志
def stop_sign(self, img):
flag = 0
roi_list = [(40, 190, 60, 50), (140, 190, 60, 50)]
max_num_list = []
for roi in roi_list:
max_num = img.get_statistics(roi=roi)[0] # 获取图像中的平均数
max_num_list.append(max_num)
for i in max_num_list:
if i > 50:
flag = 1
return flag
# 识别进分叉
def bifurcate_identify(self, img):
flag = 0
roi = (48, 30, 48, 48)
max_num = img.get_statistics(roi=roi)[0] # 获取图像中的平均数
if max_num < 50:
flag = 1
return flag
# 向左拐进内圈
def turn_left(self, img):
dot_list = []
roi = [(0, i * 48, 120, 48) for i in range(5)] # 左边大半块
for i in range(5):
roii = roi[i]
dot_list.append(self.get_black_center(img, roii))
for j in dot_list:
if j == 0:
continue
else:
img.draw_circle(j[0], j[1], 4, color=(255, 255, 255), thickness=1)
if dot_list == [0, 0, 0, 0, 0]:
count = 0
count_num = 0
for i in dot_list:
if i == 0:
continue
count_num += 1
count += i[0]
if count_num != 0:
x_middle = int(count / count_num)
else:
x_middle = 60
else:
x_middle = 60
img = self.connect_line(img, dot_list)
display.show(img)
return x_middle
# 前进函数
def move_forward(self, img):
dot_list = []
roi = [(90, i * 48, 60, 48) for i in range(5)] # 中间
for i in range(5):
roii = roi[i]
dot_list.append(self.get_black_center(img, roii))
for j in dot_list:
if j == 0:
continue
else:
img.draw_circle(j[0], j[1], 4, color=(255, 255, 255), thickness=1)
if dot_list == [0, 0, 0, 0, 0]:
count = 0
count_num = 0
for i in dot_list:
if i == 0:
continue
count_num += 1
count += i[0]
if count_num != 0:
x_middle = int(count / count_num)
else:
x_middle = 120
else:
x_middle = 120
img = self.connect_line(img, dot_list)
display.show(img)
return x_middle
# 检测右边还有没有线(判断是否进入内圈)
def detect_whether_into_inner(self, img):
yes_inner = 0
roi = [(150, i * 48, 90, 48) for i in range(5)] # 左边大半块
for i in range(5):
roii = roi[i]
flag = self.get_black_center(img, roii)
if flag:
yes_inner = 1
break
return yes_inner
def run(self):
while 1:
img = camera.capture()
# 逻辑函数自己写喽,想怎么处理自己决定
if __name__ == '__main__':
findline = FindLine()
findline.run()

基本都封装好了,想怎么用调用相应的函数即可,注意一下ROI区域在屏幕中的位置就行,可能反过来
注:硬件Maix ii dock (v831)
2022 电赛C题 巡线基础模块代码(带控制)的更多相关文章
- TI MSP430工程配置及2019年电赛A题编程示例(使用430 F5529)
配置 第一步:右击工程,选择Options 第二步:在General Options的Target选项卡里选择对应的器件Device,这里是MSP430G2231 第三步:在Debugger里选择FE ...
- 【系列】关于NJUPT电赛自控方向第一次积分赛的总结
本人是NJUPT电子科学与技术专业大一摸鱼狗一枚.本博客旨在总结与分享个人准备电赛所学知识,同时也是为了防止遗忘,锻炼写文章的能力.目前电赛方向为自控方向.主要研究方向为单片机.图像处理.自动控制相关 ...
- 2017年第六届数学中国数学建模国际赛(小美赛)C题解题思路
这篇文章主要是介绍下C题的解题思路,首先我们对这道C题进行一个整体的概括,结构如下: C题:经济类 第一问:发现危险人群. 发现:欺诈的方式开始.雇佣或浪漫的承诺. 数据→确定特定的经济萧条地区→确定 ...
- 杭电acm刷题顺序
最近兴趣来了,闲暇之余,回顾大学期间刷过的杭电acm那些入门级别的题,以此巩固基础知识! 以下参考刷题顺序,避免入坑 原文传送门:https://blog.csdn.net/liuqiyao_01/a ...
- 4. K线基础知识
1. K线基础知识 K线又叫阴阳线.蜡烛图.最早由日本米市商人发明,后来推广应用到金融行情价格的分析. K线图的构造主要包含四个价格因素:开盘价.收盘价.最高价.最低价 2. K线图例 收盘价高于开盘 ...
- 2013杭州现场赛B题-Rabbit Kingdom
杭州现场赛的题.BFS+DFS #include <iostream> #include<cstdio> #include<cstring> #define inf ...
- 2013年山东省赛F题 Mountain Subsequences
2013年山东省赛F题 Mountain Subsequences先说n^2做法,从第1个,(假设当前是第i个)到第i-1个位置上哪些比第i位的小,那也就意味着a[i]可以接在它后面,f1[i]表示从 ...
- 2013年省赛H题
2013年省赛H题你不能每次都快速幂算A^x,优化就是预处理,把10^9预处理成10^5和10^4.想法真的是非常巧妙啊N=100000构造两个数组,f1[N],间隔为Af2[1e4]间隔为A^N,中 ...
- 2013年省赛I题 Thrall’s Dream
2013年省赛I题判断单向联通,用bfs剪枝:从小到大跑,如果遇到之前跑过的点(也就是编号小于当前点的点),就o(n)传递关系. bfs #include<iostream> #inclu ...
- HEX SDUT 3896 17年山东省赛D题
HEX SDUT 3896 17年山东省赛D题这个题是从矩形的左下角走到右上角的方案数的变形题,看来我对以前做过的题理解还不是太深,或者是忘了.对于这种题目,直接分析它的性质就完事了.从(1,1)走到 ...
随机推荐
- excel怎么根据数值做进度条
开始->条件格式->数据条
- 五大股票金融数据API接口推荐:从实时行情到历史数据全覆盖
摘要:本文将介绍五大主流的股票金融数据API接口,涵盖实时行情.历史数据.技术指标等功能,帮助开发者快速构建金融数据应用.(本文由deepseek生成) 一.StockTV API 1. 核心优势 全 ...
- 在Linux中查看分区表的4种方法
作为Linux管理员,我们需要一次又一次地查看硬盘的分区表.这有助于我们通过为进一步分区腾出空间来重新组织旧驱动器,并在必要时为新驱动器创建空间.您可以在硬盘上创建不超过四个主分区,但可以在多个逻辑分 ...
- Docker管理面板系列——Portainer
一.介绍 Portainer是个轻量级的Docker管理面板,和Rancher这种重量级选手没法比,Portainer倾向于单机的管理(后来发现能够添加多个单机节点切换着管理),当然,在Docker搞 ...
- 官方的 MCP C# SDK:csharp-sdk
csharp-sdk 这是 Model Context Protocol(MCP)官方提供的 C# SDK,为 MCP 服务器和客户端提供简单易用的接口, 主要由微软维护.MCP 是由 Claude( ...
- 【Python】导出docx格式Word文档中的文本、图片和附件等
[Python]导出docx格式Word文档中的文本.图片和附件等 零.需求 为批量批改学生在机房提交的实验报告,我需要对所有的实验文档内容进行处理.需要批量提取Word文档中的图片和附件以便进一步检 ...
- udl(Universal Data Link)通用数据连接文件
新建文本文档 更改后缀名为.udl(注意小点) 然后打开运行 配置并测试 改回后缀名.txt(有个小点哦) 打开就是了
- 《机器人SLAM导航核心技术与实战》第1季:第3章_OpenCV图像处理
<机器人SLAM导航核心技术与实战>第1季:第3章_OpenCV图像处理 视频讲解 [第1季]3.第3章_OpenCV图像处理-视频讲解 [第1季]3.1.第3章_OpenCV图像处理_认 ...
- Linux 关机与重启命令
关机命令 我们可以使用以下三种命令来关机 Linux : 1.立刻关机(需要root用户) shutdown -h now 10 分钟后自动关机 shutdown -h 10 2.立刻关机 halt ...
- eolinker校验规则之正则匹配:返回结果校验的方法和案例(正则校验)
如上图红色箭头,需要校验返回值内是否包含"创建满足条件的优惠券"这一内容 如果需要满足以上校验,最好的方法就是使用正则进行匹配 切换到正则匹配,输入需要校验的内容,即可实现正则匹配 ...