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

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

import director.vtkAll as vtk 

import director.objectmodel as om 

from director import lcmUtils 

 

# if bot_lcmgl cannot be important than this module will not be able to 

# support lcmgl, but it can still be imported in a disabled state 

try: 

    import bot_lcmgl 

    import octomap as lcmOctomap 

    LCMGL_AVAILABLE = True 

except ImportError: 

    LCMGL_AVAILABLE = False 

 

 

class OctomapObject(om.ObjectModelItem): 

 

    def __init__(self, name, actor): 

 

        om.ObjectModelItem.__init__(self, name, om.Icons.Octomap) 

 

 

        self.actor = actor 

        self.actor.SetUseBounds(False) 

        self.addProperty('Visible', actor.GetVisibility()) 

        self.addProperty('Alpha', 0.8, attributes=om.PropertyAttributes(decimals=2, minimum=0, maximum=1.0, singleStep=0.1, hidden=False)) 

        self.addProperty('Color Mode', 2, attributes=om.PropertyAttributes(enumNames=['Flat', 'Print', 'Height', 'Gray', 'Semantic'])) 

        self.addProperty('Occ. Space', 1, attributes=om.PropertyAttributes(enumNames=['Hide', 'Show'])) 

        self.addProperty('Free Space', 0, attributes=om.PropertyAttributes(enumNames=['Hide', 'Show'])) 

        self.addProperty('Structure', 0, attributes=om.PropertyAttributes(enumNames=['Hide', 'Show'])) 

        self.addProperty('Tree Depth', 16, attributes=om.PropertyAttributes(decimals=0, minimum=1, maximum=16, singleStep=1.0)) 

        self.views = [] 

 

    def _onPropertyChanged(self, propertySet, propertyName): 

        om.ObjectModelItem._onPropertyChanged(self, propertySet, propertyName) 

 

        if propertyName == 'Visible': 

            self.actor.SetVisibility(self.getProperty(propertyName)) 

            self.renderAllViews() 

 

        elif propertyName == 'Alpha': 

            self.actor.setAlphaOccupied(self.getProperty(propertyName)) 

            self.renderAllViews() 

 

        elif propertyName == 'Occ. Space': 

            self.actor.enableOcTreeCells(self.getProperty(propertyName)) 

            self.renderAllViews() 

 

        elif propertyName == 'Free Space': 

            self.actor.enableFreespace(self.getProperty(propertyName)) 

            self.renderAllViews() 

 

        elif propertyName == 'Structure': 

            self.actor.enableOctreeStructure(self.getProperty(propertyName)) 

            self.renderAllViews() 

 

        elif propertyName == 'Tree Depth': 

            self.actor.changeTreeDepth(self.getProperty(propertyName)) 

            self.renderAllViews() 

 

        elif propertyName == 'Color Mode': 

            heightColorMode = self.getProperty(propertyName) 

            self.actor.setColorMode(heightColorMode) 

            self.renderAllViews() 

 

    def addToView(self, view): 

        if view in self.views: 

            return 

        self.views.append(view) 

        view.renderer().AddActor(self.actor) 

        view.render() 

 

    def renderAllViews(self): 

        for view in self.views: 

            view.render() 

 

    def onRemoveFromObjectModel(self): 

        self.removeFromAllViews() 

 

    def removeFromAllViews(self): 

        for view in list(self.views): 

            self.removeFromView(view) 

        assert len(self.views) == 0 

 

    def removeFromView(self, view): 

        assert view in self.views 

        self.views.remove(view) 

        view.renderer().RemoveActor(self.actor) 

        view.render() 

 

    def onMessage(self, msgBytes): 

        #print "about to draw" 

        self.actor.UpdateOctomapData(msgBytes.data()) 

        self.renderAllViews() 

 

 

managerInstance = None 

 

class OctomapManager(object): 

 

    def __init__(self, view): 

        assert LCMGL_AVAILABLE 

        self.view = view 

        self.subscriber = None 

        self.enable() 

 

    def isEnabled(self): 

        return self.subscriber is not None 

 

    def setEnabled(self, enabled): 

        if enabled and not self.subscriber: 

            #self.subscriber = lcmUtils.addSubscriber('LCMGL.*', callback=self.onMessage) 

            self.subscriber = lcmUtils.addSubscriber('OCTOMAP', callback=self.onMessage) 

            self.subscriber = lcmUtils.addSubscriber('OCTOMAP_REF', callback=self.onMessage) 

            self.subscriber = lcmUtils.addSubscriber('OCTOMAP_IN', callback=self.onMessage) 

        elif not enabled and self.subscriber: 

            lcmUtils.removeSubscriber(self.subscriber) 

            self.subscriber = None 

 

    def enable(self): 

        self.setEnabled(True) 

 

    def disable(self): 

        self.setEnabled(False) 

 

    def onMessage(self, msgBytes, channel): 

        #print " " 

        #print "got data" 

        msg = lcmOctomap.raw_t.decode(msgBytes.data()) 

        drawObject = self.getDrawObject(channel) 

        if not drawObject: 

            drawObject = self.addDrawObject(channel, msgBytes) 

        drawObject.onMessage(msgBytes) 

 

    def getDrawObject(self, name): 

        parent = om.getOrCreateContainer('Octomap') 

        return parent.findChild(name) 

 

    def addDrawObject(self, name, msgBytes): 

        actor = vtk.vtkOctomap() 

        obj = OctomapObject(name, actor) 

        om.addToObjectModel(obj, om.getOrCreateContainer('Octomap')) 

        obj.addToView(self.view) 

        return obj 

 

 

def init(view): 

    if not hasattr(vtk, 'vtkOctomap'): 

        return None 

 

    global managerInstance 

    managerInstance = OctomapManager(view) 

 

    return managerInstance