2023 电赛E题--可能会出现的问题以及解决方法

2023年电赛E题报告模板(K210版)--可直接使用

本文链接:2023年电赛E题报告模板(K210版)--可直接使用_皓悦编程记的博客-CSDN博客

解决激光笔在黑色区域无法识别

本文链接:

2023 电赛 E 题 激光笔识别有误--使用K210/Openmv/树莓派/Jetson nano实现激光笔在黑色区域的目标检测_牧子川的博客-CSDN博客

问题:第二题测量的pwm误差跟舵机跑起来不一样是什么原因啊

解决方法:动态补偿

问题:激光在黑胶带上就识别不出来

解决方法:查看该链接有方法

2023 电赛 E 题 激光笔识别有误--使用K210/Openmv/树莓派/Jetson nano实现激光笔在黑色区域的目标检测_牧子川的博客-CSDN博客

就这种现象 现在三种解决方案可以尝试,

第一种就是把曝光调到极致,这样其他地方都是黑的,方便识别;

第二种就是用浅色广告布,不要用黑胶带;

第三种就是直接用深度学习自己训练

第三种我觉得就是这个题的考点

问题:我的显示没有点定义distance_cm、H_FOV这两个值,要怎么解决?

解决:根据代码自查

import sensor, image, math, pyb

初始化相机

sensor.reset()

sensor.set_pixformat(sensor.RGB565)

sensor.set_framesize(sensor.QVGA)

sensor.skip_frames(time=2000)

设置阈值,用于颜色分割

black_threshold = (0, 45, -30, 40, -30, 30) # 根据实际情况调整阈值

舵机参数

servo_pan_pin = 1 # 舵机1的引脚编号

servo_tilt_pin = 2 # 舵机2的引脚编号

servo_pan = pyb.Servo(servo_pan_pin) # 初始化舵机1

servo_tilt = pyb.Servo(servo_tilt_pin) # 初始化舵机2

servo_speed = 50 # 舵机转动速度(0-100,越大越快)

servo_pan_range = (0, 180) # 舵机1转动范围(角度)

servo_tilt_range = (0, 180) # 舵机2转动范围(角度)

控制舵机沿着矩形框移动一圈,并回到中心点

for angle in range(servo_pan_range[0], servo_pan_range[1], servo_speed):

servo_pan.angle(angle) # 控制舵机1水平旋转

servo_tilt.angle(angle) # 控制舵机2垂直旋转

pyb.delay(100) # 延时一段时间,控制舵机转动速度

将舵机回到中心点

servo_pan.angle((servo_pan_range[0] + servo_pan_range[1]) // 2)

servo_tilt.angle((servo_tilt_range[0] + servo_tilt_range[1]) // 2)

寻找矩形函数,返回第二大的矩形区域

def find_second_largest_rectangle(blobs):

max_area = 0

max_blob = None

second_max_area = 0

second_max_blob = None

for blob in blobs:

area = blob.area()

if area > max_area:

second_max_area = max_area

second_max_blob = max_blob

max_area = area

max_blob = blob

elif area > second_max_area:

second_max_area = area

second_max_blob = blob

return second_max_blob

while True:

img = sensor.snapshot().lens_corr(1.8) # 获取图像

blobs = img.find_blobs([black_threshold], pixels_threshold=200, area_threshold=200)

if blobs:

寻找第二大的矩形区域

second_max_blob = find_second_largest_rectangle(blobs)

if second_max_blob:

img.draw_rectangle(second_max_blob.rect(), color=(255, 0, 0), thickness=4) # 绘制第二大的矩形框,颜色为红色

获取矩形框的中心点坐标

x, y = second_max_blob.cx(), second_max_blob.cy()

计算矩形框的长度和宽度(单位:厘米)

width_cm = 2 * distance_cm * math.tan(math.radians(H_FOV / 2)) * (second_max_blob.w() / img.width())

问题:openmv能 不用pid直接从中心坐标跑到矩形的一个顶点吗

解决:不能

问题:arduino接收到原点坐标如何控制激光笔移动到原点啊,思路是什么啊?

解决:把舵机移动范围划分出来,每一格代表多少 然后移动

问题:用arduino实现与openmv的通信

解决:

OpenMV上的代码(Python):

```python

import sensor, image, time, pyb

初始化串口

uart = pyb.UART(3, 9600)

while(True):

拍摄图像

img = sensor.snapshot()

在图像上绘制一个矩形

img.draw_rectangle(50, 50, 100, 100)

将图像转换为灰度图像

img_gray = img.to_grayscale()

计算矩形区域的平均亮度

avg_brightness = img_gray.get_statistics().mean()

将平均亮度值发送到Arduino

uart.write(str(avg_brightness) + '\n')

延迟一段时间

time.sleep(100)

```

在Arduino上的代码(C/C++):

```cpp

void setup() {

// 初始化串口

Serial.begin(9600);

}

void loop() {

if (Serial.available()) {

// 读取串口数据

String data = Serial.readStringUntil('\n');

// 将字符串转换为浮点数

float brightness = data.toFloat();

// 打印接收到的亮度值

Serial.print("Received brightness: ");

Serial.println(brightness);

// 延迟一段时间

delay(100);

}

}

OpenMV通过串口将图像的平均亮度值发送到Arduino,然后Arduino接收并打印接收到的亮度

问题:open mvF7PLUS能不能使用pwm

解决:不能

问题:为啥我链接上openmv 就变成变成一个角度,之后就不动了

解决:首先要能单独控制舵机 旋转任意角度

jetson(1404551917) 2023/8/3 17:21:16

import time

import machine

配置舵机引脚和PWM

pwm_pin = machine.Pin("P7", machine.Pin.OUT)

pwm = machine.PWM(pwm_pin, freq=50) # 使用50Hz的频率

设置舵机的转动范围(可以根据舵机型号进行调整)

min_duty = 30 # 最小占空比,对应最小角度

max_duty = 130 # 最大占空比,对应最大角度

控制舵机转动到指定角度

def set_servo_angle(angle):

将角度转换为对应的占空比

duty = min_duty + (max_duty - min_duty) * angle / 180.0

pwm.duty(int(duty))

示例:让舵机在0°和180°之间来回转动

while True:

for angle in range(0, 181, 10):

set_servo_angle(angle)

time.sleep(0.5)

for angle in range(180, -1, -10):

set_servo_angle(angle)

time.sleep(0.5)

使用PWM信号控制舵机的转动角度

问题:第四题的思路

解决:你要使用k210得到A4靶的旋转角度 ,摄像头检测A4靶纸的位置和角度信息。

将检测到的位置和角度信息与舵机的控制代码结合,使之执行相应的旋转动作

示例代码

import machine

import time

定义舵机控制引脚

servo_pin = machine.Pin(12, machine.Pin.OUT)

servo_pwm = machine.PWM(servo_pin)

定义旋转角度的范围

min_angle = 0

max_angle = 180

定义舵机旋转函数

def rotate_servo(angle):

duty_cycle = int((angle / 180) * 1023) # 转换为占空比

servo_pwm.duty(duty_cycle)

获取A4靶纸的旋转角度

def get_target_rotation():

使用相应的传感器或相机模块获取位置和角度信息

在这里假设已经获取到了旋转角度

rotation_angle = 90 # 假设旋转角度为90度

return rotation_angle

将A4靶纸以任意旋转角度贴在屏幕上,并启动运动目标控制系统

def run_target_control():

target_rotation = get_target_rotation()

if min_angle <= target_rotation <= max_angle:

rotate_servo(target_rotation)

time.sleep(1) # 等待舵机旋转到指定角度

在这里添加您的其他运动目标控制代码

else:

print("无效的旋转角度")

主循环

while True:

run_target_control()

问题:第四问,识别到坐标后,没有什么好的思路

解决:获取倾斜矩形框的位置和角度:使用OpenMV的图像处理功能,通过颜色识别或者边缘检测算法检测出倾斜的矩形框,并获取其位置和角度信息。 计算矩形框的中心点坐标:根据矩形框的位置信息,计算出矩形框的中心点坐标。可以通过矩形框的左上角和右下角坐标来计算中心点坐标。 计算激光笔需要移动的路径:根据矩形框的中心点坐标和角度,计算出激光笔需要移动的路径。具体的计算方式可以根据你的需求和实际情况来确定,以下是一种可能的计算方式: 假设激光笔的起始位置为(0, 0)。 根据矩形框的中心点坐标和角度,计算出激光笔需要移动的相对坐标。可以使用三角函数来计算相对坐标,例如使用正弦函数和余弦函数来计算横向和纵向的相对坐标。 将相对坐标转换为绝对坐标,即将相对坐标加上起始位置的坐标,得到激光笔需要移动的绝对坐标。 返回移动路径:将计算得到的移动路径返回,以便后续控制舵机移动。

相关推荐
童安格粉丝2 个月前
centos 7 防止及解决keepalive脑裂现象(主备均有vip)
运维·centos·问题·keepalived·vip·漂移·两台都有
网络研究院3 个月前
多云复杂性正在危及组织的数字化进程
网络·人工智能·问题·技术··解决·洞察
网络研究院6 个月前
生物识别技术存在的问题及需要考虑的关键事项
人工智能·问题·风险·身份·隐私·验证·生物识别
悟道子HD6 个月前
web后端——netbeans ide +jsp+servlet开发学习总结
java·前端·ide·经验分享·后端·编辑器·问题
悟道子HD7 个月前
firefox 浏览器常见问题(技巧)总结
经验分享·科技·firefox·浏览器·问题·更新·技巧
伊织code7 个月前
生活 - 解决提出问题的人
生活·问题·解决·屏蔽·心态
前端菜鸟来报道7 个月前
关于npm和yarn的使用(自己的问题记录)
npm·问题
悟道子HD7 个月前
计算机网络技术-TCP传输连接的建立和释放过程;
网络·科技·tcp/ip·计算机网络·三次握手·问题·经验
fighting的码农(zg)-GPT8 个月前
【保姆级】GPT的Oops问题快速解决方案
gpt·算法·gpt4·解决方案·问题·sora·oops
窦再兴9 个月前
不懂咱就学,记不住多看几遍
java·开发语言·问题·原理