From fb2d868eb936d471817ca1f01738587719b92046 Mon Sep 17 00:00:00 2001 From: gabduf Date: Thu, 30 Apr 2026 15:17:13 -0400 Subject: [PATCH 1/2] removing map cleaner package mounting --- sim_ws/docker-compose.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/sim_ws/docker-compose.yml b/sim_ws/docker-compose.yml index e1823ba..5aba98e 100644 --- a/sim_ws/docker-compose.yml +++ b/sim_ws/docker-compose.yml @@ -10,7 +10,6 @@ services: - ../sim_ws/src/scripts:/sim_ws/src/scripts - ../sim_ws/src/visualization:/sim_ws/src/visualization - ../sim_ws/src/arcus_gui:/sim_ws/src/arcus_gui - - ../sim_ws/src/map_cleaner:/sim_ws/src/map_cleaner - ../../arcus:/sim_ws/src/arcus - /tmp/.X11-unix:/tmp/.X11-unix:rw environment: From eed62e67d5c69c0fcdc7c9248c75af2487ab5ce0 Mon Sep 17 00:00:00 2001 From: gabduf Date: Sun, 10 May 2026 12:14:53 -0400 Subject: [PATCH 2/2] gap follow + map helpers from gui --- sim_ws/src/arcus_gui/CMakeLists.txt | 1 + sim_ws/src/arcus_gui/src/MainWindow.cpp | 4 +- sim_ws/src/arcus_gui/src/MainWindow.hpp | 3 +- .../src/QWidget/QGapFollow/QGapFollow.cpp | 18 ++++++ .../src/QWidget/QGapFollow/QGapFollow.hpp | 57 ++++++++++++++++++ .../QMapRacelineHelpers.cpp | 8 +-- .../QMapRacelineHelpers.hpp | 8 +-- sim_ws/src/arcus_gui/ui/ui/GapFollowWidget.ui | 58 +++++++++++++++++++ .../src/arcus_gui/ui/ui/MapRacelineHelpers.ui | 2 +- .../map_preparation/utils/exportAlgos.sh | 2 +- .../map_preparation/utils/exportSpeedZones.sh | 2 +- 11 files changed, 145 insertions(+), 18 deletions(-) create mode 100644 sim_ws/src/arcus_gui/src/QWidget/QGapFollow/QGapFollow.cpp create mode 100644 sim_ws/src/arcus_gui/src/QWidget/QGapFollow/QGapFollow.hpp create mode 100644 sim_ws/src/arcus_gui/ui/ui/GapFollowWidget.ui diff --git a/sim_ws/src/arcus_gui/CMakeLists.txt b/sim_ws/src/arcus_gui/CMakeLists.txt index 1086d3b..457b755 100644 --- a/sim_ws/src/arcus_gui/CMakeLists.txt +++ b/sim_ws/src/arcus_gui/CMakeLists.txt @@ -43,6 +43,7 @@ add_executable(main_gui src/gui.cpp src/QWidget/QLocalNodes/QLocalNodes.cpp src/QWidget/QMapRacelineHelpers/QMapRacelineHelpers.cpp src/QWidget/QPurePursuitWidget/QPurePursuit.cpp + src/QWidget/QGapFollow/QGapFollow.cpp src/QWidget/QArcusMaster/QSafetyWidget/QSafetyWidget.cpp src/Global/Helper/QTopicSelector/QTopicSelector.cpp src/Global/Helper/QProcessHandler/QProcessHandler.cpp diff --git a/sim_ws/src/arcus_gui/src/MainWindow.cpp b/sim_ws/src/arcus_gui/src/MainWindow.cpp index d3fe07f..b1f2e5c 100644 --- a/sim_ws/src/arcus_gui/src/MainWindow.cpp +++ b/sim_ws/src/arcus_gui/src/MainWindow.cpp @@ -7,7 +7,7 @@ MainWindow::MainWindow(std::shared_ptr guiNode_): _localNodesWidget(guiNode_, this), _mapRacelineHelpers(guiNode_, this), _purePursuitWidget(guiNode_, this), - _exampleWidget5(this) + _gapFollowWidget(guiNode_, this) { this->setCentralWidget(&_centralWidget); @@ -18,7 +18,7 @@ MainWindow::MainWindow(std::shared_ptr guiNode_): _gridLayout.addWidget(&_localNodesWidget, 0, 2); _gridLayout.addWidget(&_mapRacelineHelpers, 1, 0); _gridLayout.addWidget(&_purePursuitWidget, 1, 1); - _gridLayout.addWidget(&_exampleWidget5, 1, 2); + _gridLayout.addWidget(&_gapFollowWidget, 1, 2); _gridLayout.setColumnStretch(0, 1); _gridLayout.setColumnStretch(1, 1); diff --git a/sim_ws/src/arcus_gui/src/MainWindow.hpp b/sim_ws/src/arcus_gui/src/MainWindow.hpp index aa6b1be..b3efba5 100644 --- a/sim_ws/src/arcus_gui/src/MainWindow.hpp +++ b/sim_ws/src/arcus_gui/src/MainWindow.hpp @@ -16,6 +16,7 @@ #include "QWidget/QArcusMaster/QArcusMaster.hpp" #include "QWidget/QLocalNodes/QLocalNodes.hpp" #include "QWidget/QPurePursuitWidget/QPurePursuit.hpp" +#include "QWidget/QGapFollow/QGapFollow.hpp" #include "QWidget/QMapRacelineHelpers/QMapRacelineHelpers.hpp" #include "rclcpp/rclcpp.hpp" @@ -37,7 +38,7 @@ class MainWindow : public QMainWindow QLocalNodesWidget _localNodesWidget; QMapRacelineHelpers _mapRacelineHelpers; QPurePursuitWidget _purePursuitWidget; - QWidget _exampleWidget5; + QGapFollowWidget _gapFollowWidget; }; #endif // MAIN_WINDOWS_HPP \ No newline at end of file diff --git a/sim_ws/src/arcus_gui/src/QWidget/QGapFollow/QGapFollow.cpp b/sim_ws/src/arcus_gui/src/QWidget/QGapFollow/QGapFollow.cpp new file mode 100644 index 0000000..8522115 --- /dev/null +++ b/sim_ws/src/arcus_gui/src/QWidget/QGapFollow/QGapFollow.cpp @@ -0,0 +1,18 @@ +#include "QGapFollow.hpp" +#include + +QGapFollowWidget::QGapFollowWidget(std::shared_ptr node_, QWidget* parent_): + QWidget(parent_), + _node(node_), + _maxSpeedSlider(parent_, node_, MAX_SPEED_PARAM_NAME, GAP_FOLLOW_NODE_NAME, MAX_SPEED_MIN, MAX_SPEED_MAX, MAX_SPEED_DEFAULT, SPEED_PRECISION), + _distanceSpeedGainSlider(parent_, node_, DISTANCE_SPEED_GAIN_PARAM_NAME, GAP_FOLLOW_NODE_NAME, DISTANCE_SPEED_GAIN_MIN, DISTANCE_SPEED_GAIN_MAX, DISTANCE_SPEED_GAIN_DEFAULT, DISTANCE_SPEED_GAIN_PRECISION), + _bubbleRadiusSlider(parent_, node_, BUBBLE_RADIUS_PARAM_NAME, GAP_FOLLOW_NODE_NAME, BUBBLE_RADIUS_MIN, BUBBLE_RADIUS_MAX, BUBBLE_RADIUS_DEFAULT, BUBBLE_RADIUS_PRECISION), + _staticFrictionCoeffSlider(parent_, node_, STATIC_FRICTION_COEFF, GAP_FOLLOW_NODE_NAME, STATIC_FRICTION_COEFF_MIN, STATIC_FRICTION_COEFF_MAX, STATIC_FRICTION_COEFF_DEFAULT, STATIC_FRICTION_COEFF_PRECISION) +{ + _ui.setupUi(this); + + _ui.sliderLayout->addWidget(&_maxSpeedSlider); + _ui.sliderLayout->addWidget(&_distanceSpeedGainSlider); + _ui.sliderLayout->addWidget(&_bubbleRadiusSlider); + _ui.sliderLayout->addWidget(&_staticFrictionCoeffSlider); +} \ No newline at end of file diff --git a/sim_ws/src/arcus_gui/src/QWidget/QGapFollow/QGapFollow.hpp b/sim_ws/src/arcus_gui/src/QWidget/QGapFollow/QGapFollow.hpp new file mode 100644 index 0000000..f5c8ba0 --- /dev/null +++ b/sim_ws/src/arcus_gui/src/QWidget/QGapFollow/QGapFollow.hpp @@ -0,0 +1,57 @@ +#ifndef Q_GAP_FOLLOW_WIDGET_HPP +#define Q_GAP_FOLLOW_WIDGET_HPP + +#include "UI_GapFollowWidget.h" +#include "Global/Helper/QParamSlider/QParamSlider.hpp" + +#include +#include + +class QGapFollowWidget : public QWidget +{ + Q_OBJECT + + static constexpr const char* GAP_FOLLOW_NODE_NAME = "/arcus/gap_follow"; + static constexpr const char* MAX_SPEED_PARAM_NAME = "max_speed"; + static constexpr const char* DISTANCE_SPEED_GAIN_PARAM_NAME = "speed_distance_factor"; + static constexpr const char* BUBBLE_RADIUS_PARAM_NAME = "bubble_radius"; + static constexpr const char* STATIC_FRICTION_COEFF = "static_friction_coeff"; + + static constexpr float MAX_SPEED_DEFAULT = 5; + static constexpr float DISTANCE_SPEED_GAIN_DEFAULT = 1.2; + static constexpr float BUBBLE_RADIUS_DEFAULT = 0.3; + static constexpr float STATIC_FRICTION_COEFF_DEFAULT = 0.7; + + static constexpr float MAX_SPEED_MIN = 0.0; + static constexpr float DISTANCE_SPEED_GAIN_MIN = 0.0; + static constexpr float BUBBLE_RADIUS_MIN = 0.0; + static constexpr float STATIC_FRICTION_COEFF_MIN = 0.0; + + static constexpr float MAX_SPEED_MAX = 20.0; + static constexpr float DISTANCE_SPEED_GAIN_MAX = 10.0; + static constexpr float BUBBLE_RADIUS_MAX = 1.0; + static constexpr float STATIC_FRICTION_COEFF_MAX = 5.0; + + static constexpr float SPEED_PRECISION = 0.05; + static constexpr float DISTANCE_SPEED_GAIN_PRECISION = 0.05; + static constexpr float BUBBLE_RADIUS_PRECISION = 0.05; + static constexpr float STATIC_FRICTION_COEFF_PRECISION = 0.05; + + + public: + QGapFollowWidget(std::shared_ptr node_, QWidget* parent_); + + private: + void setupUI(void); + + std::shared_ptr _node; + + QParamSlider _maxSpeedSlider; + QParamSlider _distanceSpeedGainSlider; + QParamSlider _bubbleRadiusSlider; + QParamSlider _staticFrictionCoeffSlider; + + Ui::gapFollowWidget _ui; +}; + +#endif // Q_GAP_FOLLOW_WIDGET_HPP diff --git a/sim_ws/src/arcus_gui/src/QWidget/QMapRacelineHelpers/QMapRacelineHelpers.cpp b/sim_ws/src/arcus_gui/src/QWidget/QMapRacelineHelpers/QMapRacelineHelpers.cpp index 9c6360e..81c4da6 100644 --- a/sim_ws/src/arcus_gui/src/QWidget/QMapRacelineHelpers/QMapRacelineHelpers.cpp +++ b/sim_ws/src/arcus_gui/src/QWidget/QMapRacelineHelpers/QMapRacelineHelpers.cpp @@ -3,12 +3,8 @@ QMapRacelineHelpers::QMapRacelineHelpers(std::shared_ptr node_, QWidget* parent_): QWidget(parent_), _node(node_), - _mapCarToLocalProcess(this, "Map (Car to Local)", MAP_CAR_TO_LOCAL_CMD, true), - _racelineScriptProcess(this, "Raceline Script", RACELINE_SCRIPT_CMD, true), - _waypointsLocalToCarProcess(this, "Waypoints (Local to Car)", WAYPOINTS_LOCAL_TO_CAR_CMD, true) + _racelineHelper(this, "Raceline Helpers", RACELINE_HELPER_CMD, true) { _ui.setupUi(this); - _ui.buttonsLayout->addWidget(&_mapCarToLocalProcess); - _ui.buttonsLayout->addWidget(&_racelineScriptProcess); - _ui.buttonsLayout->addWidget(&_waypointsLocalToCarProcess); + _ui.buttonsLayout->addWidget(&_racelineHelper); } \ No newline at end of file diff --git a/sim_ws/src/arcus_gui/src/QWidget/QMapRacelineHelpers/QMapRacelineHelpers.hpp b/sim_ws/src/arcus_gui/src/QWidget/QMapRacelineHelpers/QMapRacelineHelpers.hpp index abdee9a..b5fc912 100644 --- a/sim_ws/src/arcus_gui/src/QWidget/QMapRacelineHelpers/QMapRacelineHelpers.hpp +++ b/sim_ws/src/arcus_gui/src/QWidget/QMapRacelineHelpers/QMapRacelineHelpers.hpp @@ -11,9 +11,7 @@ class QMapRacelineHelpers : public QWidget { Q_OBJECT - static constexpr const char* MAP_CAR_TO_LOCAL_CMD = "source /opt/ros/humble/setup.bash && ros2 launch f1tenth_gym_ros visualize_launch.py"; - static constexpr const char* RACELINE_SCRIPT_CMD = "source /opt/ros/humble/setup.bash && ros2 launch drive_controller drive_controller.launch.py"; - static constexpr const char* WAYPOINTS_LOCAL_TO_CAR_CMD = "source /opt/ros/humble/setup.bash && ros2 launch drive_controller drive_controller.launch.py"; + static constexpr const char* RACELINE_HELPER_CMD = "python3 /sim_ws/src/scripts/map_preparation/prepare_map.py"; public: QMapRacelineHelpers(std::shared_ptr node_, QWidget* parent_); @@ -25,9 +23,7 @@ class QMapRacelineHelpers : public QWidget std::shared_ptr _node; - QProcessHandler _mapCarToLocalProcess; - QProcessHandler _racelineScriptProcess; - QProcessHandler _waypointsLocalToCarProcess; + QProcessHandler _racelineHelper; Ui::MapRacelineHelpers _ui; }; diff --git a/sim_ws/src/arcus_gui/ui/ui/GapFollowWidget.ui b/sim_ws/src/arcus_gui/ui/ui/GapFollowWidget.ui new file mode 100644 index 0000000..80fa2cf --- /dev/null +++ b/sim_ws/src/arcus_gui/ui/ui/GapFollowWidget.ui @@ -0,0 +1,58 @@ + + + gapFollowWidget + + + + 0 + 0 + 611 + 300 + + + + Form + + + + + + + + + 24 + 75 + true + + + + GAP FOLLOW + + + Qt::AlignCenter + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 40 + + + + + + + + + + + diff --git a/sim_ws/src/arcus_gui/ui/ui/MapRacelineHelpers.ui b/sim_ws/src/arcus_gui/ui/ui/MapRacelineHelpers.ui index 8dababd..f3e31cf 100644 --- a/sim_ws/src/arcus_gui/ui/ui/MapRacelineHelpers.ui +++ b/sim_ws/src/arcus_gui/ui/ui/MapRacelineHelpers.ui @@ -51,7 +51,7 @@ - MAP/RACELINE HELPERS + MAPPIN AND RISK QLineEdit::Normal diff --git a/sim_ws/src/scripts/map_preparation/utils/exportAlgos.sh b/sim_ws/src/scripts/map_preparation/utils/exportAlgos.sh index f2e84e5..40ac561 100644 --- a/sim_ws/src/scripts/map_preparation/utils/exportAlgos.sh +++ b/sim_ws/src/scripts/map_preparation/utils/exportAlgos.sh @@ -5,7 +5,7 @@ USER="arcus" HOST="arcus-jetson.local" RACELINE_FILE="saved/algos.csv" -REMOTE_RACELINE_DIR="/home/arcus/arcus/resources/waypoints" +REMOTE_RACELINE_DIR="/home/arcus/arcus/resources" echo "Sending raceline back to remote..." scp "$RACELINE_FILE" "$USER@$HOST:$REMOTE_RACELINE_DIR" diff --git a/sim_ws/src/scripts/map_preparation/utils/exportSpeedZones.sh b/sim_ws/src/scripts/map_preparation/utils/exportSpeedZones.sh index 3a55dbf..0fc7e0e 100644 --- a/sim_ws/src/scripts/map_preparation/utils/exportSpeedZones.sh +++ b/sim_ws/src/scripts/map_preparation/utils/exportSpeedZones.sh @@ -5,7 +5,7 @@ USER="arcus" HOST="arcus-jetson.local" RACELINE_FILE="saved/speed_zones.csv" -REMOTE_RACELINE_DIR="/home/arcus/arcus/resources/waypoints" +REMOTE_RACELINE_DIR="/home/arcus/arcus/resources" echo "Sending raceline back to remote..." scp "$RACELINE_FILE" "$USER@$HOST:$REMOTE_RACELINE_DIR"