Nao机器人踢球实例讲解#
该实例包含color_threshold.py和kick_ball两个文件,其中color_threshold.py用于找到合适的阈值进行图像的二值化,kick_ball.py文件是踢球的主程序。
color_threshold.py#
在filename变量中填入图像文件所在的位置。
#!/usr/bin/env python
import cv2
import numpy as np
def callback(object):
pass
def Choose_Color():
filename = 'Your file location'
image0 = cv2.imread(filename,1)
img = cv2.cvtColor(image0, cv2.COLOR_BGR2HSV)
img = cv2.resize(img,(int(img.shape[1] / 2),int(img.shape[0] / 2)))
cv2.imshow("image",img)
cv2.createTrackbar("H_min","image",50,255,callback)
cv2.createTrackbar("H_max","image",150,255,callback)
cv2.createTrackbar("S_min","image",0,255,callback)
cv2.createTrackbar("S_max","image",255,255,callback)
cv2.createTrackbar("V_min","image",0,255,callback)
cv2.createTrackbar("V_max","image",255,255,callback)
while(True):
H_min = cv2.getTrackbarPos("H_min","image",)
S_min = cv2.getTrackbarPos("S_min","image",)
V_min = cv2.getTrackbarPos("V_min","image",)
H_max = cv2.getTrackbarPos("H_max","image",)
S_max = cv2.getTrackbarPos("S_max","image",)
V_max = cv2.getTrackbarPos("V_max","image",)
lower_hsv = np.array([H_min, S_min, V_min])
upper_hsv = np.array([H_max, S_max, V_max])
mask = cv2.inRange(img,lower_hsv,upper_hsv)
cv2.imshow("mask", mask)
if cv2.waitKey(1) & 0XFF == 27:
break
Choose_Color()
运行程序后,出现交互界面,拖动HSV滑动条,使球的二值化效果达到最佳,记录下H,S,V的数值大小。
kick_ball.py#
导入库#
from naoqi import ALProxy
from PIL import Image
import vision_definitions
import numpy as np
import motion
import cv2
import math
import time
设置机器人IP#
# 改为你自己的机器人的IP地址
robotIP="192.168.2.115"
PORT = 9559
初始化代理#
motionProxy = ALProxy("ALMotion", robotIP, PORT)
posture = ALProxy("ALRobotPosture",robotIP, PORT)
camProxy = ALProxy("ALVideoDevice", robotIP, PORT)
speech = ALProxy("ALTextToSpeech",robotIP, PORT)
初始化机器人姿态#
def Init():
posture.goToPosture('Stand',0.5)
setHeadAngle(0, 0.25)
motionProxy.setStiffnesses("Head", 0.0)
获取图像#
def getImage(cameraID):
if (cameraID == 0): # Top Camera
camProxy.setCameraParameter("test", 18, 0)
elif (cameraID == 1): # Bottom Camera
camProxy.setCameraParameter("test", 18, 1)
resolution = vision_definitions.kVGA # resolution
colorSpace = vision_definitions.kRGBColorSpace #
fps = 15
nameId = camProxy.subscribe("test", resolution, colorSpace, fps) #
naoImage = camProxy.getImageRemote(nameId)
imageWidth = naoImage[0]
imageHeight = naoImage[1]
array = naoImage[6] # binary array of size height * width * nblayers containing image data.
im = Image.frombytes("RGB", (imageWidth, imageHeight), array)
im.save("raw_Image.png", "PNG")
camProxy.unsubscribe(nameId)
图像二值化#
def Binarization(image, pattern):
# Setting the pattern
lower = []
upper = []
if (pattern == "red"):
lower = np.array([0, 129, 16]) #H_min,S_min,V_min
upper = np.array([21, 255, 255]) #H_max,S_max,V_max
elif (pattern == "yellow"):
lower = np.array([20, 100, 100]) #H_min,S_min,V_min
upper = np.array([34, 255, 255]) #H_max,S_max,V_max
elif (pattern == "blue"):
lower = np.array([110, 70, 70]) #H_min,S_min,V_min
upper = np.array([124, 255, 255]) #H_max,S_max,V_max
# BGR to HSV
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
# Binarization
mask = cv2.inRange(hsv, lower, upper)
# Opened the image
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
opened = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel)
cv2.imshow("Binarization", opened)
return opened
遍历图像,寻找是否有球#
若有,则返回flag为true,(x,y)是目标点的坐标;否则返回false,(0,0)。
def search(cameraID):
getImage(cameraID)
img = cv2.imread("raw-Image.png")
bina = Binarization(img, "red") # color
x, y = calcTheLocate(bina)
if (x == 0 and y == 0):
flag = False
else:
flag = True
return flag, x, y
寻找图像中球的中心点#
def calcTheLocate(img):
col = np.ones(640)
row = np.ones(480)
colsum = []
rowsum = []
x = 0
xw = 0 # w:west
xe = 0 # e:est
y = 0
yn = 0 #n:north
ys = 0 #s:south
for i in range(0, 480):
product = np.dot(col, img[i][:])
colsum.append(product)
for i in range(0, 480):
if (colsum[i] == max(colsum)):
y = i
val = max(colsum) / 255
yn = int(i - val)
ys = int(i + val)
break
for i in range(0, 640):
product = np.dot(row, img[:, i])
rowsum.append(product)
for i in range(0, 640):
if (rowsum[i] == max(rowsum)):
x = i
val = max(colsum) / 255
xw = int(val - i)
xe = int(val + i)
break
print("locate x: ", x, xw, xe, "........ locate y :", y, yn, ys)
cv2.circle(img, (x, y), 5, (55, 255, 155), -1)
cv2.circle(img, (xw, y), 5, (55, 255, 155), -1)
cv2.circle(img, (xe, y), 5, (55, 255, 155), -1)
cv2.circle(img, (x, yn), 5, (55, 255, 155), -1)
cv2.circle(img, (x, ys), 5, (55, 255, 155), -1)
cv2.putText(img, "center", (x - 20, y - 20),
cv2.FONT_HERSHEY_SIMPLEX, 0.75, (55, 255, 155), 2)
cv2.imshow("two", img)
cv2.imwrite("binalizeImage.png", img)
# cv2.waitKey(0)
return x, y
计算球和机器人的实际距离#
该实例用的是底端的摄像头,若使用顶端的摄像头,需要重新测试校准D_min和D_max的值。
def getDistance(x, y):
img_height = 480
img_width = 640
H = 477.33 # Height of bottom camera
# Calibrate the two parameters for your own case
D_min = 50 # mm, minimum distance
D_max = 800 # mm, maximum distance
beta = 56.3 * math.pi / 180.0 # HFOV
alpha = math.atan(D_min / H)
theta = math.atan(D_max / H) - alpha
diff_theta = (img_height - y) * theta / img_height
x_real = H * math.tan(alpha + diff_theta) /1000
y_unit = (x_real * 1000 + D_min) * math.tan(beta / 2)
y_real = -2 * y_unit * (x - img_width / 2) / img_width / 1000
turn = math.atan(y_real / x_real)
return x_real, y_real, turn
机器人踢球动作#
本实例中,机器人用右脚踢球。
def kick_ball():
names = list()
times = list()
keys = list()
names.append("HeadPitch")
times.append([ 1.16000, 2.68000, 3.20000, 4.24000, 5.12000, 6.12000])
keys.append([ [ 0.04363, [ 3, -0.38667, 0.00000], [ 3, 0.50667, 0.00000]], \
[ 0.26180, [ 3, -0.50667, 0.00000], [ 3, 0.17333, 0.00000]], [ 0.17453, \
[ 3, -0.17333, 0.06012], [ 3, 0.34667, -0.12023]], [ -0.27925, [ 3, -0.34667, 0.00000], \
[ 3, 0.29333, 0.00000]], [ -0.26180, [ 3, -0.29333, -0.00575], [ 3, 0.33333, 0.00653]], \
[ -0.24241, [ 3, -0.33333, 0.00000], [ 3, 0.00000, 0.00000]]])
names.append("HeadYaw")
times.append([ 1.16000, 2.68000, 3.20000, 4.24000, 5.12000, 6.12000])
keys.append([ [ 0.00464, [ 3, -0.38667, 0.00000], [ 3, 0.50667, 0.00000]], \
[ -0.00149, [ 3, -0.50667, 0.00000], [ 3, 0.17333, 0.00000]], [ 0.00311, \
[ 3, -0.17333, 0.00000], [ 3, 0.34667, 0.00000]], [ -0.04905, [ 3, -0.34667, 0.00000], \
[ 3, 0.29333, 0.00000]], [ -0.03371, [ 3, -0.29333, -0.00382], [ 3, 0.33333, 0.00434]], \
[ -0.02459, [ 3, -0.33333, 0.00000], [ 3, 0.00000, 0.00000]]])
names.append("LAnklePitch")
times.append([ 1.04000, 1.76000, 2.56000, 4.12000, 5.00000, 6.00000])
keys.append([ [ 0.03226, [ 3, -0.34667, 0.00000], [ 3, 0.24000, 0.00000]], \
[ 0.01745, [ 3, -0.24000, 0.00000], [ 3, 0.26667, 0.00000]], [ 0.01745, [ 3, -0.26667, 0.00000], \
[ 3, 0.52000, 0.00000]], [ 0.03491, [ 3, -0.52000, 0.00000], [ 3, 0.29333, 0.00000]], \
[ 0.03491, [ 3, -0.29333, 0.00000], [ 3, 0.33333, 0.00000]], [ 0.11501, [ 3, -0.33333, 0.00000], \
[ 3, 0.00000, 0.00000]]])
names.append("LAnkleRoll")
times.append([ 1.04000, 1.76000, 2.56000, 4.12000, 5.00000, 6.00000])
keys.append([ [ 0.33161, [ 3, -0.34667, 0.00000], [ 3, 0.24000, 0.00000]], \
[ 0.36652, [ 3, -0.24000, 0.00000], [ 3, 0.26667, 0.00000]], [ 0.36652, \
[ 3, -0.26667, 0.00000], [ 3, 0.52000, 0.00000]], [ 0.36652, [ 3, -0.52000, 0.00000], \
[ 3, 0.29333, 0.00000]], [ 0.34732, [ 3, -0.29333, 0.01920], [ 3, 0.33333, -0.02182]], \
[ -0.08433, [ 3, -0.33333, 0.00000], [ 3, 0.00000, 0.00000]]])
names.append("LElbowRoll")
times.append([ 1.08000, 2.60000, 3.12000, 4.16000, 5.04000, 6.04000])
keys.append([ [ -0.74096, [ 3, -0.36000, 0.00000], [ 3, 0.50667, 0.00000]],\
[ -1.03396, [ 3, -0.50667, 0.15621], [ 3, 0.17333, -0.05344]], [ -1.36990, \
[ 3, -0.17333, 0.00000], [ 3, 0.34667, 0.00000]], [ -1.02015, [ 3, -0.34667, -0.11965], \
[ 3, 0.29333, 0.10124]], [ -0.70722, [ 3, -0.29333, -0.10030], [ 3, 0.33333, 0.11398]], \
[ -0.37732, [ 3, -0.33333, 0.00000], [ 3, 0.00000, 0.00000]]])
names.append("LElbowYaw")
times.append([ 1.08000, 2.60000, 3.12000, 4.16000, 5.04000, 6.04000])
keys.append([ [ -1.15353, [ 3, -0.36000, 0.00000], [ 3, 0.50667, 0.00000]], \
[ -0.95411, [ 3, -0.50667, -0.06096], [ 3, 0.17333, 0.02085]], [ -0.90809, [ 3, -0.17333, 0.00000], \
[ 3, 0.34667, 0.00000]], [ -1.23023, [ 3, -0.34667, 0.11716], [ 3, 0.29333, -0.09913]], \
[ -1.55697, [ 3, -0.29333, 0.00000], [ 3, 0.33333, 0.00000]], [ -1.14441, [ 3, -0.33333, 0.00000], \
[ 3, 0.00000, 0.00000]]])
names.append("LHand")
times.append([ 1.08000, 2.60000, 3.12000, 4.16000, 5.04000, 6.04000])
keys.append([ [ 0.00317, [ 3, -0.36000, 0.00000], [ 3, 0.50667, 0.00000]], [ 0.00328, \
[ 3, -0.50667, -0.00003], [ 3, 0.17333, 0.00001]], [ 0.00329, [ 3, -0.17333, 0.00000], \
[ 3, 0.34667, 0.00000]], [ 0.00317, [ 3, -0.34667, 0.00000], [ 3, 0.29333, 0.00000]], \
[ 0.00325, [ 3, -0.29333, 0.00000], [ 3, 0.33333, 0.00000]], [ 0.00187, [ 3, -0.33333, 0.00000], \
[ 3, 0.00000, 0.00000]]])
names.append("LHipPitch")
times.append([ 1.04000, 2.56000, 3.08000, 3.36000, 4.12000, 5.00000, 6.00000])
keys.append([ [ 0.23159, [ 3, -0.34667, 0.00000], [ 3, 0.50667, 0.00000]], [ 0.10580, \
[ 3, -0.50667, 0.00000], [ 3, 0.17333, 0.00000]], [ 0.12217, [ 3, -0.17333, 0.00000], \
[ 3, 0.09333, 0.00000]], [ 0.08433, [ 3, -0.09333, 0.00000], [ 3, 0.25333, 0.00000]], \
[ 0.09046, [ 3, -0.25333, -0.00614], [ 3, 0.29333, 0.00710]], [ 0.19171, [ 3, -0.29333, -0.01627], \
[ 3, 0.33333, 0.01849]], [ 0.21020, [ 3, -0.33333, 0.00000], [ 3, 0.00000, 0.00000]]])
names.append("LHipRoll")
times.append([ 1.04000, 2.56000, 3.08000, 3.36000, 4.12000, 5.00000, 6.00000])
keys.append([ [ -0.34366, [ 3, -0.34667, 0.00000], [ 3, 0.50667, 0.00000]], [ -0.36820, \
[ 3, -0.50667, 0.00000], [ 3, 0.17333, 0.00000]], [ -0.36820, [ 3, -0.17333, 0.00000], \
[ 3, 0.09333, 0.00000]], [ -0.36513, [ 3, -0.09333, 0.00000], [ 3, 0.25333, 0.00000]], \
[ -0.36667, [ 3, -0.25333, 0.00000], [ 3, 0.29333, 0.00000]], [ -0.36513, [ 3, -0.29333, \
-0.00153], [ 3, 0.33333, 0.00174]], [ 0.10129, [ 3, -0.33333, 0.00000], [ 3, 0.00000, 0.00000]]])
names.append("LHipYawPitch")
times.append([ 1.04000, 2.56000, 3.08000, 3.36000, 4.12000, 5.00000, 6.00000])
keys.append([ [ -0.18097, [ 3, -0.34667, 0.00000], [ 3, 0.50667, 0.00000]], [ -0.25307, \
[ 3, -0.50667, 0.00000], [ 3, 0.17333, 0.00000]], [ -0.06285, [ 3, -0.17333, -0.02279], \
[ 3, 0.09333, 0.01227]], [ -0.05058, [ 3, -0.09333, 0.00000], [ 3, 0.25333, 0.00000]], \
[ -0.18711, [ 3, -0.25333, 0.02986], [ 3, 0.29333, -0.03457]], [ -0.24386, [ 3, \
-0.29333, 0.02058], [ 3, 0.33333, -0.02339]], [ -0.31903, [ 3, -0.33333, 0.00000], \
[ 3, 0.00000, 0.00000]]])
names.append("LKneePitch")
times.append([ 1.04000, 1.76000, 2.56000, 3.08000, 3.36000, 4.12000, 5.00000, 6.00000])
keys.append([ [ -0.08727, [ 3, -0.34667, 0.00000], [ 3, 0.24000, 0.00000]], [ -0.08727, \
[ 3, -0.24000, 0.00000], [ 3, 0.26667, 0.00000]], [ -0.09235, [ 3, -0.26667, 0.00000], \
[ 3, 0.17333, 0.00000]], [ -0.07973, [ 3, -0.17333, 0.00000], [ 3, 0.09333, 0.00000]], \
[ -0.07973, [ 3, -0.09333, 0.00000], [ 3, 0.25333, 0.00000]], [ -0.07819, \
[ 3, -0.25333, -0.00047], [ 3, 0.29333, 0.00055]], [ -0.07666, [ 3, -0.29333, 0.00000], \
[ 3, 0.33333, 0.00000]], [ -0.09208, [ 3, -0.33333, 0.00000], [ 3, 0.00000, 0.00000]]])
names.append("LShoulderPitch")
times.append([ 1.08000, 2.60000, 3.12000, 4.16000, 5.04000, 6.04000])
keys.append([ [ 1.48649, [ 3, -0.36000, 0.00000], [ 3, 0.50667, 0.00000]], [ 1.35917, \
[ 3, -0.50667, 0.00000], [ 3, 0.17333, 0.00000]], [ 1.41746, [ 3, -0.17333, -0.02659], \
[ 3, 0.34667, 0.05318]], [ 1.59847, [ 3, -0.34667, -0.03988], [ 3, 0.29333, 0.03375]], \
[ 1.63835, [ 3, -0.29333, 0.00000], [ 3, 0.33333, 0.00000]], [ 1.50021, [ 3, -0.33333, 0.00000], \
[ 3, 0.00000, 0.00000]]])
names.append("LShoulderRoll")
times.append([ 1.08000, 2.60000, 3.12000, 4.16000, 5.04000, 6.04000])
keys.append([ [ 0.02305, [ 3, -0.36000, 0.00000], [ 3, 0.50667, 0.00000]], [ 0.01998, \
[ 3, -0.50667, 0.00000], [ 3, 0.17333, 0.00000]], [ 0.13197, [ 3, -0.17333, 0.00000], \
[ 3, 0.34667, 0.00000]], [ 0.11816, [ 3, -0.34667, 0.01381], [ 3, 0.29333, -0.01168]], \
[ 0.02305, [ 3, -0.29333, 0.00000], [ 3, 0.33333, 0.00000]], [ 0.03524, [ 3, -0.33333, 0.00000], \
[ 3, 0.00000, 0.00000]]])
names.append("LWristYaw")
times.append([ 1.08000, 2.60000, 3.12000, 4.16000, 5.04000, 6.04000])
keys.append([ [ 0.24435, [ 3, -0.36000, 0.00000], [ 3, 0.50667, 0.00000]], [ 0.23935, \
[ 3, -0.50667, 0.00500], [ 3, 0.17333, -0.00171]], [ 0.22094, [ 3, -0.17333, 0.00409], \
[ 3, 0.34667, -0.00818]], [ 0.20253, [ 3, -0.34667, 0.00554], [ 3, 0.29333, -0.00469]], \
[ 0.19026, [ 3, -0.29333, 0.01227], [ 3, 0.33333, -0.01394]], [ -0.12736, [ 3, -0.33333, 0.00000],\
[ 3, 0.00000, 0.00000]]])
names.append("RAnklePitch")
times.append([ 1.04000, 1.32000, 1.76000, 2.24000, 2.56000, 2.84000, 3.08000, 3.36000, 3.68000, 4.12000, 5.00000, 6.00000])
keys.append([ [ 0.08727, [ 3, -0.34667, 0.00000], [ 3, 0.09333, 0.00000]], [ -0.08727, \
[ 3, -0.09333, 0.08824], [ 3, 0.14667, -0.13866]], [ -0.59341, [ 3, -0.14667, 0.00000], \
[ 3, 0.16000, 0.00000]], [ -0.40143, [ 3, -0.16000, -0.14312], [ 3, 0.10667, 0.09541]], \
[ 0.12217, [ 3, -0.10667, 0.00000], [ 3, 0.09333, 0.00000]], [ -0.05236, [ 3, -0.09333, 0.04386], \
[ 3, 0.08000, -0.03759]], [ -0.12217, [ 3, -0.08000, 0.00000], [ 3, 0.09333, 0.00000]], \
[ 0.24435, [ 3, -0.09333, 0.00000], [ 3, 0.10667, 0.00000]], [ -0.12217, [ 3, -0.10667, 0.12468], \
[ 3, 0.14667, -0.17144]], [ -0.64403, [ 3, -0.14667, 0.00000], [ 3, 0.29333, 0.00000]], \
[ -0.21991, [ 3, -0.29333, -0.11820], [ 3, 0.33333, 0.13432]], [ 0.11356, [ 3, -0.33333, 0.00000], \
[ 3, 0.00000, 0.00000]]])
names.append("RAnkleRoll")
times.append([ 1.04000, 2.56000, 3.08000, 3.36000, 4.12000, 5.00000, 6.00000])
keys.append([ [ 0.40143, [ 3, -0.34667, 0.00000], [ 3, 0.50667, 0.00000]], \
[ 0.10887, [ 3, -0.50667, 0.00000], [ 3, 0.17333, 0.00000]], [ 0.13802, \
[ 3, -0.17333, 0.00000], [ 3, 0.09333, 0.00000]], [ 0.00000, [ 3, -0.09333, 0.00000], \
[ 3, 0.25333, 0.00000]], [ 0.18097, [ 3, -0.25333, -0.05338], [ 3, 0.29333, 0.06181]], \
[ 0.34558, [ 3, -0.29333, 0.00000], [ 3, 0.33333, 0.00000]], [ 0.05066, \
[ 3, -0.33333, 0.00000], [ 3, 0.00000, 0.00000]]])
names.append("RElbowRoll")
times.append([ 1.00000, 2.52000, 3.04000, 4.08000, 4.96000, 5.96000])
keys.append([ [ 0.64117, [ 3, -0.33333, 0.00000], [ 3, 0.50667, 0.00000]], \
[ 1.15353, [ 3, -0.50667, -0.18364], [ 3, 0.17333, 0.06282]], [ 1.38056, [ 3, -0.17333, 0.00000], \
[ 3, 0.34667, 0.00000]], [ 1.36062, [ 3, -0.34667, 0.01994], [ 3, 0.29333, -0.01687]], \
[ 0.96024, [ 3, -0.29333, 0.14120], [ 3, 0.33333, -0.16046]], [ 0.45564, \
[ 3, -0.33333, 0.00000], [ 3, 0.00000, 0.00000]]])
names.append("RElbowYaw")
times.append([ 1.00000, 2.52000, 3.04000, 4.08000, 4.96000, 5.96000])
keys.append([ [ 0.99714, [ 3, -0.33333, 0.00000], [ 3, 0.50667, 0.00000]],\
[ 0.86368, [ 3, -0.50667, 0.00000], [ 3, 0.17333, 0.00000]], [ 0.90970, \
[ 3, -0.17333, 0.00000], [ 3, 0.34667, 0.00000]], [ 0.63205, [ 3, -0.34667, 0.00000], \
[ 3, 0.29333, 0.00000]], [ 0.84834, [ 3, -0.29333, -0.13498], [ 3, 0.33333, 0.15339]], \
[ 1.49714, [ 3, -0.33333, 0.00000], [ 3, 0.00000, 0.00000]]])
names.append("RHand")
times.append([ 1.00000, 2.52000, 3.04000, 4.08000, 4.96000, 5.96000])
keys.append([ [ 0.00129, [ 3, -0.33333, 0.00000], [ 3, 0.50667, 0.00000]], \
[ 0.00136, [ 3, -0.50667, 0.00000], [ 3, 0.17333, 0.00000]], [ 0.00132, \
[ 3, -0.17333, 0.00001], [ 3, 0.34667, -0.00002]], [ 0.00128, [ 3, -0.34667, 0.00000], \
[ 3, 0.29333, 0.00000]], [ 0.00133, [ 3, -0.29333, -0.00005], [ 3, 0.33333, 0.00006]], \
[ 0.00391, [ 3, -0.33333, 0.00000], [ 3, 0.00000, 0.00000]]])
names.append("RHipPitch")
times.append([ 1.04000, 2.56000, 3.08000, 3.36000, 4.12000, 5.00000, 6.00000])
keys.append([ [ 0.16265, [ 3, -0.34667, 0.00000], [ 3, 0.50667, 0.00000]], [ -0.39726, \
[ 3, -0.50667, 0.31826], [ 3, 0.17333, -0.10888]], [ -1.11876, [ 3, -0.17333, 0.00190], \
[ 3, 0.09333, -0.00102]], [ -1.11978, [ 3, -0.09333, 0.00000], [ 3, 0.25333, 0.00000]], \
[ -0.78540, [ 3, -0.25333, -0.12796], [ 3, 0.29333, 0.14816]], [ -0.29142, [ 3, -0.29333, -0.15581], \
[ 3, 0.33333, 0.17705]], [ 0.21318, [ 3, -0.33333, 0.00000], [ 3, 0.00000, 0.00000]]])
names.append("RHipRoll")
times.append([ 1.04000, 2.56000, 3.08000, 3.36000, 4.12000, 5.00000, 6.00000])
keys.append([ [ -0.47124, [ 3, -0.34667, 0.00000], [ 3, 0.50667, 0.00000]], [ -0.54001, \
[ 3, -0.50667, 0.00000], [ 3, 0.17333, 0.00000]], [ -0.32218, [ 3, -0.17333, -0.09040], \
[ 3, 0.09333, 0.04868]], [ -0.12276, [ 3, -0.09333, 0.00000], [ 3, 0.25333, 0.00000]], \
[ -0.36360, [ 3, -0.25333, 0.04547], [ 3, 0.29333, -0.05265]], [ -0.41713, [ 3, -0.29333, 0.00000], \
[ 3, 0.33333, 0.00000]], [ -0.05825, [ 3, -0.33333, 0.00000], [ 3, 0.00000, 0.00000]]])
names.append("RKneePitch")
times.append([ 1.04000, 2.56000, 2.84000, 3.08000, 3.36000, 4.12000, 5.00000, 6.00000])
keys.append([ [ -0.08901, [ 3, -0.34667, 0.00000], [ 3, 0.50667, 0.00000]], \
[ 1.97575, [ 3, -0.50667, 0.00000], [ 3, 0.09333, 0.00000]], [ 1.97222, [ 3, -0.09333, 0.00353], \
[ 3, 0.08000, -0.00302]], [ 1.23918, [ 3, -0.08000, 0.26583], [ 3, 0.09333, -0.31013]], \
[ 0.24435, [ 3, -0.09333, 0.00000], [ 3, 0.25333, 0.00000]], [ 1.53589, [ 3, -0.25333, 0.00000], \
[ 3, 0.29333, 0.00000]], [ 0.62430, [ 3, -0.29333, 0.25160], [ 3, 0.33333, -0.28591]], \
[ -0.07666, [ 3, -0.33333, 0.00000], [ 3, 0.00000, 0.00000]]])
names.append("RShoulderPitch")
times.append([ 1.00000, 2.52000, 3.04000, 4.08000, 4.96000, 5.96000])
keys.append([ [ 1.52782, [ 3, -0.33333, 0.00000], [ 3, 0.50667, 0.00000]], [ 1.46033, \
[ 3, -0.50667, 0.00000], [ 3, 0.17333, 0.00000]], [ 1.47413, [ 3, -0.17333, 0.00000], \
[ 3, 0.34667, 0.00000]], [ 1.24096, [ 3, -0.34667, 0.00000], [ 3, 0.29333, 0.00000]], \
[ 1.51862, [ 3, -0.29333, -0.02707], [ 3, 0.33333, 0.03076]], [ 1.54938, [ 3, -0.33333, 0.00000], \
[ 3, 0.00000, 0.00000]]])
names.append("RShoulderRoll")
times.append([ 1.00000, 2.52000, 3.04000, 4.08000, 4.96000, 5.96000])
keys.append([ [ -0.12268, [ 3, -0.33333, 0.00000], [ 3, 0.50667, 0.00000]], \
[ -0.04138, [ 3, -0.50667, 0.00000], [ 3, 0.17333, 0.00000]], [ -0.14569, [ 3, -0.17333, 0.00000], \
[ 3, 0.34667, 0.00000]], [ -0.13955, [ 3, -0.34667, 0.00000], [ 3, 0.29333, 0.00000]], [ -0.14722, \
[ 3, -0.29333, 0.00000], [ 3, 0.33333, 0.00000]], [ -0.03993, [ 3, -0.33333, 0.00000], [ 3, 0.00000, 0.00000]]])
names.append("RWristYaw")
times.append([ 1.00000, 2.52000, 3.04000, 4.08000, 4.96000, 5.96000])
keys.append([ [ -0.08727, [ 3, -0.33333, 0.00000], [ 3, 0.50667, 0.00000]], [ -0.07359, \
[ 3, -0.50667, -0.00911], [ 3, 0.17333, 0.00312]], [ -0.05058, [ 3, -0.17333, 0.00000], \
[ 3, 0.34667, 0.00000]], [ -0.06285, [ 3, -0.34667, 0.00000], [ 3, 0.29333, 0.00000]], \
[ 0.05680, [ 3, -0.29333, 0.00000], [ 3, 0.33333, 0.00000]], [ 0.00149, [ 3, -0.33333, 0.00000], \
[ 3, 0.00000, 0.00000]]])
motionProxy.angleInterpolationBezier(names, times, keys)
校准机器人的位置#
def getReady():
flag, x, y = search(1) #bottom camera
if x < 330:
x, y, turn = getDistanceBottom(x, y)
print("adjust x:", x, "y:", y)
speech.say("I am adjusting")
moveConfig = [["MaxStepFrequency", 1.0]]
motionProxy.moveTo(0, 1.2 * y, turn, moveConfig)
主程序#
def main():
Init()
flag = None
while (flag == None):
flag, x, y = search(1)
while (flag == False):
speech.say("I don't see the ball.")
motionProxy.moveTo(-0.1, 0.1, math.pi / 3)
flag, x, y = search(1)
speech.say("I see the ball")
print("final locate : ", x, y)
x, y, turn = getDistance(x, y)
print("walk 0:", x, y, turn)
moveConfig = [["MaxStepFrequency", 1.0]]
motionProxy.moveTo(0.68 * x, 0.85 * y, 0.8 * turn, moveConfig)
getReady()
speech.say("I am ready")
kick_ball()
posture.goToPosture('Stand',0.5)
if __name__ == '__main__':
main()