コード例 #1
0
    def paintEvent(self, event):
        self.calc_max_pixel_viewport()
        self.meter_viewport = qtc.QRectF(
            0,
            0,
            self.map_model.viewport[0],
            self.map_model.viewport[1])

        # Create transformation matrix to automatically rescale all field
        # coordinates (meters) to pixel coordinates and to flip the y-axis.
        transformation = qtg.QTransform()
        pixels_per_meter = (self.pixel_viewport.width() /
                            self.meter_viewport.width())
        transformation.scale(pixels_per_meter, -pixels_per_meter)

        # From here on, directly use the field coordinates (in meters).

        for layer_painter in self.layer_painter:
            painter = Painter(pixels_per_meter)
            painter.begin(self)
            painter.setTransform(transformation)
            # Translate coordinate system to field center.
            painter.translate(layer_painter.layer["settings"]["center_x"],
                              layer_painter.layer["settings"]["center_y"])

            layer_painter.paint(painter)
            painter.end()
コード例 #2
0
ファイル: ukf.py プロジェクト: SkyCloudShang/HULKsCodeRelease
 def drawHypothesis(self, painter: Painter, hypothesis):
     painter.setBrush(qtc.Qt.yellow)
     for sigmaPoint in hypothesis["sigmaPoints"]:
         painter.drawPose(painter.getPoseFromVector3(sigmaPoint), 0.15,
                          0.15)
     painter.setBrush(qtc.Qt.red)
     painter.drawPose(painter.getPoseFromVector3(hypothesis["stateMean"]),
                      0.2, 0.2,
                      "{:.2f}".format(hypothesis["meanEvalError"]))
コード例 #3
0
 def paint(self, painter: Painter):
     painter.transformByPose(self.transformation)
     painter.setPen(qtc.Qt.black, 0)
     painter.setBrush(qtg.QColor(
         self.layer["settings"]["position"]["color"]))
     if self.position is not None:
         painter.drawEllipse(
             qtc.QPointF(self.position[0], self.position[1]),
             self.layer["settings"]["position"]
                       ["circleDiameter"] / 2,
             self.layer["settings"]["position"]
                       ["circleDiameter"] / 2
         )
コード例 #4
0
 def paint(self, painter: Painter):
     painter.transformByPose(self.transformation)
     if self.obstacles is not None:
         # Obstacles
         painter.setBrush(qtc.Qt.NoBrush)
         for obstacle in self.obstacles:
             pen = self.penForObstacleType(obstacle["type"])
             painter.setPen(pen)
             painter.drawEllipse(
                 qtc.QPointF(obstacle["relativePosition"][0],
                             obstacle["relativePosition"][1]),
                 obstacle["radius"],
                 obstacle["radius"]
             )
コード例 #5
0
 def paint(self, painter: Painter):
     painter.transformByPose(self.transformation)
     painter.setPen(
         qtg.QColor(self.layer["settings"]["lines"]["lineColor"]),
         self.layer["settings"]["lines"]["lineWidth"])
     if self.lines is not None:
         for line in self.lines:
             painter.drawLineF(line[0][0], line[0][1], line[1][0],
                               line[1][1])
コード例 #6
0
ファイル: ukf.py プロジェクト: SkyCloudShang/HULKsCodeRelease
    def paint(self, painter: Painter):
        if not (self.poseHypotheses and self.publishedPose):
            return

        painter.setPen(qtg.QPen(qtc.Qt.black, 0))
        painter.setBrush(qtc.Qt.blue)

        painter.drawPose(self.publishedPose, 0.2, 0.2)

        for hypothesis in self.poseHypotheses:
            self.drawHypothesis(painter, hypothesis)
コード例 #7
0
 def paint(self, painter: Painter):
     painter.transformByPose(self.transformation)
     if self.filteredSonar is not None:
         sensors = [[
             -self.layer["settings"]["sonar"]["zAngle"],
             self.layer["settings"]["sonar"]["yOffset"] / 100,
             self.filteredSonar["filteredValues"][0],
             self.filteredSonar["valid"][0]
         ],
                    [
                        self.layer["settings"]["sonar"]["zAngle"],
                        -self.layer["settings"]["sonar"]["yOffset"] / 100,
                        self.filteredSonar["filteredValues"][1],
                        self.filteredSonar["valid"][1]
                    ]]
         openAngle = self.layer["settings"]["sonar"]["openingAngle"]
         color = qtg.QColor(self.layer["settings"]["sonar"]["color"])
         for [zAngle, yOffset, filtered, fValid] in sensors:
             if fValid:
                 painter.setPen(color, 0.02)
                 rect = qtc.QRectF(0.0, 0.0, filtered * 2, filtered * 2)
                 rect.moveCenter(qtc.QPointF(0.0, yOffset))
                 painter.drawArc(rect, (-(openAngle / 2) + zAngle) * 16,
                                 openAngle * 16)
             else:
                 painter.setPen(qtc.Qt.red, 0.02)
                 rect = qtc.QRectF(0.0, 0.0, 0.1, 0.1)
                 rect.moveCenter(qtc.QPointF(0.0, yOffset))
                 painter.drawPie(rect, (-(openAngle / 2) + zAngle) * 16,
                                 openAngle * 16)
     if self.rawSonar is not None:
         sensors = [[
             -self.layer["settings"]["sonar"]["zAngle"],
             self.layer["settings"]["sonar"]["yOffset"] / 100,
             self.rawSonar["SONAR_LEFT_SENSOR_0"],
             self.rawSonar["valid_SONAR_LEFT_SENSOR_0"]
         ],
                    [
                        self.layer["settings"]["sonar"]["zAngle"],
                        -self.layer["settings"]["sonar"]["yOffset"] / 100,
                        self.rawSonar["SONAR_RIGHT_SENSOR_0"],
                        self.rawSonar["valid_SONAR_RIGHT_SENSOR_0"]
                    ]]
         openAngle = self.layer["settings"]["sonar"]["openingAngle"]
         color = qtg.QColor(self.layer["settings"]["sonar"]["color"])
         for [zAngle, yOffset, raw, rValid] in sensors:
             if rValid:
                 painter.setPen(color, 0)
                 rect = qtc.QRectF(0.0, 0.0, raw * 2, raw * 2)
                 rect.moveCenter(qtc.QPointF(0.0, yOffset))
                 painter.drawArc(rect, (-(openAngle / 2) + zAngle) * 16,
                                 openAngle * 16)
             else:
                 painter.setPen(qtc.Qt.red, 0)
                 rect = qtc.QRectF(0.0, 0.0, 0.1, 0.1)
                 rect.moveCenter(qtc.QPointF(0.0, yOffset))
                 painter.drawPie(rect, (-(openAngle / 2) + zAngle) * 16,
                                 openAngle * 16)
コード例 #8
0
 def paint(self, painter: Painter):
     if self.probabilityMap:
         paintText = False
         if self.layer["settings"]["search"]["showNumericProbability"]:
             paintText = True
         elif self.layer["settings"]["search"]["showNumericAge"]:
             paintText = True
         for row in self.probabilityMap:
             for cell in row:
                 painter.setPen(qtc.Qt.black, 0.0)
                 # to help debugging
                 if (cell[0] < 0.0):
                     print("cell probability < 0 p:", cell[0])
                 if (cell[0] > 1.0):
                     print("cell probability > 1 p:", cell[0])
                 if (cell[1] < 0):
                     print("cell age < 0 age:", cell[1])
                 # Age in redscale as outline, saturated at 50 seconds
                 if self.layer["settings"]["search"]["showAge"]:
                     painter.setPen(
                         qtg.QColor(
                             round(255 * ((min(cell[1], 5000)) / 5000)), 0,
                             0, 255), 0.02)
                 # Probability in greyscale at center,
                 # scaled by fourth root (^0.25) for visibility
                 scaledProbability = 0
                 if self.layer["settings"]["search"]["showProbability"]:
                     scaledProbability = round(255 * (cell[0]**0.25))
                     scaledProbability = max(0, min(255, scaledProbability))
                 painter.setBrush(
                     qtg.QColor(scaledProbability, scaledProbability,
                                scaledProbability, 255))
                 painter.drawRect(
                     qtc.QRectF(cell[2] - 0.18, cell[3] - 0.18, 0.36, 0.36))
                 if paintText:
                     # Showing numeric values
                     painter.setPen(qtc.Qt.white, 0)
                     # Probability in %
                     if self.layer["settings"]["search"][
                             "showNumericProbability"]:
                         painter.drawText(
                             qtc.QPointF(cell[2] - 0.15, cell[3] + 0.03),
                             "%.2f" % (cell[0] * 100.0), 0.01)
                     # Age in seconds
                     if self.layer["settings"]["search"]["showNumericAge"]:
                         ageToShow = math.floor(cell[1] * 0.016667)
                         logOffset = 0
                         if ageToShow > 0:
                             logOffset = math.floor(math.log10(ageToShow))
                         painter.drawText(
                             qtc.QPointF(
                                 cell[2] - 0.025 - (0.05 * logOffset),
                                 cell[3] - 0.15), str(ageToShow), 0.01)
     # Show voronoi seeds: opaque when searching, transparent when not
     if self.voronoiSeeds and (self.explorerCount > 0):
         if self.layer["settings"]["search"]["showVoronoiSeeds"]:
             # To check if search is active,
             # we need walkTarget in absolute coordinates and
             # compare it to ballSearchPose.
             # This is a very ugly method,
             # but very useful information for testing.
             searching = 128  # not searching actively
             if self.ballSearchPose:
                 if self.walkTarget:
                     if self.pose:
                         walkTargetAbsolute = [[
                             self.pose[0][0] + (math.cos(self.pose[1]) *
                                                self.walkTarget[0][0]) -
                             (math.sin(self.pose[1]) *
                              self.walkTarget[0][1]),
                             self.pose[0][1] + (math.sin(self.pose[1]) *
                                                self.walkTarget[0][0]) +
                             (math.cos(self.pose[1]) *
                              self.walkTarget[0][1])
                         ], (self.pose[1] + self.walkTarget[1]) %
                                               (math.pi * 2.0)]
                         if walkTargetAbsolute[1] > math.pi:
                             walkTargetAbsolute[1] -= math.pi * 2.0
                         elif walkTargetAbsolute[1] < -math.pi:
                             walkTargetAbsolute[1] += math.pi * 2.0
                         # For the comparison a high threshold is being
                         # used to avoid flickering,
                         # as data might be somewhat out of sync
                         if abs(walkTargetAbsolute[1] -
                                self.ballSearchPose[1]) < 0.1:
                             if abs(walkTargetAbsolute[0][0] -
                                    self.ballSearchPose[0][0]) < 0.1:
                                 if abs(walkTargetAbsolute[0][1] -
                                        self.ballSearchPose[0][1]) < 0.1:
                                     searching = 255  # actively searching
             # paint voronoi seeds
             painter.setPen(qtc.Qt.black, 0)
             painter.setBrush(qtg.QColor(255, 255, 0, searching))
             for seed in self.voronoiSeeds:
                 painter.drawEllipse(qtc.QPointF(seed[0], seed[1]), 0.15,
                                     0.15)
コード例 #9
0
    def paint(self, painter: Painter):
        pen = qtg.QPen(qtc.Qt.white)
        pen.setWidthF(self.field_settings["lineWidth"])

        # This creates sharp edges where lines join instead of rounded corners
        pen.setJoinStyle(qtc.Qt.MiterJoin)

        # green background
        painter.setBrush(qtc.Qt.darkGreen)
        painter.setPen(qtc.Qt.NoPen)
        painter.drawRectF(
            -self.field_settings["length"] / 2 -
            self.field_settings["borderStripWidth"],
            -self.field_settings["width"] / 2 -
            self.field_settings["borderStripWidth"],
            self.field_settings["length"] +
            self.field_settings["borderStripWidth"] * 2,
            self.field_settings["width"] +
            self.field_settings["borderStripWidth"] * 2)

        # white pen
        painter.setPen(pen)
        painter.setBrush(qtc.Qt.NoBrush)

        # field border
        painter.drawRectF(-self.field_settings["length"] / 2,
                          -self.field_settings["width"] / 2,
                          self.field_settings["length"],
                          self.field_settings["width"])

        # penalty area left
        painter.drawRectF(-self.field_settings["length"] / 2,
                          -self.field_settings["penaltyAreaWidth"] / 2,
                          self.field_settings["penaltyAreaLength"],
                          self.field_settings["penaltyAreaWidth"])

        # penalty area right
        painter.drawRectF(self.field_settings["length"] / 2,
                          -self.field_settings["penaltyAreaWidth"] / 2,
                          -self.field_settings["penaltyAreaLength"],
                          self.field_settings["penaltyAreaWidth"])

        # center line
        painter.drawLineF(0, -self.field_settings["width"] / 2, 0,
                          self.field_settings["width"] / 2)

        # center circle
        painter.drawEllipse(qtc.QPointF(0, 0),
                            self.field_settings["centerCircleDiameter"] / 2,
                            self.field_settings["centerCircleDiameter"] / 2)

        # penalty mark left
        painter.setBrush(qtc.Qt.white)
        painter.drawEllipse(
            qtc.QPointF(
                -self.field_settings["length"] / 2 +
                self.field_settings["penaltyMarkerDistance"], 0),
            self.field_settings["penaltyMarkerSize"] / 2,
            self.field_settings["penaltyMarkerSize"] / 2)

        # penalty mark right
        painter.drawEllipse(
            qtc.QPointF(
                self.field_settings["length"] / 2 -
                self.field_settings["penaltyMarkerDistance"], 0),
            self.field_settings["penaltyMarkerSize"] / 2,
            self.field_settings["penaltyMarkerSize"] / 2)

        # kick off pointEllipse
        painter.drawEllipse(qtc.QPointF(0, 0),
                            self.field_settings["penaltyMarkerSize"] / 2,
                            self.field_settings["penaltyMarkerSize"] / 2)
コード例 #10
0
 def paint(self, painter: Painter):
     if self.teamPlayers is not None:
         # Draw for each team player
         for robot in self.teamPlayers:
             color = qtg.QColor(
                 self.layer["settings"]["teamPlayers"][Roles(
                     robot["currentlyPerformingRole"]).name + "Color"])
             # fov
             if self.layer["settings"]["teamPlayers"]["showFOV"]:
                 # fov
                 painter.setBrush(qtc.Qt.NoBrush)
                 painter.setPen(qtg.QPen(qtc.Qt.yellow, 0))
                 painter.drawFOV(robot["pose"],
                                 robot["headYaw"],
                                 self.layer["settings"]["teamPlayers"]
                                 ["maxDistance"],
                                 self.layer["settings"]["teamPlayers"]
                                 ["cameraOpeningAngle"])
             if self.layer["settings"]["teamPlayers"]["showTarget"]:
                 # Walking-target
                 painter.setBrush(qtc.Qt.NoBrush)
                 painter.setPen(color, 0)
                 painter.drawTarget(robot["walkingTo"],
                                    self.layer["settings"]["teamPlayers"]
                                    ["targetCircleDiameter"])
                 # Dotted line
                 dotted_pen = qtg.QPen(qtc.Qt.yellow,
                                       0,
                                       qtc.Qt.DashDotLine)
                 painter.setPen(dotted_pen)
                 painter.drawLineF(robot["pose"][0][0],
                                   robot["pose"][0][1],
                                   robot["walkingTo"][0][0],
                                   robot["walkingTo"][0][1])
             if self.layer["settings"]["teamPlayers"]["showPlayer"]:
                 # Pose
                 painter.setBrush(color)
                 painter.setPen(qtg.QPen(qtc.Qt.black, 0))
                 painter.drawPose(robot["pose"],
                                 self.layer["settings"]["teamPlayers"]
                                 ["poseCircleDiameter"],
                                 self.layer["settings"]["teamPlayers"]
                                 ["poseCircleDiameter"])
                 # PlayerNumber
                 painter.setPen(
                     qtg.QPen(qtg.QColor(ui_utils.ideal_text_color(color)),
                              0))
                 painter.drawText(qtc.QPointF(robot["pose"][0][0] -
                                          (self.layer["settings"]
                                           ["teamPlayers"]
                                           ["poseCircleDiameter"] * 0.2),
                                          robot["pose"][0][1] -
                                          (self.layer["settings"]
                                           ["teamPlayers"]
                                           ["poseCircleDiameter"] * 0.25)),
                              str(robot["playerNumber"]),
                              self.layer["settings"]
                              ["teamPlayers"]["poseCircleDiameter"] * 0.61)
             if self.layer["settings"]["teamPlayers"]["showSearchPosition"]:
                 # Show Search Position
                 painter.setBrush(color)
                 painter.setPen(qtg.QPen(qtc.Qt.black, 0))
                 painter.drawEllipse(
                     qtc.QPointF(
                         robot["currentSearchPosition"][0],
                         robot["currentSearchPosition"][1]),
                     self.layer["settings"]["teamPlayers"]["searchPositionDiameter"] / 2,
                     self.layer["settings"]["teamPlayers"]["searchPositionDiameter"] / 2)
コード例 #11
0
    def paint(self, painter: Painter):
        painter.setPen(qtg.QPen(qtc.Qt.black, 0))
        painter.drawPose([self.teamBallPosition, 0.0], 0, 0, str(self.rateKick), 0.15, [0.1, 0.1])

        painter.setBrush(qtg.QColor("#000000"))
        if self.firstShadowPoint is not None and self.secondShadowPoint is not None:
            painter.drawPose([self.firstShadowPoint, 0.0], 0.1, 0, "first", 0.1)
            painter.drawPose([self.secondShadowPoint, 0.0], 0.1, 0, "second", 0.1)
        if self.firstShadowPointAfter is not None and self.secondShadowPointAfter is not None:
            painter.drawPose([self.firstShadowPointAfter, 0.0], 0.1, 0, "firstAfter", 0.1)
            painter.drawPose([self.secondShadowPointAfter, 0.0], 0.1, 0, "secondAfter", 0.1)

        for index, chunk in enumerate(self.kickRatingChunks):
            if chunk:
                color = qtg.QColor("#00ff00")
            else:
                color = qtg.QColor("#ff0000")
            painter.setBrush(color)
            if self.hitPoints is not None:
                painter.drawPose([self.hitPoints[index], 0.0], 0.1, 0, "{0:.2f}".format(self.kickRatingChunkWeights[index]), 0.1, [0.1, 0])
コード例 #12
0
 def paint(self, painter: Painter):
     painter.transformByPose(self.transformation)
     if self.motionPlan is not None:
         # Walking-target
         painter.setBrush(qtc.Qt.NoBrush)
         painter.setPen(qtg.QColor(self.layer["settings"
                                              ]["motionPlan"
                                                ]["targetColor"]),
                        0)
         painter.drawTarget(self.motionPlan["walkTarget"],
                            self.layer["settings"
                                       ]["motionPlan"
                                         ]["targetCircleDiameter"])
         # Dotted line to walking-target
         dotted_pen = qtg.QPen(qtc.Qt.yellow,
                               0,
                               qtc.Qt.DashDotLine)
         painter.setPen(dotted_pen)
         painter.drawLineF(0.0,
                           0.0,
                           self.motionPlan["walkTarget"][0][0],
                           self.motionPlan["walkTarget"][0][1])
         # Translation
         painter.setPen(qtg.QColor("#ff0000"), 0)
         painter.drawLineF(0.0,
                           0.0,
                           self.motionPlan["translation"][0],
                           self.motionPlan["translation"][1])
コード例 #13
0
 def paint(self, painter: Painter):
     # Draw background
     bgColor = qtg.QColor(self.settings["backgroundColor"])
     bgColor.setAlpha(self.settings["backgroundAlpha"])
     painter.setBrush(bgColor)
     painter.setPen(qtc.Qt.NoPen)
     painter.drawRectF(-self.settings["width"] / 2,
                       -self.settings["height"] / 2, self.settings["width"],
                       self.settings["height"])
     # Draw Axis
     lineColor = qtg.QColor(self.settings["lineColor"])
     pen = qtg.QPen(lineColor)
     pen.setWidthF(self.settings["lineWidth"])
     painter.setPen(pen)
     painter.setBrush(qtc.Qt.NoBrush)
     painter.drawLineF(0, -self.settings["height"] / 2, 0,
                       self.settings["height"] / 2)
     painter.drawLineF(-self.settings["width"] / 2, 0,
                       self.settings["width"] / 2, 0)
     if self.settings["polar"]:
         # Draw Circles
         r = 0.0
         while (r + self.settings["radialStepSize"] <= max(
                 self.settings["height"] / 2, self.settings["width"] / 2)):
             r += self.settings["radialStepSize"]
             painter.drawEllipse(qtc.QPointF(0, 0), r, r)
         # Draw Angles
         l = max(self.settings["height"] / 2, self.settings["width"] / 2)
         deg = 90.0
         while (deg + self.settings["polarAngleStepSize"] < 270.0):
             deg += self.settings["polarAngleStepSize"]
             v = [
                 math.cos(math.radians(deg)) * l,
                 math.sin(math.radians(deg)) * l
             ]
             painter.drawLineF(0, 0, v[0], v[1])
             painter.drawLineF(0, 0, -v[0], v[1])
     else:
         # draw grid
         # horizontal lines
         offset = 0.0
         while (offset + self.settings["stepSizeY"] <=
                self.settings["height"] / 2):
             offset += self.settings["stepSizeY"]
             painter.drawLineF(-self.settings["width"] / 2, offset,
                               self.settings["width"] / 2, offset)
             painter.drawLineF(-self.settings["width"] / 2, -offset,
                               self.settings["width"] / 2, -offset)
         # vertical lines
         offset = 0.0
         while (offset + self.settings["stepSizeX"] <=
                self.settings["width"] / 2):
             offset += self.settings["stepSizeX"]
             painter.drawLineF(offset, -self.settings["height"] / 2, offset,
                               self.settings["height"] / 2)
             painter.drawLineF(-offset, -self.settings["height"] / 2,
                               -offset, self.settings["height"] / 2)