def testStep(self): scene = SunCgSceneLoader.loadHouseFromJson("0004d52d1aeeb8ae6de39d6bd993e992", TEST_SUNCG_DATA_DIR) renderer = Panda3dSemanticsRenderer(scene, TEST_SUNCG_DATA_DIR, mode='offscreen') renderer.showRoomLayout(showCeilings=False) mat = np.array([0.999992, 0.00394238, 0, 0, -0.00295702, 0.750104, -0.661314, 0, -0.00260737, 0.661308, 0.75011, 0, 43.621, -55.7499, 12.9722, 1]) scene.agents[0].setMat(LMatrix4f(*mat.ravel())) renderer.step(dt=0.1) image = renderer.getRgbaImages()['agent-0'] # Validate that all rendered colors maps to original values, up to some tolerance eps = 1e-2 colors = np.stack(MODEL_CATEGORY_COLOR_MAPPING.values()) for color in image.reshape((-1, image.shape[-1])): alpha = color[-1] if alpha == 1.0: self.assertTrue(np.min(np.sum(np.abs(colors - color[:3]), axis=1)) < eps) fig = plt.figure(figsize=(8, 8)) plt.axis("off") ax = plt.subplot(111) ax.imshow(image) plt.show(block=False) time.sleep(1.0) plt.close(fig) renderer.destroy()
def testStep(self): scene = SunCgSceneLoader.loadHouseFromJson("0004d52d1aeeb8ae6de39d6bd993e992", TEST_SUNCG_DATA_DIR) modelLightsInfo = SunCgModelLights(os.path.join(TEST_SUNCG_DATA_DIR, 'metadata', 'suncgModelLights.json')) renderer = Panda3dRenderer(scene, shadowing=True, mode='offscreen', modelLightsInfo=modelLightsInfo) renderer.showRoomLayout(showCeilings=False) mat = np.array([0.999992, 0.00394238, 0, 0, -0.00295702, 0.750104, -0.661314, 0, -0.00260737, 0.661308, 0.75011, 0, 43.621, -55.7499, 12.9722, 1]) scene.agents[0].setMat(LMatrix4f(*mat.ravel())) renderer.step(dt=0.1) image = renderer.getRgbImages()['agent-0'] depth = renderer.getDepthImages(mode='distance')['agent-0'] self.assertTrue(np.min(depth) >= renderer.zNear) self.assertTrue(np.max(depth) <= renderer.zFar) fig = plt.figure(figsize=(16, 8)) plt.axis("off") ax = plt.subplot(121) ax.imshow(image) ax = plt.subplot(122) ax.imshow(depth / np.max(depth), cmap='binary') plt.show(block=False) time.sleep(1.0) plt.close(fig) renderer.destroy()
def testInit(self): houseId = "0004d52d1aeeb8ae6de39d6bd993e992" scene = SunCgSceneLoader.loadHouseFromJson(houseId, SUNCG_DATA_DIR) agent = scene.agents[0] # Configure the agent transform = TransformState.makePosHpr(pos=LVector3f(38.42, -39.10, 1.70), hpr=LVector3f(-77.88, -13.93, 0.0)) agent.setTransform(transform) renderer = DepthRenderer(scene, size=(512, 512), fov=75.0) agentId = agent.getTag('agent-id') image = renderer.getDepthImage(agentId) fig = plt.figure(figsize=(8, 8)) plt.ion() plt.show() plt.axis("off") plt.imshow(image) plt.draw() plt.pause(1.0) plt.close(fig)
def testLoadHouseFromJson(self): scene = SunCgSceneLoader.loadHouseFromJson( '0004d52d1aeeb8ae6de39d6bd993e992', TEST_SUNCG_DATA_DIR) self.assertTrue(scene.getTotalNbHouses() == 1) self.assertTrue(scene.getTotalNbRooms() == 4) self.assertTrue(scene.getTotalNbObjects() == 55) self.assertTrue(scene.getTotalNbAgents() == 1)
def __init__(self, houseId, suncgDatasetRoot=None, size=(256, 256), debug=False, depth=False, realtime=False, dt=0.1, cameraTransform=None): self.__dict__.update(houseId=houseId, suncgDatasetRoot=suncgDatasetRoot, size=size, debug=debug, depth=depth, realtime=realtime, dt=dt, cameraTransform=cameraTransform) self.scene = SunCgSceneLoader.loadHouseFromJson(houseId, suncgDatasetRoot) agentRadius = 0.1 agentHeight = 1.6 if self.cameraTransform is None: self.cameraTransform = TransformState.makePos(LVector3f(0.0, 0.0, agentHeight/2.0 - agentRadius)) self.renderWorld = Panda3dRenderer(self.scene, size, shadowing=False, depth=depth, cameraTransform=self.cameraTransform) self.physicWorld = Panda3dBulletPhysics(self.scene, suncgDatasetRoot, debug=debug, objectMode='box', agentRadius=agentRadius, agentHeight=agentHeight, agentMass=60.0, agentMode='capsule') self.clock = ClockObject.getGlobalClock() self.worlds = { "physics": self.physicWorld, "render": self.renderWorld, } self.agent = self.scene.agents[0] self.agentRbNp = self.agent.find('**/+BulletRigidBodyNode') self.labeledNavMap = None self.occupancyMapCoord = None
def testStep(self): try: scene = SunCgSceneLoader.loadHouseFromJson( "0004d52d1aeeb8ae6de39d6bd993e992", TEST_SUNCG_DATA_DIR) #NOTE: show initial models loaded into the scene for model in scene.scene.findAllMatches('**/+ModelNode'): model.show() viewer = Viewer(scene, shadowing=True) # Configure the camera #NOTE: in Panda3D, the X axis points to the right, the Y axis is forward, and Z is up mat = np.array([ 0.999992, 0.00394238, 0, 0, -0.00295702, 0.750104, -0.661314, 0, -0.00260737, 0.661308, 0.75011, 0, 43.621, -55.7499, 12.9722, 1 ]) mat = LMatrix4f(*mat.ravel()) viewer.cam.setMat(mat) for _ in range(20): viewer.step() time.sleep(1.0) finally: viewer.destroy()
def testDebugHouseWithRender(self): renderer = None physics = None viewer = None try: scene = SunCgSceneLoader.loadHouseFromJson( "0004d52d1aeeb8ae6de39d6bd993e992", TEST_SUNCG_DATA_DIR) renderer = Panda3dRenderer(scene, shadowing=False, mode='offscreen') renderer.showRoomLayout(showCeilings=False) physics = Panda3dBulletPhysics( scene, suncgDatasetRoot=TEST_SUNCG_DATA_DIR, debug=True) viewer = Viewer(scene, interactive=False) viewer.disableMouse() mat = np.array([ 0.999992, 0.00394238, 0, 0, -0.00295702, 0.750104, -0.661314, 0, -0.00260737, 0.661308, 0.75011, 0, 43.621, -55.7499, 12.9722, 1 ]) mat = LMatrix4f(*mat.ravel()) viewer.cam.setMat(mat) for _ in range(20): viewer.step() time.sleep(1.0) finally: self.hulkSmash(renderer, physics, viewer)
def testGetRegionLabeledOccupacyMap(self): houseId = "0004d52d1aeeb8ae6de39d6bd993e992" scene = SunCgSceneLoader.loadHouseFromJson(houseId, SUNCG_DATA_DIR) helper = NavigationHelper(scene) occupancyMap, _, _ = helper.calculateOccupancyMap(resolution=0.1) labeledOccupancyMap = getRegionLabeledOccupacyMap(occupancyMap) nbRegions = int(np.max(labeledOccupancyMap)) self.assertTrue( np.array_equal(labeledOccupancyMap.shape, occupancyMap.shape)) self.assertTrue(nbRegions == 4) # Colorize the map randomly image = np.zeros( (labeledOccupancyMap.shape[0], labeledOccupancyMap.shape[1], 3)) for r in range(1, nbRegions + 1): randomColor = np.random.uniform(size=(3, )) image[labeledOccupancyMap == r] = randomColor fig = plt.figure(figsize=(8, 8)) plt.ion() plt.show() plt.axis("off") plt.imshow(image) plt.draw() plt.pause(1.0) plt.close(fig)
def testUpdate(self): scene = SunCgSceneLoader.loadHouseFromJson( "0004d52d1aeeb8ae6de39d6bd993e992", TEST_SUNCG_DATA_DIR) agentNp = scene.agents[0] agentNp.setPos(LVecBase3f(45, -42.5, 1.6)) agentNp.setHpr(45, 0, 0) samplingRate = 16000.0 hrtf = CipicHRTF(os.path.join(TEST_DATA_DIR, 'hrtf', 'cipic_hrir.mat'), samplingRate) acoustics = EvertAcoustics(scene, hrtf, samplingRate, maximumOrder=2, maxBufferLength=30.0) # Add ambient sound filename = os.path.join(TEST_DATA_DIR, 'audio', 'radio.ogg') ambientSound = EvertAudioSound(filename) ambientSound.setLoop(True) ambientSound.setLoopCount(0) acoustics.addAmbientSound(ambientSound) ambientSound.play() acoustics.step(0.0) player = AudioPlayer(acoustics) for _ in range(10): taskMgr.step()
def testCalculateNavigationGraph(self): houseId = "0004d52d1aeeb8ae6de39d6bd993e992" scene = SunCgSceneLoader.loadHouseFromJson(houseId, SUNCG_DATA_DIR) helper = NavigationHelper(scene) graph, occupancyMap, xlim, ylim = helper.calculateNavigationGraph( resolution=0.1, level=0, safetyMarginEdges=0.10) fig = plt.figure(figsize=(10, 10)) plt.ion() plt.show() plt.imshow(occupancyMap, cmap='gray', origin='upper', extent=[xlim[0], xlim[1], ylim[0], ylim[1]]) for i, ps in enumerate(graph.nodes): for k in graph.connectivity[i]: psk = graph.nodes[k] plt.plot([ps[0], psk[0]], [ps[1], psk[1]], 'green', zorder=1) plt.plot(ps[0], ps[1], 'r.', zorder=2) plt.draw() plt.pause(1.0) plt.close(fig)
def testDebugHouseWithViewer(self): try: scene = SunCgSceneLoader.loadHouseFromJson( "0004d52d1aeeb8ae6de39d6bd993e992", TEST_SUNCG_DATA_DIR) physics = Panda3dBulletPhysics( scene, suncgDatasetRoot=TEST_SUNCG_DATA_DIR, debug=True) viewer = Viewer(scene, interactive=False) viewer.disableMouse() mat = np.array([ 0.999992, 0.00394238, 0, 0, -0.00295702, 0.750104, -0.661314, 0, -0.00260737, 0.661308, 0.75011, 0, 43.621, -55.7499, 12.9722, 1 ]) mat = LMatrix4f(*mat.ravel()) viewer.cam.setMat(mat) for _ in range(20): viewer.step() time.sleep(1.0) finally: physics.destroy() viewer.destroy() viewer.graphicsEngine.removeAllWindows()
def testCalculateOccupancyMap(self): houseId = "0004d52d1aeeb8ae6de39d6bd993e992" scene = SunCgSceneLoader.loadHouseFromJson(houseId, SUNCG_DATA_DIR) helper = NavigationHelper(scene) occupancyMap, xlim, ylim = helper.calculateOccupancyMap(resolution=0.1) self.assertTrue(occupancyMap.shape[0] == occupancyMap.shape[1]) self.assertTrue(occupancyMap.ndim == 2) factorX = occupancyMap.shape[0] / \ (xlim[1] - xlim[0]) # pixel per meter factorY = occupancyMap.shape[1] / \ (ylim[1] - ylim[0]) # pixel per meter self.assertTrue(np.allclose(factorX, factorY, atol=1e-6)) fig = plt.figure(figsize=(8, 8)) plt.ion() plt.show() plt.axis("off") plt.imshow(occupancyMap, cmap='gray') plt.draw() plt.pause(1.0) plt.close(fig)
def testDescribe(self): scene = SunCgSceneLoader.loadHouseFromJson( "0004d52d1aeeb8ae6de39d6bd993e992", TEST_SUNCG_DATA_DIR) semantics = SuncgSemantics(scene, TEST_SUNCG_DATA_DIR) objNode = scene.scene.find('**/object-561*') desc = semantics.describeObject(objNode) self.assertTrue(desc == "small linen coffee table made of wood")
def testStep(self): scene = SunCgSceneLoader.loadHouseFromJson( "0004d52d1aeeb8ae6de39d6bd993e992", TEST_SUNCG_DATA_DIR) agentNp = scene.agents[0] agentNp.setPos(LVecBase3f(45, -42.5, 1.6)) agentNp.setHpr(45, 0, 0) # Define a sound source sourceSize = 0.25 modelId = 'source-0' modelFilename = os.path.join(TEST_DATA_DIR, 'models', 'sphere.egg') objectsNp = scene.scene.attachNewNode('objects') objectsNp.setTag('acoustics-mode', 'source') objectNp = objectsNp.attachNewNode('object-' + modelId) model = loadModel(modelFilename) model.setName('model-' + modelId) model.setTransform(TransformState.makeScale(sourceSize)) model.reparentTo(objectNp) objectNp.setPos(LVecBase3f(39, -40.5, 1.5)) samplingRate = 16000.0 hrtf = CipicHRTF(os.path.join(TEST_DATA_DIR, 'hrtf', 'cipic_hrir.mat'), samplingRate) acoustics = EvertAcoustics(scene, hrtf, samplingRate, maximumOrder=2, maxBufferLength=30.0) # Attach sound to object filename = os.path.join(TEST_DATA_DIR, 'audio', 'toilet.ogg') sound = EvertAudioSound(filename) acoustics.attachSoundToObject(sound, objectNp) sound.setLoop(True) sound.setLoopCount(1) sound.play() for i, dt in enumerate([5.0, 20.0, 10.0]): acoustics.step(dt) if i == 0: self.assertTrue(sound.status() == AudioSound.PLAYING) elif i > 1: self.assertTrue(sound.status() == AudioSound.READY) inbuf = acoustics.srcBuffers[sound] outbuf = acoustics.outBuffers[agentNp.getName()] fig = plt.figure() plt.subplot(121) plt.plot(inbuf) plt.subplot(122) plt.plot(outbuf.T) plt.show(block=False) time.sleep(4.0) plt.close(fig)
def testStep(self): scene = SunCgSceneLoader.loadHouseFromJson( "0004d52d1aeeb8ae6de39d6bd993e992", TEST_SUNCG_DATA_DIR) physics = Panda3dBulletPhysics(scene) for _ in range(10): physics.step(dt=0.1) physics.destroy()
def testInit(self): samplingRate = 16000.0 scene = SunCgSceneLoader.loadHouseFromJson( "0004d52d1aeeb8ae6de39d6bd993e992", TEST_SUNCG_DATA_DIR) hrtf = CipicHRTF(os.path.join(TEST_DATA_DIR, 'hrtf', 'cipic_hrir.mat'), samplingRate) engine = EvertAcoustics(scene, hrtf, samplingRate, maximumOrder=2, debug=True) engine.destroy()
def testAttachSoundToObject(self): samplingRate = 16000.0 scene = SunCgSceneLoader.loadHouseFromJson( "0004d52d1aeeb8ae6de39d6bd993e992", TEST_SUNCG_DATA_DIR) acoustics = EvertAcoustics(scene, samplingRate=samplingRate, maximumOrder=2) filename = os.path.join(TEST_DATA_DIR, 'audio', 'toilet.ogg') sound = EvertAudioSound(filename) objNode = scene.scene.find('**/object-83*') acoustics.attachSoundToObject(sound, objNode)
def testMultipleSources(self): scene = SunCgSceneLoader.loadHouseFromJson( "0004d52d1aeeb8ae6de39d6bd993e992", TEST_SUNCG_DATA_DIR) agentNp = scene.agents[0] agentNp.setPos(LVecBase3f(45, -42.5, 1.6)) agentNp.setHpr(45, 0, 0) # Define multiple sound sources sources = [] for i, pos in enumerate([(39, -40.5, 1.5), (45.5, -42.5, 0.5)]): sourceSize = 0.25 modelId = 'source-%d' % (i) modelFilename = os.path.join(TEST_DATA_DIR, 'models', 'sphere.egg') objectsNp = scene.scene.attachNewNode('objects') objectsNp.setTag('acoustics-mode', 'source') objectNp = objectsNp.attachNewNode('object-' + modelId) model = loadModel(modelFilename) model.setName('model-' + modelId) model.setTransform(TransformState.makeScale(sourceSize)) model.reparentTo(objectNp) objectNp.setPos(LVecBase3f(*pos)) sources.append(objectNp) samplingRate = 16000.0 hrtf = CipicHRTF(os.path.join(TEST_DATA_DIR, 'hrtf', 'cipic_hrir.mat'), samplingRate) acoustics = EvertAcoustics(scene, hrtf, samplingRate, maximumOrder=2) audioFilenames = ['toilet.ogg', 'radio.ogg'] for audioFilename, source in zip(audioFilenames, sources): # Attach sound to object filename = os.path.join(TEST_DATA_DIR, 'audio', audioFilename) sound = EvertAudioSound(filename) acoustics.attachSoundToObject(sound, source) sound.setLoop(True) sound.setLoopCount(1) sound.play() for _ in range(20): acoustics.step(dt=0.1) obs = acoustics.getObservationsForAgent(agentNp.getName()) self.assertTrue('audio-buffer-right' in obs) self.assertTrue('audio-buffer-left' in obs) self.assertTrue( np.array_equal(obs['audio-buffer-right'].shape, obs['audio-buffer-left'].shape))
def testRenderHouse(self): scene = SunCgSceneLoader.loadHouseFromJson( "0004d52d1aeeb8ae6de39d6bd993e992", TEST_SUNCG_DATA_DIR) samplingRate = 16000.0 hrtf = CipicHRTF(os.path.join(TEST_DATA_DIR, 'hrtf', 'cipic_hrir.mat'), samplingRate) acoustics = EvertAcoustics(scene, hrtf, samplingRate, maximumOrder=2, debug=True) acoustics.step(0.0) # Hide ceilings for nodePath in scene.scene.findAllMatches( '**/layouts/*/acoustics/*c'): nodePath.hide(BitMask32.allOn()) viewer = Viewer(scene, interactive=False) # Configure the camera # NOTE: in Panda3D, the X axis points to the right, the Y axis is # forward, and Z is up mat = np.array([ 0.999992, 0.00394238, 0, 0, -0.00295702, 0.750104, -0.661314, 0, -0.00260737, 0.661308, 0.75011, 0, 43.621, -55.7499, 12.9722, 1 ]) mat = LMatrix4f(*mat.ravel()) viewer.cam.setMat(mat) for _ in range(20): acoustics.step(dt=0.1) viewer.step() time.sleep(1.0) acoustics.destroy() viewer.destroy() viewer.graphicsEngine.removeAllWindows()
def testCalculate2dNavigationMap(self): scene = SunCgSceneLoader.loadHouseFromJson( "0004d52d1aeeb8ae6de39d6bd993e992", TEST_SUNCG_DATA_DIR) physics = Panda3dBulletPhysics(scene) navMap, _ = physics.calculate2dNavigationMap(scene.agents[0], z=1.0, precision=0.1) self.assertTrue(np.max(navMap) >= 1.0) fig = plt.figure() plt.axis("off") ax = plt.subplot(111) ax.imshow(navMap, cmap='gray') plt.show(block=False) time.sleep(1.0) plt.close(fig) physics.destroy()
def testRenderHouseWithAcousticsPath(self): scene = SunCgSceneLoader.loadHouseFromJson( "0004d52d1aeeb8ae6de39d6bd993e992", TEST_SUNCG_DATA_DIR) agentNp = scene.agents[0] agentNp.setPos(LVecBase3f(45, -42.5, 1.6)) agentNp.setHpr(45, 0, 0) # Define a sound source sourceSize = 0.25 modelId = 'source-0' modelFilename = os.path.join(TEST_DATA_DIR, 'models', 'sphere.egg') objectsNp = scene.scene.attachNewNode('objects') objectsNp.setTag('acoustics-mode', 'source') objectNp = objectsNp.attachNewNode('object-' + modelId) model = loadModel(modelFilename) model.setName('model-' + modelId) model.setTransform(TransformState.makeScale(sourceSize)) model.reparentTo(objectNp) objectNp.setPos(LVecBase3f(39, -40.5, 1.5)) samplingRate = 16000.0 hrtf = CipicHRTF(os.path.join(TEST_DATA_DIR, 'hrtf', 'cipic_hrir.mat'), samplingRate) acoustics = EvertAcoustics(scene, hrtf, samplingRate, maximumOrder=2, debug=True) # Attach sound to object filename = os.path.join(TEST_DATA_DIR, 'audio', 'toilet.ogg') sound = EvertAudioSound(filename) acoustics.attachSoundToObject(sound, objectNp) sound.play() acoustics.step(0.0) # Hide ceilings for nodePath in scene.scene.findAllMatches( '**/layouts/*/acoustics/*c'): nodePath.hide(BitMask32.allOn()) viewer = Viewer(scene, interactive=False) # Configure the camera # NOTE: in Panda3D, the X axis points to the right, the Y axis is forward, and Z is up center = agentNp.getNetTransform().getPos() mat = np.array([[1.0, 0.0, 0.0, 0.0], [0.0, 0.0, -1.0, 0.0], [0.0, 1.0, 0.0, 0.0], [center.x, center.y, 20, 1]]) mat = LMatrix4f(*mat.ravel()) viewer.cam.setMat(mat) for _ in range(20): viewer.step() time.sleep(1.0) viewer.destroy() viewer.graphicsEngine.removeAllWindows() # Calculate and show impulse responses impulse = acoustics.calculateImpulseResponse(objectNp.getName(), agentNp.getName()) fig = plt.figure() plt.plot(impulse.impulse[0], color='b', label='Left channel') plt.plot(impulse.impulse[1], color='g', label='Right channel') plt.legend() plt.show(block=False) time.sleep(1.0) plt.close(fig) acoustics.destroy()
def testAddAmbientSound(self): scene = SunCgSceneLoader.loadHouseFromJson( "0004d52d1aeeb8ae6de39d6bd993e992", TEST_SUNCG_DATA_DIR) agentNp = scene.agents[0] agentNp.setPos(LVecBase3f(45, -42.5, 1.6)) agentNp.setHpr(45, 0, 0) # Define a sound source sourceSize = 0.25 modelId = 'source-0' modelFilename = os.path.join(TEST_DATA_DIR, 'models', 'sphere.egg') objectsNp = scene.scene.attachNewNode('objects') objectsNp.setTag('acoustics-mode', 'source') objectNp = objectsNp.attachNewNode('object-' + modelId) model = loadModel(modelFilename) model.setName('model-' + modelId) model.setTransform(TransformState.makeScale(sourceSize)) model.reparentTo(objectNp) objectNp.setPos(LVecBase3f(39, -40.5, 1.5)) samplingRate = 16000.0 hrtf = CipicHRTF(os.path.join(TEST_DATA_DIR, 'hrtf', 'cipic_hrir.mat'), samplingRate) acoustics = EvertAcoustics(scene, hrtf, samplingRate, maximumOrder=2, maxBufferLength=30.0) # Attach sound to object filename = os.path.join(TEST_DATA_DIR, 'audio', 'toilet.ogg') sound = EvertAudioSound(filename) acoustics.attachSoundToObject(sound, objectNp) sound.setLoop(True) sound.setLoopCount(1) # Add ambient sound filename = os.path.join(TEST_DATA_DIR, 'audio', 'radio.ogg') ambientSound = EvertAudioSound(filename) ambientSound.setLoop(True) ambientSound.setLoopCount(0) ambientSound.setVolume(0.25) acoustics.addAmbientSound(ambientSound) ambientSound.play() acoustics.step(dt=5.0) sound.play() acoustics.step(dt=5.0) obs = acoustics.getObservationsForAgent(agentNp.getName()) data = np.array([obs['audio-buffer-left'], obs['audio-buffer-right']], dtype=np.float32).T self.assertTrue( np.allclose(data.shape[0] / samplingRate, 10.0, atol=1e-3)) #from scipy.io import wavfile #wavfile.write('output.wav', samplingRate, data) fig = plt.figure() plt.plot(data) plt.show(block=False) time.sleep(1.0) plt.close(fig)
def main(): # Create scene and remove any default agents scene = SunCgSceneLoader.loadHouseFromJson( houseId="0004d52d1aeeb8ae6de39d6bd993e992", datasetRoot=SUNCG_DATA_DIR) scene.scene.find('**/agents').node().removeAllChildren() scene.agents = [] # Create multiple agents agents = [] for i in range(3): agentRadius = 0.15 agent = Agent(scene, 'agent-%d' % (i), agentRadius) agents.append(agent) # NOTE: specify to move the camera slightly outside the model (not to render the interior of the model) cameraTransform = TransformState.makePos( LVector3f(0.0, 1.1 * agentRadius, 0.0)) # Initialize rendering and physics renderer = RgbRenderer(scene, size=(128, 128), fov=70.0, cameraTransform=cameraTransform) renderer.showRoomLayout(showCeilings=False, showWalls=True, showFloors=True) physics = Panda3dBulletPhysics(scene, SUNCG_DATA_DIR, objectMode='box', agentRadius=agentRadius, agentMode='sphere') # Configure the camera viewer = Viewer(scene, interactive=False, showPosition=False, cameraMask=renderer.cameraMask) transform = TransformState.makePosHpr(LVecBase3f(44.01, -43.95, 22.97), LVecBase3f(0.0, -81.04, 0.0)) viewer.cam.setTransform(transform) # Initialize the agent agents[0].setPosition((45, -42.5, 1.6)) agents[1].setPosition((42.5, -39, 1.6)) agents[2].setPosition((42.5, -41.5, 1.6)) # Initialize figure that will show the point-of-view of each agent plt.ion() fig = plt.figure(figsize=(12, 4), facecolor='white') ims = [] for i in range(len(agents)): ax = fig.add_subplot(1, len(agents), i + 1) ax.set_title(agents[i].agentId) ax.axis('off') rgbImage = np.zeros(renderer.size + (3, ), dtype=np.uint8) im = ax.imshow(rgbImage) ims.append(im) plt.tight_layout() plt.show() # Main loop clock = ClockObject.getGlobalClock() try: while True: # Update physics dt = clock.getDt() physics.step(dt) # Update viewer viewer.step() for i, agent in enumerate(agents): # Get the current RGB rgbImage = renderer.getRgbImage(agent.agentId, channelOrder="RGB") # Get the current observation for the agent observation = { "position": agent.getPosition(), "orientation": agent.getOrientation(), "rgb-image": rgbImage } agent.step(observation) ims[i].set_data(rgbImage) fig.canvas.draw() plt.pause(0.0001) except KeyboardInterrupt: pass viewer.destroy() renderer.destroy() return 0