diff --git a/.github/workflows/buildx-bake.yml b/.github/workflows/buildx-bake.yml
index cb642e5..458bd27 100644
--- a/.github/workflows/buildx-bake.yml
+++ b/.github/workflows/buildx-bake.yml
@@ -4,6 +4,7 @@ on:
push:
branches:
- master # Change this to your main branch name
+ #- tuning
jobs:
build:
diff --git a/.gitignore b/.gitignore
index 600d2d3..0d0dd4b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,5 @@
-.vscode
\ No newline at end of file
+.vscode
+config/npm/keys.json
+config/npm/logs
+
+maps/
\ No newline at end of file
diff --git a/config/box_filter.yaml b/config/box_filter.yaml
new file mode 100644
index 0000000..ed930f3
--- /dev/null
+++ b/config/box_filter.yaml
@@ -0,0 +1,27 @@
+scan_to_scan_filter_chain:
+ ros__parameters:
+ filter1:
+ name: box_filter
+ type: laser_filters/LaserScanBoxFilter
+ params:
+ box_frame: laser_frame
+ max_x: 0.80 #was 0.16
+ max_y: 0.18 #was 0.17
+ max_z: 0.1
+ min_x: -0.41 #was -0.41
+ min_y: -0.18 # was -0.17
+ min_z: -0.2
+ invert: false # activate to remove all points outside of the box
+ name: shadows
+ type: laser_filters/ScanShadowsFilter
+ params:
+ min_angle: 10
+ max_angle: 170
+ neighbors: 20
+ window: 1
+ name: dark_shadows
+ type: laser_filters/LaserScanIntensityFilter
+ params:
+ lower_threshold: 100
+ upper_threshold: 10000
+ disp_histogram: 0
\ No newline at end of file
diff --git a/config/caddy/Caddyfile b/config/caddy/Caddyfile
new file mode 100644
index 0000000..78fb41f
--- /dev/null
+++ b/config/caddy/Caddyfile
@@ -0,0 +1,34 @@
+# {
+# debug
+# }
+
+http://loki {
+ root * /usr/share/caddy
+ file_server browse
+
+ handle_path /config* {
+ reverse_proxy http://olivetin:1337
+ }
+
+ handle_path /viz* {
+ reverse_proxy http://foxglove:8080
+ }
+
+ # this is not working right now
+ handle_path /joy* {
+ reverse_proxy http://host.docker.internal:8000
+ }
+}
+
+http://loki.local {
+ root * /usr/share/caddy
+ file_server browse
+
+ handle_path /config {
+ reverse_proxy http://olivetin:1337
+ }
+
+ handle_path /viz* {
+ reverse_proxy http://foxglove:8080
+ }
+}
diff --git a/config/caddy/content/overview/CPS_Logo_White_square_TRANSP.png b/config/caddy/content/overview/CPS_Logo_White_square_TRANSP.png
new file mode 100644
index 0000000..8db20ad
Binary files /dev/null and b/config/caddy/content/overview/CPS_Logo_White_square_TRANSP.png differ
diff --git a/config/caddy/content/overview/blueprint.svg b/config/caddy/content/overview/blueprint.svg
new file mode 100644
index 0000000..1c2d530
--- /dev/null
+++ b/config/caddy/content/overview/blueprint.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/config/caddy/content/overview/index.html b/config/caddy/content/overview/index.html
new file mode 100644
index 0000000..66027ed
--- /dev/null
+++ b/config/caddy/content/overview/index.html
@@ -0,0 +1,95 @@
+
+
+
+
+
+
+ CPS Bot Overview
+
+
+
+
+
+
+
+ Loki Overview
+
+
+
+
+
+
+
Teleop:
+
+
+
+
+
+
+
+
+
+
Robot Configuration:
+
+
+
+
+
+
+
+
+
+
+
+
Data View:
+
+
+
+
+
+
+
+
+
+
+
+
Manual:
+
+
+
+
+
+
+
+
+
+
+
+
Connect to Wi-Fi:
+
+
+
+
+
+ SSID: |
+ cps-loki |
+
+
+ Password: |
+ cps-loki |
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/config/caddy/content/overview/joystick.png b/config/caddy/content/overview/joystick.png
new file mode 100644
index 0000000..6c127f3
Binary files /dev/null and b/config/caddy/content/overview/joystick.png differ
diff --git a/config/caddy/content/overview/qr-loki-config.svg b/config/caddy/content/overview/qr-loki-config.svg
new file mode 100644
index 0000000..07fef97
--- /dev/null
+++ b/config/caddy/content/overview/qr-loki-config.svg
@@ -0,0 +1,508 @@
+
+
+
\ No newline at end of file
diff --git a/config/caddy/content/overview/qr-loki-overview.svg b/config/caddy/content/overview/qr-loki-overview.svg
new file mode 100644
index 0000000..fe7b3e1
--- /dev/null
+++ b/config/caddy/content/overview/qr-loki-overview.svg
@@ -0,0 +1,728 @@
+
+
+
\ No newline at end of file
diff --git a/config/caddy/content/overview/qr-loki-viz.svg b/config/caddy/content/overview/qr-loki-viz.svg
new file mode 100644
index 0000000..0269677
--- /dev/null
+++ b/config/caddy/content/overview/qr-loki-viz.svg
@@ -0,0 +1,552 @@
+
+
+
\ No newline at end of file
diff --git a/config/caddy/content/overview/qr-loki.wifi.svg b/config/caddy/content/overview/qr-loki.wifi.svg
new file mode 100644
index 0000000..2b160f6
--- /dev/null
+++ b/config/caddy/content/overview/qr-loki.wifi.svg
@@ -0,0 +1,1043 @@
+
+
+
\ No newline at end of file
diff --git a/config/caddy/content/overview/safety-glasses.svg b/config/caddy/content/overview/safety-glasses.svg
new file mode 100644
index 0000000..8deb128
--- /dev/null
+++ b/config/caddy/content/overview/safety-glasses.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/config/caddy/content/overview/style.css b/config/caddy/content/overview/style.css
new file mode 100644
index 0000000..534a5a6
--- /dev/null
+++ b/config/caddy/content/overview/style.css
@@ -0,0 +1,247 @@
+html
+{
+ background-color: rgb(51, 51, 51);
+ font-family: sans-serif;
+ padding-bottom: 50px;
+}
+
+#HEADLINE
+{
+ font-family:'Gill Sans', 'Gill Sans MT', Calibri, 'Trebuchet MS', sans-serif;
+ text-align: center;
+ color: white;
+ background-color: rgb(1, 115, 126);
+ box-shadow: 0px 15px 0px -5px rgb(1, 89, 97);
+
+ margin-top: 2px;
+}
+
+#LOGO
+{
+ height: 1em;
+ width: auto;
+
+ float: right;
+ margin-top: 2px;
+ padding-left: 12px;
+ padding-right: 12px;
+ background-color: inherit;
+}
+
+.mini-heads
+{
+ color: white;
+ font-weight: 700;
+}
+
+#LEFT
+{
+ float: left;
+ max-width: 49.5%;
+
+ text-align: center;
+}
+
+#RIGHT
+{
+ float: right;
+ max-width: 49.5%;
+ flex-direction: row;
+
+ text-align: center;
+}
+
+.qr
+{
+ max-width: 59.5%;
+ height: auto;
+
+ object-fit: cover;
+
+ border-color: black;
+ border: 3px solid;
+ border-radius: 10%;
+
+}
+
+.qr_2
+{
+ width: 35%;
+ height: auto;
+}
+
+table, td
+{
+ color: white;
+
+ width: 70%;
+ line-height: 190%;
+ border: 1px solid rgb(76, 76, 76);
+ background-color: rgb(34, 34, 34);
+ border-collapse: collapse;
+ margin-left: auto;
+ margin-right: auto;
+}
+
+#SPACE
+{
+ padding: 3px;
+}
+
+#NORM_SET
+{
+ padding-top: 6px;
+}
+
+.link
+{
+ color: white;
+ background-color: rgb(1, 115, 126);
+ padding-left: 10px;
+ padding-right: 10px;
+ border-radius: 3px;
+ text-decoration: none;
+}
+
+.link:hover
+{
+ color: rgb(206, 206, 206);
+}
+
+.link:visited
+{
+ color: rgb(75, 75, 75);
+ background-color: rgb(1, 89, 97);
+}
+
+.info
+{
+ color: white;
+
+ background-color: rgb(34, 34, 34);
+
+ padding-top: 3px;
+ padding-right: 6px;
+ text-indent: 6px;
+
+ position: fixed;
+ bottom: 0px;
+ right: 6px;
+
+ border: 1px solid rgb(76, 76, 76);
+}
+
+.info:hover
+{
+ cursor: pointer;
+}
+
+.info:visited
+{
+ color: rgb(206, 206, 206);
+}
+
+a, a:visited, a:hover, a:active {
+ text-decoration: none;
+ color: inherit;
+}
+
+/* Phone */ /* pract. ab 400% zoom (inludkiert) am pc */
+@media only screen and (max-width : 480px)
+{
+ #LEFT
+ {
+ width: 100%;
+ max-width: none;
+ clear: both;
+ text-align: center;
+ }
+
+ #RIGHT
+ {
+ max-width: none;
+ padding-top: 10px;
+ }
+
+ .qr
+ {
+ max-width: 43.9%;
+ }
+
+ .qr_2
+ {
+ width: 29%;
+ }
+}
+
+/* Tablet / Ipad */ /* pract. ab 200% Zoom (nicht inkludiert) am pc */
+@media only screen and (max-width : 767px) and (min-width: 481px)
+{
+ #LEFT
+ {
+ max-width: none;
+ width: 100%;
+ clear: both;
+ text-align: center;
+ }
+
+ .qr
+ {
+ max-width: 35%;
+ }
+
+ table td
+ {
+ font-size: large;
+ }
+
+ .mini-heads
+ {
+ font-size: x-large;
+ }
+
+ #RIGHT
+ {
+ max-width: none;
+ }
+
+ #SPACE
+ {
+ padding: none;
+ display: none;
+ }
+
+ #BLOCK_ONE
+ {
+ max-width: 49.5%;
+ float: left;
+ }
+
+ #BLOCK_TWO
+ {
+ max-width: 49.5%;
+ float: right;
+ }
+
+ #BLOCK_THREE
+ {
+ max-width: 49.5%;
+ float: right;
+ }
+
+ .qr_2
+ {
+ max-width: 80%;
+ width: 50%;
+ }
+
+ .link
+ {
+ font-size: larger;
+ }
+
+ .info
+ {
+ font-size: larger;
+ }
+}
\ No newline at end of file
diff --git a/config/caddy/content/overview/wrench.svg b/config/caddy/content/overview/wrench.svg
new file mode 100644
index 0000000..6bae290
--- /dev/null
+++ b/config/caddy/content/overview/wrench.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/config/foxglove/extensions/yulong.virtual-joystick-0.0.1.foxe b/config/foxglove/extensions/yulong.virtual-joystick-0.0.1.foxe
new file mode 100644
index 0000000..7901c20
Binary files /dev/null and b/config/foxglove/extensions/yulong.virtual-joystick-0.0.1.foxe differ
diff --git a/config/foxglove/foxglove-layout.json b/config/foxglove/foxglove-layout.json
new file mode 100644
index 0000000..60a3e1d
--- /dev/null
+++ b/config/foxglove/foxglove-layout.json
@@ -0,0 +1,155 @@
+{
+ "configById": {
+ "virtual-joystick.Virtual Joystick!26sdvuh": {
+ "topic": "/cmd_vel",
+ "publishRate": 60,
+ "maxLinearSpeed": 0.5,
+ "maxAngularSpeed": 2
+ },
+ "3D!18i6zy7": {
+ "layers": {
+ "845139cb-26bc-40b3-8161-8ab60af4baf5": {
+ "visible": true,
+ "frameLocked": true,
+ "label": "Grid",
+ "instanceId": "845139cb-26bc-40b3-8161-8ab60af4baf5",
+ "layerId": "foxglove.Grid",
+ "size": 10,
+ "divisions": 10,
+ "lineWidth": 1,
+ "color": "#248eff",
+ "position": [
+ 0,
+ 0,
+ 0
+ ],
+ "rotation": [
+ 0,
+ 0,
+ 0
+ ],
+ "order": 1
+ }
+ },
+ "cameraState": {
+ "distance": 20,
+ "perspective": true,
+ "phi": 60,
+ "target": [
+ 0,
+ 0,
+ 0
+ ],
+ "targetOffset": [
+ 0,
+ 0,
+ 0
+ ],
+ "targetOrientation": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "thetaOffset": 45,
+ "fovy": 45,
+ "near": 0.5,
+ "far": 5000
+ },
+ "followMode": "follow-pose",
+ "scene": {},
+ "transforms": {},
+ "topics": {},
+ "publish": {
+ "type": "point",
+ "poseTopic": "/move_base_simple/goal",
+ "pointTopic": "/clicked_point",
+ "poseEstimateTopic": "/initialpose",
+ "poseEstimateXDeviation": 0.5,
+ "poseEstimateYDeviation": 0.5,
+ "poseEstimateThetaDeviation": 0.26179939
+ },
+ "imageMode": {}
+ },
+ "Image!3mnp456": {
+ "cameraState": {
+ "distance": 20,
+ "perspective": true,
+ "phi": 60,
+ "target": [
+ 0,
+ 0,
+ 0
+ ],
+ "targetOffset": [
+ 0,
+ 0,
+ 0
+ ],
+ "targetOrientation": [
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "thetaOffset": 45,
+ "fovy": 45,
+ "near": 0.5,
+ "far": 5000
+ },
+ "followMode": "follow-pose",
+ "scene": {},
+ "transforms": {},
+ "topics": {},
+ "layers": {},
+ "publish": {
+ "type": "point",
+ "poseTopic": "/move_base_simple/goal",
+ "pointTopic": "/clicked_point",
+ "poseEstimateTopic": "/initialpose",
+ "poseEstimateXDeviation": 0.5,
+ "poseEstimateYDeviation": 0.5,
+ "poseEstimateThetaDeviation": 0.26179939
+ },
+ "imageMode": {}
+ },
+ "RawMessages!os6rgs": {
+ "diffEnabled": false,
+ "diffMethod": "custom",
+ "diffTopicPath": "",
+ "showFullMessageForDiff": false,
+ "topicPath": ""
+ },
+ "Battery Indicator.Battery display!3gjrnnu": {
+ "batteryTopic": "",
+ "topic": {
+ "batteryTopic": ""
+ }
+ }
+ },
+ "globalVariables": {},
+ "userNodes": {},
+ "playbackConfig": {
+ "speed": 1
+ },
+ "layout": {
+ "direction": "row",
+ "first": "virtual-joystick.Virtual Joystick!26sdvuh",
+ "second": {
+ "first": "3D!18i6zy7",
+ "second": {
+ "first": "Image!3mnp456",
+ "second": {
+ "first": "RawMessages!os6rgs",
+ "second": "Battery Indicator.Battery display!3gjrnnu",
+ "direction": "column",
+ "splitPercentage": 79.02494331065759
+ },
+ "direction": "column",
+ "splitPercentage": 30
+ },
+ "direction": "row",
+ "splitPercentage": 70
+ }
+ }
+}
\ No newline at end of file
diff --git a/config/foxglove/index.html b/config/foxglove/index.html
new file mode 100644
index 0000000..f2d3df3
--- /dev/null
+++ b/config/foxglove/index.html
@@ -0,0 +1,169 @@
+Foxglove Studio
\ No newline at end of file
diff --git a/config/nav2_params.yaml b/config/nav2_params.yaml
new file mode 100644
index 0000000..0281cea
--- /dev/null
+++ b/config/nav2_params.yaml
@@ -0,0 +1,504 @@
+slam_toolbox:
+ ros__parameters:
+
+ # Plugin params
+ solver_plugin: solver_plugins::CeresSolver
+ ceres_linear_solver: SPARSE_NORMAL_CHOLESKY
+ ceres_preconditioner: SCHUR_JACOBI
+ ceres_trust_strategy: LEVENBERG_MARQUARDT
+ ceres_dogleg_type: TRADITIONAL_DOGLEG
+ ceres_loss_function: None
+
+ # ROS Parameters
+ odom_frame: odom
+ map_frame: map
+ base_frame: base_footprint
+ scan_topic: /scan_filtered
+ mode: mapping #localization
+
+ # if you'd like to immediately start continuing a map at a given pose
+ # or at the dock, but they are mutually exclusive, if pose is given
+ # will use pose
+ #map_file_name: /home/bjorn/Documents/ros-projects/cps_bot_mini_ws/my_map_serial
+ # map_start_pose: [0.0, 0.0, 0.0]
+ map_start_at_dock: true
+
+ debug_logging: false
+ throttle_scans: 1
+ transform_publish_period: 0.02 #if 0 never publishes odometry
+ map_update_interval: 1.0 #was 5.0
+ resolution: 0.05
+ max_laser_range: 200.0 #for rastering images, standard was 20
+ minimum_time_interval: 0.5
+ transform_timeout: 0.2
+ tf_buffer_duration: 30.
+ stack_size_to_use: 40000000 #// program needs a larger stack size to serialize large maps
+ enable_interactive_mode: true
+
+ # General Parameters
+ use_scan_matching: true
+ use_scan_barycenter: true
+ minimum_travel_distance: 0.5
+ minimum_travel_heading: 0.5
+ scan_buffer_size: 10
+ scan_buffer_maximum_scan_distance: 10.0
+ link_match_minimum_response_fine: 0.1
+ link_scan_maximum_distance: 1.5
+ loop_search_maximum_distance: 3.0
+ do_loop_closing: true
+ loop_match_minimum_chain_size: 10
+ loop_match_maximum_variance_coarse: 3.0
+ loop_match_minimum_response_coarse: 0.35
+ loop_match_minimum_response_fine: 0.45
+
+ # Correlation Parameters - Correlation Parameters
+ correlation_search_space_dimension: 0.5
+ correlation_search_space_resolution: 0.01
+ correlation_search_space_smear_deviation: 0.1
+
+ # Correlation Parameters - Loop Closure Parameters
+ loop_search_space_dimension: 8.0
+ loop_search_space_resolution: 0.05
+ loop_search_space_smear_deviation: 0.03
+
+ # Scan Matcher Parameters
+ distance_variance_penalty: 0.5
+ angle_variance_penalty: 1.0
+
+ fine_search_angle_offset: 0.00349
+ coarse_search_angle_offset: 0.349
+ coarse_angle_resolution: 0.0349
+ minimum_angle_penalty: 0.9
+ minimum_distance_penalty: 0.5
+ use_response_expansion: true
+
+amcl:
+ ros__parameters:
+ use_sim_time: True
+ alpha1: 0.2
+ alpha2: 0.2
+ alpha3: 0.2
+ alpha4: 0.2
+ alpha5: 0.2
+ base_frame_id: "base_footprint"
+ beam_skip_distance: 0.5
+ beam_skip_error_threshold: 0.9
+ beam_skip_threshold: 0.3
+ do_beamskip: false
+ global_frame_id: "map"
+ lambda_short: 0.1
+ laser_likelihood_max_dist: 2.0
+ laser_max_range: 7.0 #was 100.0
+ laser_min_range: -1.0
+ laser_model_type: "likelihood_field"
+ max_beams: 60
+ max_particles: 2000
+ min_particles: 500
+ odom_frame_id: "odom"
+ pf_err: 0.05
+ pf_z: 0.99
+ recovery_alpha_fast: 0.0
+ recovery_alpha_slow: 0.0
+ resample_interval: 1
+ robot_model_type: "nav2_amcl::DifferentialMotionModel"
+ save_pose_rate: 0.5
+ sigma_hit: 0.2
+ tf_broadcast: true
+ transform_tolerance: 1.0
+ update_min_a: 0.2
+ update_min_d: 0.25
+ z_hit: 0.5
+ z_max: 0.05
+ z_rand: 0.5
+ z_short: 0.05
+ scan_topic: scan_filtered
+
+bt_navigator:
+ ros__parameters:
+ use_sim_time: True
+ global_frame: map
+ robot_base_frame: base_link
+ odom_topic: /odometry/filtered
+ bt_loop_duration: 10
+ default_server_timeout: 20
+ # 'default_nav_through_poses_bt_xml' and 'default_nav_to_pose_bt_xml' are use defaults:
+ # nav2_bt_navigator/navigate_to_pose_w_replanning_and_recovery.xml
+ # nav2_bt_navigator/navigate_through_poses_w_replanning_and_recovery.xml
+ # They can be set here or via a RewrittenYaml remap from a parent launch file to Nav2.
+ plugin_lib_names:
+ - nav2_compute_path_to_pose_action_bt_node
+ - nav2_compute_path_through_poses_action_bt_node
+ - nav2_smooth_path_action_bt_node
+ - nav2_follow_path_action_bt_node
+ - nav2_spin_action_bt_node
+ - nav2_wait_action_bt_node
+ - nav2_assisted_teleop_action_bt_node
+ - nav2_back_up_action_bt_node
+ - nav2_drive_on_heading_bt_node
+ - nav2_clear_costmap_service_bt_node
+ - nav2_is_stuck_condition_bt_node
+ - nav2_goal_reached_condition_bt_node
+ - nav2_goal_updated_condition_bt_node
+ - nav2_globally_updated_goal_condition_bt_node
+ - nav2_is_path_valid_condition_bt_node
+ - nav2_initial_pose_received_condition_bt_node
+ - nav2_reinitialize_global_localization_service_bt_node
+ - nav2_rate_controller_bt_node
+ - nav2_distance_controller_bt_node
+ - nav2_speed_controller_bt_node
+ - nav2_truncate_path_action_bt_node
+ - nav2_truncate_path_local_action_bt_node
+ - nav2_goal_updater_node_bt_node
+ - nav2_recovery_node_bt_node
+ - nav2_pipeline_sequence_bt_node
+ - nav2_round_robin_node_bt_node
+ - nav2_transform_available_condition_bt_node
+ - nav2_time_expired_condition_bt_node
+ - nav2_path_expiring_timer_condition
+ - nav2_distance_traveled_condition_bt_node
+ - nav2_single_trigger_bt_node
+ - nav2_goal_updated_controller_bt_node
+ - nav2_is_battery_low_condition_bt_node
+ - nav2_navigate_through_poses_action_bt_node
+ - nav2_navigate_to_pose_action_bt_node
+ - nav2_remove_passed_goals_action_bt_node
+ - nav2_planner_selector_bt_node
+ - nav2_controller_selector_bt_node
+ - nav2_goal_checker_selector_bt_node
+ - nav2_controller_cancel_bt_node
+ - nav2_path_longer_on_approach_bt_node
+ - nav2_wait_cancel_bt_node
+ - nav2_spin_cancel_bt_node
+ - nav2_back_up_cancel_bt_node
+ - nav2_assisted_teleop_cancel_bt_node
+ - nav2_drive_on_heading_cancel_bt_node
+ - nav2_is_battery_charging_condition_bt_node
+
+bt_navigator_navigate_through_poses_rclcpp_node:
+ ros__parameters:
+ use_sim_time: True
+
+bt_navigator_navigate_to_pose_rclcpp_node:
+ ros__parameters:
+ use_sim_time: True
+
+# controller_server:
+# ros__parameters:
+# use_sim_time: True
+# controller_frequency: 20.0
+# min_x_velocity_threshold: 0.001
+# min_y_velocity_threshold: 0.5
+# min_theta_velocity_threshold: 0.001
+# failure_tolerance: 0.3
+# progress_checker_plugin: "progress_checker"
+# goal_checker_plugins: ["general_goal_checker"] # "precise_goal_checker"
+# controller_plugins: ["FollowPath"]
+
+# # Progress checker parameters
+# progress_checker:
+# plugin: "nav2_controller::SimpleProgressChecker"
+# required_movement_radius: 0.5
+# movement_time_allowance: 10.0
+# # Goal checker parameters
+# #precise_goal_checker:
+# # plugin: "nav2_controller::SimpleGoalChecker"
+# # xy_goal_tolerance: 0.25
+# # yaw_goal_tolerance: 0.25
+# # stateful: True
+# general_goal_checker:
+# stateful: True
+# plugin: "nav2_controller::SimpleGoalChecker"
+# xy_goal_tolerance: 0.25
+# yaw_goal_tolerance: 0.25
+# # DWB parameters
+# FollowPath:
+# plugin: "dwb_core::DWBLocalPlanner"
+# debug_trajectory_details: True
+# min_vel_x: -0.1
+# min_vel_y: 0.0
+# max_vel_x: 0.26
+# max_vel_y: 0.0
+# max_vel_theta: 1.0
+# min_speed_xy: 0.0
+# max_speed_xy: 0.26
+# min_speed_theta: 0.0
+# # Add high threshold velocity for turtlebot 3 issue.
+# # https://github.com/ROBOTIS-GIT/turtlebot3_simulations/issues/75
+# acc_lim_x: 2.5
+# acc_lim_y: 0.0
+# acc_lim_theta: 3.2
+# decel_lim_x: -2.5
+# decel_lim_y: 0.0
+# decel_lim_theta: -3.2
+# vx_samples: 20
+# vy_samples: 5
+# vtheta_samples: 20
+# sim_time: 1.7
+# linear_granularity: 0.05
+# angular_granularity: 0.025
+# transform_tolerance: 0.2
+# xy_goal_tolerance: 0.25
+# trans_stopped_velocity: 0.25
+# short_circuit_trajectory_evaluation: True
+# stateful: True
+# critics: ["RotateToGoal", "Oscillation", "BaseObstacle", "GoalAlign", "PathAlign", "PathDist", "GoalDist", "ObstacleFootprint", "PreferForward"]
+# BaseObstacle.scale: 0.02
+# PathAlign.scale: 32.0
+# PathAlign.forward_point_distance: 0.1
+# GoalAlign.scale: 24.0
+# GoalAlign.forward_point_distance: 0.1
+# PathDist.scale: 32.0
+# GoalDist.scale: 24.0
+# RotateToGoal.scale: 32.0
+# RotateToGoal.slowing_factor: 5.0
+# RotateToGoal.lookahead_time: -1.0
+controller_server:
+ ros__parameters:
+ use_sim_time: True
+ controller_frequency: 100.0 # was 20.0
+ min_x_velocity_threshold: 0.001
+ min_y_velocity_threshold: 0.5
+ min_theta_velocity_threshold: 0.001
+ progress_checker_plugins: ["progress_checker"] # progress_checker_plugin: "progress_checker" For Humble and older
+ goal_checker_plugins: ["goal_checker"]
+ controller_plugins: ["FollowPath"]
+
+ progress_checker:
+ plugin: "nav2_controller::SimpleProgressChecker"
+ required_movement_radius: 0.5
+ movement_time_allowance: 10.0
+ goal_checker:
+ plugin: "nav2_controller::SimpleGoalChecker"
+ xy_goal_tolerance: 0.25 # was 0.25
+ yaw_goal_tolerance: 0.25 # was 0.25
+ stateful: True
+ FollowPath:
+ plugin: "nav2_regulated_pure_pursuit_controller::RegulatedPurePursuitController"
+ desired_linear_vel: 0.5
+ lookahead_dist: 0.6
+ min_lookahead_dist: 0.3
+ max_lookahead_dist: 0.9
+ lookahead_time: 1.5
+ rotate_to_heading_angular_vel: 1.8
+ transform_tolerance: 0.1
+ use_velocity_scaled_lookahead_dist: false
+ min_approach_linear_velocity: 0.007 # was 0.05
+ approach_velocity_scaling_dist: 0.6
+ use_collision_detection: true
+ max_allowed_time_to_collision_up_to_carrot: 1.0
+ use_regulated_linear_velocity_scaling: true
+ use_fixed_curvature_lookahead: false
+ curvature_lookahead_dist: 0.25
+ use_cost_regulated_linear_velocity_scaling: false
+ regulated_linear_scaling_min_radius: 0.9
+ regulated_linear_scaling_min_speed: 0.25
+ use_rotate_to_heading: false # was true, cannot be set together with allow_reversing
+ allow_reversing: true # was false
+ rotate_to_heading_min_angle: 0.785
+ max_angular_accel: 3.2
+ max_robot_pose_search_dist: 10.0
+ use_interpolation: true # was false
+
+
+local_costmap:
+ local_costmap:
+ ros__parameters:
+ update_frequency: 5.0
+ publish_frequency: 2.0
+ global_frame: odom
+ robot_base_frame: base_link
+ use_sim_time: True
+ rolling_window: true
+ width: 3
+ height: 3
+ resolution: 0.05
+ #robot_radius: 0.22
+ footprint: "[ [0.065, 0.160], [0.065, -0.160], [-0.28, -0.13], [-0.28, 0.13] ]" # gave another points for the polygon "[ [0.18, 0.255], [0.18, -0.255], [-0.54, -0.165], [-0.54, 0.165] ]"
+ plugins: ["voxel_layer", "inflation_layer"]
+ inflation_layer:
+ plugin: "nav2_costmap_2d::InflationLayer"
+ cost_scaling_factor: 10.0 # was 3.0
+ inflation_radius: 0.55
+ voxel_layer:
+ plugin: "nav2_costmap_2d::VoxelLayer"
+ enabled: True
+ publish_voxel_map: True
+ origin_z: 0.0
+ z_resolution: 0.05
+ z_voxels: 16
+ max_obstacle_height: 2.0
+ mark_threshold: 0
+ observation_sources: rplidar oakd
+ rplidar:
+ topic: /scan_filtered
+ max_obstacle_height: 2.0
+ clearing: True
+ marking: True
+ data_type: "LaserScan"
+ raytrace_max_range: 3.0
+ raytrace_min_range: 0.0
+ obstacle_max_range: 2.5
+ obstacle_min_range: 0.0
+ oak-d: # no frame set, uses frame from message
+ topic: /stereo/points
+ max_obstacle_height: 1.5
+ min_obstacle_height: 0.02
+ obstacle_max_range: 3.0
+ obstacle_min_range: 0.0
+ raytrace_max_range: 3.2
+ raytrace_min_range: 0.0
+ clearing: True
+ marking: True
+ data_type: "PointCloud2"
+ static_layer:
+ plugin: "nav2_costmap_2d::StaticLayer"
+ map_subscribe_transient_local: True
+ always_send_full_costmap: True
+
+global_costmap:
+ global_costmap:
+ ros__parameters:
+ update_frequency: 1.0
+ publish_frequency: 1.0
+ global_frame: map
+ robot_base_frame: base_link
+ use_sim_time: True
+ #robot_radius: 0.22
+ footprint: "[ [0.065, 0.160], [0.065, -0.160], [-0.28, -0.13], [-0.28, 0.13] ]" # gave another points for the polygon
+ resolution: 0.05
+ track_unknown_space: true
+ plugins: ["static_layer", "obstacle_layer", "inflation_layer"]
+ obstacle_layer:
+ plugin: "nav2_costmap_2d::ObstacleLayer"
+ enabled: True
+ observation_sources: scan
+ scan:
+ topic: /scan_filtered
+ max_obstacle_height: 2.0
+ clearing: True
+ marking: True
+ data_type: "LaserScan"
+ raytrace_max_range: 3.0
+ raytrace_min_range: 0.0
+ obstacle_max_range: 2.5
+ obstacle_min_range: 0.0
+ static_layer:
+ plugin: "nav2_costmap_2d::StaticLayer"
+ map_subscribe_transient_local: True
+ inflation_layer:
+ plugin: "nav2_costmap_2d::InflationLayer"
+ cost_scaling_factor: 10.0 # was 3.0
+ inflation_radius: 0.55
+ always_send_full_costmap: True
+
+map_server:
+ ros__parameters:
+ use_sim_time: True
+ # Overridden in launch by the "map" launch configuration or provided default value.
+ # To use in yaml, remove the default "map" value in the tb3_simulation_launch.py file & provide full path to map below.
+ yaml_filename: ""
+
+map_saver:
+ ros__parameters:
+ use_sim_time: True
+ save_map_timeout: 5.0
+ free_thresh_default: 0.25
+ occupied_thresh_default: 0.65
+ map_subscribe_transient_local: True
+
+# planner_server:
+# ros__parameters:
+# expected_planner_frequency: 20.0
+# use_sim_time: True
+# planner_plugins: ["GridBased"]
+# GridBased:
+# plugin: "nav2_navfn_planner/NavfnPlanner"
+# tolerance: 0.5
+# use_astar: false
+# allow_unknown: true
+planner_server:
+ ros__parameters:
+ planner_plugins: ["GridBased"]
+ use_sim_time: True
+
+ GridBased:
+ plugin: "nav2_smac_planner/SmacPlanner2D"
+ tolerance: 0.125 # tolerance for planning if unable to reach exact pose, in meters
+ downsample_costmap: false # whether or not to downsample the map
+ downsampling_factor: 1 # multiplier for the resolution of the costmap layer (e.g. 2 on a 5cm costmap would be 10cm)
+ allow_unknown: true # allow traveling in unknown space
+ max_iterations: 1000000 # maximum total iterations to search for before failing (in case unreachable), set to -1 to disable
+ max_on_approach_iterations: 1000 # maximum number of iterations to attempt to reach goal once in tolerance
+ max_planning_time: 2.0 # max time in s for planner to plan, smooth
+ cost_travel_multiplier: 2.0 # Cost multiplier to apply to search to steer away from high cost areas. Larger values will place in the center of aisles more exactly (if non-`FREE` cost potential field exists) but take slightly longer to compute. To optimize for speed, a value of 1.0 is reasonable. A reasonable tradeoff value is 2.0. A value of 0.0 effective disables steering away from obstacles and acts like a naive binary search A*.
+ use_final_approach_orientation: true # Whether to set the final path pose at the goal's orientation to the requested orientation (false) or in line with the approach angle so the robot doesn't rotate to heading (true)
+ smoother:
+ max_iterations: 1000
+ w_smooth: 0.3
+ w_data: 0.2
+ tolerance: 0.1
+
+smoother_server:
+ ros__parameters:
+ use_sim_time: True
+ smoother_plugins: ["simple_smoother"]
+ simple_smoother:
+ plugin: "nav2_smoother::SimpleSmoother"
+ tolerance: 1.0e-10
+ max_its: 1000
+ do_refinement: True
+
+behavior_server:
+ ros__parameters:
+ costmap_topic: local_costmap/costmap_raw
+ footprint_topic: local_costmap/published_footprint
+ cycle_frequency: 10.0
+ behavior_plugins: ["spin", "backup", "drive_on_heading", "assisted_teleop", "wait"]
+ spin:
+ plugin: "nav2_behaviors/Spin"
+ backup:
+ plugin: "nav2_behaviors/BackUp"
+ drive_on_heading:
+ plugin: "nav2_behaviors/DriveOnHeading"
+ wait:
+ plugin: "nav2_behaviors/Wait"
+ assisted_teleop:
+ plugin: "nav2_behaviors/AssistedTeleop"
+ global_frame: odom
+ robot_base_frame: base_link
+ transform_tolerance: 0.1
+ use_sim_time: true
+ simulate_ahead_time: 2.0
+ max_rotational_vel: 1.0
+ min_rotational_vel: 0.4
+ rotational_acc_lim: 3.2
+
+robot_state_publisher:
+ ros__parameters:
+ use_sim_time: True
+
+waypoint_follower:
+ ros__parameters:
+ use_sim_time: True
+ loop_rate: 20
+ stop_on_failure: false
+ waypoint_task_executor_plugin: "wait_at_waypoint"
+ wait_at_waypoint:
+ plugin: "nav2_waypoint_follower::WaitAtWaypoint"
+ enabled: True
+ waypoint_pause_duration: 200
+
+velocity_smoother:
+ ros__parameters:
+ use_sim_time: True
+ smoothing_frequency: 20.0
+ scale_velocities: False
+ feedback: "CLOSED_LOOP" # was OPEN_LOOP
+ max_velocity: [0.26, 0.0, 1.0]
+ min_velocity: [-0.26, 0.0, -1.0]
+ max_accel: [2.5, 0.0, 3.2]
+ max_decel: [-2.5, 0.0, -3.2]
+ odom_topic: "/odometry/filtered"
+ odom_duration: 0.1 # was 0.1
+ deadband_velocity: [0.0, 0.0, 0.0]
+ velocity_timeout: 1.0
\ No newline at end of file
diff --git a/config/npm/database.sqlite b/config/npm/database.sqlite
new file mode 100644
index 0000000..09a55a7
Binary files /dev/null and b/config/npm/database.sqlite differ
diff --git a/config/npm/nginx/default_host/site.conf b/config/npm/nginx/default_host/site.conf
new file mode 100644
index 0000000..8e14528
--- /dev/null
+++ b/config/npm/nginx/default_host/site.conf
@@ -0,0 +1,18 @@
+# ------------------------------------------------------------
+# Default Site
+# ------------------------------------------------------------
+
+server {
+ listen 80 default;
+listen [::]:80 default;
+
+ server_name default-host.localhost;
+ access_log /data/logs/default-host_access.log combined;
+ error_log /data/logs/default-host_error.log warn;
+
+
+ include conf.d/include/letsencrypt-acme-challenge.conf;
+ location / {
+ return 301 http://192.168.20.10:1337/;
+ }
+}
diff --git a/config/npm/nginx/proxy_host/3.conf b/config/npm/nginx/proxy_host/3.conf
new file mode 100644
index 0000000..f6a7346
--- /dev/null
+++ b/config/npm/nginx/proxy_host/3.conf
@@ -0,0 +1,58 @@
+# ------------------------------------------------------------
+# overview.loki
+# ------------------------------------------------------------
+
+
+
+map $scheme $hsts_header {
+ https "max-age=63072000; preload";
+}
+
+server {
+ set $forward_scheme http;
+ set $server "host.docker.internal";
+ set $port 1337;
+
+ listen 80;
+listen [::]:80;
+
+
+ server_name overview.loki;
+
+
+
+
+
+
+
+
+
+
+
+
+ access_log /data/logs/proxy-host-3_access.log proxy;
+ error_log /data/logs/proxy-host-3_error.log warn;
+
+
+
+
+
+
+
+ location / {
+
+
+
+
+
+
+
+
+ # Proxy!
+ include conf.d/include/proxy.conf;
+ }
+
+
+ # Custom
+ include /data/nginx/custom/server_proxy[.]conf;
+}
diff --git a/config/olivetin.yaml b/config/olivetin.yaml
deleted file mode 100644
index ccb3189..0000000
--- a/config/olivetin.yaml
+++ /dev/null
@@ -1,11 +0,0 @@
-actions:
- - title: "Start Navigation Stack"
- shell: docker compose -f /repo/docker-compose.yaml up -d navigation
- - title: "Stop Navigation Stack"
- shell: docker compose -f /repo/docker-compose.yaml down navigation
- - title: "Start Mapping"
- shell: docker compose -f /repo/docker-compose.yaml up -d mapping
- - title: "Stop Mapping"
- shell: docker compose -f /repo/docker-compose.yaml down mapping
- - title: "Restart Teleop"
- shell: docker compose -f /repo/docker-compose.yaml restart teleop
diff --git a/config/olivetin/config.yaml b/config/olivetin/config.yaml
new file mode 100644
index 0000000..6b12a61
--- /dev/null
+++ b/config/olivetin/config.yaml
@@ -0,0 +1,35 @@
+showNavigation: false
+logLevel: "INFO"
+showNewVersions: false
+showFooter: false
+
+actions:
+ - title: "Start Navigation Stack"
+ shell: docker start cps_loki-navigation-1
+ icon: ''
+ - title: "Stop Navigation Stack"
+ shell: docker stop cps_loki-navigation-1
+ icon: ''
+ - title: "Start Mapping"
+ shell: docker start cps_loki-mapping-1
+ icon: ''
+ - title: "Stop Mapping"
+ shell: docker stop cps_loki-mapping-1
+ icon: ''
+ - title: "Restart Teleop"
+ icon: ''
+ shell: docker restart cps_loki-teleop-1
+ - title: Restart or Shutdown System
+ icon: restart
+ shell: systemctl {{ choice }}
+ arguments:
+ - name: choice
+ title: Pick one
+ choices:
+ - value: reboot
+ - value: shutdown
+ # This will SSH into a server an run the command 'service httpd restart'
+ # - title: Restart httpd on Server 1
+ # shell: ssh bjorn@loki.local 'echo "it works"'
+ # icon: ping
+ # timeout: 5
\ No newline at end of file
diff --git a/config/olivetin/icons/gamepad.png b/config/olivetin/icons/gamepad.png
new file mode 100644
index 0000000..6257a12
Binary files /dev/null and b/config/olivetin/icons/gamepad.png differ
diff --git a/config/olivetin/icons/mapping_start.gif b/config/olivetin/icons/mapping_start.gif
new file mode 100644
index 0000000..d16c5e7
Binary files /dev/null and b/config/olivetin/icons/mapping_start.gif differ
diff --git a/config/olivetin/icons/mapping_stop.gif b/config/olivetin/icons/mapping_stop.gif
new file mode 100644
index 0000000..a86cc47
Binary files /dev/null and b/config/olivetin/icons/mapping_stop.gif differ
diff --git a/config/olivetin/icons/nav2_start.png b/config/olivetin/icons/nav2_start.png
new file mode 100644
index 0000000..50ed677
Binary files /dev/null and b/config/olivetin/icons/nav2_start.png differ
diff --git a/config/olivetin/icons/nav2_stop.gif b/config/olivetin/icons/nav2_stop.gif
new file mode 100644
index 0000000..cd7f0c4
Binary files /dev/null and b/config/olivetin/icons/nav2_stop.gif differ
diff --git a/config/olivetin/icons/nav2_stop.png b/config/olivetin/icons/nav2_stop.png
new file mode 100644
index 0000000..4fce2b9
Binary files /dev/null and b/config/olivetin/icons/nav2_stop.png differ
diff --git a/config/olivetin/icons/qr-code.png b/config/olivetin/icons/qr-code.png
new file mode 100644
index 0000000..bc2043d
Binary files /dev/null and b/config/olivetin/icons/qr-code.png differ
diff --git a/config/olivetin/installation-id.txt b/config/olivetin/installation-id.txt
new file mode 100644
index 0000000..70dda62
--- /dev/null
+++ b/config/olivetin/installation-id.txt
@@ -0,0 +1 @@
+ba1fa920-2863-4600-994f-23559acfcab2
\ No newline at end of file
diff --git a/docker-compose.yaml b/docker-compose.yaml
index d9d43b8..9146a4e 100644
--- a/docker-compose.yaml
+++ b/docker-compose.yaml
@@ -36,6 +36,7 @@ services:
# Allows graphical programs in the container.
- /tmp/.X11-unix:/tmp/.X11-unix:rw
- ${XAUTHORITY:-$HOME/.Xauthority}:/root/.Xauthority
+ restart: unless-stopped
# Overlay image containing the project specific source code.
overlay:
extends: base
@@ -82,7 +83,7 @@ services:
devices:
- /dev/ttyUSB0:/dev/ttyUSB0
- /dev/ttyACM0:/dev/ttyACM0
- restart: unless-stopped
+ restart: always
# teleop
teleop:
extends: overlay
@@ -90,7 +91,7 @@ services:
ros2 launch cps_loki_bringup robot_joy_teleop.launch.py
devices:
- /dev/input:/dev/input
- restart: unless-stopped
+ restart: always
# scan filter node
lidar_filter:
extends: overlay
@@ -120,7 +121,7 @@ services:
command: >
ros2 launch nav2_bringup bringup_launch.py slam:=True map:=/repo/map.yaml
use_sim_time:=False use_composition:=True
- params_file:=/overlay_ws/src/cps_loki_bringup/config/nav2_params.yaml
+ params_file:=/repo/config/nav2_params.yaml
depends_on:
- lidar
- controller
@@ -137,61 +138,85 @@ services:
###################################################################################################################################
# Webgui Supervision via Foxglove Studio #
###################################################################################################################################
+ olivetin:
+ container_name: olivetin
+ image: jamesread/olivetin
+ #image: ghcr.io/bjoernellens1/cps_bot_mini_ws/olivetin
+ build:
+ context: .
+ dockerfile: docker/Dockerfile
+ tags:
+ - ghcr.io/bjoernellens1/cps_bot_mini_ws/olivetin
+ target: olivetin
+ x-bake:
+ platforms:
+ #- linux/arm64
+ - linux/amd64
+ user: root
+ privileged: true
+ volumes:
+ - ./config/olivetin/:/config/ # here is config.yaml and icons located
+ - ./config/olivetin/icons:/var/www/olivetin/customIcons
+ - .:/repo
+ - /var/run/docker.sock:/var/run/docker.sock
+
+ # - /var/lib/docker:/var/lib/docker
+ - ~/.ssh/id_rsa:/root/.ssh/id_rsa
+ networks:
+ - caddy_network
+ ports:
+ - "1337:1337"
+ restart: always
-
-
- # config:
- # container_name: olivetin
- # image: ghcr.io/bjoernellens1/cps_bot_mini_ws/olivetin
- # build:
- # context: .
- # dockerfile: docker/Dockerfile
- # tags:
- # - ghcr.io/bjoernellens1/cps_bot_mini_ws/olivetin
- # target: olivetin
- # x-bake:
- # platforms:
- # #- linux/arm64
- # - linux/amd64
- # #user: root
- # privileged: true
- # volumes:
- # - ./config/olivetin.yaml:/config/config.yaml # replace host path or volume as needed
- # - .:/repo
- # - /var/run/docker.sock:/var/run/docker.sock
- # - /var/lib/docker:/var/lib/docker
- # ports:
- # - "88:1337"
- # restart: unless-stopped
+ portainer:
+ container_name: portainer
+ #image: jamesread/olivetin
+ image: portainer/portainer-ce:latest
+ volumes:
+ - ./config/olivetin/:/config/ # here is config.yaml and icons located
+ - ./config/olivetin/icons:/var/www/olivetin/customIcons
+ - .:/repo
+ - /var/run/docker.sock:/var/run/docker.sock
+ - portainer_data:/data
+
+ # - /var/lib/docker:/var/lib/docker
+ - ~/.ssh/id_rsa:/root/.ssh/id_rsa
+ ports:
+ - "8000:8000"
+ - "9443:9443"
+ restart: unless-stopped
################################################################################################################################
# This section is mostly for supervision from PC #
################################################################################################################################
- foxglove-bridge:
- image: husarion/foxglove-bridge:humble
- # Interactive shell
+ # Foxglove Studio Bridge
+ foxglove_bridge:
+ extends: overlay
+ command: >
+ ros2 launch foxglove_bridge foxglove_bridge_launch.xml port:=8765
stdin_open: true
tty: true
# Networking and IPC for ROS 2
- network_mode: host
+ #network_mode: host
ipc: host
- # Needed to display graphical applications
- #privileged: true
environment:
- # Allows graphical programs in the container.
- - DISPLAY=${DISPLAY}
- - QT_X11_NO_MITSHM=1
- - NVIDIA_DRIVER_CAPABILITIES=all
- ROS_DOMAIN_ID=5
- RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
foxglove:
- image: husarion/foxglove
+ #image: husarion/foxglove
+ image: ghcr.io/foxglove/studio:latest
+ restart: always
depends_on:
- - foxglove-bridge
+ - foxglove_bridge
+ networks:
+ - caddy_network
ports:
- 8080:8080
+ volumes:
+ - ./config/foxglove/extensions:/src/extensions
+ - ./config/foxglove/foxglove-layout.json:/foxglove/default-layout.json
# rviz2
rviz2:
@@ -200,4 +225,66 @@ services:
rviz2
# Needed to display graphical applications
privileged: true
-networks: {}
+
+################################################################################################################################
+# Core Services for Web Management #
+################################################################################################################################
+ caddy:
+ image: caddy:latest
+ networks:
+ - caddy_network
+ extra_hosts:
+ - "host.docker.internal:host-gateway"
+ ports:
+ - "80:80"
+ - "443:443"
+ volumes:
+ - ./config/caddy/Caddyfile:/etc/caddy/Caddyfile
+ - ./config/caddy/content:/usr/share/caddy/
+ restart: always
+ depends_on:
+ - foxglove
+ - olivetin
+ roscore:
+ image: husarion/ros1-bridge:foxy-0.9.6-20230327-stable
+ command: |
+ bash -c "source /opt/ros/noetic/setup.bash && roscore"
+ network_mode: host
+ environment:
+ - ROS_DOMAIN_ID=5
+ restart: always
+ ros1bridge:
+ image: husarion/ros1-bridge:foxy-0.9.6-20230327-stable
+ command: |
+ ros2 run ros1_bridge dynamic_bridge
+ network_mode: host
+ ipc: host
+ environment:
+ - ROS_DOMAIN_ID=5
+ - RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
+ restart: always
+ webui-joystick:
+ image: husarion/webui-ros-joystick:noetic-0.0.1-20230510-stable
+ network_mode: host
+ # networks:
+ # - caddy_network
+ # ports:
+ # - 8000:8000
+ ipc: host
+ environment:
+ - ROS_DOMAIN_ID=5
+ restart: always
+ depends_on:
+ - ros1bridge
+ command: roslaunch webui-ros-joystick webui.launch
+
+################################################################################################################################
+# Docker related extra stuff #
+################################################################################################################################
+networks:
+ caddy_network:
+ driver: bridge
+volumes:
+ portainer_data:
+ npm-data:
+ npm-letsencrypt:
\ No newline at end of file
diff --git a/docker/Dockerfile b/docker/Dockerfile
index 2225a88..ababe64 100644
--- a/docker/Dockerfile
+++ b/docker/Dockerfile
@@ -43,6 +43,11 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
ros-${ROS_DISTRO}-xacro \
&& rm -rf /var/lib/apt/lists/*
+# Install Foxglove Bridge
+RUN apt-get update && apt-get install -y --no-install-recommends \
+ ros-${ROS_DISTRO}-foxglove-bridge \
+ && rm -rf /var/lib/apt/lists/*
+
ENV RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
###########################################
@@ -93,45 +98,45 @@ LABEL org.opencontainers.image.source=https://github.com/bjoernellens1/cps_loki
#############################################
# OliveTin Build #
#############################################
-# FROM registry.fedoraproject.org/fedora:39 AS olivetin
+FROM registry.fedoraproject.org/fedora:39 AS olivetin
-# LABEL org.opencontainers.image.source https://ghcr.io/bjoernellens1/cps_bot_mini_ws/olivetin
-# LABEL org.opencontainers.image.title=OliveTin
+LABEL org.opencontainers.image.source https://ghcr.io/bjoernellens1/cps_bot_mini_ws/olivetin
+LABEL org.opencontainers.image.title=OliveTin
-# # Making sure there is newest docker version installed
-# RUN dnf -y install dnf-plugins-core \
-# && dnf -y install 'dnf-command(config-manager)' \
-# && dnf config-manager --add-repo https://download.docker.com/linux/fedora/docker-ce.repo \
-# && dnf -y install docker-ce-cli docker-compose-plugin --setopt=install_weak_deps=False
+# Making sure there is newest docker version installed
+RUN dnf -y install dnf-plugins-core \
+ && dnf -y install 'dnf-command(config-manager)' \
+ && dnf config-manager --add-repo https://download.docker.com/linux/fedora/docker-ce.repo \
+ && dnf -y install docker-ce-cli docker-compose-plugin --setopt=install_weak_deps=False
-# # Install OliveTin and dependencies
-# RUN mkdir -p /config /var/www/olivetin \
-# && dnf install -y --nodocs --noplugins --setopt=keepcache=0 --setopt=install_weak_deps=0 \
-# iputils \
-# openssh-clients \
-# shadow-utils \
-# OliveTin \
-# && dnf clean all
+# Install OliveTin and dependencies
+RUN mkdir -p /config /var/www/olivetin \
+ && dnf install -y --nodocs --noplugins --setopt=keepcache=0 --setopt=install_weak_deps=0 \
+ iputils \
+ openssh-clients \
+ shadow-utils \
+ OliveTin \
+ && dnf clean all
-# RUN useradd --system --create-home olivetin -u 1000
+RUN useradd --system --create-home olivetin -u 1000
-# EXPOSE 1337/tcp
+EXPOSE 1337/tcp
-# VOLUME /config
+VOLUME /config
-# USER olivetin
+USER olivetin
-# ENTRYPOINT [ "/usr/bin/OliveTin" ]
+ENTRYPOINT [ "/usr/bin/OliveTin" ]
-# FROM alpine AS olivetin
+FROM docker AS olivetin
+RUN wget https://github.com/OliveTin/OliveTin/releases/latest/download/OliveTin_linux_amd64.apk
+RUN apk add --allow-untrusted OliveTin_linux_amd64.apk
+# RUN wget https://github.com/OliveTin/OliveTin/releases/download/2023.12.21/OliveTin_linux_amd64.deb
+# RUN apt install ./OliveTin_linux_amd64.deb
+# Expose the default OliveTin port
+EXPOSE 1337
-# RUN wget https://github.com/OliveTin/OliveTin/releases/latest/download/OliveTin_linux_amd64.apk
-# RUN apk add --allow-untrusted OliveTin_linux_amd64.apk docker-cli-compose
-
-# # Expose the default OliveTin port
-# EXPOSE 1337
-
-# # Set the default command to run OliveTin
-# CMD ["OliveTin"]
\ No newline at end of file
+# Set the default command to run OliveTin
+CMD ["OliveTin"]
\ No newline at end of file
diff --git a/docs/loki_overview.odg b/docs/loki_overview.odg
new file mode 100644
index 0000000..99164e7
Binary files /dev/null and b/docs/loki_overview.odg differ
diff --git a/overlay.repos b/overlay.repos
index 5e3d78f..27faf7e 100644
--- a/overlay.repos
+++ b/overlay.repos
@@ -17,4 +17,4 @@ repositories:
cps_loki_bringup:
type: git
url: https://github.com/bjoernellens1/cps_loki_bringup
- version: main
+ version: tuning
diff --git a/scripts/ps4_controller_script.sh b/scripts/ps4_controller_script.sh
new file mode 100755
index 0000000..1767022
--- /dev/null
+++ b/scripts/ps4_controller_script.sh
@@ -0,0 +1,7 @@
+#!/bin/bash
+
+# Change directory to where docker-compose.yml is located
+cd /home/bjorn/git/cps_loki
+
+# Restart the teleop service using docker-compose
+docker compose restart teleop
diff --git a/scripts/setup.sh b/scripts/setup.sh
new file mode 100755
index 0000000..cb6eb1a
--- /dev/null
+++ b/scripts/setup.sh
@@ -0,0 +1,16 @@
+#!/bin/bash
+
+# copy script to a system directory
+sudo cp ps4_controller_script.sh /etc/udev/rules.d
+
+# Set execute permissions for the script
+sudo chmod +x /etc/udev/rules.d/ps4_controller_script.sh
+
+# Create or append the udev rule
+echo 'ACTION=="add", SUBSYSTEM=="input", ATTRS{name}=="Wireless Controller", RUN+="/etc/udev/rules.d/ps4_controller_script.sh"' | sudo tee /etc/udev/rules.d/99-ps4-controller.rules
+
+# Reload udev rules
+sudo udevadm control --reload-rules
+
+# Provide user feedback
+echo "Setup completed. PS4 controller udev rule installed."
\ No newline at end of file
diff --git a/sudo b/sudo
deleted file mode 100644
index c0230c8..0000000
--- a/sudo
+++ /dev/null
@@ -1 +0,0 @@
-powersave tee /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor /sys/devices/system/cpu/cpu1/cpufreq/scaling_governor