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

from director import lcmUtils 

from director import objectmodel as om 

from director import visualization as vis 

from director import vtkAll as vtk 

from director import transformUtils 

from director.debugVis import DebugData 

from director.shallowCopy import shallowCopy 

import vicon as lcmvicon 

import time 

import numpy as np 

 

 

class ViconVisualizer(object): 

    ''' 

    Usage: 

 

      viconVis = ViconVisualizer('VICON_CHANNEL_NAME') 

 

 

      # You can enable visualization of edges between vicon markers, 

      # but this visualization is slower.  To enable: 

 

      viconVis.drawEdges = True 

 

      # By default the lcm update rate is throttled to 10 hz. 

      # To increase the update rate: 

 

      viconVis.subscriber.setSpeedLimit(100) 

 

      # Note, the constructor calls initSubscriber() automatically. 

      # To remove the lcm subscriber: 

 

      viconVis.removeSubscriber() 

 

    ''' 

 

    def __init__(self, channel): 

        self.channel = channel 

        self.subscriber = None 

        self.lastMessage = None 

        self.unitConversion = 0.001 

        self.models = {} 

        self.markerGeometry = None 

        self.drawEdges = False 

        self.initSubscriber() 

 

    def initSubscriber(self): 

        self.subscriber = lcmUtils.addSubscriber(self.channel, lcmvicon.vicon_t, self.onMessage) 

        self.subscriber.setSpeedLimit(10) 

 

    def removeSubscriber(self): 

        if not self.subscriber: 

            return 

        lcmUtils.removeSubscriber(self.subscriber) 

        self.subscriber = None 

 

    def getRootFolder(self): 

        folder = om.getOrCreateContainer(self.channel) 

        return folder 

 

    def removeRootFolder(self): 

        om.removeFromObjectModel(self.getRootFolder()) 

 

    def onMessage(self, msg): 

        self.lastMessage = msg 

        self.drawModels(msg) 

 

    def getMarkerGeometry(self): 

 

        if self.markerGeometry is None: 

            d = DebugData() 

            d.addSphere(np.zeros(3), radius=0.007, resolution=12) 

            self.markerGeometry = shallowCopy(d.getPolyData()) 

 

        return self.markerGeometry 

 

    def drawModels(self, msg): 

 

        tNow = time.time() 

 

        for model in msg.models: 

            self.drawModel(model) 

 

        elapsed = time.time() - tNow 

        #print 'rate:', 1/elapsed 

 

    def createMarkerObjects(self, numberOfMarkers, modelFolder, modelName, modelColor): 

 

        geom = self.getMarkerGeometry() 

 

        def makeMarker(i): 

            obj = vis.showPolyData(shallowCopy(geom), modelName + ' marker %d' % i, color=modelColor, parent=modelFolder) 

            vis.addChildFrame(obj) 

            return obj 

 

        return [makeMarker(i) for i in xrange(numberOfMarkers)] 

 

    def drawModel(self, model): 

 

        modelFolder = om.getOrCreateContainer(model.name, parentObj=self.getRootFolder()) 

        markerFolder = om.getOrCreateContainer('markers', parentObj=modelFolder) 

        modelName = model.name 

 

        markerObjects = markerFolder.children() 

 

        if len(markerObjects) != model.nummarkers: 

            for obj in markerObjects: 

                om.removeFromObjectModel(obj) 

 

            modelColor = vis.getRandomColor() 

            markerObjects = self.createMarkerObjects(model.nummarkers, markerFolder, modelName, modelColor) 

            self.models[modelName] = markerObjects 

 

        if len(markerObjects): 

            modelColor = markerObjects[0].getProperty('Color') 

 

        for i, marker in enumerate(model.markers): 

            xyz = np.array(marker.xyz)*self.unitConversion 

            markerFrame = vtk.vtkTransform() 

            markerFrame.Translate(xyz) 

            markerObjects[i].getChildFrame().copyFrame(markerFrame) 

 

        if self.drawEdges: 

            d = DebugData() 

            for m1 in model.markers: 

                xyz = np.array(m1.xyz)*self.unitConversion 

                for m2 in model.markers: 

                    xyz2 = np.array(m2.xyz)*self.unitConversion 

                    d.addLine(xyz, xyz2) 

            edges = shallowCopy(d.getPolyData()) 

            vis.updatePolyData(edges, modelName + ' edges', color=modelColor, parent=modelFolder) 

        else: 

            edgesObj = om.findObjectByName(modelName + ' edges') 

            om.removeFromObjectModel(edgesObj) 

 

        computeModelFrame = True 

        if computeModelFrame: 

            pos = np.array(model.segments[0].T)*self.unitConversion 

            rpy = np.array(model.segments[0].A) 

            modelFrame = transformUtils.frameFromPositionAndRPY(pos, np.degrees(rpy)) 

            vis.updateFrame(modelFrame, modelName + ' frame', parent=modelFolder, scale=0.1)