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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Python】基础:标准库常用模块

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍标准库常用模块。 学其所用&#xff0c;用其所学。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下次更新不迷路&#…

vue3过滤输入框首尾空格

vue3过滤输入框首尾空格 在 directive文件夹下 新建 trim.ts 文件 // trim.ts 文件 import { App } from "vue"function getInput(el: { tagName: string; querySelector: (arg0: string) > any }) {let inputEleif (el.tagName ! INPUT) {inputEle el.queryS…

如何加载模型YOLOv8 ONNXRuntime

YOLOv8 是 YOLO(You Only Look Once)目标检测系统的最新版本(v8)。YOLO 是一种实时、一次性目标检测系统,旨在在网络的单次前向传递中执行目标检测,使其快速高效。YOLOv8是之前YOLO模型的改进版本,具有更高的精度和更快的推理速度。 ONNX(开放神经网络交换)是一种表示…

《每天5分钟玩转kubernetes》读书笔记

笔记 概念 Pod是脆弱的&#xff0c;但应用是健壮的。 kubelet运行在Cluster所有节点上&#xff0c;负责启动Pod和容器。kubeadm用于初始化Cluster。kubectl是k8s命令行工具。通过kubectl可以部署和管理应用&#xff0c;查看各种资源&#xff0c;创建、删除和更新各种组件。 …

Maven【入门笔记】

Maven 解决版本依赖的问题 https://www.liaoxuefeng.com/wiki/1252599548343744/1309301146648610 如果没有项目管理工具&#xff0c;在开发项目的时候&#xff0c;我们需要手动管理依赖包&#xff0c;需要管理依赖包的版本、去找到并下载依赖包、还有依赖包所依赖的包 等等。…

【C语言进阶】数据的存储----浮点型篇

&#x1f341; 博客主页:江池俊的博客 &#x1f4ab;收录专栏&#xff1a;C语言—探索高效编程的基石 &#x1f4bb; 其他专栏&#xff1a;数据结构探索 ​&#x1f4a1;代码仓库&#xff1a;江池俊的代码仓库 &#x1f3aa; 社区&#xff1a;GeekHub &#x1f341; 如果觉得博…

途游游戏 x 极狐GitLab “通关” DevOps :单元测试从无到优,覆盖率 0→80%

目录 4 个工具孤岛 → 极狐GitLab 全家桶&#xff0c; 被动的「人找进度」 → 高效的「进度找人」 把 Code Review 做扎实 代码质量「向左移」&#xff0c;修复成本「往下降」 从无到「优」 自动执行单元测试&#xff0c;覆盖率 0→80% 你喜欢玩游戏吗&#xff1f; 最近…

IE浏览器,和Edge浏览器

目录 一.IE浏览器&#xff08;前世今生&#xff09; 1.什么是IE浏览器&#xff1f; 2.IE浏览器发展历程 3.IE浏览器在早些年为什么这么流行 4.ie浏览器为什么被停用? 5.IE浏览器无法适应如今的Web发展原因 二.Edge&#xff08;发展&#xff09; 1.什么是Edge浏览器&…

docker【安装、存储、镜像、仓库、网络、监控】

docker-0110.0.0.51docker-0210.0.0.52docker-0310.0.0.53 【1】docker安装 docker-01 [rootdocker-01 ~]# vim /etc/yum.conf [main] cachedir/var/cache/yum/$basearch/$releasever keepcache1 debuglevel2 logfile/var/log/yum.log exactarch1 obsoletes1 gpgcheck1 plugin…

k8s ingress获取客户端客户端真实IP

背景 在Kubernetes中&#xff0c;获取客户端真实IP地址是一个常见需求。这是因为在负载均衡架构中&#xff0c;原始请求的源IP地址会被替换成负载均衡器的IP地址。 获取客户端真实IP的需求背景包括以下几点&#xff1a; 安全性&#xff1a;基于客户端IP进行访问控制和认证授…

做好“关键基础设施提供商”角色,亚马逊云科技加快生成式AI落地

一场关于生产力的革命已在酝酿之中。全球管理咨询公司麦肯锡在最近的报告《生成式人工智能的经济潜力&#xff1a;下一波生产力浪潮》中指出&#xff0c;生成式AI每年可能为全球经济增加2.6万亿到4.4万亿美元的价值。在几天前的亚马逊云科技纽约峰会中&#xff0c;「生成式AI」…

熟练掌握ChatGPT解决复杂问题——学会提问

目录 引言 一、5W1H分析法 1. 简单的问题&#xff08;what、where、when、who&#xff09; 2.复杂的问题&#xff08;why、how&#xff09; 2.1 为什么&#xff08;Why&#xff09;——原因 2.2 方式 &#xff08;How&#xff09;——如何 二、如何提问得到更高质量的答案…

pycharm运行pytest无法实时输出信息

需要去掉控制台输出。根据查询相关信息显示pycharm运行pytest无法实时输出信息&#xff0c;需要去掉pycharm里面的运行模式&#xff0c;点击减号&#xff0c;再点击加号&#xff0c;添加python执行文件即可实时输出信息。 问题描述&#xff1a; 使用pycharm运行代码时&#x…

uniapp 持续获取定位(登录状态下才获取)(不采用定时器)(任意页面都可监听定位改变)

基于上次文章做了优化和改良,保证在登录状态下才获取定位信息 uniapp 小程序实时且持续获取定位信息(全局设置一次)(单页面监听定位改变)(不采用定时器)_uniapp小程序定位_前端小胡兔的博客-CSDN博客本篇文章实现了uniapp 微信小程序实时获取定位信息,小程序打开即可持续获取定…

2023年第四届“华数杯”数学建模思路 - 案例:退火算法

## 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 退火算法原理 1.1 物理背景 在热力学上&#xff0c;退火&#xff08;annealing&#xff09;现象指物体逐渐降温的物理现象&#xff0c;温度愈低&#…

C++ 数组作为函数参数

数组元素和数组名都可以作为函数的参数以实现函数间数据的传递和共享。 可以用数组元素作为调用函数时的实参&#xff0c;这与使用该类型的一个变量&#xff08;或对象&#xff09;作实参是完全相同的。 如果使用数组名作为函数的参数&#xff0c;则实参和形参都应该是数组名…

企业上云实施路线图

企业上云步骤主要分为规划、设计、实施、验证、运维五个阶段。https://articles.e-works.net.cn/cloud/article144684.htm

XXL-JOB定时任务框架(Oracle定制版)

特点 xxl-job是一个轻量级、易扩展的分布式任务调度平台&#xff0c;能够快速开发和简单学习。开放源代码并被多家公司线上产品使用&#xff0c;开箱即用。尽管其确实非常好用&#xff0c;但我在工作中使用的是Oracle数据库&#xff0c;因为xxl-job是针对MySQL设计的&#xff…

group normalization

1、 Theory look for this link for more information, actually only this image can illustrate the group normalization.you can ignore the rest of this artical. 2、 Code check this link for detailed about the formulation and the theory of the group normalzi…

问题解决和批判性思维是软件工程的重要核心

软件工程的重心在于问题解决和批判性思维&#xff08;合理设计和架构降低复杂度&#xff09;&#xff0c;而非仅局限于编程。 许多人误以为软件工程就只是编程&#xff0c;即用编程语言编写指令&#xff0c;让计算机按照这些指令行事。但实际上&#xff0c;软件工程的内涵远超…