Ejemplo n.º 1
0
    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()
Ejemplo n.º 2
0
    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()
Ejemplo n.º 3
0
    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)
Ejemplo n.º 4
0
 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)
Ejemplo n.º 5
0
    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
Ejemplo n.º 6
0
    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()
Ejemplo n.º 7
0
    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)
Ejemplo n.º 8
0
    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)
Ejemplo n.º 9
0
    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()
Ejemplo n.º 10
0
    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)
Ejemplo n.º 11
0
    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()
Ejemplo n.º 12
0
    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)
Ejemplo n.º 13
0
    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")
Ejemplo n.º 14
0
    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)
Ejemplo n.º 15
0
    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()
Ejemplo n.º 16
0
    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()
Ejemplo n.º 17
0
    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)
Ejemplo n.º 18
0
    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))
Ejemplo n.º 19
0
    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()
Ejemplo n.º 20
0
    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()
Ejemplo n.º 21
0
    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()
Ejemplo n.º 22
0
    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)
Ejemplo n.º 23
0
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