搜索
bottom↓
回复: 28

多旋翼直升机(四轴飞行器)之开源整合平台 [研究探讨单元] 主题一:光流(Optic

[复制链接]

出0入0汤圆

发表于 2011-3-3 01:43:47 | 显示全部楼层 |阅读模式
多旋翼直升机(四轴飞行器)之开源整合平台
  八、研究探讨单元
    主题一:光流(Optical Flow)应用于四轴的悬停及避开障碍。
   一、应用范例:
          应用例一:透过OPENCV中的函式库将前后画面的特征点,标示移动方向及速度。
                    原始资料:http://ai.stanford.edu/~dstavens/cs223b/

(原文件名:RESEARCH_OF_01.JPG)

     应用例二: AR.drone 两个相机都在特征点上, 做速度以及方向的标记(在左上角的画面是往下看的镜头画面)
                    视讯地址: http://www.youtube.com/watch?v=V4r2HXGA8jw

(原文件名:RESEARCH_OF_02.png)

     AR.drone 悬停时的画面

(原文件名:RESEARCH_OF_03.png)

   二、透过上面的二个应用例子,可以总结出几点:
     1. 因为是透过影像中的特征点来处理, 所以摄影机的解析度不是很重要,也不需要彩色, 黑白即可。因为要测速所以60fps比30fps好 。
     2. 透过例一分享的资料看来,影像处理的方法是:
      (a)先找出第一个画面的特征点,可以用OPENCV的GoodFeaturesToTrack()函式取得。
      (b)再用CalcOpticalFlowPyrLK()函式,将第二个画面中和画面一里相同的特征点,全部找出其位置。
      (c)由第一画面与第二画面中, 同一特征点的位移差值,可以估算出方向及速度。
     3. 透过例二知道所有特征点位移的平均值, 可当做是机体移动的对应值。

   三、测试实作
          程式测试一:
            1.硬体:电脑+摄影机+USB影像撷取器。
            2.软体:PYTHON V2.6(先不用C语言,否则容易卡在新旧版的参数设定上,冷门资料可没人跟你解说)+OPENCV V2.2。
            3.程式范例:OF_001.PY  点击此处下载 ourdev_619571YHE36Y.zip(文件大小:1K) (原文件名:OF_001.zip)
      4.萤幕截图:

照向地面, 蓝圈加红箭头标示着[特征点]的方向及速度。中间绿(Y)+黄(X)标示整体的X,Y分量,紫色标出机体位移方向及速度。

(原文件名:RESEARCH_OF_04.JPG)

(原文件名:RESEARCH_OF_05.JPG)


(原文件名:RESEARCH_OF_06.JPG)
机体转动的画面

(原文件名:RESEARCH_OF_07.JPG)



============================
OF_001.PY
============================
import math
import cv
import time


pram1 = 0.04
pram2 = 1.0

cv.NamedWindow("camera", 1)
#cv.NamedWindow("feature", 1)
capture = cv.CaptureFromCAM(0)
color1 = cv.CV_RGB(0,180,200)
color2 = cv.CV_RGB(180,180,0)
color1 = cv.CV_RGB(0,0,250)
color2 = cv.CV_RGB(250,0,0)
while True:
   
    frame = cv.QueryFrame(capture)
   
    size = cv.GetSize(frame)

    frame_1    = cv.CreateImage(size, cv.IPL_DEPTH_8U, 1)
    frame_2    = cv.CreateImage(size, cv.IPL_DEPTH_8U, 1)
    pyramid_1  = cv.CreateImage(size, cv.IPL_DEPTH_8U, 1)
    pyramid_2  = cv.CreateImage(size, cv.IPL_DEPTH_8U, 1)
   
    cv.CvtColor(frame, frame_1, cv.CV_BGR2GRAY)
   
    frame = cv.QueryFrame(capture)   

    cv.CvtColor(frame, frame_2, cv.CV_BGR2GRAY)
   
#    print "size", size
    eig_image = cv.CreateImage(size, cv.IPL_DEPTH_32F, 1)
    temp_image = cv.CreateImage(size, cv.IPL_DEPTH_32F, 1)
   
#    for (x,y) in cv.GoodFeaturesToTrack(grayscale, eig_image, temp_image, 400, 0.04, 1.0, useHarris = True):
    GFTT_frame_1 = cv.GoodFeaturesToTrack(frame_1, eig_image, temp_image, 100, 0.01, 0.01, useHarris = False)
#    for (x,y) in GFTT_frame_1:
#        print "good feature at", x,y
#        cv.Circle(frame, (int(x), int(y)), 6, color, 1, cv.CV_AA, 0)


    criteria = (cv.CV_TERMCRIT_ITER | cv.CV_TERMCRIT_EPS, 20, 0.3)
    flags = 0
    win_size = 12
   
    COFP_frame_2, status, track_error = cv.CalcOpticalFlowPyrLK(frame_1, frame_2, pyramid_1, pyramid_2, GFTT_frame_1,(win_size ,win_size ), 4, criteria, flags)

      
#    for (x1,y1) in features:   
#        cv.Circle(frame, (int(x), int(y)), 6, color1, 1, cv.CV_AA, 0)

    hypotenuse_total = 0.0
    x_total = 0.0
    y_total = 0.0
   
    f2_len = len(COFP_frame_2)
    for i in range(1,f2_len):
#       print "x=%f,y=%f " % (features[0],features[1])
        p_x = GFTT_frame_1[0]
        p_y = GFTT_frame_1[1]
        q_x = COFP_frame_2[0]
        q_y = COFP_frame_2[1]

        x_total = x_total + (p_x - q_x)
        y_total = y_total + (p_y - q_y)
        
        angle = math.atan2((p_y - q_y), (p_x - q_x))
        hypotenuse = math.sqrt( (p_y - q_y)**2 + (p_x - q_x)**2)
        
        hypotenuse_total = hypotenuse_total + hypotenuse
        

        if hypotenuse > 0 :
           q_x = p_x - 9 * hypotenuse * math.cos(angle)
           q_y = p_y - 9 * hypotenuse * math.sin(angle)

           cv.Circle(frame, (int(p_x), int(p_y)), 3, color1, 1, cv.CV_AA, 0)
           cv.Line(frame, (int(p_x), int(p_y)), (int(q_x), int(q_y)), color2, 1, cv.CV_AA, 0)
        
           p_x = q_x + 9 * math.cos(angle + math.pi / 6)
           p_y = q_y + 9 * math.sin(angle + math.pi / 6)
           cv.Line(frame, (int(p_x), int(p_y)), (int(q_x), int(q_y)), color2, 1, cv.CV_AA, 0)
        
           p_x = q_x + 9 * math.cos(angle - math.pi / 6)
           p_y = q_y + 9 * math.sin(angle - math.pi / 6)
           cv.Line(frame, (int(p_x), int(p_y)), (int(q_x), int(q_y)), color2, 1, cv.CV_AA, 0)
        
#        cv.Circle(frame, (int(features[0]), int(features[1])), 6, color1, 1, cv.CV_AA, 0)

    if f2_len > 0 :
       hypotenuse_avg = hypotenuse_total / f2_len
      
       x_avg = int(x_total / f2_len)*-9
       y_avg = int(y_total / f2_len)*-9

      

    cv.Line(frame, (0,240),(720,240),cv.CV_RGB(128,128,128), 2, cv.CV_AA, 0)
    cv.Line(frame, (360,0),(360,480),cv.CV_RGB(128,128,128), 2, cv.CV_AA, 0)   
    cv.Line(frame, (360,240),(x_avg+360,240),cv.CV_RGB(220,220,0), 6, cv.CV_AA, 0)
    cv.Line(frame, (360,240),(360,y_avg+240),cv.CV_RGB(0,220,0), 6, cv.CV_AA, 0)

    cv.Line(frame, (360,240),(x_avg+360,y_avg+240),cv.CV_RGB(250,0,250), 2, cv.CV_AA, 0)
   
#    print hypotenuse_avg   
#    print x_avg,y_avg
   
    cv.ShowImage("camera", frame)
#    cv.ShowImage("feature", grayscale)

    inkey = cv.WaitKey(10)
#    print "key:", inkey
   
    if inkey == 2490368:
       pram2 = pram2 + 0.1
    if inkey == 2621440:
       pram2 = pram2 - 0.1        
    if inkey == 27:
        break
               
#    print "param2: ", pram2

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2012-5-25 17:29:16 | 显示全部楼层
2012.05.25 重新上传附件档:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2011-3-3 08:33:34 | 显示全部楼层
这个得顶啊

出0入0汤圆

发表于 2011-3-3 08:37:49 | 显示全部楼层
顶,佩服

出0入0汤圆

发表于 2011-3-3 09:01:00 | 显示全部楼层
强大 楼主的进度相当了得啊 目标是四轴阵么

出0入0汤圆

发表于 2011-3-3 09:24:27 | 显示全部楼层
学习了,^_^

出0入4汤圆

发表于 2011-3-3 09:36:53 | 显示全部楼层
不错,楼主比较有分析能力。

出0入0汤圆

发表于 2011-3-3 09:37:06 | 显示全部楼层
顶了学了

出0入0汤圆

发表于 2011-3-3 09:52:16 | 显示全部楼层
这个研究了比大家深哦,顶一个

出0入0汤圆

发表于 2011-3-3 09:54:26 | 显示全部楼层
我用matlab做了一个,使用Horn-Schunck optical flow method


(原文件名:fl.JPG)

出0入0汤圆

 楼主| 发表于 2011-3-4 22:42:43 | 显示全部楼层
回复【3楼】c.azrael  
强大 楼主的进度相当了得啊 目标是四轴阵么
-----------------------------------------------------------------------
是的,目标是先100台,再来200台,一直升上去, 将德国人的发明发扬光大,由技术层级提升到文化层级, 并且开创新的表演产业, 大家一起合作好生存。
(埋头苦干去了,刚温合十)

出0入0汤圆

发表于 2011-3-4 23:23:06 | 显示全部楼层
从AR.Drone工程师的回贴中可知, AR.Drone也是用的光流(Optical Flow)技术:
=================================================
https://projects.ardrone.org/boards/1/topics/show/1031#message-1049
RE: Read horizontal speed - Added by Stephane Piskorski 148 days ago
Estimation is done by fusing information from the accelerometers and vertical camera (which uses optical flow-like algorithms, see the right most quadran in ardrone_navigation).
The details are not made public.

Stephane Piskorski
A.R.Drone Software Engineer
=================================================

打算在AR.Drone上玩, 还得用C语言, ARM交叉编译.
把Parrot藏着掖着的那个program.elf彻底架空!

出0入0汤圆

 楼主| 发表于 2011-3-6 08:54:30 | 显示全部楼层
回复【10楼】MAPGPS  
-----------------------------------------------------------------------
  在此先感谢MAPGPS在5imx中的DIY全文,在对AR.Drone的arm+linux平台有了更多的了解后。发现其中四轴软硬体统一平台化的可能性。硬体部份可以用arm7来对应KK、MK的模友群的需求(要有航模操控技术)。用arm9来对应AR.Drone群的需求(不用航模操控技术)。用am11来对应高清航拍需求(对摄影器材减重防振,影片画面用硬体压缩与即时传输监视,可规划式的航模操控)。软体用linux+c整合,根据以上需求做出模组化的程式, 整个系统整合出一个完全开源的软硬体四轴开发平台。
  看来是要来买个arm11开发板回来研究,研究了。

出0入0汤圆

发表于 2011-3-6 12:46:35 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-3-6 15:53:09 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-3-18 20:23:48 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-3-18 20:33:46 | 显示全部楼层
摄像头的电压不好稳定

出0入0汤圆

发表于 2011-3-20 19:40:49 | 显示全部楼层
哇靠,太厉害了,佩服

出0入0汤圆

发表于 2011-3-22 02:32:09 | 显示全部楼层
国内好像也有公司在做,在5imx上看到:http://v.youku.com/v_show/id_XMjUxODIxMDM2.html,应该也是光流。

出0入0汤圆

发表于 2011-4-13 15:03:00 | 显示全部楼层
回复【17楼】godiy
-----------------------------------------------------------------------

这个不是光流,比较简单的,背景识别

出0入0汤圆

发表于 2011-4-24 17:36:51 | 显示全部楼层
受教了,

出0入0汤圆

发表于 2011-9-20 23:41:50 | 显示全部楼层
回复【楼主位】TADLAW
-----------------------------------------------------------------------

太强了,我怎么才看到,支持。鄙人也想做一个避障碍的飞行器。跪求有经验人士指导,从哪里入手?已经有可以拓展的飞行器平台。。。。

出0入0汤圆

发表于 2011-12-18 23:22:24 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-1-29 16:34:16 | 显示全部楼层
回复【楼主位】TADLAW
-----------------------------------------------------------------------

出0入0汤圆

发表于 2012-1-29 19:18:50 | 显示全部楼层
回复【楼主位】TADLAW
-----------------------------------------------------------------------
厉害

出0入0汤圆

发表于 2012-5-25 17:33:38 | 显示全部楼层
楼主的研究精神太值得学习了

出0入0汤圆

发表于 2012-12-18 18:36:24 | 显示全部楼层
TADLAW 发表于 2012-5-25 17:29
2012.05.25 重新上传附件档:

楼主知道不知道国内有没有现成的光流传感器?发现国外有,国内还没有啊

出0入0汤圆

发表于 2015-2-24 21:43:25 | 显示全部楼层
学习学习

出0入0汤圆

发表于 2015-4-15 16:52:22 | 显示全部楼层
太强大了,求教有没有直接用光流传感器实现室内悬停的?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-14 17:11

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表