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

news2024/9/21 16:16:45

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)。 根据矩形框的中心点坐标和角度,计算出激光笔需要移动的相对坐标。可以使用三角函数来计算相对坐标,例如使用正弦函数和余弦函数来计算横向和纵向的相对坐标。 将相对坐标转换为绝对坐标,即将相对坐标加上起始位置的坐标,得到激光笔需要移动的绝对坐标。 返回移动路径:将计算得到的移动路径返回,以便后续控制舵机移动。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/835096.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

W5500-EVB-PICO做DNS Client进行域名解析(四)

前言 在上一章节中我们用W5500-EVB-PICO通过dhcp获取ip地址&#xff08;网关&#xff0c;子网掩码&#xff0c;dns服务器&#xff09;等信息&#xff0c;给我们的开发板配置网络信息&#xff0c;成功的接入网络中&#xff0c;那么本章将教大家如何让我们的开发板进行DNS域名解析…

Python(六十三)获取字典视图

❤️ 专栏简介&#xff1a;本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中&#xff0c;我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 &#xff1a;本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

设计模式行为型——中介者模式

目录 什么是中介者模式 中介者模式的实现 中介者模式角色 中介者模式类图 中介者模式代码实现 中介者模式的特点 优点 缺点 使用场景 注意事项 实际应用 什么是中介者模式 中介者模式&#xff08;Mediator Pattern&#xff09;属于行为型模式&#xff0c;是用来降低…

Filebeat+ELK 部署

Node1节点&#xff08;2C/4G&#xff09;&#xff1a;node1/192.168.8.10 Elasticsearch Kibana Node2节点&#xff08;2C/4G&#xff09;&#xff1a;node2/192.168.8.11 Elasticsearch Apache节点&#xff1a;apache/192.168.8.13 …

Java反射学习(大综合)

第一天 Java反射及动态代理... 2 一、 Java反射... 2 1、什么是反射&#xff1a;... 2 2、反射的原理... 2 3、反射的优缺点&#xff1a;... 2 4、反射的用途&#xff1a;... 3 5、反射机制常用的类&#xff1a;... 3 1、获得Class&#xff1a;主要有三…

计算机基础:数据库-Sqlserver

数据库-Sqlserver 前言参考链接&#xff1a;关键词数据库代码案例视图触发器索引窗口函数游标小记 前言 妥妥的复习&#xff0c;我相信chatjpt,也相信笔记。 说实话&#xff0c;真正碰到问题还是先想到搜索引擎或chatjpt&#xff08;即使印象中自己的笔记记过相关内容&#xf…

NVIDIA 535.86.05 Linux 图形驱动程序改进 Wayland 支持

导读NVIDIA公司近日发布了适用于 Linux、FreeBSD 和 Solaris 系统的 NVIDIA 535.86.05 图形驱动程序&#xff0c;作为其生产分支的维护更新&#xff0c;解决了各种错误和问题。 NVIDIA 535.86.05 是在 NVIDIA 535.54.03 发布一个多月之后发布的&#xff0c;它通过解决在使用某…

量子机器学习解决方案新鲜出炉!Rigetti和ADIALab签署合作

​ &#xff08;图片来源&#xff1a;网络&#xff09; 近日&#xff0c;美国全栈量子经典计算的先驱Rigetti Computing宣布与阿拉伯联合酋长国的ADIA Lab签署了合作协议&#xff0c;双方将共同设计、构建、运行和优化量子计算解决方案&#xff0c;旨在解决概率分布分类问题&am…

【腾讯云Cloud Studio实战训练营】如何成为一名合格的Python爬虫“念咒师”(基于ChatGpt)

【前言】 不管是新手程序猿&#xff0c;还是秃头程序猿&#xff0c;在工作学习中&#xff0c;都无法避免一项看似简单却又异常重要的环节——搭建开发环境&#xff0c;这常常让我们程序猿们头痛不已&#xff01;毫不夸张的说&#xff0c;它可能是整个开发过程中最具挑战性和耗时…

Xcode protobuf2.5添加arm64编译器补丁生成静态库

项目需求&#xff0c;protobuf源码编成静态库使用 但是&#xff0c;github上的protobuf源码没有对应arm64的编译器定义&#xff0c;编译出来的静态库使用时报错。 下面的连接是arm64编译器代码补丁包&#xff0c;把编译器代码放到src/google/protobuf/stubs/atomicops_intern…

【安装】阿里云轻量服务器安装Ubuntu图形化界面(端口号/灰屏问题)

阿里云官网链接 https://help.aliyun.com/zh/simple-application-server/use-cases/use-vnc-to-build-guis-on-ubuntu-18-04-and-20-04 网上搜了很多教程&#xff0c;但是我没在界面看到有vnc连接&#xff0c;后面才发现官网有教程。 其实官网很详细了&#xff0c;不过这里还是…

Golang空结构体struct{}的作用是什么?

文章目录 占位符&#xff1a;通道标识&#xff1a;键集合&#xff1a;内存占用优化&#xff1a;总结&#xff1a; 在Go语言中&#xff0c;空结构体 struct{}是一种特殊的数据类型&#xff0c;它不占用任何内存空间。空结构体没有任何字段&#xff0c;也没有任何方法。尽管它看起…

Android Studio 的Gradle版本修改

使用Android Studio构建项目时&#xff0c;需要配置Gradle&#xff0c;与Gradle插件。 Gradle是一个构建工具&#xff0c;用于管理和自动化Android项目的构建过程。它使用Groovy或Kotlin作为脚本语言&#xff0c;并提供了强大的配置能力来定义项目的依赖关系、编译选项、打包方…

gradio创建机器学习的好工具 基本使用和示例

1.gradio介绍 Gradio: 用Python构建机器学习网页APP Gradio是一个开源的Python库,用于构建演示机器学习或数据科学,以及web应用程序。 使用Gradio,您可以基于您的机器学习模型或数据科学工作流快速创建一个漂亮的用户界面,让用户可以”尝试“拖放他们自己的图像、粘贴文本…

飞凌嵌入式「国产」平台大盘点(二)全志系列

在上篇文章中&#xff0c;小编带大家一起盘点了飞凌嵌入式国产平台中的瑞芯微系列核心板。本篇文章&#xff0c;将继续为大家介绍的是全志系列核心板&#xff0c;话不多说&#xff0c;上干货&#xff01; 全志科技 飞凌嵌入式 飞凌嵌入式与全志科技的合作始于2019年&#xff…

MobPush iOS SDK iOS实时活动

开发工具&#xff1a;Xcode 功能需要: SwiftUI实现UI页面&#xff0c;iOS16.1以上系统使用 功能使用: 需应用为启动状态 功能说明 iOS16.1 系统支持实时活动功能&#xff0c;可以在锁定屏幕上实时获知各种事情的进展&#xff0c;MobPushSDK iOS 4.0.3版本已完成适配&#xf…

Webpack5新手入门简单配置

1.初始化项目 yarn init -y 2.安装依赖 yarn add -D webpack5.75.0 webpack-cli5.0.0 3.新建index.js 说明&#xff1a;写入下面的一句话 console.log("hello webpack"); 4.执行命令 说明&#xff1a;如果没有安装webpack脚手架就不能执行yarn webpack&#xff08…

光电新风向——氮化镓

根据维基百科词条&#xff0c;氮化镓&#xff08;GaN、Gallium nitride&#xff09;是氮和镓的化合物&#xff0c;是一种 III 族和 V 族的直接能隙&#xff08;direct bandgap&#xff09;的半导体。自1990年起常用在发光二极管中。此化合物结构类似纤锌矿&#xff0c;硬度很高…

无人驾驶实战-第五课(动态环境感知与3D检测算法)

激光雷达的分类&#xff1a; 机械式Lidar&#xff1a;TOF、N个独立激光单元、旋转产生360度视场 MEMS式Lidar&#xff1a;不旋转 激光雷达的输出是点云&#xff0c;点云数据特点&#xff1a; 简单&#xff1a;x y z i &#xff08;i为信号强度&#xff09; 稀疏&#xff1a;7%&…

[比赛简介]OTTO – Multi-Objective Recommender System

比赛链接 比赛简介 本次竞赛的目标是预测电子商务点击、购物车添加和订单。您将根据用户会话中的先前事件构建多目标推荐系统。 您的工作将有助于改善所有相关人员的购物体验。客户将收到更多量身定制的建议&#xff0c;而在线零售商可能会增加销售额。 在线购物者可以从大…