欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python實(shí)現(xiàn)Nao機(jī)器人的單目測(cè)距

 更新時(shí)間:2021年09月03日 16:24:55   作者:小禪Chaika  
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)Nao機(jī)器人的單目測(cè)距,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

 本文實(shí)例為大家分享了python實(shí)現(xiàn)Nao機(jī)器人單目測(cè)距的具體代碼,供大家參考,具體內(nèi)容如下

此代碼適于用做對(duì)Nao機(jī)器人做視覺識(shí)別和測(cè)距實(shí)驗(yàn),只提供關(guān)鍵代碼部分,嘗試?yán)胏v2去優(yōu)化代碼會(huì)更加簡(jiǎn)潔喲!

此代碼的主要功能:

1.初始姿態(tài)下,通過(guò)更換攝像頭和轉(zhuǎn)頭去尋找目標(biāo)
2.通過(guò)顏色閾值識(shí)別目標(biāo),計(jì)算目標(biāo)與Nao的距離和角度

可以擴(kuò)展功能:

1.在運(yùn)動(dòng)過(guò)程中對(duì)方向和距離進(jìn)行多次測(cè)量和校正,提高準(zhǔn)確度
2.找到目標(biāo)后,通過(guò)對(duì)目標(biāo)的測(cè)量,選擇使用哪個(gè)腳去踢目標(biāo)

#!/usr/bin/python2.7
#-*- encoding: UTF-8 -*-
import vision_definitions
#----------------------單目測(cè)距--------------------------------
#***********************************************
#@函數(shù)名:   DistAndDirect_cal(cxnum,rynum,colsum,rowsum,Head_angle,cameraID)
#@參數(shù):     (cxnum,rynum)是通過(guò)圖像識(shí)別得到球心的像素點(diǎn)坐標(biāo)
#           (colsum,rowsum)是圖片總大?。?40*480
#            cameraID=0,取上攝像頭;cameraID=1,取下攝像頭
#@返回值:   無(wú)
#@功能說(shuō)明: 采用機(jī)器人的下攝像頭進(jìn)行測(cè)量球離機(jī)器人的相關(guān)角度與距離
def DistAndDirect_cal(cxnum,rynum,colsum,rowsum,Head_angle,cameraID):
    distx=-(cxnum-colsum/2)
    disty=rynum-rowsu/2
    print distx,disty
    Picture_angle=disty*47.64/480

    if cameraID ==0:
        h=0.62
        Camera_angle=12
    else:
        h=0.57
        Camera_angle=38
    #Head_angle[0]機(jī)器人仰俯角度
    Total_angle=math.pi*(Picture_angle+Camera_angle)/180+Head_angle[0]
    d1=h/math.tan(Total_angle)

    alpha=math.pi*(distx*60.92/640)/180
    d2=d1/math.cos(alpha)
    #Head_angle[1]機(jī)器人左右角度
    Forward_Distance=d2*math.cos(alpha+Head_angle[1])
    Sideward_Distance=-d2*math.sin(alpha+Head_angle[1])
#***********************************************

#@函數(shù)名:   GetNaoImage(IP,PORT,cameraID)
#@參數(shù):     略
#@返回值:   無(wú)
#@功能說(shuō)明: 采調(diào)用機(jī)器人內(nèi)置攝像頭控制模塊,對(duì)當(dāng)前場(chǎng)景進(jìn)行拍攝并保持。
#           由于球距離機(jī)器人約小于0.6m時(shí),機(jī)器人額頭攝像頭無(wú)法看到,
#           所以需要變換攝像頭,cameraID=0,取上攝像頭;
#           cameraID=1,取下攝像頭
def Get NaoImage(IP,PORT,cameraID):
    camProxy=ALProxy("ALVideoDevice",IP,PORT)
    resolition=2 #VGA格式640*480
    colorSpace=11#RGB

    #選擇并啟用攝像頭
    camProxy.setParam(vision_definitions.kCameraSelectID,cameraID)
    videoClient=camProxy.subscribe("python_client",resolition,colorSpace,5)

    #獲取攝像機(jī)圖像。
    #image [6]包含以ASCII字符數(shù)組形式傳遞的圖像數(shù)據(jù)。
    naoImage=camProxy.getImageRemote(videoClient)

    camProxy.unsubscribe(videoClient)
    #獲取圖像大小和像素陣列。
    imageWidth=naoImage[0]
    imageHeight=naoImage[1]
    array=naoImage[6]
    #從我們的像素陣列創(chuàng)建一個(gè)PIL圖像。
    im=Image.fromstring("RGB",(imageWidth,imageHeight),array)
    #保存圖像。
    im.save("temp.jpg","JPEG")

#***********************************************
#@函數(shù)名:   findColorPattern(img,pattern)
#@參數(shù):     略
#@返回值:   無(wú)
#@功能說(shuō)明:  將RGB圖像轉(zhuǎn)化為二值圖:此方法用的是cv,可以嘗試用cv2代碼會(huì)更加簡(jiǎn)潔
def  findColorPattern(img,pattern):
    channels=[None,None,None]
    channels[0]=cv.CreateImage(cv.GetSize(img),8,1)
    channels[1]=cv.CreateImage(cv.GetSize(img),8,1)
    channels[2]=cv.CreateImage(cv.GetSize(img),8,1)
    ch0=cv.CreateImage(cv.GetSize(img),8,1)
    ch1=cv.CreateImage(cv.GetSize(img),8,1)
    ch2=cv.CreateImage(cv.GetSize(img),8,1)
    cv.Split(img,ch0,ch1,ch2,None)
    dest=[None,None,None,None]
    dest[0]=cv.CreateImage(cv.GetSize(img),8,1)
    dest[1]=cv.CreateImage(cv.GetSize(img),8,1)
    dest[2]=cv.CreateImage(cv.GetSize(img),8,1)
    dest[3]=cv.CreateImage(cv.GetSize(img),8,1)
    cv.Smooth(ch0,channels[0],cv.CV_GAUSSIAN,3,3,0)
    cv.Smooth(ch1,channels[1],cv.CV_GAUSSIAN,3,3,0)
    cv.Smooth(ch2,channels[2],cv.CV_GAUSSIAN,3,3,0)
    for i in range(3):
        k=2-i
        lower=pattern[k]-75#設(shè)置閾值
        upper=pattern[k]+75
        cv.InRangeS(channels[i],lower,upper,dest[i])

    cv.And(dest[0],dest[1],dest[3])
    temp=cv.CreateImage(cv.GetSize(img),8,1)
    cv.And(dest[2],dest[3],temp)
    '''
    cv.NameWindow("result",cv.CV_WINDOW_AUTOSIZE)
    cv.ShowImage("result",temp)
    cv.WaitKey(0)
    '''
    return temp

#***********************************************
#@函數(shù)名:   xyProject(matrix,imgaesize)
#@參數(shù):     matrix
#           imgaesize
#@返回值:   無(wú)
#@功能說(shuō)明: 利用二值圖,計(jì)算球的像素坐標(biāo)。其原理是:遍歷各行各列
#           像素的數(shù)值的和,最大的組合即為球心坐標(biāo)
def xyProject(matrix,imagesize):
    #聲明一個(gè)數(shù)據(jù)類型為8位型單通道的imagessize[1]*1/1*imagessize[0]矩陣(初始值為 0)。
    colmask=cv.CreateMat(imagessize[1],1,cv.CV_8UC1)
    rowmask=cv.CreateMat(1,imagessize[0],cv.CV_8UC1)
    cv.Set(colmask,1)
    cv.Set(rowmask,1)

    colsum=[]
    for i in range(imagesize[0]):
        col=cv.GetCol(matrix,i)
        #計(jì)算向量點(diǎn)積
        a=cv.DotProduct(colmask,col)
        colsum.append(a)

    rowsum=[]
    for i in range(imagesize[1]):
        row=cv.GetRow(matrix,i)
        a=cv.DotProduct(rowmask,row)
        rowsum.append(a)

    return(colsum,rowsum)#得到各行各列“1”值的和

def crMax(colsum,rowsum):
    cx=max(colsum)
    ry=max(rowsum)
    for i in range(len(colsum)):
        if colsum[i]==cx:
            cxnum=i
    for i in range(len(rowsum)):
        if rowsum[i]==ry:
            rynum=i
    return(cxnum,rynum)
#***********************************************
#@函數(shù)名:  GetHeadAngles(robotIP,PORT)
#@參數(shù):    略
#@返回值:   無(wú)
#@功能說(shuō)明:
def GetHeadAngles(robotIP,PORT):
    motionProxy=ALProxy("ALMotion",robotIP,PORT)
    names=["HeadPitch","HeadYaw"]
    useSensors=1
    sensorAngles=motionProxy.getAngles(names,useSensors)
    return sensorAngles
#***********************************************
#@函數(shù)名:  SetHeadAngles(robotIP,PORT,angles)
#@參數(shù):    略
#@返回值:   無(wú)
#@功能說(shuō)明:
def SetHeadAngles(robotIP,PORT,angles):
    motionProxy=ALProxy("ALMotion",robotIP,PORT)
    motionProxy.setStiffnesses("Head",1.0)

    names=["HeadPitch","HeadYaw"]
    fractionMaxSpeed=0.2
    motionProxy.setAngles(names,angles,fractionMaxSpeed)

    time.sleep(2.0)
    motionProxy.setStiffnesses("Head",0.0)

#***********************************************
#@函數(shù)名:   Capture_Picture(IP,PORT,cameraID,angles,pattern_colors)
#@參數(shù):     angles
#           pattern_colors
#@返回值:   無(wú)
#@功能說(shuō)明: 將上面的一系列函數(shù)整合起來(lái)

def Capture_Picture(IP,PORT,cameraID,angles,pattern_colors):
    SetHeadAngles(IP,PORT,angles)
    GetNaoImage(IP,PORT,cameraID)
    image=cv.LoadImage("temp.jpg")
    imagesize=cv.GetSize(image) #返回?cái)?shù)值,兩個(gè)元素分別為列數(shù)和行數(shù)
    matrix=findColorPattern(image,pattern_colors)
    (colsum,rowsum)=xyProject(matrix,imagesize)
    (cxnum,rynum)=crMax(colsum,rowsum)
    cv.SaveImage("result.jpg",matrix)

    return (cxnum,rynum,colsum,rowsum)

 

#***********************************************
#@函數(shù)名:   Target_Detect_and_Distance(IP,PORT)
#@參數(shù):
#@返回值:   無(wú)
#@功能說(shuō)明: 當(dāng)上攝像頭無(wú)法找到球時(shí),切換到下攝像頭,然后在左轉(zhuǎn)右轉(zhuǎn)。
#       在這個(gè)過(guò)程中,如果發(fā)現(xiàn)目標(biāo),則計(jì)算距離并輸出距離
#       若始終未找到目標(biāo),則輸出距離為0。

def Target_Detect_and_Distance(IP,PORT):
    pattern_colors=(255,150,50)
    cameraID=0# 默認(rèn)上攝像頭
    angles=[0,0]
    (cxnum,rynum,colsum,rowsum)=Capture_Picture(IP,PORT,cameraID,angles)

    if(cxnum,rynum)==(639,479):
        cameraID=1
        (cxnum,rynum,colsum,rowsum)=Capture_Picture(IP,PORT,cameraID,angles)
    if(cxnum,rynum)==(639,479):
        cameraID=0
        angles=[0.0.7]
        (cxnum,rynum,colsum,rowsum)=Capture_Picture(IP,PORT,cameraID,angles)
    if(cxnum,rynum)==(639,479):
        cameraID=0
        angles=[0,-0.7]
        (cxnum,rynum,colsum,rowsum)=Capture_Picture(IP,PORT,cameraID,angles)
    HeadAngles-GetHeadAngles(IP,PORT)
    ###############
    (Forward_Distance,Sideward_Distance)=DistAndDirect_cal(cxnum,rynum,colsum,rowsum,Head_angle,cameraID)
    if(cxnum,rynum)==(639,479):
        (Forward_Distance,Sideward_Distance)=(0,0)
    print "Forward_Distance=",Forward_Distance,"meters"
    print "Sideward_Distance="+Sideward_Distance+"meters"

#***********************************************
#@函數(shù)名:   Target_Detect_and_Distance(IP,PORT)
#@參數(shù):
#@返回值:   無(wú)
#@功能說(shuō)明: 當(dāng)找到球后,可能會(huì)存在一定的誤差。
#           因此需要判斷球位于機(jī)器人前方的哪一側(cè),再來(lái)確定用哪只腳踢球

def Final_See(robotIP,PORT):
    pattern_colors=(255,150,50)
    angles=[0.5,0]
    SetHeadAngles(robotIP,PORT,angles)

    cameraID=1

    GetNaoImage(robotIP,PORT,cameraID)
    image=cv.LoadImage("temp.jpg")
    imagesize=cv.GetNaoImage(image)

    matrix=findColorPattern(image,pattern_colors)

    (colsum,rowsum)=xyProject(matrix,imgaesize)
    (cxnum,rynum)=crMax(colsum,rowsum)
    cv.SaveImage("result.jpg",matrix)

    HeadAngles=GetHeadAngles(robotIP,PORT)
    #########################
    (Forward_Distance,Sideward_Distance)=DistAndDirect_cal(cxnum,rynum,colsum,rowsum,Head_angle,cameraID)

    if cxnum<len(colsum)/2:
        side=0#左腳
    else:
        side=1#右腳
    print "side=",side
    print "last distance=",Forward_Distance
    return (side,Forward_Distance)

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python 字典一個(gè)鍵對(duì)應(yīng)多個(gè)值的方法

    Python 字典一個(gè)鍵對(duì)應(yīng)多個(gè)值的方法

    這篇文章主要介紹了Python 字典一個(gè)鍵對(duì)應(yīng)多個(gè)值的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • 用Python將結(jié)果保存為xlsx的方法

    用Python將結(jié)果保存為xlsx的方法

    今天小編就為大家分享一篇用Python將結(jié)果保存為xlsx的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-01-01
  • Python中yield關(guān)鍵字的理解與使用

    Python中yield關(guān)鍵字的理解與使用

    yield關(guān)鍵字用于創(chuàng)建生成器函數(shù),一種高效利用內(nèi)存的函數(shù)類型,可以像迭代器對(duì)象一樣使用,本文主要介紹了Python中的yield關(guān)鍵字的應(yīng)用,需要的可以參考下
    2023-08-08
  • python3 線性回歸驗(yàn)證方法

    python3 線性回歸驗(yàn)證方法

    今天小編就為大家分享一篇python3 線性回歸驗(yàn)證方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-07-07
  • Python中l(wèi)ogging模塊的用法實(shí)例

    Python中l(wèi)ogging模塊的用法實(shí)例

    這篇文章主要介紹了Python中l(wèi)ogging模塊的用法實(shí)例,以實(shí)例形式介紹了日志模塊logging的用法,具有一定的實(shí)用價(jià)值,需要的朋友可以參考下
    2014-09-09
  • Python 標(biāo)準(zhǔn)庫(kù)zipfile將文件夾加入壓縮包的操作方法

    Python 標(biāo)準(zhǔn)庫(kù)zipfile將文件夾加入壓縮包的操作方法

    Python zipfile 庫(kù)可用于壓縮/解壓 zip 文件. 本文介紹一下如何創(chuàng)建壓縮包,對(duì)Python zipfile壓縮包相關(guān)知識(shí)感興趣的朋友一起看看吧
    2021-09-09
  • python實(shí)習(xí)總結(jié)(yeild,async,azwait和協(xié)程)

    python實(shí)習(xí)總結(jié)(yeild,async,azwait和協(xié)程)

    今天是Python實(shí)習(xí)的第一天,熟悉了環(huán)境,第一次使用macbook,氛圍還不錯(cuò),努力學(xué)習(xí)新知識(shí),希望本片文章能給你帶來(lái)幫助
    2021-10-10
  • Win8下python3.5.1安裝教程

    Win8下python3.5.1安裝教程

    這篇文章主要為大家詳細(xì)介紹了Win8下python3.5.1安裝教程,文中安裝步驟介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • 在django項(xiàng)目中導(dǎo)出數(shù)據(jù)到excel文件并實(shí)現(xiàn)下載的功能

    在django項(xiàng)目中導(dǎo)出數(shù)據(jù)到excel文件并實(shí)現(xiàn)下載的功能

    這篇文章主要介紹了在django項(xiàng)目中導(dǎo)出數(shù)據(jù)到excel文件并實(shí)現(xiàn)下載的功能,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-03-03
  • Python進(jìn)程管理神器Supervisor詳解

    Python進(jìn)程管理神器Supervisor詳解

    Supervisor 是一款 Python 開發(fā)的進(jìn)程管理系統(tǒng),允許用戶監(jiān)視和控制 Linux 上的進(jìn)程,能將一個(gè)普通命令行進(jìn)程變?yōu)楹笈_(tái)守護(hù)進(jìn)程,異常退出時(shí)能自動(dòng)重啟,這篇文章主要介紹了Python進(jìn)程管理神器Supervisor,需要的朋友可以參考下
    2022-07-07

最新評(píng)論