示例#1
0
class FootstepsPanel(object):
    def __init__(self, driver, robotModel, jointController, irisDriver):

        self.driver = driver
        self.robotModel = robotModel
        self.jointController = jointController

        loader = QtUiTools.QUiLoader()
        uifile = QtCore.QFile(':/ui/ddFootsteps.ui')
        assert uifile.open(uifile.ReadOnly)

        self.widget = loader.load(uifile)

        self.placer = None

        self.irisDriver = irisDriver
        self.region_seed_frames = []

        self.ui = WidgetDict(self.widget.children())

        self.ui.walkingGoalButton.connect("clicked()", self.onNewWalkingGoal)
        self.ui.walkingPlanButton.connect("clicked()", self.onShowWalkingPlan)
        self.ui.stopButton.connect("clicked()", self.onStop)
        self.ui.simulateDrakeButton.connect("clicked()", self.onSimulateDrake)
        self.ui.haltSimulationDrakeButton.connect("clicked()",
                                                  self.onHaltSimulationDrake)
        self.ui.restoreDefaultsButton.connect("clicked()",
                                              lambda: self.applyDefaults())
        self.ui.showWalkingVolumesCheck.connect("clicked()",
                                                self.onShowWalkingVolumes)

        ### BDI frame logic
        self.ui.hideBDIButton.setVisible(False)
        self.ui.showBDIButton.setVisible(False)
        self.ui.hideBDIButton.connect("clicked()", self.onHideBDIButton)
        self.ui.showBDIButton.connect("clicked()", self.onShowBDIButton)

        self.ui.newRegionSeedButton.connect("clicked()", self.onNewRegionSeed)
        self.ui.autoIRISSegmentationButton.connect("clicked()",
                                                   self.onAutoIRISSegmentation)
        self._setupPropertiesPanel()

    def onShowWalkingVolumes(self):
        self.driver.show_contact_slices = self.ui.showWalkingVolumesCheck.checked

        folder = om.findObjectByName('walking volumes')
        for obj in folder.children():
            obj.setProperty('Visible', self.driver.show_contact_slices)

    def onNewRegionSeed(self):
        t = self.newWalkingGoalFrame(self.robotModel, distanceForward=0.5)
        self.irisDriver.newTerrainItem(t)

    def onAutoIRISSegmentation(self):
        self.irisDriver.autoIRISSegmentation()

    def _setupPropertiesPanel(self):
        l = QtGui.QVBoxLayout(self.ui.paramsContainer)
        l.setMargin(0)
        self.propertiesPanel = PythonQt.dd.ddPropertiesPanel()
        self.propertiesPanel.setBrowserModeToWidget()
        l.addWidget(self.propertiesPanel)
        self.panelConnector = propertyset.PropertyPanelConnector(
            self.driver.params.properties, self.propertiesPanel)
        self.driver.params.properties.connectPropertyChanged(
            self.onPropertyChanged)
        PythonQt.dd.ddGroupBoxHider(self.ui.paramsContainer)

    def onPropertyChanged(self, propertySet, propertyName):
        self.driver.updateRequest()
        if propertyName == 'Defaults':
            self.applyDefaults()

    def applyDefaults(self):
        set_name = self.driver.defaults_map[
            self.driver.params.properties.defaults]
        for k, v in self.driver.default_step_params[set_name].iteritems():
            self.driver.params.setProperty(k, v)

    def newWalkingGoalFrame(self, robotModel, distanceForward=1.0):
        t = self.driver.getFeetMidPoint(robotModel)
        t.PreMultiply()
        t.Translate(distanceForward, 0.0, 0.0)
        t.PostMultiply()
        return t

    def onNewWalkingGoal(self, walkingGoal=None):

        walkingGoal = walkingGoal or self.newWalkingGoalFrame(self.robotModel)
        frameObj = vis.updateFrame(walkingGoal,
                                   'walking goal',
                                   parent='planning',
                                   scale=0.25)
        frameObj.setProperty('Edit', True)

        rep = frameObj.widget.GetRepresentation()
        rep.SetTranslateAxisEnabled(2, False)
        rep.SetRotateAxisEnabled(0, False)
        rep.SetRotateAxisEnabled(1, False)
        frameObj.widget.HandleRotationEnabledOff()

        if self.placer:
            self.placer.stop()

        terrain = om.findObjectByName('HEIGHT_MAP_SCENE')
        if terrain:

            pos = np.array(frameObj.transform.GetPosition())

            polyData = filterUtils.removeNonFinitePoints(terrain.polyData)
            if polyData.GetNumberOfPoints():
                polyData = segmentation.labelDistanceToLine(
                    polyData, pos, pos + [0, 0, 1])
                polyData = segmentation.thresholdPoints(
                    polyData, 'distance_to_line', [0.0, 0.1])
                if polyData.GetNumberOfPoints():
                    pos[2] = np.nanmax(
                        vnp.getNumpyFromVtk(polyData, 'Points')[:, 2])
                    frameObj.transform.Translate(
                        pos - np.array(frameObj.transform.GetPosition()))

            d = DebugData()
            d.addSphere((0, 0, 0), radius=0.03)
            handle = vis.showPolyData(d.getPolyData(),
                                      'walking goal terrain handle',
                                      parent=frameObj,
                                      visible=True,
                                      color=[1, 1, 0])
            handle.actor.SetUserTransform(frameObj.transform)
            self.placer = PlacerWidget(app.getCurrentRenderView(), handle,
                                       terrain)

            def onFramePropertyModified(propertySet, propertyName):
                if propertyName == 'Edit':
                    if propertySet.getProperty(propertyName):
                        self.placer.start()
                    else:
                        self.placer.stop()

            frameObj.properties.connectPropertyChanged(onFramePropertyModified)
            onFramePropertyModified(frameObj, 'Edit')

        frameObj.connectFrameModified(self.onWalkingGoalModified)
        self.onWalkingGoalModified(frameObj)

    def onWalkingGoalModified(self, frame):

        om.removeFromObjectModel(om.findObjectByName('footstep widget'))
        request = self.driver.constructFootstepPlanRequest(
            self.jointController.q, frame.transform)
        self.driver.sendFootstepPlanRequest(request)

    def onExecute(self):
        self.driver.commitFootstepPlan(self.driver.lastFootstepPlan)

    def onShowWalkingPlan(self):
        startPose = self.jointController.getPose('EST_ROBOT_STATE')
        self.driver.sendWalkingPlanRequest(self.driver.lastFootstepPlan,
                                           startPose,
                                           waitForResponse=True)

    def onStop(self):
        self.driver.sendStopWalking()

    def onSimulateDrake(self):
        startPose = self.jointController.getPose('EST_ROBOT_STATE')
        self.robotModel.setProperty('Visible', False)
        self.driver.sendWalkingPlanRequest(self.driver.lastFootstepPlan,
                                           startPose,
                                           waitForResponse=False,
                                           req_type='simulate_drake')

    def onHaltSimulationDrake(self):
        om.findObjectByName("drake viewer").findChild("robot 1").setProperty(
            "Visible", False)
        self.robotModel.setProperty('Visible', True)
        self.driver.sendHaltSimulationDrakeRequest()

    ### BDI frame logic
    def onHideBDIButton(self):
        self.driver.showBDIPlan = False
        self.driver.bdiRobotModel.setProperty('Visible', False)
        folder = om.getOrCreateContainer("BDI footstep plan")
        om.removeFromObjectModel(folder)
        folder = om.getOrCreateContainer("BDI adj footstep plan")
        om.removeFromObjectModel(folder)

    def onShowBDIButton(self):
        self.driver.showBDIPlan = True
        self.driver.bdiRobotModel.setProperty('Visible', True)
        self.driver.drawBDIFootstepPlan()
        self.driver.drawBDIFootstepPlanAdjusted()
class FootstepsPanel(object):

    def __init__(self, driver, robotModel, jointController, irisDriver):

        self.driver = driver
        self.robotModel = robotModel
        self.jointController = jointController

        loader = QtUiTools.QUiLoader()
        uifile = QtCore.QFile(':/ui/ddFootsteps.ui')
        assert uifile.open(uifile.ReadOnly)

        self.widget = loader.load(uifile)

        self.placer = None

        self.irisDriver = irisDriver
        self.region_seed_frames = []

        self.ui = WidgetDict(self.widget.children())

        self.ui.walkingGoalButton.connect("clicked()", self.onNewWalkingGoal)
        self.ui.walkingPlanButton.connect("clicked()", self.onShowWalkingPlan)
        self.ui.stopButton.connect("clicked()", self.onStop)
        self.ui.simulateDrakeButton.connect("clicked()", self.onSimulateDrake)
        self.ui.haltSimulationDrakeButton.connect("clicked()", self.onHaltSimulationDrake)
        self.ui.restoreDefaultsButton.connect("clicked()", lambda: self.applyDefaults())
        self.ui.showWalkingVolumesCheck.connect("clicked()", self.onShowWalkingVolumes)

        ### BDI frame logic
        self.ui.hideBDIButton.setVisible(False)
        self.ui.showBDIButton.setVisible(False)
        self.ui.hideBDIButton.connect("clicked()", self.onHideBDIButton)
        self.ui.showBDIButton.connect("clicked()", self.onShowBDIButton)

        self.ui.newRegionSeedButton.connect("clicked()", self.onNewRegionSeed)
        self.ui.autoIRISSegmentationButton.connect("clicked()", self.onAutoIRISSegmentation)
        self._setupPropertiesPanel()


    def onShowWalkingVolumes(self):
        self.driver.show_contact_slices = self.ui.showWalkingVolumesCheck.checked

        folder = om.findObjectByName('walking volumes')
        for obj in folder.children():
            obj.setProperty('Visible', self.driver.show_contact_slices)

    def onNewRegionSeed(self):
        t = self.newWalkingGoalFrame(self.robotModel, distanceForward=0.5)
        self.irisDriver.newTerrainItem(t)

    def onAutoIRISSegmentation(self):
        self.irisDriver.autoIRISSegmentation()

    def _setupPropertiesPanel(self):
        l = QtGui.QVBoxLayout(self.ui.paramsContainer)
        l.setMargin(0)
        self.propertiesPanel = PythonQt.dd.ddPropertiesPanel()
        self.propertiesPanel.setBrowserModeToWidget()
        l.addWidget(self.propertiesPanel)
        self.panelConnector = propertyset.PropertyPanelConnector(self.driver.params.properties, self.propertiesPanel)
        self.driver.params.properties.connectPropertyChanged(self.onPropertyChanged)
        PythonQt.dd.ddGroupBoxHider(self.ui.paramsContainer)

    def onPropertyChanged(self, propertySet, propertyName):
        self.driver.updateRequest()
        if propertyName == 'Defaults':
            self.applyDefaults()

    def applyDefaults(self):
        set_name = self.driver.defaults_map[self.driver.params.properties.defaults]
        for k, v in self.driver.default_step_params[set_name].iteritems():
            self.driver.params.setProperty(k, v)

    def newWalkingGoalFrame(self, robotModel, distanceForward=1.0):
        t = self.driver.getFeetMidPoint(robotModel)
        t.PreMultiply()
        t.Translate(distanceForward, 0.0, 0.0)
        t.PostMultiply()
        return t


    def onNewWalkingGoal(self, walkingGoal=None):

        walkingGoal = walkingGoal or self.newWalkingGoalFrame(self.robotModel)
        frameObj = vis.updateFrame(walkingGoal, 'walking goal', parent='planning', scale=0.25)
        frameObj.setProperty('Edit', True)


        rep = frameObj.widget.GetRepresentation()
        rep.SetTranslateAxisEnabled(2, False)
        rep.SetRotateAxisEnabled(0, False)
        rep.SetRotateAxisEnabled(1, False)
        frameObj.widget.HandleRotationEnabledOff()

        if self.placer:
            self.placer.stop()

        terrain = om.findObjectByName('HEIGHT_MAP_SCENE')
        if terrain:

            pos = np.array(frameObj.transform.GetPosition())

            polyData = filterUtils.removeNonFinitePoints(terrain.polyData)
            if polyData.GetNumberOfPoints():
                polyData = segmentation.labelDistanceToLine(polyData, pos, pos+[0,0,1])
                polyData = segmentation.thresholdPoints(polyData, 'distance_to_line', [0.0, 0.1])
                if polyData.GetNumberOfPoints():
                    pos[2] = np.nanmax(vnp.getNumpyFromVtk(polyData, 'Points')[:,2])
                    frameObj.transform.Translate(pos - np.array(frameObj.transform.GetPosition()))

            d = DebugData()
            d.addSphere((0,0,0), radius=0.03)
            handle = vis.showPolyData(d.getPolyData(), 'walking goal terrain handle', parent=frameObj, visible=True, color=[1,1,0])
            handle.actor.SetUserTransform(frameObj.transform)
            self.placer = PlacerWidget(app.getCurrentRenderView(), handle, terrain)

            def onFramePropertyModified(propertySet, propertyName):
                if propertyName == 'Edit':
                    if propertySet.getProperty(propertyName):
                        self.placer.start()
                    else:
                        self.placer.stop()

            frameObj.properties.connectPropertyChanged(onFramePropertyModified)
            onFramePropertyModified(frameObj, 'Edit')

        frameObj.connectFrameModified(self.onWalkingGoalModified)
        self.onWalkingGoalModified(frameObj)

    def onWalkingGoalModified(self, frame):

        om.removeFromObjectModel(om.findObjectByName('footstep widget'))
        request = self.driver.constructFootstepPlanRequest(self.jointController.q, frame.transform)
        self.driver.sendFootstepPlanRequest(request)

    def onExecute(self):
        self.driver.commitFootstepPlan(self.driver.lastFootstepPlan)

    def onShowWalkingPlan(self):
        startPose = self.jointController.getPose('EST_ROBOT_STATE')
        self.driver.sendWalkingPlanRequest(self.driver.lastFootstepPlan, startPose, waitForResponse=True)

    def onStop(self):
        self.driver.sendStopWalking()

    def onSimulateDrake(self):
        startPose = self.jointController.getPose('EST_ROBOT_STATE')
        self.robotModel.setProperty('Visible', False);
        self.driver.sendWalkingPlanRequest(self.driver.lastFootstepPlan, startPose, waitForResponse=False, req_type='simulate_drake')

    def onHaltSimulationDrake(self):
        om.findObjectByName("drake viewer").findChild("robot 1").setProperty("Visible", False)
        self.robotModel.setProperty('Visible', True);
        self.driver.sendHaltSimulationDrakeRequest()

    ### BDI frame logic
    def onHideBDIButton(self):
        self.driver.showBDIPlan = False
        self.driver.bdiRobotModel.setProperty('Visible', False)
        folder = om.getOrCreateContainer("BDI footstep plan")
        om.removeFromObjectModel(folder)
        folder = om.getOrCreateContainer("BDI adj footstep plan")
        om.removeFromObjectModel(folder)

    def onShowBDIButton(self):
        self.driver.showBDIPlan = True
        self.driver.bdiRobotModel.setProperty('Visible', True)
        self.driver.drawBDIFootstepPlan()
        self.driver.drawBDIFootstepPlanAdjusted()