@@ -7,25 +7,30 @@ import (
77 "github.com/RoboCup-SSL/ssl-simulation-controller/internal/vision"
88 "github.com/golang/protobuf/proto"
99 "log"
10+ "math"
1011 "net"
12+ "sync"
1113)
1214
1315type SimulationController struct {
1416 visionServer * sslnet.MulticastServer
1517 refereeServer * sslnet.MulticastServer
1618 trackerServer * sslnet.MulticastServer
1719 simControlClient * sslnet.UdpClient
20+ mutex sync.Mutex
1821
19- simControlPort string
22+ simControlPort string
23+ simulatorRestarted bool
2024
21- lastTrackedFrame * tracker.TrackerWrapperPacket
22- lastRefereeMsg * referee.Referee
23- fieldSize * vision.SSL_GeometryFieldSize
25+ lastTrackedFrame * tracker.TrackerWrapperPacket
26+ lastRefereeMsg * referee.Referee
27+ fieldSize * vision.SSL_GeometryFieldSize
28+ lastVisionFrameIds map [uint32 ]uint32
2429
25- ballReplacer BallReplacer
26- robotCountMaintainer RobotCountMaintainer
27- robotSpecsSetter RobotSpecSetter
28- geometrySetter GeometrySetter
30+ ballReplacer * BallReplacer
31+ robotCountMaintainer * RobotCountMaintainer
32+ robotSpecsSetter * RobotSpecSetter
33+ geometrySetter * GeometrySetter
2934}
3035
3136func NewSimulationController (visionAddress , refereeAddress , trackerAddress , simControlPort , robotSpecConfig string ) (c * SimulationController ) {
@@ -34,12 +39,18 @@ func NewSimulationController(visionAddress, refereeAddress, trackerAddress, simC
3439 c .refereeServer = sslnet .NewMulticastServer (refereeAddress , c .onNewRefereeData )
3540 c .trackerServer = sslnet .NewMulticastServer (trackerAddress , c .onNewTrackerData )
3641 c .simControlPort = simControlPort
42+ c .simulatorRestarted = true
43+ c .lastVisionFrameIds = map [uint32 ]uint32 {}
44+
45+ c .ballReplacer = NewBallReplacer (c )
46+ c .robotCountMaintainer = NewRobotCountMaintainer (c )
47+ c .robotSpecsSetter = NewRobotSpecSetter (c , robotSpecConfig )
48+ c .geometrySetter = NewGeometrySetter (c )
49+
3750 c .ballReplacer .c = c
3851 c .robotCountMaintainer .c = c
3952 c .robotSpecsSetter .c = c
40- c .robotSpecsSetter .LoadRobotSpecs (robotSpecConfig )
4153 c .geometrySetter .c = c
42- c .geometrySetter .LoadGeometry ()
4354 return
4455}
4556
@@ -51,7 +62,24 @@ func (c *SimulationController) onNewVisionData(data []byte, remoteAddr *net.UDPA
5162 }
5263
5364 if wrapper .Geometry != nil && wrapper .Geometry .Field != nil {
65+ c .mutex .Lock ()
5466 c .fieldSize = wrapper .Geometry .Field
67+ c .mutex .Unlock ()
68+ }
69+
70+ if wrapper .Detection != nil {
71+ c .mutex .Lock ()
72+ frameId := * wrapper .Detection .FrameNumber
73+ lastFrameId , lastFrameIdPresent := c .lastVisionFrameIds [* wrapper .Detection .CameraId ]
74+ if lastFrameIdPresent && math .Abs (float64 (frameId - lastFrameId )) > 100 {
75+ // large frame id change: Simulator probably restarted
76+ c .simulatorRestarted = true
77+ c .lastVisionFrameIds = map [uint32 ]uint32 {}
78+ log .Printf ("Simulator restart detected due to high frame id change (%d -> %d)" ,
79+ lastFrameId , frameId )
80+ }
81+ c .lastVisionFrameIds [* wrapper .Detection .CameraId ] = frameId
82+ c .mutex .Unlock ()
5583 }
5684
5785 if c .simControlClient == nil {
@@ -68,7 +96,9 @@ func (c *SimulationController) onNewRefereeData(data []byte, _ *net.UDPAddr) {
6896 log .Println ("Could not unmarshal referee packet" , err )
6997 return
7098 }
99+ c .mutex .Lock ()
71100 c .lastRefereeMsg = refereeMsg
101+ c .mutex .Unlock ()
72102}
73103
74104func (c * SimulationController ) onNewTrackerData (data []byte , _ * net.UDPAddr ) {
@@ -81,8 +111,10 @@ func (c *SimulationController) onNewTrackerData(data []byte, _ *net.UDPAddr) {
81111 * c .lastTrackedFrame .Uuid == * frame .Uuid || // frame from same origin
82112 // new frame is significantly newer than last frame
83113 (* frame .TrackedFrame .Timestamp - * c .lastTrackedFrame .TrackedFrame .Timestamp ) > 5 {
114+ c .mutex .Lock ()
84115 c .lastTrackedFrame = frame
85116 c .handle ()
117+ c .mutex .Unlock ()
86118 }
87119}
88120
@@ -105,6 +137,14 @@ func (c *SimulationController) handle() {
105137 return
106138 }
107139
140+ if c .simulatorRestarted {
141+ c .ballReplacer .Reset ()
142+ c .robotCountMaintainer .Reset ()
143+ c .robotSpecsSetter .Reset ()
144+ c .geometrySetter .Reset ()
145+ c .simulatorRestarted = false
146+ }
147+
108148 c .ballReplacer .handleReplaceBall ()
109149 c .robotCountMaintainer .handleRobotCount ()
110150 c .robotSpecsSetter .handleRobotSpecs ()
0 commit comments