人妖在线一区,国产日韩欧美一区二区综合在线,国产啪精品视频网站免费,欧美内射深插日本少妇

新聞動(dòng)態(tài)

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

發(fā)布日期:2022-01-28 18:40 | 文章來(lái)源:腳本之家

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

此代碼適于用做對(duì)Nao機(jī)器人做視覺(jué)識(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í)有所幫助,也希望大家多多支持本站。

香港服務(wù)器租用

版權(quán)聲明:本站文章來(lái)源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來(lái)源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來(lái)源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來(lái),僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。

相關(guān)文章

實(shí)時(shí)開(kāi)通

自選配置、實(shí)時(shí)開(kāi)通

免備案

全球線路精選!

全天候客戶服務(wù)

7x24全年不間斷在線

專屬顧問(wèn)服務(wù)

1對(duì)1客戶咨詢顧問(wèn)

在線
客服

在線客服:7*24小時(shí)在線

客服
熱線

400-630-3752
7*24小時(shí)客服服務(wù)熱線

關(guān)注
微信

關(guān)注官方微信
頂部