From 6a28fb4adab689f0c0a8d454152b2f39006f0944 Mon Sep 17 00:00:00 2001 From: James <91348155+FrogAi@users.noreply.github.com> Date: Mon, 1 Dec 2025 12:00:00 -0700 Subject: [PATCH] Display the model's stopping point --- frogpilot/assets/other_images/stop_sign.png | Bin 0 -> 19247 bytes .../qt/onroad/frogpilot_annotated_camera.cc | 35 ++++++++++++++++++ .../ui/qt/onroad/frogpilot_annotated_camera.h | 4 ++ 3 files changed, 39 insertions(+) create mode 100644 frogpilot/assets/other_images/stop_sign.png diff --git a/frogpilot/assets/other_images/stop_sign.png b/frogpilot/assets/other_images/stop_sign.png new file mode 100644 index 0000000000000000000000000000000000000000..159873301abd79fda4c648b9036bac0398c9782f GIT binary patch literal 19247 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 literal 0 HcmV?d00001 diff --git a/frogpilot/ui/qt/onroad/frogpilot_annotated_camera.cc b/frogpilot/ui/qt/onroad/frogpilot_annotated_camera.cc index 4014a3103..80c3f97d7 100644 --- a/frogpilot/ui/qt/onroad/frogpilot_annotated_camera.cc +++ b/frogpilot/ui/qt/onroad/frogpilot_annotated_camera.cc @@ -7,6 +7,7 @@ FrogPilotAnnotatedCameraWidget::FrogPilotAnnotatedCameraWidget(QWidget *parent) curveSpeedIcon = loadPixmap("../../frogpilot/assets/other_images/curve_speed.png", {btn_size, btn_size}); curveSpeedIconFlipped = curveSpeedIcon.transformed(QTransform().scale(-1, 1)); + stopSignImg = loadPixmap("../../frogpilot/assets/other_images/stop_sign.png", {btn_size, btn_size}); loadGif("../../frogpilot/assets/other_images/curve_icon.gif", cemCurveIcon, QSize(widget_size, widget_size), this); loadGif("../../frogpilot/assets/other_images/lead_icon.gif", cemLeadIcon, QSize(widget_size, widget_size), this); @@ -148,8 +149,10 @@ void FrogPilotAnnotatedCameraWidget::updateState(const UIState &s, const FrogPil cscSpeed = frogpilotPlan.getCscSpeed(); cscTraining = frogpilotPlan.getCscTraining(); experimentalMode = selfdriveState.getExperimentalMode(); + redLight = frogpilotPlan.getRedLight(); roadCurvature = frogpilotPlan.getRoadCurvature(); roadName = QString::fromStdString(params_memory.get("RoadName")); + stoppingDistance = modelV2.getPosition().getX().size() > 33 - 1 ? modelV2.getPosition().getX()[33 - 1] : 0.0; hideBottomIcons = selfdriveState.getAlertSize() != cereal::SelfdriveState::AlertSize::NONE; hideBottomIcons |= frogpilotSelfdriveState.getAlertSize() != cereal::FrogPilotSelfdriveState::AlertSize::NONE; @@ -225,6 +228,10 @@ void FrogPilotAnnotatedCameraWidget::paintFrogPilotWidgets(QPainter &p, UIState paintStandstillTimer(p); } + if (track_vertices.length() >= 1 && redLight && frogpilot_toggles.value("show_stopping_point").toBool()) { + paintStoppingPoint(p); + } + if ((blinkerLeft || blinkerRight) && signalStyle != "None" && (standstillDuration == 0 || signalStyle != "static")) { paintTurnSignals(p); } @@ -512,6 +519,34 @@ void FrogPilotAnnotatedCameraWidget::paintStandstillTimer(QPainter &p) { p.restore(); } +void FrogPilotAnnotatedCameraWidget::paintStoppingPoint(QPainter &p) { + p.save(); + + QPointF centerPoint = (track_vertices.first() + track_vertices.last()) / 2.0f; + QPointF stopSignPosition = centerPoint - QPointF(stopSignImg.width() / 2.0f, stopSignImg.height()); + p.drawPixmap(stopSignPosition, stopSignImg); + + if (frogpilot_toggles.value("show_stopping_point_metrics").toBool()) { + float distance = stoppingDistance * distanceConversion; + QString distanceText = QString::number(std::nearbyint(distance)) + leadDistanceUnit; + + QFont font = InterFont(45, QFont::DemiBold); + QFontMetrics fm(font); + + QPointF textPosition(centerPoint.x() - fm.horizontalAdvance(distanceText) / 2.0f, centerPoint.y() - stopSignImg.height() - fm.ascent()); + + QPainterPath path; + path.addText(textPosition, font, distanceText); + p.strokePath(path, QPen(Qt::black, 3, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin)); + + p.setFont(font); + p.setPen(whiteColor()); + p.drawText(textPosition, distanceText); + } + + p.restore(); +} + void FrogPilotAnnotatedCameraWidget::paintTurnSignals(QPainter &p) { int frameIndex = qBound(0, animationFrameIndex, totalFrames - 1); diff --git a/frogpilot/ui/qt/onroad/frogpilot_annotated_camera.h b/frogpilot/ui/qt/onroad/frogpilot_annotated_camera.h index 0eac28b0d..ac89f8915 100644 --- a/frogpilot/ui/qt/onroad/frogpilot_annotated_camera.h +++ b/frogpilot/ui/qt/onroad/frogpilot_annotated_camera.h @@ -52,6 +52,7 @@ private: void paintCurveSpeedControlTraining(QPainter &p); void paintRoadName(QPainter &p); void paintStandstillTimer(QPainter &p); + void paintStoppingPoint(QPainter &p); void paintTurnSignals(QPainter &p); void updateSignals(); @@ -62,6 +63,7 @@ private: bool cscControllingSpeed; bool cscTraining; bool experimentalMode; + bool redLight; int animationFrameIndex; int frogHopCount; @@ -77,6 +79,7 @@ private: float setSpeed; float speedConversion; float speedConversionMetrics; + float stoppingDistance; Params params; Params params_memory{"", true}; @@ -89,6 +92,7 @@ private: QPixmap curveSpeedIcon; QPixmap curveSpeedIconFlipped; + QPixmap stopSignImg; QPoint cemStatusPosition; QPoint compassPosition;