2023 Electric Competition --- スポーツ ターゲット コントロールおよび自動追跡システム (質問 E) OpenMV ソリューション

序文

(1) ナンセンスな話はやめて、多くの人が GitHub にアクセスできない可能性があるため、使用される可能性のあるコードを直接投稿します。このブログも更新され、最初にチュートリアルとコードが投稿されます
(2)
<1>ビデオチュートリアル: https://singtown.com/learn/49603/
<2>OpenMV Pan Tilt 公式 Github リンク: https://github.com/SingTown/OpenMV-Pan-Tilt/tree/ master /pan-tilt/src
(3) 赤い点が小さすぎる、OpenMV の精度が十分ではない、という人もいるでしょう。この C ステーションで作成されたしきい値コードを見てください: https://blog.csdn.net/weixin_52385589/ item/details/126334744
(4)コンペティション側が既製のガジェットを直接購入させるのは絶対に不可能です。そうでなければ、コンペティションの意味は何ですか? オンラインでいくつかの議論を見ました。カメラは必ず必要です, K210には公式図書館があるようで、K210の学生はそれについて学ぶことができます。
(5) OpenMV にはさらにトレーニングが必要です。照明補正を行うことをお勧めします。結局のところ、OpenMV には照明に対する高い要件があり、周囲の光が安定している必要があります。
注:ネチズンからのフィードバックによると、関係者は照明補正は使用できないと述べました。関連情報が得られませんでした。光補正を使用するかどうかを決定する前に確認してください。
(6)皆さん、何か質問がある場合は、ステーション C にプライベート メッセージを送ってみてください。コメントが多いので見落としてしまいがちです。(コメント欄に書くと熱くなってしまいますが、泣いてください)
(7)このブログは状況に応じてリアルタイムに更新していきますので、更新にご注意ください。
(8)繰り返しますが、提供されているものはすべて疑似コードです。間違いなくエラーが報告されます。自分で調整する必要があります! 私はアイデアを提供するだけで、料理が出されるのですが、食べられないのですか?
(9)更新日記:
〈1〉2023年8月2日午前9時。OpenMV 公式追跡ジンバル コードとそれに関連する解釈。
<2>2023年8月2日午前10時。ステーションCの別のボスのデバッグ結果コードを追加します。
<3>2023年8月2日午後2時。タイプミスを修正し、基本的な質問に対するアイデアを増やします。
<4>2023年8月2日午後2時10分。ネチズンからの質問をいくつか追加します。
〈5〉2023年8月2日午後2時40分。前書きが変更されました。質問がある場合はプライベート メッセージを送っていただければ幸いです。コメント エリアで時々更新されるためです。
〈6〉2023年8月2日午後2時50分。基本的な質問のアイデアは更新されており、4 番目の質問についてはまだ議論されています。
〈7〉2023年8月2日午後3時。ネットユーザーからのいくつかの質問を更新しました
<8> 2023年8月2日、午後3時40分。OpenMV の魚眼歪みによって引き起こされる可能性のある問題に関して、ソフトウェアおよびハードウェアの解決策が追加されました。
〈9〉2023年8月2日午後4時35分。コードエラー報告とデバイス選択問題への返信について。
<10>2023年8月2日午後5時30分。推奨される OpenMV ジンバルの購入時に発生する可能性のある問題、および機能すると言われている既製のソリューションについて更新します。
<11>2023年8月2日午後6時。エラー問題を報告するには、魚眼歪みコードを更新してください。基本問題の第 1 問と第 2 問のコードは、
<12> 2023 年 8 月 2 日、午後 6 時 20 分に与えられます。ブログビデオに関する情報の場所とコードの入手方法が更新されました。
<13>2023年8月2日午後6時40分。K210、OpenART mini、OpenMV コードに関する質問に回答しました。〈14〉2023年8月2日午後7時30分。ネチズンからの質問に答えると、ステアリングギアがぴくぴくと動く、OpenMVがメインコントローラーと通信している、最初と2番目の質問は、ステアリングギアの制御が不安定であるというものです。

<15>2023年8月2日午後9時20分。推奨ステアリングギアが更新されました。デジタルステアリングギアはアナログステアリングギアよりも正確です。
<16> 2023年8月3日、寝る前12時最終更新。レーザーとOpenMVの設置場所について。
〈17〉2023年8月3日9時50分。OpenART mini を OpenMV に移植する計画を更新し、ネチズンからの回答を得るためにブログを作成しました。
<18> 2023年8月3日、10時30分。話題の遊びのアイデアをアップデート。
〈19〉2023年8月3日、11時30分。現在のフィードバックと実現可能なソリューションを最も目立つ場所に配置します。
<20> 2023年8月4日9時20分。基本問題の3問目は微調整されています。基本的な質問と発展的な質問を分離します。遊びの質問はまだアイデアを補足しており、基本的な問題も昼前に補足される予定です。しばらくお待ちください。
<21> 2023年8月4日、10時30分。基本的な質問に対するすべてのテストのアイデアが提供され、疑似コードも提供され、ハードウェア テストのアイデアも提供されます。

オンラインで宣伝される既製のソリューション

OpenART miniの生徒さんはこちらをご覧ください

(1) インターネット上の誰かが、OpenART mini には既製のソリューションがあると言っているのを読みました。OpenART miniを知っている学生であれば、ぜひ試してみてください。この情報は次のとおりです
(2) Baidu ネットワーク ディスク情報:
OpenART 最小モジュール情報リンク: https://pan.baidu.com/s/1yoCNXzci_dfHzW33emxdLA
抽出コード: mxx8

ここに画像の説明を挿入

(3) ジンバル制御について:
<1> ジンバルは 2 つのサーボで構成され、下のサーボはヨー角 (左右) の回転を制御し、上のサーボはピッチ角 (上下) の回転を制御します。
<2> ジンバルにレーザー発射装置が取り付けられている場合、単一のサーボの回転を制御すると、レーザーの経路は直線であり、ジンバルの 2 つのサーボの経路は水平と直線であることが観察されます。 2つのステアリングギアを同時に制御すれば、面上の任意の位置にレーザー照射を実現できます。
<3> このとき、設定した一定の経路に従ってステアリングギアを制御する必要がある場合、経路が線分の場合、線分の始点座標と終点座標(座標はステアリングギアのハイレベル時間、つまりデューティサイクルに対応します)。開始点と終了点をジンバルサーボに直接出力すると、開始点と終了点に到達したにもかかわらず、パスは直線パスではありません。これは、X 軸と Y 軸の移動距離が一致していないことが原因です。そのため、この線分を細分化する必要があります。たとえば、開始点の座標を通じて線分を 1000 個の部分に細分化する必要があります。点と終点を指定し、1回に1箇所だけ移動すると、レーザーの軌跡が線分に沿って徐々に移動していることがわかります。
<4> 移動するパスが閉じた長方形の場合は、その長方形の四隅の座標を取得するだけでよく、上記の線分の分割移動に合わせて、四辺を細分化してサーボを制御します。徐々に移動します。つまり、絹のように見える閉じた長方形のパスが実現されます。
<5> 制御プログラムを作成する際に、この分割動作方法を使用すると、プログラムセグメントを周期割り込みの中に配置して実行することができ、このとき 1 回の動作時間を設定して、全体を制御することができます。移動速度。移動速度の制御は、経路の安定性であっても、点の追跡であっても、正確に移動速度を制御する必要があります。
(4) E の質問に含まれるメイン制御モデルに制限はありません. スマート カー コンペティションのコア ボード (RT1064、TC264、CH32V307、STC など) を使用できます. RT1064 メイン ボードには 3 つのステアリング ギア インターフェイスがありますパン/チルトを制御するのに便利で、レーザーに制限はなく、スポット サイズが 1 cm 以下である必要があるだけです。
(4) このプロジェクトに関する関連ビデオ資料:

1

2


5


4

6

OpenMV的同学看这个

点开这个链接:2023年电赛—运动目标控制与自动追踪系统(E题)OpenART mini的代码移植到OpenMV

硬件注意事项

接线问题

(1)我们这里是使用的OpenMV的P8和P7引脚。所以建议引脚如下图引出。
(2)舵机一般是5V供电,所以注意VCC是供5V的电压。而右边那两个GND和VCC是连接OpenMV的。如果右边的VCC是连接OpenMV的VIN引脚,就可以供5V电。如果是连接OpenMV的3.3V引脚,iu只能供3.3V电压。否则OpenMV会被烧掉!
(3)舵机的VCC要直接连接电池,因为如果通过OpenMV连接,OpenMV的输出电流太小,带不动舵机!

ここに画像の説明を挿入

云台购买推荐

(1)一开始我推荐使用这一款。后面根据别人反馈,精度不够。所以我还是推荐我之前吐槽的那个奇奇怪怪的舵机啊。(被打脸了,哈哈哈)

ここに画像の説明を挿入

(2)推荐这一款,虽然不需要这么大的扭矩,但是他是数字舵机,精度更高。

ここに画像の説明を挿入

OpenMV鱼眼畸变

(1)我刚刚上机测试了一下,突然发现OpenMV存在鱼眼畸变。
(2)鱼眼畸变就是,摄像出来的图片就像鱼的眼睛看到的图片一样,不是平的。
(3)这个会不会有影响不清楚。
(4)从硬件上处理办法就是换一个无畸变镜头,官方链接 :
https://item.taobao.com/item.htm?spm=a1z10.1-c-s.w5003-18207055866.1.6b0b1dc1nPB6IZ&id=601956249175&scene=taobao_shop
(5)来不及的话,可以使用软件方法。但是我测试了,好像没有反应。
<1>我们购买的OpenMV的默认镜头是带鱼眼效果的,所以需要进行畸变矫正(注意:此处运算量大,不建议长时间使用OpenMV不然会发烫很严重
<2>因为我们这里没有指定是传入的zoom,x_corr,y_corr的值,所以按照顺序,传入的1.8是给strength。我们可以调节这个值,来查看即便矫正的效果,建议从1.8开始尝试。
<3>zoom就是进行图像缩放,比如10X10的图像,为0.5,就算5X5的图像。建议为默认值,只需要调节strength就行了。
<4>后面这个x和y是什么,官方文档没有解释。
(6)真的太多人不喜欢认真看博客了,说了是伪代码,要自己调整。还要问!我这里还是给这真正0~基础的人,贴出来,别再问了!

import sensor, image
img = sensor.snapshot() # 截取一张图片
img.lens_corr(1.8)  #去除鱼眼畸变

ここに画像の説明を挿入

出现Frame capture has timed out. 帧捕获超时了

(1)如果是我贴出来的代码,出现这个bug。你重新开机启动应该就可以了。
(2)如果还不可以,就说明你OpenMV坏了。要快点换一个。

ここに画像の説明を挿入

基础题思路

(1)以下均为个人思路,仅供参考。
(2)个人认为基础题不需要使用PID,只需要一个OpenMV,两个舵机,一个云台就可以了。
(3)OpenMV控制舵机的教程:OpenMV输出PWM,实现对舵机控制
(4)根据网友反馈,本题不需要用PID!常见的数字舵机就行了!!!别跟我扯算法!!!

第一问—复位

(1)这个比较简单,我感觉只需要写入一个固定值,给舵机一个固定的PWM就可以了。
(2)关于按键问题,你们可以使用下面的函数实现。
<1>这里的pyb.Pin第一个参数是你用于读取按键值的。
<2>第二个参数可以获得引脚上的按键值。
<3>按键电路如下,并联上一个104的电容,是用于硬件消抖。

import pyb
p = pyb.Pin("P0", pyb.Pin.IN)
key_value = p.value() # Returns 0 or 1.

ここに画像の説明を挿入

第二问—沿A4纸移动

(1)和第一问一样,我认为写一个死的程序就行了,因为他的屏幕给定了0.5m*0.5m。
(2)有一些人问第一问和第二问切换问题

import pyb, time
p = pyb.Pin("P0", pyb.Pin.IN)
clock = time.clock() # 追踪帧率,影响不大
while True:
	key_value = p.value() # Returns 0 or 1.
    if key_value == 1:
        key_time_first  = clock.tick() #开始计时
        Task1 = 1
        while key_value == 1: #一直等待松手
            pass
    if key_value == 0:  #确认松手
        key_time_last = clock.avg()
        if(key_time_last-key_time_first> 2000) :  #如果按键按下时间超过2s
            # 进入任务2
            pass   # 这个是表示不进行任何操作!!!
        elif Task1 == 1 : #如果按键按下时间小于1s
            # 进入任务1
            pass

第三问—黑色边框检测

(1)时间太紧急了,我就讲一下思路。
<1>我们使用blobs = img.find_rects([red_threshold]),找到黑色边框。
<2>调用max_blob = find_max(blobs),找到最大的黑色边框。因为可能存在其他的干扰。
<3>找到边框之后,调用max_blob.x(),max_blob.y(),max_blob.w(),max_blob.h()分别获得识别到的边框左上角的x坐标,y坐标,宽度和长度。
<4>不明白的可以看下面这个图,假设0包含的地方是屏幕,11选中的是黑框内,我们最终返回的值如下图。
(2)有网友提供,说出现了NameError:name img isn’t defined的报错。是因为我只是截取了代码中的一部分。前面的没写,为了方便新手朋友使用,我还是加上。
(3)但是,请各位注意,摄像头的初始化

import sensor, image, time

sensor.reset() # 初始化摄像头传感器
sensor.set_pixformat(sensor.RGB565) # 使用 RGB565 彩图
sensor.set_framesize(sensor.QQVGA) # 使用 QQVGA 分辨率
sensor.skip_frames(10) #跳过几帧,让新的设置生效。
sensor.set_auto_whitebal(False) # 因为是颜色识别,所以需要把白平衡关闭
clock = time.clock() # 追踪帧率,影响不大
#__________________________________________________________________
#定义寻找最大色块的函数,因为图像中有多个色块,所以追踪最大的那个
def find_max(blobs):
    max_size=0
    for blob in blobs:
        if blob[2]*blob[3] > max_size:
            max_blob=blob
            max_size = blob[2]*blob[3]
    return max_blob
#__________________________________________________________________
while(True):
	clock.tick() # 跟踪快照()之间经过的毫秒数。
	img = sensor.snapshot() # 截取一张图片
	blobs =  img.find_rects(threshold = 10000) #识别矩形框
	max_blob = find_max(blobs)  #调用上面自定义函数,找到最大色块
	max_blob.x()  #返回识别区域左上角的x坐标
	max_blob.y()  #返回识别区域左上角的y坐标
	max_blob.w()  #返回识别区域的宽度
	max_blob.h()  #返回识别区域的长度

ここに画像の説明を挿入

第四问—黑色边框检测

(1)这个和第三问舵机控制有区别,第三问是一个舵机一个舵机的控制。而这一题需要两个舵机同时控制。
(2)看2023年电赛—运动目标控制与自动追踪系统(E题)OpenART mini的代码移植到OpenMV这一篇博客

关于基础题的硬件调试思路

(1)需要准备的器材:示波器,信号发生器,万用表。
(2)很多人反馈数字舵机不行,我的方法不行。而也有一部分同学说我的方法是可行的。所以说我希望各位先测试一下,是不是自己硬件上出现的问题。

数字舵机,机械结构的检测方法

(1)我们先找到一个信号发生器,让信号发生器上产生一个PWM波形。然后通过调节信号发生器上的PWM,让云台沿着正方形框框移动。
(2)同时,我们观察是否能够很好的运行。如果可以,记录下来沿着正方形框框运动的四个点位PWM值。 如果不可以很好的运行,说明你的云台或者说舵机有问题,快点换!
(3)如果可以,我们开始测量舵机的最小分辨率。数字舵机是有一个最小分辨率的,比如说,你一个20ms周期的方波,高电平是500us和高电平550us的情况可能是一样的!也就是说,你这一款舵机的分辨率达不到50us的精度!
(4)测试舵机分辨率,我建议从500us开始测试。然后改变了高电平持续时间,一直调整到发现舵机有移动了!那么就说明找到了舵机分辨率。找到分辨率之后,记录下来,之后有用。

PWM输出的稳定性测量

(1)你将上面记录下来的PWM值,编程写出来。然后拿示波器测试,看看能否产生指定的PWM值。
(2)如果示波器上能够输出你记录的四个点位,否则说明你程序有问题或者是主控坏了。那么把结构拼装好。然后开机测试,注意,这里不需要进行图像识别!!!只是单纯的四个PWM点位输出!!!
(3)如果云台能够按照指定的四个点位运行,那么你第二问就做出来了 。如果没有,说明你接线有问题!
(4)怎么知道哪里接线有问题呢?那万用表测试,开到蜂鸣器挡位,一点一点的测试主控和云台的接线,如果发现哪里蜂鸣器不叫,或者是叫的断断续续的,说明有可能接线不稳定!!!
(5)这个时候就要加上焊锡固定了。

如何找到PWM输出量和图像数据的关系

(1) 関係を見つけるには、まず OpenMV をコンピュータに接続し、印刷機能を使用して長方形の 4 点データをコンピュータ端末に出力することをお勧めします。
(2) 次に、信号発生器を使用して PWM を出力し、サーボが 1 回転あたりの最小解像度で移動するときにピクセルがどれだけ移動するかを確認します。ピクセル ポイントの移動の値を見つけたら、ピクセル ポイントと PWM ハイ レベルの変化を記録します。モデリング分析の場合、線形関係である必要があります。
(3) モデル化が完了したら、線形関係をプログラムし、3 番目の質問を行います。

4番目の質問の細分化ルートについて

(1) このとき、上記信号発生器で検出したステアリングギアの最小分解能が有効となります。
(2) 線形モデリング関係と最小解像度を通じて、この動きに必要なサブディビジョンの数を計算できます。最小解像度に基づく必要はありません。
(3) 擬似コードは以下の通り

//假设这是一个20ms的中断
void 20ms_interrupt()
{
    
    
	x_PWM_max = x_linearity(x_img); //通过你找到的线性关系,将像素点值转换成PWM值
	y_PWM_max = y_linearity(y_img); //通过你找到的线性关系,将像素点值转换成PWM值
	if(x_PWM_current < x_PWM_max ) //PWM限幅
	{
    
    
		x_PWM_current += x_PWM_interval; //每次增加最小分辨率个PWM值
		PWM_SET(x_PWM_current ); //调用PWM输出函数,将PWM值输出
	}
	if(y_PWM_current < y_PWM_max ) //PWM限幅
	{
    
    
		y_PWM_current += y_PWM_interval; //每次增加最小分辨率个PWM值
		PWM_SET(y_PWM_current ); //调用PWM输出函数,将PWM值输出
	}
}

質問アイデアのリンクを再生する

リンクをクリックしてください: 2023 Electric Competition—スポーツ ターゲット コントロールおよび自動追跡システム (質問 E)

ネチズンからの質問と質問Eの公式説明

質問する前にこれを見てください!
このリンクをクリックしてください: 2023 E スポーツ—スポーツターゲット制御および自動追跡システム (質問 E) ネチズンからの質問への回答

おすすめ

転載: blog.csdn.net/qq_63922192/article/details/132054666