example for Issue #1586
This commit is contained in:
123
examples/pybullet/examples/pointCloudFromCameraImage.py
Normal file
123
examples/pybullet/examples/pointCloudFromCameraImage.py
Normal file
@@ -0,0 +1,123 @@
|
||||
|
||||
import pybullet as p
|
||||
import math
|
||||
import numpy as np
|
||||
|
||||
|
||||
|
||||
p.connect(p.GUI)
|
||||
plane = p.loadURDF("plane100.urdf")
|
||||
cube = p.loadURDF("cube.urdf",[0,0,1])
|
||||
|
||||
def getRayFromTo(mouseX,mouseY):
|
||||
width, height, viewMat, projMat, cameraUp, camForward, horizon,vertical, _,_,dist, camTarget = p.getDebugVisualizerCamera()
|
||||
camPos = [camTarget[0] - dist*camForward[0],camTarget[1] - dist*camForward[1],camTarget[2] - dist*camForward[2]]
|
||||
farPlane = 10000
|
||||
rayForward = [(camTarget[0]-camPos[0]),(camTarget[1]-camPos[1]),(camTarget[2]-camPos[2])]
|
||||
lenFwd = math.sqrt(rayForward[0]*rayForward[0]+rayForward[1]*rayForward[1]+rayForward[2]*rayForward[2])
|
||||
invLen = farPlane*1./lenFwd
|
||||
rayForward = [invLen*rayForward[0],invLen*rayForward[1],invLen*rayForward[2]]
|
||||
rayFrom = camPos
|
||||
oneOverWidth = float(1)/float(width)
|
||||
oneOverHeight = float(1)/float(height)
|
||||
|
||||
dHor = [horizon[0] * oneOverWidth,horizon[1] * oneOverWidth,horizon[2] * oneOverWidth]
|
||||
dVer = [vertical[0] * oneOverHeight,vertical[1] * oneOverHeight,vertical[2] * oneOverHeight]
|
||||
rayToCenter=[rayFrom[0]+rayForward[0],rayFrom[1]+rayForward[1],rayFrom[2]+rayForward[2]]
|
||||
ortho=[- 0.5 * horizon[0] + 0.5 * vertical[0]+float(mouseX)*dHor[0]-float(mouseY)*dVer[0],
|
||||
- 0.5 * horizon[1] + 0.5 * vertical[1]+float(mouseX)*dHor[1]-float(mouseY)*dVer[1],
|
||||
- 0.5 * horizon[2] + 0.5 * vertical[2]+float(mouseX)*dHor[2]-float(mouseY)*dVer[2]]
|
||||
|
||||
rayTo = [rayFrom[0]+rayForward[0] +ortho[0],
|
||||
rayFrom[1]+rayForward[1] +ortho[1],
|
||||
rayFrom[2]+rayForward[2] +ortho[2]]
|
||||
lenOrtho = math.sqrt(ortho[0]*ortho[0]+ortho[1]*ortho[1]+ortho[2]*ortho[2])
|
||||
alpha = math.atan(lenOrtho/farPlane)
|
||||
return rayFrom,rayTo, alpha
|
||||
|
||||
|
||||
width, height, viewMat, projMat, cameraUp, camForward, horizon,vertical, _,_,dist, camTarget = p.getDebugVisualizerCamera()
|
||||
camPos = [camTarget[0] - dist*camForward[0],camTarget[1] - dist*camForward[1],camTarget[2] - dist*camForward[2]]
|
||||
farPlane = 10000
|
||||
rayForward = [(camTarget[0]-camPos[0]),(camTarget[1]-camPos[1]),(camTarget[2]-camPos[2])]
|
||||
lenFwd = math.sqrt(rayForward[0]*rayForward[0]+rayForward[1]*rayForward[1]+rayForward[2]*rayForward[2])
|
||||
oneOverWidth = float(1)/float(width)
|
||||
oneOverHeight = float(1)/float(height)
|
||||
dHor = [horizon[0] * oneOverWidth,horizon[1] * oneOverWidth,horizon[2] * oneOverWidth]
|
||||
dVer = [vertical[0] * oneOverHeight,vertical[1] * oneOverHeight,vertical[2] * oneOverHeight]
|
||||
|
||||
lendHor = math.sqrt(dHor[0]*dHor[0]+dHor[1]*dHor[1]+dHor[2]*dHor[2])
|
||||
lendVer = math.sqrt(dVer[0]*dVer[0]+dVer[1]*dVer[1]+dVer[2]*dVer[2])
|
||||
|
||||
cornersX = [0,width,width,0]
|
||||
cornersY = [0,0,height,height]
|
||||
corners3D=[]
|
||||
|
||||
imgW = int(width/10)
|
||||
imgH = int(height/10)
|
||||
|
||||
img = p.getCameraImage(imgW,imgH, renderer=p.ER_BULLET_HARDWARE_OPENGL)
|
||||
rgbBuffer=img[2]
|
||||
depthBuffer = img[3]
|
||||
print("rgbBuffer.shape=",rgbBuffer.shape)
|
||||
print("depthBuffer.shape=",depthBuffer.shape)
|
||||
|
||||
#disable rendering temporary makes adding objects faster
|
||||
p.configureDebugVisualizer(p.COV_ENABLE_RENDERING,0)
|
||||
p.configureDebugVisualizer(p.COV_ENABLE_GUI,0)
|
||||
p.configureDebugVisualizer(p.COV_ENABLE_TINY_RENDERER,0)
|
||||
visualShapeId = p.createVisualShape(shapeType=p.GEOM_SPHERE, rgbaColor=[1,1,1,1], radius=0.03 )
|
||||
collisionShapeId = -1 #p.createCollisionShape(shapeType=p.GEOM_MESH, fileName="duck_vhacd.obj", collisionFramePosition=shift,meshScale=meshScale)
|
||||
|
||||
for i in range (4):
|
||||
w = cornersX[i]
|
||||
h = cornersY[i]
|
||||
rayFrom,rayTo, _= getRayFromTo(w,h)
|
||||
rf = np.array(rayFrom)
|
||||
rt = np.array(rayTo)
|
||||
vec = rt-rf
|
||||
l = np.sqrt(np.dot(vec,vec))
|
||||
newTo = (0.01/l)*vec+rf
|
||||
#print("len vec=",np.sqrt(np.dot(vec,vec)))
|
||||
|
||||
p.addUserDebugLine(rayFrom,newTo,[1,0,0])
|
||||
corners3D.append(newTo)
|
||||
count = 0
|
||||
|
||||
stepX=5
|
||||
stepY=5
|
||||
for w in range(0,imgW,stepX):
|
||||
for h in range (0,imgH,stepY):
|
||||
count+=1
|
||||
if ((count % 100)==0):
|
||||
print(count,"out of ", imgW*imgH/(stepX*stepY))
|
||||
rayFrom,rayTo, alpha = getRayFromTo(w*(width/imgW),h*(height/imgH))
|
||||
rf = np.array(rayFrom)
|
||||
rt = np.array(rayTo)
|
||||
vec = rt-rf
|
||||
l = np.sqrt(np.dot(vec,vec))
|
||||
depthImg = float(depthBuffer[h,w])
|
||||
far=1000.
|
||||
near=0.01
|
||||
depth = far * near / (far - (far - near) * depthImg)
|
||||
depth/=math.cos(alpha)
|
||||
newTo = (depth/l)*vec+rf
|
||||
p.addUserDebugLine(rayFrom,newTo,[1,0,0])
|
||||
mb = p.createMultiBody(baseMass=0,baseCollisionShapeIndex=collisionShapeId, baseVisualShapeIndex = visualShapeId, basePosition = newTo, useMaximalCoordinates=True)
|
||||
color = rgbBuffer[h,w]
|
||||
color=[color[0]/255.,color[1]/255.,color[2]/255.,1]
|
||||
p.changeVisualShape(mb,-1,rgbaColor=color)
|
||||
p.addUserDebugLine(corners3D[0],corners3D[1],[1,0,0])
|
||||
p.addUserDebugLine(corners3D[1],corners3D[2],[1,0,0])
|
||||
p.addUserDebugLine(corners3D[2],corners3D[3],[1,0,0])
|
||||
p.addUserDebugLine(corners3D[3],corners3D[0],[1,0,0])
|
||||
p.configureDebugVisualizer(p.COV_ENABLE_RENDERING,1)
|
||||
print("ready\n")
|
||||
#p.removeBody(plane)
|
||||
#p.removeBody(cube)
|
||||
while (1):
|
||||
p.setGravity(0,0,-10)
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user