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 @@ +blueprint \ 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

+
+ + + + + +
+

Connect to Wi-Fi:

+ + +
+ + + + + + + + + +
SSID:cps-loki
Password: cps-loki
+
+
+ +
+ + Check us out! +
+ + + + + + \ 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 @@ +safety-glasses \ 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 @@ +wrench \ 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