Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

import director 

from director import transformUtils 

from director import visualization as vis 

from director import objectmodel as om 

from director import ikconstraints 

 

import os 

import functools 

import numpy as np 

import scipy.io 

from director.tasks.taskuserpanel import TaskUserPanel 

 

class SitStandPlanner(object): 

 

    def __init__(self, ikServer, robotSystem): 

        self.ikServer = ikServer 

        self.robotSystem = robotSystem 

        self.ikServer.connectStartupCompleted(self.initialize) 

        self.initializedFlag = False 

        self.planOptions = dict() 

 

    def initialize(self, ikServer, success): 

        if ikServer.restarted: 

            return 

        commands = self.getInitCommands() 

        self.ikServer.taskQueue.addTask(functools.partial(self.ikServer.comm.sendCommandsAsync, commands)) 

        self.ikServer.taskQueue.start() 

        self.initializedFlag = True 

 

    def getInitCommands(self): 

        commands = [''' 

        addpath([getenv('DRC_BASE'), '/software/control/matlab/planners/chair_standup']); 

        pssRobot = s.robot; 

        warning('Off','KinematicPoseTrajectory:Terrain'); 

        pss = PlanSitStand(pssRobot); 

      '''] 

        return commands 

 

    def applyParams(self): 

        commands = [] 

        commands.append("pss.plan_options.chair_height = %s;" %self.planOptions['chair_height']) 

        commands.append("pss.plan_options.speed = %s;" %self.planOptions['speed']) 

        commands.append("pss.plan_options.back_gaze_bound = %s;" %self.planOptions['back_gaze_bound']) 

        commands.append("pss.plan_options.min_distance = %s;" %self.planOptions['min_distance']) 

        commands.append("pss.plan_options.pelvis_gaze_bound = %s;" %self.planOptions['pelvis_gaze_bound']) 

        commands.append("pss.plan_options.pelvis_gaze_angle = %s;" %self.planOptions['pelvis_gaze_angle']) 

        commands.append("pss.plan_options.sit_back_distance = %s;" %self.planOptions['sit_back_distance']) 

        commands.append("pss.plan_options.bky_angle = %s;" %self.planOptions['bky_angle']) 

 

        self.ikServer.taskQueue.addTask(functools.partial(self.ikServer.comm.sendCommandsAsync, commands)) 

        self.ikServer.taskQueue.start() 

 

    def plan(self,planType): 

        self.applyParams() 

        startPose = self.getPlanningStartPose() 

        commands = [] 

        commands.append("pss.planSitting(%s, '%s');" % ( 

            ikconstraints.ConstraintBase.toColumnVectorString(startPose), 

            planType)) 

 

        self.ikServer.taskQueue.addTask(functools.partial(self.ikServer.comm.sendCommandsAsync, commands)) 

        self.ikServer.taskQueue.start() 

 

    def getPlanningStartPose(self): 

        return self.robotSystem.robotStateJointController.q 

 

 

class SitStandPlannerPanel(TaskUserPanel): 

 

    def __init__(self, robotSystem): 

 

        TaskUserPanel.__init__(self, windowTitle='Sit/Stand') 

 

        self.robotSystem = robotSystem 

        self.sitStandPlanner = SitStandPlanner(robotSystem.ikServer, robotSystem) 

        self.addDefaultProperties() 

        self.addButtons() 

        self.addTasks() 

 

 

    def addButtons(self): 

        self.addManualButton('Start', self.onStart) 

        self.addManualButton('Sit', functools.partial(self.onPlan, 'sit')) 

        self.addManualButton('Stand', functools.partial(self.onPlan, 'stand')) 

        self.addManualButton('Squat', functools.partial(self.onPlan, 'squat')) 

        self.addManualButton('Stand From Squat', functools.partial(self.onPlan, 'stand_from_squat')) 

        self.addManualButton('Sit From Current', functools.partial(self.onPlan, 'sit_from_current')) 

        self.addManualButton('Hold With Pelvis Contact', functools.partial(self.onPlan, 'hold_with_pelvis_contact')) 

        self.addManualButton('Hold Without Pelvis Contact', functools.partial(self.onPlan, 'hold_without_pelvis_contact')) 

 

    def onStart(self): 

        self._syncProperties() 

 

    def onPlan(self,planType): 

        self._syncProperties() 

        self.sitStandPlanner.plan(planType) 

 

    def addDefaultProperties(self): 

        self.params.addProperty('Chair Height', 0.57, attributes=om.PropertyAttributes(singleStep=0.01, decimals=3)) 

        self.params.addProperty('Sit Back Distance', 0.2, attributes=om.PropertyAttributes(singleStep=0.01, decimals=3)) 

        self.params.addProperty('Speed', 1, attributes=om.PropertyAttributes(singleStep=0.1, decimals=3)) 

        self.params.addProperty('Back Gaze Bound', 0.4, attributes=om.PropertyAttributes(singleStep=0.01, decimals=3)) 

        self.params.addProperty('Min Distance', 0.1, attributes=om.PropertyAttributes(singleStep=0.01, decimals=3)) 

        self.params.addProperty('Pelvis Gaze Bound', 0.1, attributes=om.PropertyAttributes(singleStep=0.01, decimals=3)) 

        self.params.addProperty('Pelvis Gaze Angle', 0, attributes=om.PropertyAttributes(singleStep=0.01, decimals=3)) 

        self.params.addProperty('Back y Angle', -0.2, attributes=om.PropertyAttributes(singleStep=0.01, decimals=3)) 

 

    def _syncProperties(self): 

        self.sitStandPlanner.planOptions['chair_height'] = self.params.getProperty('Chair Height') 

        self.sitStandPlanner.planOptions['sit_back_distance'] = self.params.getProperty('Sit Back Distance') 

        self.sitStandPlanner.planOptions['speed'] = self.params.getProperty('Speed') 

        self.sitStandPlanner.planOptions['back_gaze_bound'] = self.params.getProperty('Back Gaze Bound') 

        self.sitStandPlanner.planOptions['min_distance'] = self.params.getProperty('Min Distance') 

        self.sitStandPlanner.planOptions['pelvis_gaze_bound']= self.params.getProperty('Pelvis Gaze Bound') 

        self.sitStandPlanner.planOptions['pelvis_gaze_angle'] = self.params.getProperty('Pelvis Gaze Angle') 

        self.sitStandPlanner.planOptions['bky_angle'] = self.params.getProperty('Back y Angle') 

        self.sitStandPlanner.applyParams() 

 

    def onPropertyChanged(self, propertySet, propertyName): 

        self._syncProperties() 

 

    def addTasks(self): 

 

        # some helpers 

        self.folder = None 

        def addTask(task, parent=None): 

            parent = parent or self.folder 

            self.taskTree.onAddTask(task, copy=False, parent=parent) 

        def addFunc(func, name, parent=None): 

            addTask(rt.CallbackTask(callback=func, name=name), parent=parent) 

        def addFolder(name, parent=None): 

            self.folder = self.taskTree.addGroup(name, parent=parent) 

            return self.folder