精华内容
下载资源
问答
  • openmv巡线小车优化程序进行优化,通过计算线性回归方程的theta和rho来循迹
  • OPENMV巡线代码

    2020-04-05 15:08:12
    巡线代码,首先讲图像进行二值化,然后选取特定的ROI,判断线的左右, 返回01值,然后通过串口发送个主控板
  • OpenMV巡线模块原理讲解,直线、直角、T形,十字。
  • openmv寻线,把摄像头当成8路光电数字灰度进行寻线,同时可识别十字路线,已配置uart3输出需要的数据
  • 利用OpenMV线性回归寻找黑线 串口通信,给上位机返回拟合线段的端点坐标
  • OpenMV巡线

    千次阅读 2020-05-28 11:42:21
    openMV巡线 借助的是线性回归,线性回归的意思就是找出一条直线嘛,和曲线的吻合度最高,那个曲线就是道路的边缘。

    你向别人介绍openmv就说哦这是一个嵌入式的机器视觉模块。一个摄像头模块带有主控,可以用Python编程。

     

    用openMV巡线

    借助的是线性回归,线性回归的意思就是找出一条直线嘛,用最小二乘法,和曲线的吻合度最高,那个曲线就是道路的边缘。

    先把图像进行二值化。二值化前要设置阈值,比如在这个阈值下面的设置为白色,阈值上面的设置为黑色。

     

     

    openMV好像是专门一个单片机,是不是意味着它要和主控进行通信。

     

     

     

    仔细想想是可以对所有像素值做个线性回归。本身二值化后,像素点要么为0要么为1,就对1的点做线性回归嘛,或者这样,那一个个黑点你就看作坐标系里面的一个点嘛,让你对这些点做线性回归,这样不就会了么。你对白点做线性回归可能是和跟黑点做线性回归的结果是一样的,当然这是我的猜测。

     

    有专门的openMV IDE编写代码,python语言编程。看下面,openMV确实是有专门的主控芯片的。说明它的代码不是跑在飞控上,得和无人机主控进行通信,实时传回数据。

     

    展开全文
  • 仅仅是巡线程序,程序简单一看就懂的那种 #include "led.h" #include "delay.h" #include "key.h" #include "sys.h" #include "beep.h" int main(void) { vu8 key=0; delay_init(); LED_Init(); BEEP_...
  • 文章目录 前言 一、比赛题目的具体要求 二、各个部分的具体分析 1.循迹部分 2.定时部分 3.自适应坡度的部分 前言 去年因为个人赛前没有准备MSP430F... 如果有同学需要代码,可以在下面链接下载:OpenMV线性回归小车代码


    前言

    去年因为个人赛前没有准备MSP430F5529的部分,导致我在看到C题规定要用430/432作为主控的要求时,本能的有一些恐惧,所以最后就没有选择做C题,转去做F题了,算是一个遗憾吧。今年电赛的赛前准备时间,第一个想到的就是去把这道题做了,发现确实是可以做完的,没有我想象得那么难。

    先看一下我们的调试视频(注:视频中没有加上定时部分,后面解释原因):

    2020年全国大学生电子设计大赛C题

    一、比赛题目的具体要求

    赛道
    请添加图片描述

    这个比赛的要求简单得来说就是要求小车能够后沿着网格线在规定的时间到达终点并停止下来,其中时间误差不能超过1S,距离误差不能超过2cm.

    从第二个图中的具体要求中又可以提炼出完成这个的题三个具体任务:
    1、能够实现循迹
    2、能够实现定时
    3、能够适应任意坡度的赛道
    后面将从这三个部分具体分析。

    二、各个部分的具体分析

    1.循迹部分

    循迹部分我们觉得首选方案应该是用光电传感器,因为光电传感器可以返回数字量读熟稳定,同时光电传感器对环境的适应性更强。但是为了挑战一下自己我们选择了之前没有做过的OpenMV做为循迹的传感器。
    利用Openmv自带的例程进行稍微的改进,我们可以很简单得识别出赛道,如下图:

    直线部分
    斜线部分
    利用斜线部分分析:因为OpenMV可以返回出斜线的两个顶点的坐标(X1,Y1)、(X2,Y2),于是就可以利用这两个坐标构成反馈,进而利用PID进行调节。

    位置环PID:利用两端点坐标找出直线中点的横坐标并返回给单片机,以像素的中点的横坐标为目标值构成反馈

    转向环PID:利用两端点坐标可以很容以算出斜线的斜率,进而推断出斜线的倾斜角,以90度为目标值构成反馈

    OpenMV程序可以在下面链接下载:
    OpenMV线性回归

    2.定时部分

    轨道
    因为轨道的总长度是确定的,即是:路程确定,所以要实现定时实际上是能够完成速度的自设定,找到时间和速度的关系,当设定的时间确定时,就确定了速度,这样就可以保证小车在规定的时间行驶到终点。
    由于这次我们的小车是在程序设计之前搭好的,所以我们就没有考虑电机是否需要带上编码器,最后因为无法测速,所以这部分就没有做了

    3.自适应坡度的部分

    在这里插入图片描述
    作为这道题最大的一个难点恐怕就是匀速爬坡了。因为在垂直上坡时,重力作为阻力作用在小车竖直方向,对小车的速度有着直接的影响;但是在坡上横向行驶时,重力作为阻力作用在小车的横向,对小车的速度没有影响。这样就导致了如果单片机给一个恒定的PWM波时会导致小车在爬坡时速度较慢,在横向行驶时速度较快,而且不同坡度对小车的影响不一样,这时候不管是定时还是循迹都会受到影响。

    这时最好的解决方法是:构成速度闭环,进行实时的速度调节,保证速度恒定在目标值。这样当坡度较大时,转速降低时,因为反馈,单片机输出更大的占空比的PWM,从而使输出功率增大来抵消重力的影响;坡度较小时同理。

    如果有同学需要代码,可以在下面链接下载:OpenMV线性回归小车代码

    展开全文
  • 基于openmv小车

    千次阅读 2019-10-29 17:11:50
    # Note: Your OpenMV Cam runs about half as fast while # connected to your computer. The FPS should increase once disconnected. Car.py from pyb import Pin, Timer inverse_left=False #change it to True ...
    原来采用RGB565识别红色再转换为灰度识别继续进行下面的循迹代码,
    但是无法实现多次识别,只能在摄像头第一次初始化后可识别红色,
    但转化为灰色后,进入了死循环,程序转换为在灰度识别下对黑线的识别,
    无法运行下面的循迹代码。根据这一特点,我将初始化摄像头加入while循环,发现多次初始化摄像头图像会不断闪烁。
    

    最终,重新编写代码,关于识别色块的程序,一但识别的红色则车速为0,一但识别到黑色向左加速,一但没有识别到黑色向右加速,这样就能实现在跑道内左转。欢迎大家评论指出不足之处

    main.py

    import sensor, image, time
    import car
     
    # For color tracking to work really well you should ideally be in a very, very,
    # very, controlled enviroment where the lighting is constant...
    red_threshold_01 = (61, 48, -128, 127, -128, 127)
    black_threshold_02=(0, 22, -22, 127, -33, 18)
    #设置红色的阈值,括号里面的数值分别是L A B 的最大值和最小值(minL, maxL, minA,
    # maxA, minB, maxB),LAB的值在图像左侧三个坐标图中选取。如果是灰度图,则只需
    #设置(min, max)两个数字即可。
     
    # You may need to tweak the above settings for tracking green things...
    # Select an area in the Framebuffer to copy the color settings.
     
    sensor.reset() # Initialize the camera sensor.
    sensor.set_pixformat(sensor.RGB565) # use RGB565.
    sensor.set_framesize(sensor.QQVGA) # use QQVGA for speed.
    sensor.skip_frames(10) # Let new settings take affect.
    sensor.set_auto_whitebal(False)
    #关闭白平衡。白平衡是默认开启的,在颜色识别中,需要关闭白平衡。
    clock = time.clock() # Tracks FPS.
     
    while(True):
        clock.tick() # Track elapsed milliseconds between snapshots().
        img = sensor.snapshot() # Take a picture and return the image.
        #  pixels_threshold=100, area_threshold=100
        blobs = img.find_blobs([red_threshold_01], area_threshold=150)
     
        if blobs:
        #如果找到了目标颜色
            print(blobs)
            for b in blobs:
            #迭代找到的目标颜色区域
                # Draw a rect around the blob.
                img.draw_rectangle(b[0:4]) # rect
                #用矩形标记出目标颜色区域
                img.draw_cross(b[5], b[6]) # cx, cy
                #在目标颜色区域的中心画十字形标记
                car.run(0,0)
        else:
            clock.tick() # Track elapsed milliseconds between snapshots().
            img = sensor.snapshot() # Take a picture and return the image.
        #  pixels_threshold=100, area_threshold=100
            blobs = img.find_blobs([black_threshold_02], area_threshold=150)
     
            if blobs:
        #如果找到了目标颜色
                print(blobs)
                for b in blobs:
            #迭代找到的目标颜色区域
                # Draw a rect around the blob.
                    img.draw_rectangle(b[0:4]) # rect
                #用矩形标记出目标颜色区域
                    img.draw_cross(b[5], b[6]) # cx, cy
                #在目标颜色区域的中心画十字形标记
                    car.run(30,60)
            else:
                    car.run(60,30)
              #car.run(60,60)
     
     
        print(clock.fps()) # Note: Your OpenMV Cam runs about half as fast while
        # connected to your computer. The FPS should increase once disconnected.
    

    Car.py

    from pyb import Pin, Timer
    inverse_left=False  #change it to True to inverse left wheel
    inverse_right=False #change it to True to inverse right wheel
     
    ain1 =  Pin('P0', Pin.OUT_PP)
    ain2 =  Pin('P1', Pin.OUT_PP)
    bin1 =  Pin('P2', Pin.OUT_PP)
    bin2 =  Pin('P3', Pin.OUT_PP)
    ain1.low()
    ain2.low()
    bin1.low()
    bin2.low()
     
    pwma = Pin('P7')
    pwmb = Pin('P8')
    tim = Timer(4, freq=1000)
    ch1 = tim.channel(1, Timer.PWM, pin=pwma)
    ch2 = tim.channel(2, Timer.PWM, pin=pwmb)
    ch1.pulse_width_percent(0)
    ch2.pulse_width_percent(0)
     
    def run(left_speed, right_speed):
        if inverse_left==True:
            left_speed=(-left_speed)
        if inverse_right==True:
            right_speed=(-right_speed)
     
        if left_speed < 0:
            ain1.low()
            ain2.high()
        else:
            ain1.high()
            ain2.low()
        ch1.pulse_width_percent(abs(left_speed))
     
        if right_speed < 0:
            bin1.low()
            bin2.high()
        else:
            bin1.high()
            bin2.low()
        ch2.pulse_width_percent(abs(right_speed))
    
    展开全文
  • 小车能够在亚太机器人大赛场地上精确定位,采用双机通信实现,由于自己录得视频过大,没往上传,仅传了代码
  • OPENMV的学习(三)巡线

    千次阅读 2021-07-30 19:38:47
    巡线代码如下 while(True): clock.tick() img = sensor.snapshot().binary([THRESHOLD]) if BINARY_VISIBLE else sensor.snapshot() # 返回类似于由find_lines()和find_line_segments()返回的线对象。...

    存储文件

    插入sd卡,会将默认储存地址flash改为sd卡。

    image.save("/example.jpg")
    
    

    串口通信

    传输面积最大的色块的坐标

    # Blob Detection and uart transport
    import sensor, image, time
    from pyb import UART
    import json
    # For color tracking to work really well you should ideally be in a very, very,
    # very, controlled enviroment where the lighting is constant...
    yellow_threshold   = (65, 100, -10, 6, 24, 51)
    # You may need to tweak the above settings for tracking green things...
    # Select an area in the Framebuffer to copy the color settings.
    
    sensor.reset() # Initialize the camera sensor.
    sensor.set_pixformat(sensor.RGB565) # use RGB565.
    sensor.set_framesize(sensor.QQVGA) # use QQVGA for speed.
    sensor.skip_frames(10) # Let new settings take affect.
    sensor.set_auto_whitebal(False) # turn this off.
    clock = time.clock() # Tracks FPS.
    
    uart = UART(3, 115200)
    def find_max(blobs):
        max_size=0
        for blob in blobs:
            if blob.pixels() > max_size:
                max_blob=blob
                max_size = blob.pixels()
        return max_blob
    
    while(True):
        img = sensor.snapshot() # Take a picture and return the image.
    
        blobs = img.find_blobs([yellow_threshold])
        if blobs:
            max_blob=find_max(blobs)
            print('sum :', len(blobs))
            img.draw_rectangle(max_blob.rect())
            img.draw_cross(max_blob.cx(), max_blob.cy())
    
            output_str="[%d,%d]" % (max_blob.cx(),max_blob.cy()) #方式1
            #output_str=json.dumps([max_blob.cx(),max_blob.cy()]) #方式2
            print('you send:',output_str)
            uart.write(output_str+'\r\n')
        else:
            print('not found!')
    
    

    优化图像

    直方图均衡化是通过拉伸像素强度分布范围来增强图像对比度的一种方法.说得更清楚一些, 以上面的直方图为例, 你可以看到像素主要集中在中间的一些强度值上. 直方图均衡化要做的就是 拉伸 这个范围. 见下面左图: 绿圈圈出了 少有像素分布其上的 强度值. 对其应用均衡化后, 得到了中间图所示的直方图. 均衡化的图像见下面右图.

    # Blob Detection and uart transport
    import sensor, image, time
    from pyb import UART
    import json
    # For color tracking to work really well you should ideally be in a very, very,
    # very, controlled enviroment where the lighting is constant...
    yellow_threshold   = (65, 100, -10, 6, 24, 51)
    # You may need to tweak the above settings for tracking green things...
    # Select an area in the Framebuffer to copy the color settings.
    
    sensor.reset() # Initialize the camera sensor.
    sensor.set_pixformat(sensor.RGB565) # use RGB565.
    sensor.set_framesize(sensor.QQVGA) # use QQVGA for speed.
    sensor.skip_frames(10) # Let new settings take affect.
    sensor.set_auto_whitebal(False) # turn this off.
    clock = time.clock() # Tracks FPS.
    
    uart = UART(3, 115200)
    def find_max(blobs):
        max_size=0
        for blob in blobs:
            if blob.pixels() > max_size:
                max_blob=blob
                max_size = blob.pixels()
        return max_blob
    
    while(True):
        img = sensor.snapshot() # Take a picture and return the image.
    
        blobs = img.find_blobs([yellow_threshold])
        if blobs:
            max_blob=find_max(blobs)
            print('sum :', len(blobs))
            img.draw_rectangle(max_blob.rect())
            img.draw_cross(max_blob.cx(), max_blob.cy())
    
            output_str="[%d,%d]" % (max_blob.cx(),max_blob.cy()) #方式1
            #output_str=json.dumps([max_blob.cx(),max_blob.cy()]) #方式2
            print('you send:',output_str)
            uart.write(output_str+'\r\n')
        else:
            print('not found!')
    
    

    image.histeq([adaptive=False[, clip_limit=-1[, mask=None]]])
    在图像上运行直方图均衡算法。 直方图均衡化使图像中的对比度和亮度标准化。
    如果 adaptive 传递为True,那么将在图像上运行自适应直方图均衡方法,这通常比非自适应直方图限定更好,但运行时间更长
    clip_limit 提供了一种限制自适应直方图均衡的对比度的方法。 使用较小的值(例如10)可以生成良好的直方图均衡对比度受限图像。
    mask 是另一个用作绘图操作的像素级掩码的图像。掩码应该是一个只有黑色或白色像素的图像,并且应该与你正在绘制的 image 大小相同。 仅掩码中设置的像素被修改。
    返回图像对象,以便您可以使用 . 表示法调用另一个方法。
    不支持压缩图像和bayer图像。

    线性回归(循迹)

    线性回归能找到视野中任何的线,但是处理速度就会很慢,为了能更快的寻到我们想要的轨迹,把颜色调为灰度,不去处理追踪颜色,图像大小设成QQVGA,缩小图像面积,来增加速度。通过二值化,能让我们想要的线条更加清晰,使用binary()来获取图像信息,用mean(2)来消噪。
    ==image.erode(size[, threshold[, mask=None]])==从分割区域的边缘删除像素。
    这一方法通过卷积图像上((size2)+1)x((size2)+1)像素的核来实现,如果相邻像素集的总和小于 threshold ,则对内核的中心像素进行归零。若 threshold 未设定,这个方法的功能如标准腐蚀方法一样。若threshold设定,您就可以指定腐蚀的特定像素,例如:设置低于2个的像素周围阈值为2。
    mask 是另一个用作绘图操作的像素级掩码的图像。掩码应该是一个只有黑色或白色像素的图像,并且应该与你正在绘制的 image 大小相同。最后通过image.get_regression(阀值)来找线。
    巡线代码如下

    while(True):
        clock.tick()
        img = sensor.snapshot().binary([THRESHOLD]) if BINARY_VISIBLE else sensor.snapshot()
    
        # 返回类似于由find_lines()和find_line_segments()返回的线对象。
        # 你有x1(),y1(),x2(),y2(),length(),
        # theta()(以度为单位的旋转),rho()和magnitude()。
        #
        # magnitude() 表示线性回归的工作情况。这对于鲁棒的线性回归意味着不同
        # 的东西。一般来说,值越大越好...
        line = img.get_regression([(255,255) if BINARY_VISIBLE else THRESHOLD],roi = ROI,robust = True)
        img.mean(2)
        if (line):
            img.draw_line(line.line(), color = 255)#127
            #print(line.theta())
            th = line.theta()
            if th > 90:
                th = 180 - th
                if th > 7:
                    print('L',th)
            else:
                if line.theta() > 7:
                    print('R',line.theta())
                    
    
    展开全文
  • STM32F1循迹小车程序

    2019-03-27 10:07:36
    STM32F1循迹小车程序,光电传感器检测,超声波测距,PID调速。
  • stm32f4结合openmv简易循迹小车的制作(无PID版)

    千次阅读 多人点赞 2019-10-10 21:23:35
    今年19年,电赛国赛年,暑假在学校准备了一个多月吧,搞四轴飞行器,我负责视觉方面,然后学习了openmv,不幸的是,封箱前几个小时,临阵加电路,没想到电压问题把飞机搞炸了,最终遗憾弃赛,不过还是去了现场,说多...
  • 基于STM32F103智能巡线小车

    千次阅读 2021-08-08 22:42:00
    巡线小车是我作为新手入手的第一个项目,基本巡线功能是使用红外传感器循迹模块判断黑线的路径来确定转向方向,同时控制单片机配置PWM占空比波控制小车前进的L298N电机模块,实现前后退,左右转(差速转)来巡线。...
  • 基于openmv与51小车的串口通信巡线

    千次阅读 多人点赞 2020-10-05 11:32:36
    基于openmv与51小车的串口通信巡线 **新手小菜鸡,写的可能不大行,欢迎大神指正。 硬件连接:我用的是openmv3(注意供电电压端VIN,不然乱接可能会烧坏),P4和P5引脚是RXD和TXD,分别与单片机的TXD,RXD相连接,共...
  • 二、OpenMV黑线检测2.1 OpenMV简介2.2 OpenMV详细参数2.3 OpenMV IDE安装2.4 OpenMV Cam连接2.5 OpenMV项目搭建2.5.1 OpenMV工程新建2.5.2 OpenMV颜色识别相关函数find_blobs函数阈值颜色阈值选择工具blobs是一个...
  • openMV摄像头循迹小车

    千次阅读 2021-10-26 08:32:59
    主控MSP430F5529,电机驱动模块L298N,openMV摄像头 一、总体思路 使用openMV线性回归,然后使用pid输出,使用串口发送到MSP430,在经过处理输出PWM到车轮,实现循迹 二、openMV代码 THRESHOLD = (0, 20, -128,...
  • 【手把手教你做OpenMV小车】总篇

    万次阅读 多人点赞 2019-01-21 22:23:14
    前言: 移动机器人小车是很常见的比赛项目,也是众多技术爱好者入手的第一个项目 ,很多人常常在入门时备受阻碍,费时费力。从零到一的过程很艰辛,博主在入门时也花费了很多精力,包括学习编程语言和器件的功能,也...
  • 循迹识别小车:(四)OpenMV4部分

    千次阅读 多人点赞 2021-01-22 16:14:39
    1、寻线:OpenMV4摄像头将获得的轨迹进行处理,得到轨迹的一个偏离角度,然后通过偏转角判断给STM32发送左转或右转的信号。 2、停止:MV4通过模板匹配和识别圆双重判断是否目标为圆,如果是则给STM32发出信号来停止...
  • OpenMV 线性回归巡线之一:赛道提取

    千次阅读 多人点赞 2020-10-16 10:28:27
    巡线设置为“灰度”、“QQQVGA”来加快速度,由于不跟踪颜色,所以不需要闭自动白平衡。 使用 histeq() 方法提高图像的对比度,以便接下来将图像二值化分离出赛道。 下面用 OpenMV IDE 提取赛道的灰度阀值,如下...
  • 主控:MSP430F5529 软件环境:IDE 库函数版本 主要功能:实现2020年电赛C题爬坡小车的基本功能 备注:里面有430和OpenMV的通信与前面OpenMV线性回归一起食用较好
  • 基于arduino的5路循迹小车(5)与OpenMV的串口通信 进行图像识别,开发板控制舵机抓取物料 接第一篇链接 https://blog.csdn.net/weixin_45984029/article/details/103437347 1.硬件选用 OpenMV 2.接线 开发板与...
  • OPENMV和STM32的识别追踪小车(详细版)之OPENMV

    万次阅读 多人点赞 2020-02-22 16:01:57
    OPENMV和STM32的识别追踪小车(详细版) 实现:通过OPENMV识别Apriltags标签,STM32驱动小车追踪标签 博主通过一段时间的学习,做了这个比较简单的以OPENMV为摄像传感器STM32为控制器的寻物小车,不多说,直接进入...
  • 基于OpenMV与STM32的寻球小车 实现的小功能有: ①设别颜色小球,并自动追寻小球 ②简单测试与颜色小球的粗略距离,并且在小球10cm处停车 ③按键调节PID参数以及调节识别的颜色
  • OPENMV和STM32的识别追踪小车(详细版)之STM32端

    万次阅读 多人点赞 2020-02-24 21:41:07
    OPENMV和STM32的识别追踪小车(详细版)之STM32端 二:STM32的介绍以及程序 2.1(STM32F407介绍) STM32F407提供了工作频率为168 MHz的Cortex™-M4内核(具有浮点单元)的性能。我的32是正点原子的最小系统板,它大...
  • 三、图形化巡线小车编程3.1 编程环境配置3.1.1 下载编程软件3.1.2 安装编程软件3.2 Krobot(啃萝卜)编程软件3.2.1 硬件接线3.2.2 图形模块3.3 巡线小车图形化编程3.3.1 硬件模块连接3.3.2 图形化编程3.3.3 巡线小车...
  • 使用无线技术,通过单片机串口通信,达到控制小车运动的目的。
  • 三、Arduino IDE巡线小车编程3.1 Arduino开发环境下载免安装ZIP包下载IDE安装包3.2 Arduino IDE3.3 Blink项目实例打开内置案例进行程序上传3.4 巡线小车编程 3.1 Arduino开发环境 开发环境即Arduino项目的编程环境 ...
  • STM32各类小车工作原理及学习 ...简介:循迹小车由三轮或四轮小车和摄像头两大部分组成,通过...寻迹小车核心组成:openMV和STM3F1。 涉及主要知识:STM32相关知识(学习视频 https://ke.qq.com/course/279403); openM...
  • arduino与openmv的智能物流小车 一、购买模块组件准备阶段 1、ArduinoMAGE2560+扩展板 使用这个当做主控板,加上扩展板已经满足了所有需求,主要是也很便宜,唯一不足的是就是扩展板装上的时候,扩展板的电源接口的...

空空如也

空空如也

1 2 3 4 5
收藏数 95
精华内容 38
关键字:

openmv巡线小车