Compare commits
4 Commits
main
...
build-acti
Author | SHA1 | Date | |
---|---|---|---|
|
e3f484edb4 | ||
|
958a0c70ef | ||
61f22aaf4f | |||
|
916b65da0f |
45
.github/workflows/docker-buildx-bake-build.yml
vendored
45
.github/workflows/docker-buildx-bake-build.yml
vendored
@ -1,45 +0,0 @@
|
||||
name: Docker Compose Build
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main # Change this to your main branch name
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
|
||||
#- name: Set up QEMU
|
||||
# run: docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
|
||||
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@v3
|
||||
|
||||
# - name: Login to Docker Hub (if needed)
|
||||
# uses: docker/login-action@v1
|
||||
# with:
|
||||
# username: ${{ secrets.DOCKER_USERNAME }}
|
||||
# password: ${{ secrets.DOCKER_PASSWORD }}
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
|
||||
#- name: Login to GitHub Container Registry
|
||||
# run: echo ${{ secrets.GHCR_PAT }} | docker login ghcr.io -u ${{ github.repository_owner }} --password-stdin
|
||||
- name: 'Login to GitHub Container Registry'
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
registry: ghcr.io
|
||||
username: ${{github.actor}}
|
||||
password: ${{secrets.GHCR_PAT}}
|
||||
|
||||
- name: Build and Push Docker Compose Services
|
||||
run: |
|
||||
docker buildx bake --push
|
||||
docker buildx bake -f docker-compose.yml --push
|
||||
#env:
|
||||
# COMPOSE_FILE: docker-compose.yml
|
97
.github/workflows/docker-publish.yml
vendored
Normal file
97
.github/workflows/docker-publish.yml
vendored
Normal file
@ -0,0 +1,97 @@
|
||||
name: Docker
|
||||
|
||||
# This workflow uses actions that are not certified by GitHub.
|
||||
# They are provided by a third-party and are governed by
|
||||
# separate terms of service, privacy policy, and support
|
||||
# documentation.
|
||||
|
||||
on:
|
||||
schedule:
|
||||
- cron: '25 23 * * *'
|
||||
push:
|
||||
branches: [ "build-action" ]
|
||||
# Publish semver tags as releases.
|
||||
tags: [ 'v*.*.*' ]
|
||||
pull_request:
|
||||
branches: [ "build-action" ]
|
||||
|
||||
env:
|
||||
# Use docker.io for Docker Hub if empty
|
||||
REGISTRY: ghcr.io
|
||||
# github.repository as <account>/<repo>
|
||||
IMAGE_NAME: ${{ github.repository }}
|
||||
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
packages: write
|
||||
# This is used to complete the identity challenge
|
||||
# with sigstore/fulcio when running outside of PRs.
|
||||
id-token: write
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v3
|
||||
|
||||
# Install the cosign tool except on PR
|
||||
# https://github.com/sigstore/cosign-installer
|
||||
- name: Install cosign
|
||||
if: github.event_name != 'pull_request'
|
||||
uses: sigstore/cosign-installer@6e04d228eb30da1757ee4e1dd75a0ec73a653e06 #v3.1.1
|
||||
with:
|
||||
cosign-release: 'v2.1.1'
|
||||
|
||||
# Workaround: https://github.com/docker/build-push-action/issues/461
|
||||
- name: Setup Docker buildx
|
||||
uses: docker/setup-buildx-action@79abd3f86f79a9d68a23c75a09a9a85889262adf
|
||||
|
||||
# Login against a Docker registry except on PR
|
||||
# https://github.com/docker/login-action
|
||||
- name: Log into registry ${{ env.REGISTRY }}
|
||||
if: github.event_name != 'pull_request'
|
||||
uses: docker/login-action@28218f9b04b4f3f62068d7b6ce6ca5b26e35336c
|
||||
with:
|
||||
registry: ${{ env.REGISTRY }}
|
||||
username: ${{ github.actor }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
# Extract metadata (tags, labels) for Docker
|
||||
# https://github.com/docker/metadata-action
|
||||
- name: Extract Docker metadata
|
||||
id: meta
|
||||
uses: docker/metadata-action@98669ae865ea3cffbcbaa878cf57c20bbf1c6c38
|
||||
with:
|
||||
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
|
||||
|
||||
# Build and push Docker image with Buildx (don't push on PR)
|
||||
# https://github.com/docker/build-push-action
|
||||
- name: Build and push Docker image
|
||||
id: build-and-push
|
||||
uses: docker/build-push-action@ac9327eae2b366085ac7f6a2d02df8aa8ead720a
|
||||
with:
|
||||
context: .
|
||||
push: ${{ github.event_name != 'pull_request' }}
|
||||
tags: ${{ steps.meta.outputs.tags }}
|
||||
labels: ${{ steps.meta.outputs.labels }}
|
||||
cache-from: type=gha
|
||||
cache-to: type=gha,mode=max
|
||||
|
||||
|
||||
# Sign the resulting Docker image digest except on PRs.
|
||||
# This will only write to the public Rekor transparency log when the Docker
|
||||
# repository is public to avoid leaking data. If you would like to publish
|
||||
# transparency data even for private images, pass --force to cosign below.
|
||||
# https://github.com/sigstore/cosign
|
||||
- name: Sign the published Docker image
|
||||
if: ${{ github.event_name != 'pull_request' }}
|
||||
env:
|
||||
# https://docs.github.com/en/actions/security-guides/security-hardening-for-github-actions#using-an-intermediate-environment-variable
|
||||
TAGS: ${{ steps.meta.outputs.tags }}
|
||||
DIGEST: ${{ steps.build-and-push.outputs.digest }}
|
||||
# This step uses the identity token to provision an ephemeral certificate
|
||||
# against the sigstore community Fulcio instance.
|
||||
run: echo "${TAGS}" | xargs -I {} cosign sign --yes {}@${DIGEST}
|
1
.gitignore
vendored
1
.gitignore
vendored
@ -1 +0,0 @@
|
||||
*.pgm
|
13
README.md
13
README.md
@ -3,24 +3,15 @@
|
||||
For the build with docker buildx bake you will need binfmt dependencies for arm64 architecture, as we are doing a multiplatform build (Works on PCs as well as Jetson Nano, Raspberry Pi, Apple Silicon Devices).
|
||||
|
||||
For Robot:
|
||||
```
|
||||
docker buildx bake overlay --load
|
||||
docker buildx bake overlay --push
|
||||
```
|
||||
e.g.:
|
||||
```
|
||||
docker compose up -d controller
|
||||
```
|
||||
|
||||
For PC:
|
||||
```
|
||||
docker buildx bake guis --load
|
||||
docker buildx bake guis --push
|
||||
```
|
||||
--> get into container shell:
|
||||
```
|
||||
docker compose run guis
|
||||
```
|
||||
or
|
||||
```
|
||||
docker compose up rviz2
|
||||
```
|
||||
docker compose up rviz2
|
26
bak/docker-bake.hcl
Normal file
26
bak/docker-bake.hcl
Normal file
@ -0,0 +1,26 @@
|
||||
# docker-bake.hcl
|
||||
group "default" {
|
||||
targets = ["base", "overlay_arm64", "overlay_amd64"]
|
||||
}
|
||||
|
||||
target "base" {
|
||||
dockerfile = "docker/Dockerfile"
|
||||
tags = ["ghcr.io/bjoernellens1/ros2_rmp/rmp:base"]
|
||||
}
|
||||
|
||||
target "overlay_arm64" {
|
||||
inherits = ["base"]
|
||||
dockerfile = "docker/Dockerfile.arm64"
|
||||
platforms = ["linux/arm64"]
|
||||
}
|
||||
|
||||
target "overlay_amd64" {
|
||||
inherits = ["base"]
|
||||
dockerfile = "docker/Dockerfile.amd64"
|
||||
platforms = ["linux/amd64"]
|
||||
}
|
||||
|
||||
target "db" {
|
||||
dockerfile = "Dockerfile.db"
|
||||
tags = ["docker.io/username/db"]
|
||||
}
|
29
cert.pem
29
cert.pem
@ -1,29 +0,0 @@
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIFCTCCAvGgAwIBAgIUSToN1sKvyyEHUX43N0x2pJ2tozYwDQYJKoZIhvcNAQEL
|
||||
BQAwFDESMBAGA1UEAwwJbG9jYWxob3N0MB4XDTIzMDgyMzE0NDgwMFoXDTI0MDgy
|
||||
MjE0NDgwMFowFDESMBAGA1UEAwwJbG9jYWxob3N0MIICIjANBgkqhkiG9w0BAQEF
|
||||
AAOCAg8AMIICCgKCAgEAuz16ToP/oe0GlHELnOxXVMbQ4ygDhAoJRDW+h3AN01QP
|
||||
GD8hKByM5QKUd1bnUa40jKeENerJLVpwvYW+wksIw8OEoU+XKLQav59LkumMx94Y
|
||||
92vhfYPEdjJGfBSemf4GALw0GmeizeglGKQAomBN2fV0Wege77T6aE3GSafzmgWk
|
||||
WKIXLzYd0C+fzMUnf7TtbpacG71D1VAryedq2/srR6ZnrP92SyWB6vJt9kdFxhie
|
||||
V0zdrmiLhKbj4QBHn2ZfBzBe33eLHEJc7DlQ7fkQr58PVnF35h0lIYC2YdZjGSIe
|
||||
1r12HGCvjDlDX3ygznsnMIIOGPd78vzpiVUlIk1MLqS4FeAMqyTFuljZ7UjG2+Yf
|
||||
p+9gJ/3vfbCiWmtwJOuZvCeXvCwUGlvJH7aFan9UKG0OCuIOBY+8ZqkbgKQ8lCNv
|
||||
hk5HD8z49pa2u9Tzau68KMLOIhJ000sPW17RrWTrQK0izLeNmxlUvNFtg65pCpE7
|
||||
yUinlKVfBjPraK1htuZL/E0MZ1sq9YV/VbjFQnrhad1bZ+DvLRuX2Ehd8gsUt6UL
|
||||
hQW3vq7GmXo0u+xT1XIkCEYdNUGo4xXKr925MmcRVa6gR5dsAuAoQ5cN/5z4wnJt
|
||||
eNonakERtPomAC/ACTsbr3RjpG6h0jPHXta5XC+PKydV9riuk/LAIRIF0dKGfHUC
|
||||
AwEAAaNTMFEwHQYDVR0OBBYEFKL/qoyl0fc1f6VBhW5GJDpae5a7MB8GA1UdIwQY
|
||||
MBaAFKL/qoyl0fc1f6VBhW5GJDpae5a7MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZI
|
||||
hvcNAQELBQADggIBADoEzbUqOiTbTOppCRP3q+l8Z3mlymtZgz/BcyGms+8B2LMC
|
||||
xSJ88+lkg23XG8KQ+oIOHDaLBsVUePeSLLt3MAtDMbBEDUsUf2nWK+l3IbNlMxTn
|
||||
1beb/FM1QRwLfbqGvVi7afpZvLH7wJc2SCv+996eW/Hau5yDxntqupjAd1G7pDrJ
|
||||
PQMJhmWg1VQHxBC1MyMVdz8r4nqBSIKN5XMxdrZitXOa6c2b2/SvolGN6UEUD1at
|
||||
LAbS1nXloBNVuOrmTCxRxCKxec8+2qs4QOc/Ux7jF9Q65TkW1IkucnDaOluDcufY
|
||||
n4GQXaRFyQJInoGpWlOM3hJ2ZlhlQj+tjuvTyu7uWCINC4r0bYqpIpY4mWzXKRFT
|
||||
e5M4nVy8YukjsM82zZRvXdD8Mlfuxb8xkpQBdqVClO24TSjZOCAw4qsizpV/N7S9
|
||||
NmQ5+2CI4l3KvhH1gAjtXvNOOicn7laXDtz5wc1fZxmUptQQp5JXFtSguLpJpGli
|
||||
r7s8wRPnVJW3HhjNIzYIzOm3J4dtl1+ZqHGfeFes+8ty2HAJK1AmnRvt8UQK3VjR
|
||||
YrlzbM6+cjzmJQ3S3LTXOi0Zssf6SQspCaAMP8hUXhZyi8y7PMNHpp/LuUEFox03
|
||||
/L8X5DB9SXofdFp+1jVh6WZCV8wt39Fxo+l+5afpeIc138XOkgvsrBFNzTi9
|
||||
-----END CERTIFICATE-----
|
@ -1,21 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<CycloneDDS xmlns="https://cdds.io/config" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://cdds.io/config https://raw.githubusercontent.com/eclipse-cyclonedds/cyclonedds/master/etc/cyclonedds.xsd">
|
||||
<Domain id="any">
|
||||
<General>
|
||||
<Interfaces>
|
||||
<NetworkInterface name="tailscale0"/>
|
||||
</Interfaces>
|
||||
<AllowMulticast>true</AllowMulticast>
|
||||
</General>
|
||||
<Discovery>
|
||||
<Peers>
|
||||
</Peers>
|
||||
<ParticipantIndex>auto</ParticipantIndex>
|
||||
<MaxAutoParticipantIndex>40</MaxAutoParticipantIndex>
|
||||
</Discovery>
|
||||
<Tracing>
|
||||
<Verbosity>severe</Verbosity>
|
||||
<OutputFile>stdout</OutputFile>
|
||||
</Tracing>
|
||||
</Domain>
|
||||
</CycloneDDS>
|
@ -1,50 +0,0 @@
|
||||
#!/bin/bash
|
||||
# Basic entrypoint for ROS / Colcon Docker containers
|
||||
|
||||
UNDERLAY_WS=/rmp_ws
|
||||
|
||||
# Source ROS 2
|
||||
source /opt/ros/${ROS_DISTRO}/setup.bash
|
||||
echo "Sourced ROS 2 ${ROS_DISTRO}"
|
||||
|
||||
# Source the base workspace, if built
|
||||
if [ -f ${UNDERLAY_WS}/install/setup.bash ]
|
||||
then
|
||||
source ${UNDERLAY_WS}/install/setup.bash
|
||||
# vcs pull ${UNDERLAY_WS}/src
|
||||
echo "Sourced CPS RMP 220 base workspace"
|
||||
fi
|
||||
|
||||
# Source the overlay workspace, if built
|
||||
if [ -f /overlay_ws/install/setup.bash ]
|
||||
then
|
||||
source /overlay_ws/install/setup.bash
|
||||
# vcs pull /overlay_ws/src
|
||||
echo "Sourced CPS RMP 220 Overlay workspace"
|
||||
fi
|
||||
|
||||
# Source the bridge workspace, if built
|
||||
if [ -f ~/ros2_humble/install/setup.bash ]
|
||||
then
|
||||
source ~/ros2_humbleinstall/setup.bash
|
||||
#export GAZEBO_MODEL_PATH=$GAZEBO_MODEL_PATH:$(ros2 pkg prefix turtlebot3_gazebo)/share/turtlebot3_gazebo/models
|
||||
echo "Sourced CPS RMP 220 base workspace"
|
||||
fi
|
||||
|
||||
# Implement updating all repositories at launch
|
||||
# if [ -f ${UNDERLAY_WS}/]
|
||||
# then
|
||||
# cd ${UNDERLAY_WS}
|
||||
# vcs pull src
|
||||
# echo "Updated base workspace"
|
||||
# fi
|
||||
|
||||
# if [ -f /overlay_ws/]
|
||||
# then
|
||||
# cd /overlay_ws
|
||||
# vcs pull src
|
||||
# echo "Updated overlay workspace"
|
||||
# fi
|
||||
|
||||
# Execute the command passed into this entrypoint
|
||||
exec "$@"
|
@ -1,633 +0,0 @@
|
||||
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
|
||||
scan_topic: /scan_filtered
|
||||
use_map_saver: true
|
||||
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: test_steve
|
||||
#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: 5.0
|
||||
resolution: 0.02 # was 0.05 ; resolution equals to how many meters are 1 pixel on the map. So the lower value the higher the resoltion
|
||||
max_laser_range: 20.0 #for rastering images
|
||||
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
|
||||
controller_server:
|
||||
ros__parameters:
|
||||
controller_frequency: 50.0 # was 30.0 # ! must be float!
|
||||
FollowPath:
|
||||
plugin: "nav2_mppi_controller::MPPIController"
|
||||
time_steps: 56
|
||||
model_dt: 0.05
|
||||
batch_size: 1000 # was 2000
|
||||
vx_std: 0.2
|
||||
vy_std: 0.2
|
||||
wz_std: 0.4
|
||||
vx_max: 0.5
|
||||
vx_min: -0.35
|
||||
vy_max: 0.5
|
||||
wz_max: 1.9
|
||||
iteration_count: 1
|
||||
prune_distance: 1.7
|
||||
transform_tolerance: 0.1
|
||||
temperature: 0.3
|
||||
gamma: 0.015
|
||||
motion_model: "DiffDrive"
|
||||
visualize: false
|
||||
reset_period: 1.0 # (only in Humble)
|
||||
regenerate_noises: false
|
||||
TrajectoryVisualizer:
|
||||
trajectory_step: 5
|
||||
time_step: 3
|
||||
AckermannConstraints:
|
||||
min_turning_r: 0.1 # was0.2 # only active for ackermann
|
||||
critics: ["ConstraintCritic", "ObstaclesCritic", "GoalCritic", "GoalAngleCritic", "PathAlignCritic", "PathFollowCritic", "PathAngleCritic", "PreferForwardCritic"]
|
||||
ConstraintCritic:
|
||||
enabled: true
|
||||
cost_power: 1
|
||||
cost_weight: 4.0
|
||||
GoalCritic:
|
||||
enabled: true
|
||||
cost_power: 1
|
||||
cost_weight: 5.0
|
||||
threshold_to_consider: 1.4
|
||||
GoalAngleCritic:
|
||||
enabled: true
|
||||
cost_power: 1
|
||||
cost_weight: 3.0
|
||||
threshold_to_consider: 0.5
|
||||
PreferForwardCritic:
|
||||
enabled: true
|
||||
cost_power: 1
|
||||
cost_weight: 10.0 # was 5.0
|
||||
threshold_to_consider: 0.5
|
||||
ObstaclesCritic:
|
||||
enabled: true
|
||||
cost_power: 1
|
||||
repulsion_weight: 1.5
|
||||
critical_weight: 20.0
|
||||
consider_footprint: true # was false
|
||||
collision_cost: 10000.0
|
||||
collision_margin_distance: 0.1
|
||||
near_goal_distance: 0.5
|
||||
inflation_radius: 0.35 #was0.55 # (only in Humble)
|
||||
cost_scaling_factor: 10.0 # (only in Humble)
|
||||
PathAlignCritic:
|
||||
enabled: true
|
||||
cost_power: 1
|
||||
cost_weight: 14.0
|
||||
max_path_occupancy_ratio: 0.05
|
||||
trajectory_point_step: 3
|
||||
threshold_to_consider: 0.5
|
||||
offset_from_furthest: 20
|
||||
use_path_orientations: true # was false
|
||||
PathFollowCritic:
|
||||
enabled: true
|
||||
cost_power: 1
|
||||
cost_weight: 5.0
|
||||
offset_from_furthest: 5
|
||||
threshold_to_consider: 1.4
|
||||
PathAngleCritic:
|
||||
enabled: true
|
||||
cost_power: 1
|
||||
cost_weight: 2.0
|
||||
offset_from_furthest: 4
|
||||
threshold_to_consider: 0.5
|
||||
max_angle_to_furthest: 1.0
|
||||
mode: 0
|
||||
# TwirlingCritic:
|
||||
# enabled: true
|
||||
# twirling_cost_power: 1
|
||||
# twirling_cost_weight: 10.0
|
||||
|
||||
|
||||
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.02 # was 0.05 ; this param control the resolution how many meters is 1 pixel on the map
|
||||
#robot_radius: 0.22
|
||||
footprint: "[ [0.18, 0.200], [0.18, -0.200], [-0.54, -0.165], [-0.54, 0.165] ]" # 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 ;exponential rate at which the obstacle cost drops off (default: 10)
|
||||
inflation_radius: 0.35 # max. distance from an obstacle at which costs are incurred for planning paths.
|
||||
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.18, 0.255], [0.18, -0.255], [-0.54, -0.165], [-0.54, 0.165] ]" # 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.35
|
||||
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
|
||||
planner_server:
|
||||
ros__parameters:
|
||||
planner_plugins: ["GridBased"]
|
||||
use_sim_time: True
|
||||
|
||||
GridBased:
|
||||
plugin: "nav2_smac_planner/SmacPlannerHybrid"
|
||||
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)
|
||||
tolerance: 0.25 # dist-to-goal heuristic cost (distance) for valid tolerance endpoints if exact goal cannot be found.
|
||||
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 after within tolerances to continue to try to find exact solution
|
||||
max_planning_time: 5.0 # max time in s for planner to plan, smooth
|
||||
motion_model_for_search: "DUBIN" # Hybrid-A* Dubin, Redds-Shepp
|
||||
angle_quantization_bins: 72 # Number of angle bins for search
|
||||
analytic_expansion_ratio: 3.5 # The ratio to attempt analytic expansions during search for final approach.
|
||||
analytic_expansion_max_length: 3.0 # For Hybrid/Lattice nodes: The maximum length of the analytic expansion to be considered valid to prevent unsafe shortcutting
|
||||
analytic_expansion_max_cost: true # The maximum single cost for any part of an analytic expansion to contain and be valid, except when necessary on approach to goal
|
||||
analytic_expansion_max_cost_override: false # Whether or not to override the maximum cost setting if within critical distance to goal (ie probably required)
|
||||
minimum_turning_radius: 0.20 # was 0.40 # minimum turning radius in m of path / vehicle
|
||||
reverse_penalty: 1.0 #was2.0 # Penalty to apply if motion is reversing, must be => 1
|
||||
change_penalty: 0.0 # Penalty to apply if motion is changing directions (L to R), must be >= 0
|
||||
non_straight_penalty: 2.0 #was 1.2 # Penalty to apply if motion is non-straight, must be => 1
|
||||
cost_penalty: 2.0 # Penalty to apply to higher cost areas when adding into the obstacle map dynamic programming distance expansion heuristic. This drives the robot more towards the center of passages. A value between 1.3 - 3.5 is reasonable.
|
||||
retrospective_penalty: 0.015
|
||||
lookup_table_size: 20.0 # Size of the dubin/reeds-sheep distance window to cache, in meters.
|
||||
cache_obstacle_heuristic: true #was false # Cache the obstacle map dynamic programming distance expansion heuristic between subsiquent replannings of the same goal location. Dramatically speeds up replanning performance (40x) if costmap is largely static.
|
||||
debug_visualizations: false # For Hybrid nodes: Whether to publish expansions on the /expansions topic as an array of poses (the orientation has no meaning) and the path's footprints on the /planned_footprints topic. WARNING: heavy to compute and to display, for debug only as it degrades the performance.
|
||||
use_quadratic_cost_penalty: True #was False
|
||||
downsample_obstacle_heuristic: True
|
||||
allow_primitive_interpolation: False
|
||||
smooth_path: True # If true, does a simple and quick smoothing post-processing to the path
|
||||
|
||||
smoother:
|
||||
max_iterations: 1000
|
||||
w_smooth: 0.3
|
||||
w_data: 0.2
|
||||
tolerance: 1.0e-10
|
||||
do_refinement: true
|
||||
refinement_num: 2
|
||||
|
||||
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
|
@ -1,8 +1,6 @@
|
||||
#!/bin/bash
|
||||
# Basic entrypoint for ROS / Colcon Docker containers
|
||||
|
||||
UNDERLAY_WS=/rmp_ws
|
||||
|
||||
# Source ROS 2
|
||||
source /opt/ros/${ROS_DISTRO}/setup.bash
|
||||
echo "Sourced ROS 2 ${ROS_DISTRO}"
|
||||
@ -12,28 +10,20 @@ if [ -f ${UNDERLAY_WS}/install/setup.bash ]
|
||||
then
|
||||
source ${UNDERLAY_WS}/install/setup.bash
|
||||
#export GAZEBO_MODEL_PATH=$GAZEBO_MODEL_PATH:$(ros2 pkg prefix turtlebot3_gazebo)/share/turtlebot3_gazebo/models
|
||||
echo "Sourced CPS RMP 220 base workspace"
|
||||
echo "Sourced Bot Mini base workspace"
|
||||
fi
|
||||
|
||||
# Source the overlay workspace, if built
|
||||
if [ -f /overlay_ws/install/setup.bash ]
|
||||
then
|
||||
source /overlay_ws/install/setup.bash
|
||||
echo "Sourced CPS RMP 220 Overlay workspace"
|
||||
#export GAZEBO_MODEL_PATH=$GAZEBO_MODEL_PATH:$(ros2 pkg prefix tb3_worlds)/share/tb3_worlds/models
|
||||
echo "Sourced Bot Mini overlay workspace"
|
||||
fi
|
||||
|
||||
# Source the bridge workspace, if built
|
||||
if [ -f /opt/ros/melodic/local_setup.bash ]
|
||||
then
|
||||
source /opt/ros/melodic/local_setup.bash
|
||||
echo "Sourced melodic distribution"
|
||||
fi
|
||||
# Start Robot ROS2 Nodes
|
||||
ros2 launch bot_mini_bringup robot_controller.launch.py priority:=80 cpu-affinity:=4 lock-memory-size:=100 config-child-threads:=True &
|
||||
ros2 launch bot_mini_bringup robot_twist_mux.launch.py &
|
||||
ros2 launch bot_mini_bringup robot_joy_teleop.launch.py
|
||||
|
||||
if [ -f /opt/ros/eloquent/local_setup.bash ]
|
||||
then
|
||||
source /opt/ros/eloquent/local_setup.bash
|
||||
echo "Sourced eloquent distribution"
|
||||
fi
|
||||
|
||||
# Execute the command passed into this entrypoint
|
||||
exec "$@"
|
||||
wait
|
@ -15,14 +15,4 @@ repositories:
|
||||
RPlidar_ROS2:
|
||||
type: git
|
||||
url: https://github.com/bjoernellens1/sllidar_ros2
|
||||
version: main
|
||||
|
||||
rmp220_teleop:
|
||||
type: git
|
||||
url: https://github.com/bjoernellens1/rmp220_teleop.git
|
||||
version: main
|
||||
|
||||
rmp220_middleware:
|
||||
type: git
|
||||
url: https://github.com/bjoernellens1/rmp220_middleware.git
|
||||
version: main
|
@ -15,14 +15,4 @@ repositories:
|
||||
RPlidar_ROS2:
|
||||
type: git
|
||||
url: https://github.com/bjoernellens1/sllidar_ros2
|
||||
version: main
|
||||
|
||||
rmp220_teleop:
|
||||
type: git
|
||||
url: https://github.com/bjoernellens1/rmp220_teleop.git
|
||||
version: main
|
||||
|
||||
rmp220_middleware:
|
||||
type: git
|
||||
url: https://github.com/bjoernellens1/rmp220_middleware.git
|
||||
version: main
|
@ -1,28 +1,5 @@
|
||||
version: "3.9"
|
||||
|
||||
# First network configuration. Change this to the network interface you want to use primarily. (Better configuration for multiple Network interfaces needed).
|
||||
networks:
|
||||
# rmp:
|
||||
# driver: macvlan
|
||||
# driver_opts:
|
||||
# parent: eno1 # robot network interface
|
||||
# ipam:
|
||||
# config:
|
||||
# - subnet: 192.168.0.0/24
|
||||
# gateway: 192.168.0.1
|
||||
# ip_range: 192.168.0.200/25
|
||||
# aux_addresses:
|
||||
# net-address: 192.168.0.100 #? what is this for --> to exclude addresses from buing used.
|
||||
# make new bridge network for ros
|
||||
rmp:
|
||||
driver: bridge
|
||||
# ipam:
|
||||
# config:
|
||||
# - subnet:
|
||||
|
||||
# add this mountpoint to all services: - ./customize/entrypoint.sh:/entrypoint.sh
|
||||
# Attention: child services will inherit settings from their parents. So if you set a network_mode: host in the base service, all child services will also use host networking. This is not always what you want. So be careful with this.
|
||||
|
||||
services:
|
||||
# Base image containing dependencies.
|
||||
base:
|
||||
@ -30,8 +7,6 @@ services:
|
||||
build:
|
||||
context: .
|
||||
dockerfile: docker/Dockerfile
|
||||
tags:
|
||||
- ghcr.io/bjoernellens1/ros2_rmp/rmp:base
|
||||
args:
|
||||
ROS_DISTRO: humble
|
||||
target: base
|
||||
@ -39,6 +14,7 @@ services:
|
||||
platforms:
|
||||
- linux/arm64
|
||||
- linux/amd64
|
||||
|
||||
# Interactive shell
|
||||
stdin_open: true
|
||||
tty: true
|
||||
@ -46,26 +22,16 @@ services:
|
||||
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
|
||||
# set correct ros2 parameters: domain id and rmw implementation
|
||||
- ROS_DOMAIN_ID=5
|
||||
- RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
|
||||
- CYCLONEDDS_URI=file:///cyclonedds.xml
|
||||
volumes:
|
||||
# Allows graphical programs in the container.
|
||||
- /tmp/.X11-unix:/tmp/.X11-unix:rw
|
||||
- ${XAUTHORITY:-$HOME/.Xauthority}:/root/.Xauthority
|
||||
- ./config/entrypoint.sh:/entrypoint.sh
|
||||
- ./config/cyclonedds.xml:/cyclonedds.xml
|
||||
restart: unless-stopped
|
||||
|
||||
# networks: # not using bridging anymore, instead try using all services on macvlan? let's see... shoudl word for now. Bridging does definitely not work because multicast is not supported here.
|
||||
# rmp:
|
||||
# #ipv4_address: 192.168.0.101 #actually don't need to set ips. they are set automatically by docker-compose. SHould be inherited by all child services.
|
||||
|
||||
# Overlay image containing the project specific source code.
|
||||
overlay:
|
||||
@ -100,289 +66,144 @@ services:
|
||||
platforms:
|
||||
- linux/arm64
|
||||
- linux/amd64
|
||||
#entrypoint: /bin/bash
|
||||
command: >
|
||||
/bin/bash
|
||||
devices:
|
||||
- /dev/dri:/dev/dri
|
||||
|
||||
# Robot State Publisher
|
||||
rsp:
|
||||
robot_state_publisher:
|
||||
extends: overlay
|
||||
command: >
|
||||
ros2 launch cps_rmp220_support rsp.launch.py
|
||||
stdin_open: true
|
||||
tty: true
|
||||
# Networking and IPC for ROS 2
|
||||
network_mode: host
|
||||
ipc: host
|
||||
environment:
|
||||
- ROS_DOMAIN_ID=5
|
||||
|
||||
# Controller
|
||||
controller:
|
||||
extends: base
|
||||
extends: overlay
|
||||
command: >
|
||||
ros2 run segwayrmp SmartCar --ros-args -r cmd_vel:=cmd_vel_out -p serial_full_name:=/dev/segway
|
||||
ros2 launch cps_rmp220_support robot_controller.launch.py
|
||||
devices:
|
||||
- /dev/segway:/dev/ttyUSB0
|
||||
#- /dev/ttyUSB0:/dev/ttyUSB0
|
||||
- /dev/ttyUSB0:/dev/ttyUSB0
|
||||
- /dev/ttyUSB1:/dev/ttyUSB1
|
||||
- /dev/ttyACM0:/dev/ttyACM0
|
||||
# Interactive shell
|
||||
stdin_open: true
|
||||
tty: true
|
||||
# Networking and IPC for ROS 2
|
||||
network_mode: host
|
||||
ipc: host
|
||||
# Needed to display graphical applications
|
||||
privileged: true
|
||||
# depends_on:
|
||||
# - robot_state_publisher
|
||||
environment:
|
||||
- ROS_DOMAIN_ID=5
|
||||
restart: unless-stopped
|
||||
|
||||
# teleop
|
||||
teleop:
|
||||
extends: base
|
||||
depends_on:
|
||||
- controller
|
||||
extends: overlay
|
||||
command: >
|
||||
ros2 launch rmp220_teleop robot_joystick.launch.py
|
||||
ros2 launch cps_rmp220_support robot_joystick.launch.py
|
||||
devices:
|
||||
- /dev/input/js0:/dev/input/js0
|
||||
#- /dev/input/by-id/usb-Logitech_Wireless_Gamepad_F710_56679674-joystick:/dev/input/by-id/usb-Logitech_Wireless_Gamepad_F710_56679674-joystick
|
||||
# Interactive shell
|
||||
stdin_open: true
|
||||
tty: true
|
||||
# Networking and IPC for ROS 2
|
||||
network_mode: host
|
||||
ipc: host
|
||||
# Needed to display graphical applications
|
||||
privileged: true
|
||||
environment:
|
||||
- ROS_DOMAIN_ID=5
|
||||
|
||||
# lidar
|
||||
lidar:
|
||||
extends: overlay
|
||||
command: >
|
||||
ros2 launch cps_rmp220_support robot_lidar.launch.py
|
||||
stdin_open: true
|
||||
tty: true
|
||||
# Networking and IPC for ROS 2
|
||||
network_mode: host
|
||||
ipc: host
|
||||
depends_on:
|
||||
- lidar_filter
|
||||
command: >
|
||||
ros2 launch cps_rmp220_support robot_lidar.launch.py serial_port:=/dev/rplidarA1
|
||||
devices:
|
||||
- /dev/rplidarA1:/dev/rplidarA1 #udevrules needed for this to work:
|
||||
# SUBSYSTEM=="tty", ATTRS{serial}=="0001", SYMLINK+="segway"
|
||||
# SUBSYSTEM=="tty", ATTRS{serial}=="3453995662b3af4f81f4a69eba5f3f29", SYMLINK+="rplidarA1"
|
||||
|
||||
# Lidar filtering node.
|
||||
lidar_filter:
|
||||
extends: overlay
|
||||
command: >
|
||||
ros2 launch cps_rmp220_support robot_scan_filter.launch.py
|
||||
|
||||
# localization by ekf node
|
||||
ekf:
|
||||
extends: overlay
|
||||
depends_on:
|
||||
- controller
|
||||
- rsp
|
||||
command: >
|
||||
ros2 launch cps_rmp220_support robot_localization.launch.py
|
||||
- robot_state_publisher
|
||||
environment:
|
||||
- ROS_DOMAIN_ID=5
|
||||
|
||||
# mapping
|
||||
mapping:
|
||||
extends: overlay
|
||||
depends_on:
|
||||
- ekf
|
||||
- rsp
|
||||
- lidar
|
||||
command: >
|
||||
ros2 launch cps_rmp220_support robot_mapping.launch.py
|
||||
|
||||
# slam-toolbox-localization
|
||||
localization:
|
||||
extends: overlay
|
||||
depends_on:
|
||||
- ekf
|
||||
- rsp
|
||||
- lidar
|
||||
command: >
|
||||
ros2 launch cps_rmp220_support robot_mapping_localization.launch.py map_file_name:=/repo/maps/map.yaml
|
||||
|
||||
# amcl_localization
|
||||
amcl:
|
||||
extends: overlay
|
||||
depends_on:
|
||||
- ekf
|
||||
- rsp
|
||||
- lidar
|
||||
command: >
|
||||
ros2 launch cps_rmp220_support robot_amcl.launch.py map:=/repo/maps/map.yaml
|
||||
# Interactive shell
|
||||
stdin_open: true
|
||||
tty: true
|
||||
# Networking and IPC for ROS 2
|
||||
network_mode: host
|
||||
ipc: host
|
||||
environment:
|
||||
- ROS_DOMAIN_ID=5
|
||||
|
||||
# navigation
|
||||
navigation:
|
||||
extends: overlay
|
||||
depends_on:
|
||||
- controller
|
||||
- teleop
|
||||
- rsp
|
||||
- lidar
|
||||
- ekf
|
||||
- oakd
|
||||
command: >
|
||||
ros2 launch nav2_bringup bringup_launch.py slam:=False map:=/repo/maps/map_01-26-24.yaml use_sim_time:=False use_composition:=True params_file:=/repo/config/nav2_params.yaml
|
||||
#maps/map_openlabday.yaml
|
||||
ros2 launch cps_rmp220_support robot_navigation.launch.py
|
||||
map_subscribe_transient_local:=true
|
||||
stdin_open: true
|
||||
tty: true
|
||||
# Networking and IPC for ROS 2
|
||||
network_mode: host
|
||||
ipc: host
|
||||
environment:
|
||||
- ROS_DOMAIN_ID=5
|
||||
|
||||
# bash
|
||||
bash:
|
||||
extends: overlay
|
||||
command: >
|
||||
/bin/bash
|
||||
stdin_open: true
|
||||
tty: true
|
||||
# Networking and IPC for ROS 2
|
||||
network_mode: host
|
||||
ipc: host
|
||||
devices:
|
||||
- /dev/input/js0:/dev/input/js0
|
||||
environment:
|
||||
- ROS_DOMAIN_ID=5
|
||||
|
||||
# rviz2
|
||||
rviz2:
|
||||
#extends: guis
|
||||
image: ghcr.io/bjoernellens1/ros2_rmp/rmp:guis
|
||||
extends: guis
|
||||
# command: >
|
||||
# ros2 launch cps_rmp220_support robot_rviz2.launch.py
|
||||
command: >
|
||||
ros2 launch cps_rmp220_support rviz.launch.py
|
||||
rviz2
|
||||
# Interactive shell
|
||||
stdin_open: true
|
||||
tty: true
|
||||
# Networking and IPC for ROS 2
|
||||
network_mode: host
|
||||
ipc: host
|
||||
# Needed to display graphical applications
|
||||
privileged: true # really necessary?
|
||||
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
|
||||
volumes:
|
||||
# Allows graphical programs in the container.
|
||||
- /tmp/.X11-unix:/tmp/.X11-unix:rw
|
||||
- ${XAUTHORITY:-$HOME/.Xauthority}:/root/.Xauthority
|
||||
|
||||
# Foxglove Studio Bridge
|
||||
foxglove_bridge:
|
||||
extends: overlay
|
||||
command: >
|
||||
ros2 launch foxglove_bridge foxglove_bridge_launch.xml port:=8765
|
||||
#tls:=true certfile:=/certs/foxgloveCert.crt keyfile:=/certs/foxgloveKey.key
|
||||
volumes:
|
||||
- /opt/cps/certs:/certs
|
||||
|
||||
# Foxglove Studio Webserver
|
||||
foxglove:
|
||||
image: ghcr.io/foxglove/studio:latest
|
||||
stdin_open: true
|
||||
tty: true
|
||||
# Networking
|
||||
network_mode: bridge
|
||||
ports:
|
||||
- 8080:8080
|
||||
depends_on:
|
||||
- foxglove_bridge
|
||||
volumes:
|
||||
- ./foxglove/default.json:/foxglove/default-layout.json
|
||||
|
||||
# USB Camera Stream
|
||||
cam:
|
||||
extends: overlay
|
||||
command: >
|
||||
ros2 run ros2_cam_openCV cam_node
|
||||
devices:
|
||||
- /dev/video0:/dev/video0
|
||||
|
||||
|
||||
# ROS2 Frontier exploration
|
||||
explorer:
|
||||
extends: overlay
|
||||
depends_on:
|
||||
- controller
|
||||
- teleop
|
||||
- rsp
|
||||
- lidar
|
||||
- ekf
|
||||
- navigation
|
||||
command: >
|
||||
ros2 launch cps_rmp220_support robot_exploration.launch.py
|
||||
|
||||
### Images for ROS1 Interactions
|
||||
#ROS1 Bridge
|
||||
ros1bridge:
|
||||
image: ghcr.io/bjoernellens1/ros2_rmp/ros1bridge
|
||||
command: >
|
||||
ros2 run ros1_bridge dynamic_bridge --bridge-all-2to1-topics
|
||||
build:
|
||||
context: .
|
||||
dockerfile: docker/Dockerfile
|
||||
tags:
|
||||
- ghcr.io/bjoernellens1/ros2_rmp/ros1bridge
|
||||
args:
|
||||
ROS_DISTRO: humble
|
||||
target: bridge
|
||||
x-bake:
|
||||
platforms:
|
||||
#- linux/arm64
|
||||
- linux/amd64
|
||||
# Networking and IPC for ROS 2
|
||||
network_mode: host
|
||||
ipc: host
|
||||
environment:
|
||||
- ROS_DOMAIN_ID=5
|
||||
- RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
|
||||
- ROS_MASTER_URI=http://localhost:11311 # is configured to run roscore on the robot but could change to local ros1 machine here
|
||||
|
||||
#ROS1 roscore
|
||||
roscore:
|
||||
command: >
|
||||
roscore
|
||||
extends: ros1bridge
|
||||
network_mode: host
|
||||
ipc: host
|
||||
environment:
|
||||
- ROS_DOMAIN_ID=5
|
||||
- RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
|
||||
- ROS_MASTER_URI=http://localhost:11311 # is configured to run roscore on the robot but could change to local ros1 machine here
|
||||
|
||||
## Configure on ROS1 Hosts
|
||||
# seggy 192.168.0.100
|
||||
# locally running ros-package: control1
|
||||
# subscribing topic2
|
||||
# publishing topic1
|
||||
|
||||
# robot2 192.168.x.x
|
||||
# locally running ros-package: control2
|
||||
# subscribing topic1
|
||||
# publishing topic2
|
||||
# As we need one ros-master to control the communication, we choose 192.168.1.1 as master. Therefore we execute locally on robot 1:
|
||||
|
||||
# export ROS_MASTER_URI=http://192.168.0.100:11311 # or localhost?
|
||||
# export ROS_HOSTNAME=192.168.0.100
|
||||
# export ROS_IP=192.168.0.100
|
||||
# roscore
|
||||
|
||||
# In order to connect to the ROS-master, we execute locally on robot2:
|
||||
|
||||
# export ROS_MASTER_URI=http://192.168.0.100:11311
|
||||
# export ROS_IP=192.168.0.?
|
||||
# export ROS_HOSTNAME=192.168.1.?
|
||||
|
||||
# ROS2 oak-d-lite camera
|
||||
oakd:
|
||||
extends: overlay
|
||||
command: >
|
||||
ros2 launch depthai_examples stereo.launch.py
|
||||
#devices:
|
||||
#- /dev/oakd-lite:/dev/oakd-lite # need corresponding udevrules for this to work:
|
||||
# SUBSYSTEM=="usb", ATTRS{idVendor}=="03e7", MODE="0666", SYMLINK+="oakd-lite"
|
||||
#- /dev/:/dev/
|
||||
device_cgroup_rules:
|
||||
- 'c 189:* rmw'
|
||||
volumes:
|
||||
- /dev/bus/usb:/dev/bus/usb
|
||||
|
||||
# for testing the oak-d-lite camera -> works now with cgroup rules
|
||||
depthai:
|
||||
image: luxonis/depthai:latest
|
||||
command: >
|
||||
python3 /depthai/depthai_demo.py
|
||||
stdin_open: true
|
||||
tty: true
|
||||
device_cgroup_rules:
|
||||
- 'c 189:* rmw'
|
||||
volumes:
|
||||
- /dev/bus/usb:/dev/bus/usb
|
||||
environment:
|
||||
- DISPLAY=${DISPLAY}
|
||||
- QT_X11_NO_MITSHM=1
|
||||
- NVIDIA_DRIVER_CAPABILITIES=all
|
||||
|
||||
zerotier:
|
||||
image: "zyclonite/zerotier:router"
|
||||
container_name: zerotier-one
|
||||
devices:
|
||||
- /dev/net/tun
|
||||
network_mode: host
|
||||
volumes:
|
||||
- '/var/lib/zerotier-one:/var/lib/zerotier-one'
|
||||
cap_add:
|
||||
- NET_ADMIN
|
||||
- SYS_ADMIN
|
||||
- NET_RAW
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
- TZ=Europe/Amsterdam
|
||||
- PUID=1000
|
||||
- PGID=1000
|
||||
- ZEROTIER_ONE_LOCAL_PHYS=enp5s0 wlx00e04c5513fc # change for actual interfaces
|
||||
- ZEROTIER_ONE_USE_IPTABLES_NFT=false
|
||||
- ZEROTIER_ONE_GATEWAY_MODE=inbound # might change to both ways
|
||||
#- ZEROTIER_ONE_NETWORK_IDS= # does not really do much?
|
||||
- ${XAUTHORITY:-$HOME/.Xauthority}:/root/.Xauthority
|
@ -1,460 +0,0 @@
|
||||
version: "3.9"
|
||||
|
||||
# First network configuration. Change this to the network interface you want to use primarily. (Better configuration for multiple Network interfaces needed).
|
||||
networks:
|
||||
rmp:
|
||||
driver: macvlan
|
||||
driver_opts:
|
||||
parent: eno1 # robot network interface
|
||||
ipam:
|
||||
config:
|
||||
- subnet: 192.168.0.0/24
|
||||
gateway: 192.168.0.1
|
||||
ip_range: 192.168.0.200/25
|
||||
aux_addresses:
|
||||
net-address: 192.168.0.100 #? what is this for --> to exclude addresses from buing used.
|
||||
|
||||
services:
|
||||
# Base image containing dependencies.
|
||||
base:
|
||||
image: ghcr.io/bjoernellens1/ros2_rmp/rmp:base
|
||||
build:
|
||||
context: .
|
||||
dockerfile: docker/Dockerfile
|
||||
tags:
|
||||
- ghcr.io/bjoernellens1/ros2_rmp/rmp:base
|
||||
args:
|
||||
ROS_DISTRO: humble
|
||||
target: base
|
||||
x-bake:
|
||||
platforms:
|
||||
- linux/arm64
|
||||
- linux/amd64
|
||||
|
||||
# Interactive shell
|
||||
stdin_open: true
|
||||
tty: true
|
||||
# Networking and IPC for ROS 2
|
||||
#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
|
||||
volumes:
|
||||
# Allows graphical programs in the container.
|
||||
- /tmp/.X11-unix:/tmp/.X11-unix:rw
|
||||
- ${XAUTHORITY:-$HOME/.Xauthority}:/root/.Xauthority
|
||||
|
||||
networks: # not using bridging anymore, instead try using all services on macvlan? let's see... shoudl word for now. Bridging does definitely not work because multicast is not supported here.
|
||||
rmp:
|
||||
#ipv4_address: 192.168.0.101 #actually don't need to set ips. they are set automatically by docker-compose. SHould be inherited by all child services.
|
||||
|
||||
# Overlay image containing the project specific source code.
|
||||
overlay:
|
||||
extends: base
|
||||
image: ghcr.io/bjoernellens1/ros2_rmp/rmp:overlay
|
||||
build:
|
||||
context: .
|
||||
dockerfile: docker/Dockerfile
|
||||
tags:
|
||||
- ghcr.io/bjoernellens1/ros2_rmp/rmp:overlay
|
||||
target: overlay
|
||||
x-bake:
|
||||
platforms:
|
||||
- linux/arm64
|
||||
- linux/amd64
|
||||
volumes:
|
||||
- .:/repo
|
||||
command: >
|
||||
/bin/bash
|
||||
|
||||
# Additional dependencies for GUI applications
|
||||
guis:
|
||||
extends: overlay
|
||||
image: ghcr.io/bjoernellens1/ros2_rmp/rmp:guis
|
||||
build:
|
||||
context: .
|
||||
dockerfile: docker/Dockerfile
|
||||
tags:
|
||||
- ghcr.io/bjoernellens1/ros2_rmp/rmp:guis
|
||||
target: guis
|
||||
x-bake:
|
||||
platforms:
|
||||
- linux/arm64
|
||||
- linux/amd64
|
||||
#entrypoint: /bin/bash
|
||||
command: >
|
||||
/bin/bash
|
||||
|
||||
# Robot State Publisher
|
||||
rsp:
|
||||
extends: overlay
|
||||
command: >
|
||||
ros2 launch cps_rmp220_support rsp.launch.py
|
||||
stdin_open: true
|
||||
tty: true
|
||||
# Networking and IPC for ROS 2
|
||||
#network_mode: host
|
||||
ipc: host
|
||||
environment:
|
||||
- ROS_DOMAIN_ID=5
|
||||
- RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
|
||||
|
||||
# Controller
|
||||
controller:
|
||||
extends: base
|
||||
command: >
|
||||
ros2 run segwayrmp SmartCar --ros-args -r cmd_vel:=cmd_vel_out -p serial_full_name:=/dev/segway
|
||||
devices:
|
||||
- /dev/segway:/dev/segway
|
||||
- /dev/ttyUSB0:/dev/ttyUSB0
|
||||
# Interactive shell
|
||||
stdin_open: true
|
||||
tty: true
|
||||
# Networking and IPC for ROS 2
|
||||
#network_mode: host
|
||||
ipc: host
|
||||
# Needed to display graphical applications
|
||||
privileged: false
|
||||
# depends_on:
|
||||
# - robot_state_publisher
|
||||
environment:
|
||||
- ROS_DOMAIN_ID=5
|
||||
- RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
|
||||
|
||||
# teleop
|
||||
teleop:
|
||||
extends: base
|
||||
depends_on:
|
||||
- controller
|
||||
command: >
|
||||
ros2 launch rmp220_teleop robot_joystick.launch.py
|
||||
devices:
|
||||
- /dev/input/js0:/dev/input/js0
|
||||
# Interactive shell
|
||||
stdin_open: true
|
||||
tty: true
|
||||
# Networking and IPC for ROS 2
|
||||
#network_mode: host
|
||||
ipc: host
|
||||
# Needed to display graphical applications
|
||||
privileged: true
|
||||
environment:
|
||||
- ROS_DOMAIN_ID=5
|
||||
- RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
|
||||
|
||||
# lidar
|
||||
lidar:
|
||||
extends: overlay
|
||||
command: >
|
||||
ros2 launch cps_rmp220_support robot_lidar.launch.py serial_port:=/dev/rplidarA1
|
||||
stdin_open: true
|
||||
tty: true
|
||||
# Networking and IPC for ROS 2
|
||||
#network_mode: host
|
||||
ipc: host
|
||||
# depends_on:
|
||||
# - robot_state_publisher
|
||||
environment:
|
||||
- ROS_DOMAIN_ID=5
|
||||
- RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
|
||||
devices:
|
||||
- /dev/rplidarA1:/dev/rplidarA1 #udevrules needed for this to work:
|
||||
# SUBSYSTEM=="tty", ATTRS{serial}=="0001", SYMLINK+="segway"
|
||||
# SUBSYSTEM=="tty", ATTRS{serial}=="3453995662b3af4f81f4a69eba5f3f29", SYMLINK+="rplidarA1"
|
||||
|
||||
|
||||
# localiaztion by ekf node
|
||||
ekf:
|
||||
extends: overlay
|
||||
depends_on:
|
||||
- controller
|
||||
- rsp
|
||||
command: >
|
||||
ros2 launch cps_rmp220_support robot_localization.launch.py
|
||||
# Interactive shell
|
||||
stdin_open: true
|
||||
tty: true
|
||||
# Networking and IPC for ROS 2
|
||||
#network_mode: host
|
||||
ipc: host
|
||||
environment:
|
||||
- ROS_DOMAIN_ID=5
|
||||
- RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
|
||||
|
||||
# mapping
|
||||
mapping:
|
||||
extends: overlay
|
||||
depends_on:
|
||||
- ekf
|
||||
- rsp
|
||||
- lidar
|
||||
command: >
|
||||
ros2 launch cps_rmp220_support robot_mapping.launch.py
|
||||
# Interactive shell
|
||||
stdin_open: true
|
||||
tty: true
|
||||
# Networking and IPC for ROS 2
|
||||
#network_mode: host
|
||||
ipc: host
|
||||
environment:
|
||||
- ROS_DOMAIN_ID=5
|
||||
- RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
|
||||
|
||||
# slam-toolbox-localization
|
||||
localization:
|
||||
extends: overlay
|
||||
depends_on:
|
||||
- ekf
|
||||
- rsp
|
||||
- lidar
|
||||
command: >
|
||||
ros2 launch cps_rmp220_support robot_mapping_localization.launch.py map_file_name:=/repo/maps/map.yaml
|
||||
# Interactive shell
|
||||
stdin_open: true
|
||||
tty: true
|
||||
# Networking and IPC for ROS 2
|
||||
#network_mode: host
|
||||
ipc: host
|
||||
environment:
|
||||
- ROS_DOMAIN_ID=5
|
||||
- RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
|
||||
|
||||
# amcl_localization
|
||||
amcl:
|
||||
extends: overlay
|
||||
depends_on:
|
||||
- ekf
|
||||
- rsp
|
||||
- lidar
|
||||
command: >
|
||||
ros2 launch cps_rmp220_support robot_amcl.launch.py map:=/repo/maps/map.yaml
|
||||
# Interactive shell
|
||||
stdin_open: true
|
||||
tty: true
|
||||
# Networking and IPC for ROS 2
|
||||
#network_mode: host
|
||||
ipc: host
|
||||
environment:
|
||||
- ROS_DOMAIN_ID=5
|
||||
- RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
|
||||
|
||||
# navigation
|
||||
navigation:
|
||||
extends: overlay
|
||||
depends_on:
|
||||
- controller
|
||||
- teleop
|
||||
- rsp
|
||||
- lidar
|
||||
- ekf
|
||||
- oakd
|
||||
# command: >
|
||||
# ros2 launch cps_rmp220_support robot_navigation.launch.py
|
||||
# map_subscribe_transient_local:=true
|
||||
command: >
|
||||
ros2 launch nav2_bringup bringup_launch.py slam:=True map:=/repo/maps/map_current.sav.yaml use_sim_time:=False use_composition:=True params_file:=/overlay_ws/src/cps_rmp220_support/config/nav2_params.yaml
|
||||
stdin_open: true
|
||||
tty: true
|
||||
# Networking and IPC for ROS 2
|
||||
#network_mode: host
|
||||
ipc: host
|
||||
environment:
|
||||
- ROS_DOMAIN_ID=5
|
||||
- RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
|
||||
|
||||
# bash
|
||||
bash:
|
||||
extends: overlay
|
||||
command: >
|
||||
/bin/bash
|
||||
stdin_open: true
|
||||
tty: true
|
||||
# Networking and IPC for ROS 2
|
||||
#network_mode: host
|
||||
ipc: host
|
||||
environment:
|
||||
- ROS_DOMAIN_ID=5
|
||||
- RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
|
||||
|
||||
# rviz2
|
||||
rviz2:
|
||||
#extends: guis
|
||||
image: ghcr.io/bjoernellens1/ros2_rmp/rmp:guis
|
||||
# command: >
|
||||
# ros2 launch cps_rmp220_support robot_rviz2.launch.py
|
||||
command: >
|
||||
ros2 launch cps_rmp220_support rviz.launch.py
|
||||
# Interactive shell
|
||||
stdin_open: true
|
||||
tty: true
|
||||
# Networking and IPC for ROS 2
|
||||
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
|
||||
volumes:
|
||||
# Allows graphical programs in the container.
|
||||
- /tmp/.X11-unix:/tmp/.X11-unix:rw
|
||||
- ${XAUTHORITY:-$HOME/.Xauthority}:/root/.Xauthority
|
||||
|
||||
# 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
|
||||
ipc: host
|
||||
environment:
|
||||
- ROS_DOMAIN_ID=5
|
||||
- RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
|
||||
networks: # not using bridging anymore, instead try using all services on macvlan? let's see... shoudl word for now. Bridging does definitely not work because multicast is not supported here.
|
||||
rmp:
|
||||
ipv4_address: 192.168.0.201 #actually don't need to set ips. they are set automatically by docker-compose. SHould be inherited by all child services.
|
||||
|
||||
|
||||
# Foxglove Studio Webserver
|
||||
foxglove_webserver:
|
||||
image: ghcr.io/foxglove/studio:latest
|
||||
stdin_open: true
|
||||
tty: true
|
||||
# Networking
|
||||
network_mode: bridge
|
||||
ports:
|
||||
- 8080:8080
|
||||
depends_on:
|
||||
- foxglove_bridge
|
||||
volumes:
|
||||
- ./foxglove/default.json:/foxglove/default-layout.json
|
||||
|
||||
# USB Camera Stream
|
||||
cam:
|
||||
extends: overlay
|
||||
command: >
|
||||
ros2 run ros2_cam_openCV cam_node
|
||||
stdin_open: true
|
||||
tty: true
|
||||
# Networking and IPC for ROS 2
|
||||
#network_mode: host
|
||||
ipc: host
|
||||
environment:
|
||||
- ROS_DOMAIN_ID=5
|
||||
- RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
|
||||
devices:
|
||||
- /dev/video0:/dev/video0
|
||||
|
||||
|
||||
# ROS2 Frontier exploration
|
||||
explorer:
|
||||
extends: overlay
|
||||
depends_on:
|
||||
- controller
|
||||
- teleop
|
||||
- rsp
|
||||
- lidar
|
||||
- ekf
|
||||
- navigation
|
||||
command: >
|
||||
ros2 launch cps_rmp220_support robot_exploration.launch.py
|
||||
stdin_open: true
|
||||
tty: true
|
||||
# Networking and IPC for ROS 2
|
||||
#network_mode: host
|
||||
ipc: host
|
||||
environment:
|
||||
- ROS_DOMAIN_ID=5
|
||||
- RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
|
||||
|
||||
### Images for ROS1 Interactions
|
||||
#ROS1 Bridge
|
||||
ros1bridge:
|
||||
image: ghcr.io/bjoernellens1/ros2_rmp/ros1bridge
|
||||
command: >
|
||||
ros2 run ros1_bridge dynamic_bridge --bridge-all-2to1-topics
|
||||
build:
|
||||
context: .
|
||||
dockerfile: docker/Dockerfile
|
||||
tags:
|
||||
- ghcr.io/bjoernellens1/ros2_rmp/ros1bridge
|
||||
args:
|
||||
ROS_DISTRO: humble
|
||||
target: bridge
|
||||
x-bake:
|
||||
platforms:
|
||||
#- linux/arm64
|
||||
- linux/amd64
|
||||
# Networking and IPC for ROS 2
|
||||
#network_mode: host
|
||||
ipc: host
|
||||
environment:
|
||||
- ROS_DOMAIN_ID=5
|
||||
- RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
|
||||
- ROS_MASTER_URI=http://localhost:11311 # is configured to run roscore on the robot but could change to local ros1 machine here
|
||||
|
||||
#ROS1 roscore
|
||||
roscore:
|
||||
command: >
|
||||
roscore
|
||||
extends: ros1bridge
|
||||
#network_mode: host
|
||||
ipc: host
|
||||
environment:
|
||||
- ROS_DOMAIN_ID=5
|
||||
- RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
|
||||
- ROS_MASTER_URI=http://localhost:11311 # is configured to run roscore on the robot but could change to local ros1 machine here
|
||||
|
||||
|
||||
# ROS2 oak-d-lite camera
|
||||
oakd:
|
||||
extends: overlay
|
||||
command: >
|
||||
ros2 launch depthai_examples stereo.launch.py
|
||||
stdin_open: true
|
||||
tty: true
|
||||
# Networking and IPC for ROS 2
|
||||
#network_mode: host
|
||||
ipc: host
|
||||
environment:
|
||||
- ROS_DOMAIN_ID=5
|
||||
- RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
|
||||
#privileged: true
|
||||
#devices:
|
||||
#- /dev/oakd-lite:/dev/oakd-lite # need corresponding udevrules for this to work:
|
||||
# SUBSYSTEM=="usb", ATTRS{idVendor}=="03e7", MODE="0666", SYMLINK+="oakd-lite"
|
||||
#- /dev/:/dev/
|
||||
device_cgroup_rules:
|
||||
- 'c 189:* rmw'
|
||||
volumes:
|
||||
- /dev/bus/usb:/dev/bus/usb
|
||||
|
||||
|
||||
# for testing the oak-d-lite camera -> works now with cgroup rules
|
||||
depthai:
|
||||
image: luxonis/depthai:latest
|
||||
command: >
|
||||
python3 /depthai/depthai_demo.py
|
||||
stdin_open: true
|
||||
tty: true
|
||||
device_cgroup_rules:
|
||||
- 'c 189:* rmw'
|
||||
volumes:
|
||||
- /dev/bus/usb:/dev/bus/usb
|
||||
environment:
|
||||
- DISPLAY=${DISPLAY}
|
||||
- QT_X11_NO_MITSHM=1
|
||||
- NVIDIA_DRIVER_CAPABILITIES=all
|
||||
|
@ -8,7 +8,7 @@ ARG TARGETPLATFORM
|
||||
# Variable TARGETPLATFORM should be auomatically created during build process by docker.
|
||||
|
||||
########################################
|
||||
# Base Image for RMP Control #
|
||||
# Base Image for Bot Mini Control #
|
||||
########################################
|
||||
FROM ros:${ROS_DISTRO} as base
|
||||
ENV ROS_DISTRO=${ROS_DISTRO}
|
||||
@ -17,8 +17,6 @@ ENV ROS_DISTRO=${ROS_DISTRO}
|
||||
SHELL ["/bin/bash", "-c"]
|
||||
|
||||
# Create Colcon workspace with external dependencies
|
||||
RUN echo "update base 26.09.2023 - test"
|
||||
|
||||
RUN mkdir -p /rmp_ws/src
|
||||
WORKDIR /rmp_ws/src
|
||||
COPY dependencies.arm64.repos .
|
||||
@ -31,56 +29,42 @@ COPY dependencies.amd64.repos .
|
||||
RUN echo "Hardware platform is: $(uname -m)"
|
||||
RUN uname -a
|
||||
|
||||
RUN echo "update base 29.08.2023"
|
||||
|
||||
RUN if [ "$(uname -m)" = "x86_64" ]; then \
|
||||
echo "Copying files for linux/amd64"; \
|
||||
mv dependencies.amd64.repos dependencies.repos; \
|
||||
else \
|
||||
echo "Copying files for linux/arm64"; \
|
||||
mv dependencies.arm64.repos dependencies.repos; \
|
||||
fi
|
||||
echo "Copying files for linux/amd64"; \
|
||||
mv dependencies.amd64.repos dependencies.repos; \
|
||||
else \
|
||||
echo "Copying files for linux/arm64"; \
|
||||
mv dependencies.arm64.repos dependencies.repos; \
|
||||
fi
|
||||
|
||||
#RUN vcs import < dependencies.repos
|
||||
RUN vcs import < dependencies.repos
|
||||
RUN vcs import < dependencies.repos;
|
||||
|
||||
# Build the base Colcon workspace, installing dependencies first.
|
||||
WORKDIR /rmp_ws
|
||||
RUN source /opt/ros/${ROS_DISTRO}/setup.bash \
|
||||
&& apt-get update -y \
|
||||
&& apt-get install -y --no-install-recommends \
|
||||
ros-${ROS_DISTRO}-foxglove-bridge \
|
||||
&& rosdep install --from-paths src --ignore-src --rosdistro ${ROS_DISTRO} -y
|
||||
&& apt-get update -y \
|
||||
&& rosdep install --from-paths src --ignore-src --rosdistro ${ROS_DISTRO} -y \
|
||||
|
||||
RUN source /opt/ros/${ROS_DISTRO}/setup.bash \
|
||||
&& colcon build --symlink-install
|
||||
&& colcon build --symlink-install
|
||||
|
||||
# Use Cyclone DDS as middleware and install xacro
|
||||
RUN apt-get install -y --no-install-recommends \
|
||||
ros-${ROS_DISTRO}-rmw-cyclonedds-cpp \
|
||||
ros-${ROS_DISTRO}-xacro \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
# Use Cyclone DDS as middleware
|
||||
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||
ros-${ROS_DISTRO}-rmw-cyclonedds-cpp \
|
||||
ros-${ROS_DISTRO}-xacro \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
ENV RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
|
||||
|
||||
ENV UNDERLAY_WS=${UNDERLAY_WS}
|
||||
|
||||
# Set up the entrypoint
|
||||
COPY ./docker/entrypoint.sh /
|
||||
RUN chmod +x /entrypoint.sh
|
||||
|
||||
# Update repository at the end of this build stage
|
||||
RUN vcs pull src
|
||||
|
||||
ENTRYPOINT [ "/entrypoint.sh" ]
|
||||
|
||||
###########################################
|
||||
# Overlay Image for RMP Control #
|
||||
###########################################
|
||||
FROM base AS overlay
|
||||
|
||||
|
||||
# Create an overlay Colcon workspace
|
||||
RUN echo "update overlay 26.09.2023-take-2"
|
||||
RUN mkdir -p /overlay_ws/src
|
||||
WORKDIR /overlay_ws/src
|
||||
COPY overlay.repos .
|
||||
@ -88,27 +72,24 @@ RUN vcs import < overlay.repos
|
||||
|
||||
WORKDIR /overlay_ws
|
||||
|
||||
ENV DEBIAN_FRONTEND noninteractive
|
||||
RUN source /rmp_ws/install/setup.bash \
|
||||
&& apt-get update \
|
||||
&& rosdep install --from-paths src --ignore-src --rosdistro ${ROS_DISTRO} -y \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
|
||||
RUN source /rmp_ws/install/setup.bash \
|
||||
&& apt-get update \
|
||||
&& DEBIAN_FRONTEND=noninteractive apt-get install \
|
||||
nano \
|
||||
ros-humble-robot-localization \
|
||||
ros-humble-joint-state-publisher \
|
||||
ros-humble-laser-filters -y \
|
||||
&& rosdep install --from-paths src --ignore-src --rosdistro ${ROS_DISTRO} -y \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
RUN source /rmp_ws/install/setup.bash \
|
||||
&& colcon build --symlink-install
|
||||
&& colcon build --symlink-install
|
||||
|
||||
# Set up the entrypoint
|
||||
COPY ./docker/entrypoint.sh /
|
||||
RUN chmod +x /entrypoint.sh
|
||||
|
||||
# Update repository at the end of this build stage
|
||||
RUN vcs pull src
|
||||
COPY ./controller_startup.sh /
|
||||
RUN chmod +x /controller_startup.sh
|
||||
|
||||
COPY ./localization_startup.sh /
|
||||
RUN chmod +x /localization_startup.sh
|
||||
|
||||
ENTRYPOINT [ "/entrypoint.sh" ]
|
||||
|
||||
@ -119,149 +100,15 @@ FROM overlay AS guis
|
||||
|
||||
# Install additional GUI tools
|
||||
RUN source /rmp_ws/install/setup.bash \
|
||||
&& apt-get update \
|
||||
&& apt-get install -y --no-install-recommends ros-${ROS_DISTRO}-rviz2 \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
&& apt-get update \
|
||||
&& apt-get install -y --no-install-recommends ros-${ROS_DISTRO}-rviz2 \
|
||||
&& rosdep install --from-paths src --ignore-src --rosdistro ${ROS_DISTRO} -y \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# Update repository at the end of this build stage
|
||||
RUN vcs pull src
|
||||
RUN source /rmp_ws/install/setup.bash \
|
||||
&& colcon build --symlink-install \
|
||||
|
||||
# Set up the entrypoint
|
||||
ENTRYPOINT [ "/entrypoint.sh" ]
|
||||
|
||||
LABEL org.opencontainers.image.source=https://github.com/bjoernellens1/ros2_rmp
|
||||
|
||||
|
||||
### Added for bridging
|
||||
# FROM ubuntu:focal as bridge
|
||||
|
||||
# SHELL ["/bin/bash", "-c"]
|
||||
|
||||
# ENV DEBIAN_FRONTEND noninteractive
|
||||
# ENV ROS_DISTRO=foxy
|
||||
|
||||
# RUN locale
|
||||
# RUN apt-get update && apt-get install -y locales
|
||||
# RUN locale-gen en_US en_US.UTF-8
|
||||
# RUN update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8
|
||||
|
||||
# ENV LANG=en_US.UTF-8
|
||||
|
||||
# RUN locale
|
||||
|
||||
# RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||
# curl \
|
||||
# gnupg2 \
|
||||
# lsb-release \
|
||||
# software-properties-common \
|
||||
# && add-apt-repository universe
|
||||
|
||||
# RUN curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg
|
||||
# RUN echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(. /etc/os-release && echo $UBUNTU_CODENAME) main" | tee /etc/apt/sources.list.d/ros2.list > /dev/null
|
||||
|
||||
# # Install common packages
|
||||
# RUN apt-get update && apt-get install -y \
|
||||
# python3-flake8-docstrings \
|
||||
# python3-pip \
|
||||
# python3-pytest-cov \
|
||||
# ros-dev-tools
|
||||
|
||||
# RUN mkdir -p /root/ros2_foxy/src
|
||||
# WORKDIR /root/ros2_foxy
|
||||
# RUN vcs import --input https://raw.githubusercontent.com/ros2/ros2/${ROS_DISTRO}/ros2.repos src
|
||||
# #&& vcs import --input https://raw.githubusercontent.com/ros2/rmw_fastrtps/${ROS_DISTRO}/rmw_fastrtps.repos ~/ros2_humble/src \
|
||||
# #&& vcs import --input https://raw.githubusercontent.com/ros2/rmw_cyclonedds/${ROS_DISTRO}/rmw_cyclonedds.repos ~/ros2_humble/src
|
||||
|
||||
# ARG RTI_NC_LICENSE_ACCEPTED=yes # must accept license agreement for RTI Connext DDS
|
||||
|
||||
# RUN apt-get update && apt-get upgrade -y \
|
||||
# && rosdep init \
|
||||
# && rosdep update \
|
||||
# && rosdep install --from-paths src --ignore-src --rosdistro ${ROS_DISTRO} -y --skip-keys "console_bridge fastcdr fastrtps rti-connext-dds-5.3.1 urdfdom_headers"
|
||||
|
||||
# RUN colcon build --symlink-install
|
||||
|
||||
# # Create Colcon workspace with external dependencies
|
||||
# RUN mkdir -p /rmp_ws/src
|
||||
# WORKDIR /rmp_ws/src
|
||||
# COPY dependencies.arm64.repos .
|
||||
# COPY dependencies.amd64.repos .
|
||||
|
||||
# # Choose correct sources for architecture:
|
||||
# # Copy platform-specific files
|
||||
# # Use if condition to copy different files for different platforms
|
||||
# #RUN echo "TARGETPLATFORM is $TARGETPLATFORM"
|
||||
# RUN echo "Hardware platform is: $(uname -m)"
|
||||
# RUN uname -a
|
||||
|
||||
# RUN if [ "$(uname -m)" = "x86_64" ]; then \
|
||||
# echo "Copying files for linux/amd64"; \
|
||||
# mv dependencies.amd64.repos dependencies.repos; \
|
||||
# else \
|
||||
# echo "Copying files for linux/arm64"; \
|
||||
# mv dependencies.arm64.repos dependencies.repos; \
|
||||
# fi
|
||||
|
||||
# #RUN vcs import < dependencies.repos
|
||||
# RUN vcs import < dependencies.repos;
|
||||
|
||||
# # Build the base Colcon workspace, installing dependencies first.
|
||||
# WORKDIR /rmp_ws
|
||||
# RUN source /home/root/ros2_foxy/install/setup.bash \
|
||||
# && apt-get update -y \
|
||||
# && rosdep install --from-paths src --ignore-src --rosdistro ${ROS_DISTRO} -y
|
||||
|
||||
# RUN source /opt/ros/${ROS_DISTRO}/setup.bash \
|
||||
# && colcon build --symlink-install
|
||||
|
||||
# ENV RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
|
||||
|
||||
# # Set up the entrypoint
|
||||
# COPY ./docker/entrypoint.sh /
|
||||
# RUN chmod +x /entrypoint.sh
|
||||
|
||||
# ENTRYPOINT [ "/entrypoint.sh" ]
|
||||
|
||||
# This is an auto generated Dockerfile for ros:ros1-bridge
|
||||
# generated from docker_images_ros2/ros1_bridge/create_ros_ros1_bridge_image.Dockerfile.em
|
||||
FROM ros:eloquent-ros-base-bionic AS bridge
|
||||
|
||||
RUN apt update && apt install -y curl gnupg2 lsb-release
|
||||
|
||||
# setup sources.list
|
||||
RUN echo "deb http://packages.ros.org/ros/ubuntu bionic main" > /etc/apt/sources.list.d/ros1-latest.list
|
||||
|
||||
# setup keys
|
||||
# RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
|
||||
RUN curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | apt-key add -
|
||||
|
||||
ENV ROS1_DISTRO melodic
|
||||
ENV ROS2_DISTRO eloquent
|
||||
|
||||
# install ros packages
|
||||
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||
ros-${ROS1_DISTRO}-ros-comm \
|
||||
ros-${ROS1_DISTRO}-roscpp-tutorials \
|
||||
ros-${ROS1_DISTRO}-rospy-tutorials \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# install ros2 packages
|
||||
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||
ros-${ROS2_DISTRO}-ros1-bridge \
|
||||
ros-${ROS2_DISTRO}-demo-nodes-cpp \
|
||||
ros-${ROS2_DISTRO}-demo-nodes-py \
|
||||
ros-${ROS2_DISTRO}-rmw-cyclonedds-cpp \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# install downstream packages
|
||||
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||
python-rosdep \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
RUN echo "update 04.09.2023-2"
|
||||
# setup entrypoint
|
||||
COPY ./docker/bridge_entrypoint.sh /
|
||||
RUN chmod +x /bridge_entrypoint.sh
|
||||
|
||||
# Set up the entrypoint
|
||||
ENTRYPOINT [ "/bridge_entrypoint.sh" ]
|
61
docker/Dockerfile.amd64
Normal file
61
docker/Dockerfile.amd64
Normal file
@ -0,0 +1,61 @@
|
||||
ARG ROS_DISTRO=humble
|
||||
ARG UNDERLAY_WS=/rmp_ws
|
||||
|
||||
########################################
|
||||
# Base Image for Bot Mini Control #
|
||||
########################################
|
||||
FROM osrf/ros:${ROS_DISTRO}-desktop as base
|
||||
ENV ROS_DISTRO=${ROS_DISTRO}
|
||||
SHELL ["/bin/bash", "-c"]
|
||||
|
||||
# Create Colcon workspace with external dependencies
|
||||
RUN mkdir -p /rmp_ws/src
|
||||
WORKDIR /rmp_ws/src
|
||||
COPY dependencies.repos .
|
||||
RUN vcs import < dependencies.amd64.repos
|
||||
|
||||
# Build the base Colcon workspace, installing dependencies first.
|
||||
WORKDIR /rmp_ws
|
||||
RUN source /opt/ros/${ROS_DISTRO}/setup.bash \
|
||||
&& apt-get update -y \
|
||||
&& rosdep install --from-paths src --ignore-src --rosdistro ${ROS_DISTRO} -y \
|
||||
&& colcon build --symlink-install
|
||||
|
||||
# Use Cyclone DDS as middleware
|
||||
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||
ros-${ROS_DISTRO}-rmw-cyclonedds-cpp
|
||||
ENV RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
|
||||
|
||||
ENV UNDERLAY_WS=${UNDERLAY_WS}
|
||||
|
||||
###########################################
|
||||
# Overlay Image for Bot Mini Control #
|
||||
###########################################
|
||||
FROM base AS overlay
|
||||
|
||||
# Create an overlay Colcon workspace
|
||||
RUN mkdir -p /overlay_ws/src
|
||||
WORKDIR /overlay_ws/src
|
||||
|
||||
RUN echo "Dummy step"
|
||||
COPY overlay.repos .
|
||||
RUN vcs import < overlay.repos
|
||||
|
||||
WORKDIR /overlay_ws
|
||||
# COPY ./tb3_autonomy/ ./src/tb3_autonomy/
|
||||
# COPY ./tb3_worlds/ ./src/tb3_worlds/
|
||||
RUN source /rmp_ws/install/setup.bash \
|
||||
&& colcon build --symlink-install \
|
||||
&& rosdep install --from-paths src --ignore-src --rosdistro ${ROS_DISTRO} -y
|
||||
|
||||
# Set up the entrypoint
|
||||
COPY ./docker/entrypoint.sh /
|
||||
RUN chmod +x /entrypoint.sh
|
||||
|
||||
COPY ./controller_startup.sh /
|
||||
RUN chmod +x /controller_startup.sh
|
||||
|
||||
COPY ./localization_startup.sh /
|
||||
RUN chmod +x /localization_startup.sh
|
||||
|
||||
ENTRYPOINT [ "/entrypoint.sh" ]
|
62
docker/Dockerfile.arm64
Normal file
62
docker/Dockerfile.arm64
Normal file
@ -0,0 +1,62 @@
|
||||
ARG ROS_DISTRO=humble
|
||||
ARG UNDERLAY_WS=/rmp_ws
|
||||
|
||||
########################################
|
||||
# Base Image for Bot Mini Control #
|
||||
########################################
|
||||
#FROM --platform=linux/arm64 ros:${ROS_DISTRO} as base
|
||||
FROM ros:${ROS_DISTRO} as base
|
||||
ENV ROS_DISTRO=${ROS_DISTRO}
|
||||
SHELL ["/bin/bash", "-c"]
|
||||
|
||||
# Create Colcon workspace with external dependencies
|
||||
RUN mkdir -p /rmp_ws/src
|
||||
WORKDIR /rmp_ws/src
|
||||
COPY dependencies.repos .
|
||||
RUN vcs import < dependencies.arm64.repos
|
||||
|
||||
# Build the base Colcon workspace, installing dependencies first.
|
||||
WORKDIR /rmp_ws
|
||||
RUN source /opt/ros/${ROS_DISTRO}/setup.bash \
|
||||
&& apt-get update -y \
|
||||
&& rosdep install --from-paths src --ignore-src --rosdistro ${ROS_DISTRO} -y \
|
||||
&& colcon build --symlink-install
|
||||
|
||||
# Use Cyclone DDS as middleware
|
||||
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||
ros-${ROS_DISTRO}-rmw-cyclonedds-cpp
|
||||
ENV RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
|
||||
|
||||
ENV UNDERLAY_WS=${UNDERLAY_WS}
|
||||
|
||||
###########################################
|
||||
# Overlay Image for Bot Mini Control #
|
||||
###########################################
|
||||
FROM base AS overlay
|
||||
|
||||
# Create an overlay Colcon workspace
|
||||
RUN mkdir -p /overlay_ws/src
|
||||
WORKDIR /overlay_ws/src
|
||||
|
||||
RUN echo "Dummy step"
|
||||
COPY overlay.repos .
|
||||
RUN vcs import < overlay.repos
|
||||
|
||||
WORKDIR /overlay_ws
|
||||
# COPY ./tb3_autonomy/ ./src/tb3_autonomy/
|
||||
# COPY ./tb3_worlds/ ./src/tb3_worlds/
|
||||
RUN source /rmp_ws/install/setup.bash \
|
||||
&& colcon build --symlink-install \
|
||||
&& rosdep install --from-paths src --ignore-src --rosdistro ${ROS_DISTRO} -y
|
||||
|
||||
# Set up the entrypoint
|
||||
COPY ./docker/entrypoint.sh /
|
||||
RUN chmod +x /entrypoint.sh
|
||||
|
||||
COPY ./controller_startup.sh /
|
||||
RUN chmod +x /controller_startup.sh
|
||||
|
||||
COPY ./localization_startup.sh /
|
||||
RUN chmod +x /localization_startup.sh
|
||||
|
||||
ENTRYPOINT [ "/entrypoint.sh" ]
|
@ -1,8 +1,6 @@
|
||||
#!/bin/bash
|
||||
# Basic entrypoint for ROS / Colcon Docker containers
|
||||
|
||||
UNDERLAY_WS=/rmp_ws
|
||||
|
||||
# Source ROS 2
|
||||
source /opt/ros/${ROS_DISTRO}/setup.bash
|
||||
echo "Sourced ROS 2 ${ROS_DISTRO}"
|
||||
@ -11,7 +9,7 @@ echo "Sourced ROS 2 ${ROS_DISTRO}"
|
||||
if [ -f ${UNDERLAY_WS}/install/setup.bash ]
|
||||
then
|
||||
source ${UNDERLAY_WS}/install/setup.bash
|
||||
vcs pull ${UNDERLAY_WS}/src
|
||||
#export GAZEBO_MODEL_PATH=$GAZEBO_MODEL_PATH:$(ros2 pkg prefix turtlebot3_gazebo)/share/turtlebot3_gazebo/models
|
||||
echo "Sourced CPS RMP 220 base workspace"
|
||||
fi
|
||||
|
||||
@ -19,32 +17,9 @@ fi
|
||||
if [ -f /overlay_ws/install/setup.bash ]
|
||||
then
|
||||
source /overlay_ws/install/setup.bash
|
||||
vcs pull /overlay_ws/src
|
||||
#export GAZEBO_MODEL_PATH=$GAZEBO_MODEL_PATH:$(ros2 pkg prefix tb3_worlds)/share/tb3_worlds/models
|
||||
echo "Sourced CPS RMP 220 Overlay workspace"
|
||||
fi
|
||||
|
||||
# Source the bridge workspace, if built
|
||||
if [ -f ~/ros2_humble/install/setup.bash ]
|
||||
then
|
||||
source ~/ros2_humbleinstall/setup.bash
|
||||
#export GAZEBO_MODEL_PATH=$GAZEBO_MODEL_PATH:$(ros2 pkg prefix turtlebot3_gazebo)/share/turtlebot3_gazebo/models
|
||||
echo "Sourced CPS RMP 220 base workspace"
|
||||
fi
|
||||
|
||||
# Implement updating all repositories at launch
|
||||
if [ -f ${UNDERLAY_WS}/]
|
||||
then
|
||||
cd ${UNDERLAY_WS}
|
||||
vcs pull src
|
||||
echo "Updated base workspace"
|
||||
fi
|
||||
|
||||
if [ -f /overlay_ws/]
|
||||
then
|
||||
cd /overlay_ws
|
||||
vcs pull src
|
||||
echo "Updated overlay workspace"
|
||||
fi
|
||||
|
||||
# Execute the command passed into this entrypoint
|
||||
exec "$@"
|
@ -1,408 +0,0 @@
|
||||
{
|
||||
"configById": {
|
||||
"Indicator!246epy5": {
|
||||
"path": "/chassis_mode_fb.chassis_mode",
|
||||
"style": "background",
|
||||
"fallbackColor": "#f3ff09",
|
||||
"fallbackLabel": "Paused",
|
||||
"rules": [
|
||||
{
|
||||
"operator": "=",
|
||||
"rawValue": "1",
|
||||
"color": "#68e24a",
|
||||
"label": "Enabled"
|
||||
},
|
||||
{
|
||||
"operator": "=",
|
||||
"rawValue": "3",
|
||||
"color": "#ef0808",
|
||||
"label": "Stopeed"
|
||||
}
|
||||
],
|
||||
"foxglovePanelTitle": "Chassis Status"
|
||||
},
|
||||
"3D!xm9o0x": {
|
||||
"cameraState": {
|
||||
"perspective": true,
|
||||
"distance": 4.292775278853205,
|
||||
"phi": 63.55358804367419,
|
||||
"thetaOffset": 90.92255125285674,
|
||||
"targetOffset": [
|
||||
-0.29510607699692826,
|
||||
-0.46515527202238954,
|
||||
-3.3726357711173257e-18
|
||||
],
|
||||
"target": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
],
|
||||
"targetOrientation": [
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1
|
||||
],
|
||||
"fovy": 45,
|
||||
"near": 0.5,
|
||||
"far": 5000
|
||||
},
|
||||
"followMode": "follow-pose",
|
||||
"followTf": "camera_link",
|
||||
"scene": {
|
||||
"syncCamera": false
|
||||
},
|
||||
"transforms": {
|
||||
"frame:odom": {
|
||||
"visible": false
|
||||
},
|
||||
"frame:map": {
|
||||
"visible": false
|
||||
},
|
||||
"frame:base_link": {
|
||||
"visible": false
|
||||
},
|
||||
"frame:base_footprint": {
|
||||
"visible": false
|
||||
},
|
||||
"frame:chassis": {
|
||||
"visible": false
|
||||
},
|
||||
"frame:left_wheel": {
|
||||
"visible": false
|
||||
},
|
||||
"frame:right_wheel": {
|
||||
"visible": false
|
||||
},
|
||||
"frame:caster_wheel": {
|
||||
"visible": false
|
||||
},
|
||||
"frame:laser_frame": {
|
||||
"visible": false
|
||||
},
|
||||
"frame:camera_link": {
|
||||
"visible": false
|
||||
},
|
||||
"frame:camera_link_optical": {
|
||||
"visible": false
|
||||
},
|
||||
"frame:face_link": {
|
||||
"visible": false
|
||||
}
|
||||
},
|
||||
"topics": {
|
||||
"/map": {
|
||||
"visible": true,
|
||||
"colorMode": "raw"
|
||||
},
|
||||
"/robot_description": {
|
||||
"visible": true
|
||||
},
|
||||
"/amcl_pose": {
|
||||
"visible": false
|
||||
},
|
||||
"/scan": {
|
||||
"visible": false,
|
||||
"colorField": "intensity",
|
||||
"colorMode": "colormap",
|
||||
"colorMap": "turbo"
|
||||
},
|
||||
"/local_plan": {
|
||||
"visible": false
|
||||
},
|
||||
"/local_costmap/clearing_endpoints": {
|
||||
"visible": false,
|
||||
"colorField": "x",
|
||||
"colorMode": "colormap",
|
||||
"colorMap": "turbo"
|
||||
},
|
||||
"/local_costmap/costmap": {
|
||||
"visible": true,
|
||||
"colorMode": "costmap",
|
||||
"alpha": 0.57,
|
||||
"frameLocked": false
|
||||
},
|
||||
"/plan": {
|
||||
"visible": true,
|
||||
"lineWidth": 0.11
|
||||
},
|
||||
"/global_costmap/costmap": {
|
||||
"visible": false
|
||||
}
|
||||
},
|
||||
"layers": {},
|
||||
"publish": {
|
||||
"type": "point",
|
||||
"poseTopic": "/move_base_simple/goal",
|
||||
"pointTopic": "/clicked_point",
|
||||
"poseEstimateTopic": "/initialpose",
|
||||
"poseEstimateXDeviation": 0.5,
|
||||
"poseEstimateYDeviation": 0.5,
|
||||
"poseEstimateThetaDeviation": 0.26179939
|
||||
},
|
||||
"imageMode": {}
|
||||
},
|
||||
"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": {
|
||||
"perspective": false,
|
||||
"distance": 17.147499999954405,
|
||||
"phi": 15.990945674652972,
|
||||
"thetaOffset": -27.94225656208538,
|
||||
"targetOffset": [
|
||||
-0.3252914174301529,
|
||||
-1.1974256262178802,
|
||||
1.0440519804793617e-15
|
||||
],
|
||||
"target": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
],
|
||||
"targetOrientation": [
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1
|
||||
],
|
||||
"fovy": 45,
|
||||
"near": 0.5,
|
||||
"far": 5000
|
||||
},
|
||||
"followMode": "follow-pose",
|
||||
"scene": {
|
||||
"enableStats": false
|
||||
},
|
||||
"transforms": {
|
||||
"frame:base_link": {
|
||||
"visible": false
|
||||
},
|
||||
"frame:odom": {
|
||||
"visible": false
|
||||
},
|
||||
"frame:map": {
|
||||
"visible": false
|
||||
},
|
||||
"frame:base_footprint": {
|
||||
"visible": false
|
||||
},
|
||||
"frame:camera_link": {
|
||||
"visible": false
|
||||
},
|
||||
"frame:chassis": {
|
||||
"visible": false
|
||||
},
|
||||
"frame:camera_link_optical": {
|
||||
"visible": false
|
||||
},
|
||||
"frame:caster_wheel": {
|
||||
"visible": false
|
||||
},
|
||||
"frame:face_link": {
|
||||
"visible": false
|
||||
},
|
||||
"frame:laser_frame": {
|
||||
"visible": false
|
||||
},
|
||||
"frame:left_wheel": {
|
||||
"visible": false
|
||||
},
|
||||
"frame:right_wheel": {
|
||||
"visible": false
|
||||
}
|
||||
},
|
||||
"topics": {
|
||||
"/initialpose": {
|
||||
"visible": false
|
||||
},
|
||||
"/move_base_simple/goal": {
|
||||
"visible": false
|
||||
},
|
||||
"/global_costmap/costmap": {
|
||||
"visible": false,
|
||||
"colorMode": "costmap",
|
||||
"alpha": 0.38,
|
||||
"frameLocked": false
|
||||
},
|
||||
"/robot_description": {
|
||||
"visible": true
|
||||
},
|
||||
"/camera/image": {
|
||||
"visible": false
|
||||
},
|
||||
"/local_costmap/clearing_endpoints": {
|
||||
"visible": true,
|
||||
"colorField": "x",
|
||||
"colorMode": "colormap",
|
||||
"colorMap": "turbo"
|
||||
},
|
||||
"/local_costmap/costmap": {
|
||||
"visible": false
|
||||
},
|
||||
"/map": {
|
||||
"visible": true,
|
||||
"colorMode": "raw"
|
||||
},
|
||||
"/scan": {
|
||||
"visible": false,
|
||||
"colorField": "intensity",
|
||||
"colorMode": "colormap",
|
||||
"colorMap": "turbo"
|
||||
},
|
||||
"/global_costmap/published_footprint": {
|
||||
"visible": false
|
||||
},
|
||||
"/local_costmap/published_footprint": {
|
||||
"visible": false
|
||||
},
|
||||
"/plan": {
|
||||
"visible": true,
|
||||
"lineWidth": 0.11
|
||||
}
|
||||
},
|
||||
"publish": {
|
||||
"type": "pose",
|
||||
"poseTopic": "/goal_pose",
|
||||
"pointTopic": "/clicked_point",
|
||||
"poseEstimateTopic": "/initialpose",
|
||||
"poseEstimateXDeviation": 0.5,
|
||||
"poseEstimateYDeviation": 0.5,
|
||||
"poseEstimateThetaDeviation": 0.26179939
|
||||
},
|
||||
"imageMode": {},
|
||||
"followTf": "map"
|
||||
},
|
||||
"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": {
|
||||
"imageTopic": "/camera/image"
|
||||
}
|
||||
},
|
||||
"Gauge!3bflj8v": {
|
||||
"path": "/speed_fb.car_speed",
|
||||
"minValue": -1,
|
||||
"maxValue": 1,
|
||||
"colorMap": "red-yellow-green",
|
||||
"colorMode": "colormap",
|
||||
"gradient": [
|
||||
"#0000ff",
|
||||
"#ff00ff"
|
||||
],
|
||||
"reverse": false,
|
||||
"foxglovePanelTitle": "Speed"
|
||||
},
|
||||
"Gauge!2dh8khn": {
|
||||
"path": "/bms_fb.bat_soc",
|
||||
"minValue": 0,
|
||||
"maxValue": 100,
|
||||
"colorMap": "red-yellow-green",
|
||||
"colorMode": "colormap",
|
||||
"gradient": [
|
||||
"#0000ff",
|
||||
"#ff00ff"
|
||||
],
|
||||
"reverse": false,
|
||||
"foxglovePanelTitle": "Battery SOC"
|
||||
},
|
||||
"RawMessages!os6rgs": {
|
||||
"diffEnabled": false,
|
||||
"diffMethod": "custom",
|
||||
"diffTopicPath": "",
|
||||
"showFullMessageForDiff": false,
|
||||
"topicPath": "/chassis_mode_fb"
|
||||
}
|
||||
},
|
||||
"globalVariables": {},
|
||||
"userNodes": {},
|
||||
"playbackConfig": {
|
||||
"speed": 1
|
||||
},
|
||||
"layout": {
|
||||
"direction": "row",
|
||||
"first": "3D!xm9o0x",
|
||||
"second": {
|
||||
"first": "3D!18i6zy7",
|
||||
"second": {
|
||||
"first": {
|
||||
"first": {
|
||||
"first": "Image!3mnp456",
|
||||
"second": "Indicator!246epy5",
|
||||
"direction": "column"
|
||||
},
|
||||
"second": {
|
||||
"first": "Gauge!3bflj8v",
|
||||
"second": "Gauge!2dh8khn",
|
||||
"direction": "column"
|
||||
},
|
||||
"direction": "column"
|
||||
},
|
||||
"second": "RawMessages!os6rgs",
|
||||
"direction": "column",
|
||||
"splitPercentage": 79.29515418502203
|
||||
},
|
||||
"direction": "row",
|
||||
"splitPercentage": 68.43434343434342
|
||||
}
|
||||
}
|
||||
}
|
@ -1,220 +0,0 @@
|
||||
{
|
||||
"configById": {
|
||||
"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": {
|
||||
"perspective": true,
|
||||
"distance": 7.169718448165846,
|
||||
"phi": 44.39597034624296,
|
||||
"thetaOffset": 110.64544303379736,
|
||||
"targetOffset": [
|
||||
1.3652650501689945,
|
||||
-1.8373664023538157,
|
||||
1.626837553340729e-18
|
||||
],
|
||||
"target": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
],
|
||||
"targetOrientation": [
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1
|
||||
],
|
||||
"fovy": 45,
|
||||
"near": 0.5,
|
||||
"far": 5000
|
||||
},
|
||||
"followMode": "follow-pose",
|
||||
"scene": {},
|
||||
"transforms": {
|
||||
"frame:base_link": {
|
||||
"visible": false
|
||||
},
|
||||
"frame:odom": {
|
||||
"visible": false
|
||||
},
|
||||
"frame:map": {
|
||||
"visible": false
|
||||
},
|
||||
"frame:base_footprint": {
|
||||
"visible": false
|
||||
},
|
||||
"frame:camera_link": {
|
||||
"visible": false
|
||||
},
|
||||
"frame:chassis": {
|
||||
"visible": false
|
||||
},
|
||||
"frame:camera_link_optical": {
|
||||
"visible": false
|
||||
},
|
||||
"frame:caster_wheel": {
|
||||
"visible": false
|
||||
},
|
||||
"frame:face_link": {
|
||||
"visible": false
|
||||
},
|
||||
"frame:laser_frame": {
|
||||
"visible": false
|
||||
},
|
||||
"frame:left_wheel": {
|
||||
"visible": false
|
||||
},
|
||||
"frame:right_wheel": {
|
||||
"visible": false
|
||||
}
|
||||
},
|
||||
"topics": {
|
||||
"/initialpose": {
|
||||
"visible": false
|
||||
},
|
||||
"/move_base_simple/goal": {
|
||||
"visible": false
|
||||
},
|
||||
"/global_costmap/costmap": {
|
||||
"visible": true,
|
||||
"colorMode": "costmap",
|
||||
"alpha": 0.38,
|
||||
"frameLocked": false
|
||||
},
|
||||
"/robot_description": {
|
||||
"visible": true
|
||||
},
|
||||
"/camera/image": {
|
||||
"visible": false
|
||||
},
|
||||
"/local_costmap/clearing_endpoints": {
|
||||
"visible": true,
|
||||
"colorField": "x",
|
||||
"colorMode": "colormap",
|
||||
"colorMap": "turbo"
|
||||
},
|
||||
"/local_costmap/costmap": {
|
||||
"visible": false
|
||||
},
|
||||
"/map": {
|
||||
"visible": true,
|
||||
"colorMode": "map"
|
||||
},
|
||||
"/scan": {
|
||||
"visible": false,
|
||||
"colorField": "intensity",
|
||||
"colorMode": "colormap",
|
||||
"colorMap": "turbo"
|
||||
},
|
||||
"/global_costmap/published_footprint": {
|
||||
"visible": false
|
||||
},
|
||||
"/local_costmap/published_footprint": {
|
||||
"visible": false
|
||||
},
|
||||
"/plan": {
|
||||
"visible": true
|
||||
}
|
||||
},
|
||||
"publish": {
|
||||
"type": "pose",
|
||||
"poseTopic": "/goal_pose",
|
||||
"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": {
|
||||
"imageTopic": "/camera/image"
|
||||
}
|
||||
},
|
||||
"RawMessages!os6rgs": {
|
||||
"diffEnabled": false,
|
||||
"diffMethod": "custom",
|
||||
"diffTopicPath": "",
|
||||
"showFullMessageForDiff": false,
|
||||
"topicPath": "/bms_fb"
|
||||
}
|
||||
},
|
||||
"globalVariables": {},
|
||||
"userNodes": {},
|
||||
"playbackConfig": {
|
||||
"speed": 1
|
||||
},
|
||||
"layout": {
|
||||
"first": "3D!18i6zy7",
|
||||
"second": {
|
||||
"first": "Image!3mnp456",
|
||||
"second": "RawMessages!os6rgs",
|
||||
"direction": "column",
|
||||
"splitPercentage": 72.8337236533958
|
||||
},
|
||||
"direction": "row",
|
||||
"splitPercentage": 51.57828282828283
|
||||
}
|
||||
}
|
@ -1,402 +0,0 @@
|
||||
{
|
||||
"configById": {
|
||||
"Indicator!246epy5": {
|
||||
"path": "/chassis_mode_fb.chassis_mode",
|
||||
"style": "bulb",
|
||||
"fallbackColor": "#a0a0a0",
|
||||
"fallbackLabel": "Stopped",
|
||||
"rules": [
|
||||
{
|
||||
"operator": ">",
|
||||
"rawValue": "0",
|
||||
"color": "#68e24a",
|
||||
"label": "Enabled"
|
||||
}
|
||||
],
|
||||
"foxglovePanelTitle": "Chassis Status"
|
||||
},
|
||||
"3D!xm9o0x": {
|
||||
"cameraState": {
|
||||
"perspective": true,
|
||||
"distance": 1.5388995055323984,
|
||||
"phi": 63.55358804367419,
|
||||
"thetaOffset": 90.92255125285413,
|
||||
"targetOffset": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
],
|
||||
"target": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
],
|
||||
"targetOrientation": [
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1
|
||||
],
|
||||
"fovy": 45,
|
||||
"near": 0.5,
|
||||
"far": 5000
|
||||
},
|
||||
"followMode": "follow-pose",
|
||||
"followTf": "camera_link",
|
||||
"scene": {
|
||||
"syncCamera": false
|
||||
},
|
||||
"transforms": {
|
||||
"frame:odom": {
|
||||
"visible": false
|
||||
},
|
||||
"frame:map": {
|
||||
"visible": false
|
||||
},
|
||||
"frame:base_link": {
|
||||
"visible": false
|
||||
},
|
||||
"frame:base_footprint": {
|
||||
"visible": false
|
||||
},
|
||||
"frame:chassis": {
|
||||
"visible": false
|
||||
},
|
||||
"frame:left_wheel": {
|
||||
"visible": false
|
||||
},
|
||||
"frame:right_wheel": {
|
||||
"visible": false
|
||||
},
|
||||
"frame:caster_wheel": {
|
||||
"visible": false
|
||||
},
|
||||
"frame:laser_frame": {
|
||||
"visible": false
|
||||
},
|
||||
"frame:camera_link": {
|
||||
"visible": false
|
||||
},
|
||||
"frame:camera_link_optical": {
|
||||
"visible": false
|
||||
},
|
||||
"frame:face_link": {
|
||||
"visible": false
|
||||
}
|
||||
},
|
||||
"topics": {
|
||||
"/map": {
|
||||
"visible": true,
|
||||
"colorMode": "raw"
|
||||
},
|
||||
"/robot_description": {
|
||||
"visible": true
|
||||
},
|
||||
"/amcl_pose": {
|
||||
"visible": false
|
||||
},
|
||||
"/scan": {
|
||||
"visible": false,
|
||||
"colorField": "intensity",
|
||||
"colorMode": "colormap",
|
||||
"colorMap": "turbo"
|
||||
},
|
||||
"/local_plan": {
|
||||
"visible": false
|
||||
},
|
||||
"/local_costmap/clearing_endpoints": {
|
||||
"visible": false,
|
||||
"colorField": "x",
|
||||
"colorMode": "colormap",
|
||||
"colorMap": "turbo"
|
||||
},
|
||||
"/local_costmap/costmap": {
|
||||
"visible": true,
|
||||
"colorMode": "costmap",
|
||||
"alpha": 0.57,
|
||||
"frameLocked": false
|
||||
},
|
||||
"/plan": {
|
||||
"visible": true,
|
||||
"lineWidth": 0.11
|
||||
},
|
||||
"/global_costmap/costmap": {
|
||||
"visible": false
|
||||
}
|
||||
},
|
||||
"layers": {},
|
||||
"publish": {
|
||||
"type": "point",
|
||||
"poseTopic": "/move_base_simple/goal",
|
||||
"pointTopic": "/clicked_point",
|
||||
"poseEstimateTopic": "/initialpose",
|
||||
"poseEstimateXDeviation": 0.5,
|
||||
"poseEstimateYDeviation": 0.5,
|
||||
"poseEstimateThetaDeviation": 0.26179939
|
||||
},
|
||||
"imageMode": {}
|
||||
},
|
||||
"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": {
|
||||
"perspective": false,
|
||||
"distance": 11.376001845500314,
|
||||
"phi": 15.990945674652972,
|
||||
"thetaOffset": -27.942256562082942,
|
||||
"targetOffset": [
|
||||
-0.4791941626637678,
|
||||
-0.9106804180995777,
|
||||
1.0288213242914258e-15
|
||||
],
|
||||
"target": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
],
|
||||
"targetOrientation": [
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1
|
||||
],
|
||||
"fovy": 45,
|
||||
"near": 0.5,
|
||||
"far": 5000
|
||||
},
|
||||
"followMode": "follow-pose",
|
||||
"scene": {
|
||||
"enableStats": false
|
||||
},
|
||||
"transforms": {
|
||||
"frame:base_link": {
|
||||
"visible": false
|
||||
},
|
||||
"frame:odom": {
|
||||
"visible": false
|
||||
},
|
||||
"frame:map": {
|
||||
"visible": false
|
||||
},
|
||||
"frame:base_footprint": {
|
||||
"visible": false
|
||||
},
|
||||
"frame:camera_link": {
|
||||
"visible": false
|
||||
},
|
||||
"frame:chassis": {
|
||||
"visible": false
|
||||
},
|
||||
"frame:camera_link_optical": {
|
||||
"visible": false
|
||||
},
|
||||
"frame:caster_wheel": {
|
||||
"visible": false
|
||||
},
|
||||
"frame:face_link": {
|
||||
"visible": false
|
||||
},
|
||||
"frame:laser_frame": {
|
||||
"visible": false
|
||||
},
|
||||
"frame:left_wheel": {
|
||||
"visible": false
|
||||
},
|
||||
"frame:right_wheel": {
|
||||
"visible": false
|
||||
}
|
||||
},
|
||||
"topics": {
|
||||
"/initialpose": {
|
||||
"visible": false
|
||||
},
|
||||
"/move_base_simple/goal": {
|
||||
"visible": false
|
||||
},
|
||||
"/global_costmap/costmap": {
|
||||
"visible": false,
|
||||
"colorMode": "costmap",
|
||||
"alpha": 0.38,
|
||||
"frameLocked": false
|
||||
},
|
||||
"/robot_description": {
|
||||
"visible": true
|
||||
},
|
||||
"/camera/image": {
|
||||
"visible": false
|
||||
},
|
||||
"/local_costmap/clearing_endpoints": {
|
||||
"visible": true,
|
||||
"colorField": "x",
|
||||
"colorMode": "colormap",
|
||||
"colorMap": "turbo"
|
||||
},
|
||||
"/local_costmap/costmap": {
|
||||
"visible": false
|
||||
},
|
||||
"/map": {
|
||||
"visible": true,
|
||||
"colorMode": "raw"
|
||||
},
|
||||
"/scan": {
|
||||
"visible": false,
|
||||
"colorField": "intensity",
|
||||
"colorMode": "colormap",
|
||||
"colorMap": "turbo"
|
||||
},
|
||||
"/global_costmap/published_footprint": {
|
||||
"visible": false
|
||||
},
|
||||
"/local_costmap/published_footprint": {
|
||||
"visible": false
|
||||
},
|
||||
"/plan": {
|
||||
"visible": true,
|
||||
"lineWidth": 0.11
|
||||
}
|
||||
},
|
||||
"publish": {
|
||||
"type": "pose",
|
||||
"poseTopic": "/goal_pose",
|
||||
"pointTopic": "/clicked_point",
|
||||
"poseEstimateTopic": "/initialpose",
|
||||
"poseEstimateXDeviation": 0.5,
|
||||
"poseEstimateYDeviation": 0.5,
|
||||
"poseEstimateThetaDeviation": 0.26179939
|
||||
},
|
||||
"imageMode": {},
|
||||
"followTf": "map"
|
||||
},
|
||||
"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": {
|
||||
"imageTopic": "/camera/image"
|
||||
}
|
||||
},
|
||||
"Gauge!3bflj8v": {
|
||||
"path": "/speed_fb.car_speed",
|
||||
"minValue": -1,
|
||||
"maxValue": 1,
|
||||
"colorMap": "red-yellow-green",
|
||||
"colorMode": "colormap",
|
||||
"gradient": [
|
||||
"#0000ff",
|
||||
"#ff00ff"
|
||||
],
|
||||
"reverse": false,
|
||||
"foxglovePanelTitle": "Speed"
|
||||
},
|
||||
"Gauge!2dh8khn": {
|
||||
"path": "/bms_fb.bat_soc",
|
||||
"minValue": 0,
|
||||
"maxValue": 100,
|
||||
"colorMap": "red-yellow-green",
|
||||
"colorMode": "colormap",
|
||||
"gradient": [
|
||||
"#0000ff",
|
||||
"#ff00ff"
|
||||
],
|
||||
"reverse": false,
|
||||
"foxglovePanelTitle": "Battery SOC"
|
||||
},
|
||||
"RawMessages!os6rgs": {
|
||||
"diffEnabled": false,
|
||||
"diffMethod": "custom",
|
||||
"diffTopicPath": "",
|
||||
"showFullMessageForDiff": false,
|
||||
"topicPath": "/chassis_mode_fb"
|
||||
}
|
||||
},
|
||||
"globalVariables": {},
|
||||
"userNodes": {},
|
||||
"playbackConfig": {
|
||||
"speed": 1
|
||||
},
|
||||
"layout": {
|
||||
"direction": "row",
|
||||
"first": "3D!xm9o0x",
|
||||
"second": {
|
||||
"first": "3D!18i6zy7",
|
||||
"second": {
|
||||
"first": {
|
||||
"first": {
|
||||
"first": "Image!3mnp456",
|
||||
"second": "Indicator!246epy5",
|
||||
"direction": "column"
|
||||
},
|
||||
"second": {
|
||||
"first": "Gauge!3bflj8v",
|
||||
"second": "Gauge!2dh8khn",
|
||||
"direction": "column"
|
||||
},
|
||||
"direction": "column"
|
||||
},
|
||||
"second": "RawMessages!os6rgs",
|
||||
"direction": "column",
|
||||
"splitPercentage": 79.29515418502203
|
||||
},
|
||||
"direction": "row",
|
||||
"splitPercentage": 68.43434343434342
|
||||
}
|
||||
}
|
||||
}
|
@ -1,62 +0,0 @@
|
||||
services:
|
||||
### Husarnet VPN Container for remote access
|
||||
husarnet:
|
||||
image: husarnet/husarnet
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- /var/lib/husarnet # This will persist your Husarnet Client keys, thus IP of the container will be stable/the same between (re)boots
|
||||
sysctls:
|
||||
- net.ipv6.conf.all.disable_ipv6=0 # Husarnet is using IPv6 for the internal connections
|
||||
cap_add:
|
||||
- NET_ADMIN
|
||||
devices:
|
||||
- /dev/net/tun
|
||||
env_file:
|
||||
- ./husarnet/.env # create .env file in the same folder as Dockerfile and specify HOSTNAME and JOINCODE there
|
||||
|
||||
color_controller:
|
||||
build:
|
||||
dockerfile: husarnet/Dockerfile
|
||||
volumes:
|
||||
- ./husarnet/cyclonedds.xml:/cyclonedds.xml
|
||||
command:
|
||||
- bash
|
||||
- -c
|
||||
- |
|
||||
export CYCLONEDDS_URI=file:///cyclonedds.xml
|
||||
ros2 run my_demo_pkg color_controller
|
||||
network_mode: service:husarnet
|
||||
|
||||
move_controller:
|
||||
build:
|
||||
dockerfile: husarnet/Dockerfile
|
||||
volumes:
|
||||
- ./husarnet/cyclonedds.xml:/cyclonedds.xml
|
||||
command:
|
||||
- bash
|
||||
- -c
|
||||
- |
|
||||
export CYCLONEDDS_URI=file:///cyclonedds.xml
|
||||
ros2 run my_demo_pkg move_controller
|
||||
network_mode: service:husarnet
|
||||
|
||||
turtle_sim:
|
||||
image: osrf/ros:galactic-desktop
|
||||
privileged: true
|
||||
environment:
|
||||
# Allows graphical programs in the container.
|
||||
- DISPLAY=${DISPLAY}
|
||||
- QT_X11_NO_MITSHM=1
|
||||
- NVIDIA_DRIVER_CAPABILITIES=all
|
||||
volumes:
|
||||
# Allows graphical programs in the container.
|
||||
- /tmp/.X11-unix:/tmp/.X11-unix:rw
|
||||
- ${XAUTHORITY:-$HOME/.Xauthority}:/root/.Xauthority
|
||||
- ./husarnet/cyclonedds.xml:/cyclonedds.xml
|
||||
command:
|
||||
- bash
|
||||
- -c
|
||||
- |
|
||||
export CYCLONEDDS_URI=file:///cyclonedds.xml
|
||||
ros2 run turtlesim turtlesim_node
|
||||
network_mode: service:husarnet # This is the most important line in this setup. This will put the Husarnet Client in the same network namespace as your app (in this example: turtle_sim)
|
19
install.sh
19
install.sh
@ -1,19 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Specify the name of your Python script
|
||||
SCRIPT_NAME="robot_config.py"
|
||||
|
||||
# Check if the script exists in the current directory
|
||||
if [ -f "$SCRIPT_NAME" ]; then
|
||||
# Check if /usr/local/bin is writable
|
||||
if [ -w "/usr/local/bin" ]; then
|
||||
# Copy the script to /usr/local/bin
|
||||
sudo cp "$SCRIPT_NAME" "/usr/local/bin"
|
||||
sudo chmod +x "/usr/local/bin/$SCRIPT_NAME"
|
||||
echo "Script '$SCRIPT_NAME' has been installed in /usr/local/bin."
|
||||
else
|
||||
echo "Error: /usr/local/bin is not writable. You may need to use 'sudo' to install the script."
|
||||
fi
|
||||
else
|
||||
echo "Error: Script '$SCRIPT_NAME' not found in the current directory."
|
||||
fi
|
@ -1,3 +0,0 @@
|
||||
#!/bin/bash
|
||||
docker volume create portainer_data
|
||||
docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:latest
|
52
key.pem
52
key.pem
@ -1,52 +0,0 @@
|
||||
-----BEGIN PRIVATE KEY-----
|
||||
MIIJQgIBADANBgkqhkiG9w0BAQEFAASCCSwwggkoAgEAAoICAQC7PXpOg/+h7QaU
|
||||
cQuc7FdUxtDjKAOECglENb6HcA3TVA8YPyEoHIzlApR3VudRrjSMp4Q16sktWnC9
|
||||
hb7CSwjDw4ShT5cotBq/n0uS6YzH3hj3a+F9g8R2MkZ8FJ6Z/gYAvDQaZ6LN6CUY
|
||||
pACiYE3Z9XRZ6B7vtPpoTcZJp/OaBaRYohcvNh3QL5/MxSd/tO1ulpwbvUPVUCvJ
|
||||
52rb+ytHpmes/3ZLJYHq8m32R0XGGJ5XTN2uaIuEpuPhAEefZl8HMF7fd4scQlzs
|
||||
OVDt+RCvnw9WcXfmHSUhgLZh1mMZIh7WvXYcYK+MOUNffKDOeycwgg4Y93vy/OmJ
|
||||
VSUiTUwupLgV4AyrJMW6WNntSMbb5h+n72An/e99sKJaa3Ak65m8J5e8LBQaW8kf
|
||||
toVqf1QobQ4K4g4Fj7xmqRuApDyUI2+GTkcPzPj2lra71PNq7rwows4iEnTTSw9b
|
||||
XtGtZOtArSLMt42bGVS80W2DrmkKkTvJSKeUpV8GM+torWG25kv8TQxnWyr1hX9V
|
||||
uMVCeuFp3Vtn4O8tG5fYSF3yCxS3pQuFBbe+rsaZejS77FPVciQIRh01QajjFcqv
|
||||
3bkyZxFVrqBHl2wC4ChDlw3/nPjCcm142idqQRG0+iYAL8AJOxuvdGOkbqHSM8de
|
||||
1rlcL48rJ1X2uK6T8sAhEgXR0oZ8dQIDAQABAoICABwvlX1DRpSQEzj+SXK+aykS
|
||||
YriHOfxC7IEtm/hUaGhjE4ChZDLfFWCWAlZyqRC1KijwQKlDJjSjFCybeQtTc0bQ
|
||||
5GLKEeWpMwuchapgaPZfWx/HyCJ2Vvk5+T1Nd1CUGkA7FJbS+gGIDCmI6qWG3MFO
|
||||
P00XcazA8B8Kcip9U2Dgr4w+HkJXoaZIvQP8u8TwLfvDRU2xsIfocScMJJxn02yO
|
||||
QrYaoKqQQ13kT6ROt1SqOQ/IPOi3ySTXYJ9qxN1ccjqpT+bQ3oqK/OT8fc/M+fON
|
||||
/KeVHijwQzonX40b0kAi0ESgMar07QgtSJSTtLtQc6ZMNaYRf0GlS9yGCjh/LVPo
|
||||
IFCKjpSDfp2J9Q7RSFKdb8tghcTfQNAg/6zen1JnE5iUBiaQZfIj7+iD5hQfn9a2
|
||||
I1Fs3m1or3n1Z+BUg7vkDPQCyRkVEBXkKsbpD3T2cnxY9sfF0+ClmdfBQyCcLG5p
|
||||
mf6XAWQEiJrQ9iWuQYWpHDqaatan6G5ym8Wy7nJYdjJgJTszzduUSt176W8R7bGW
|
||||
73y9de+kEODQsxehSpkTVEqsMEgpTAKi5u59RRhj4OT9Lbvk9Xs9OH23aUcVUu5H
|
||||
urMIAKdsjlAUhLSPupDr4bJPRM9N4t2v709VeH170Z/9X5j7LbF++Wh2t+UXprmb
|
||||
0nDk5fjfzJnjXJQgd+nRAoIBAQDpUc+3MuLadphfyM5b5xc9A/8TuwW5a2jcLi1h
|
||||
6NlZa63qPbGvEk3kUw71ELrh8NorRqvn895CJUG4K+zVUTl9dgsXqla7GWZFHIXW
|
||||
2641R4p8HQNwNFP7KIyvvv5l72A+wWf1jpZiXXYNinrHDtPgdVXEFMDhDLibu6AK
|
||||
jsfdNOXDE+mmxMTSwwgJ9blZkdp1pBEWYCZsqW/yED6pLdTh8ZRPGHOb24x6HksZ
|
||||
Z/Gc4SIOrj5jrt3/M9oEymP+fQnF/StlnVsRnai6hBQX9khlS3pjneLOCLJfhpt/
|
||||
qcIDL03KsIhf0miIkOpNTATL4SGsWDBAQp17eN4UToacARRpAoIBAQDNcPlDVBqt
|
||||
K+fy9BBR9HBzBQlx6XkrmZ9Cgje/FrpMT+2UZ5wqMMPyB7SdoXkxx0CpB3ajOost
|
||||
i92fk7Y03xHXS3COGLKhWqDNhH1Uotlp3wpeOWx3DlAFRcIvy86iDzTa/hGaq8Kp
|
||||
2HPw0YqcxQjwYQzILBfZx3DRuQ8bt3Wiqxer/K+NRDnass/ZUTqz6nZcadMj6NiS
|
||||
Zlwm7ErjhjdYRc6amTZMtxOenxP8cAtNW+RBZ7JbUEhAhE8zU42wZI+DxhvM0mTg
|
||||
/CrRaYVE6YyAnaYo0RuJCRldz6obbgABn0q8qoY1Rmxjm+Do27hsrQgAB9Z/gmAp
|
||||
hdU2+S270fYtAoIBAQCuEYlEhkRU9HHN1ESQsCHYNakSEU+9+/JpglH9X/j4C6ve
|
||||
vFRZ5vARzh20m9yxQD2kV79c98Xz11PmkW7J3yVjArRX3Y+DWvm/yf3YRGD+AvfA
|
||||
jOzJw2B8Ws5LN9UYO7S0XRqwSsbLcCrpA02CQP+10BRCi7EytYjtNte5yLg3woVA
|
||||
OxTwhJDLJRJUS+0SdAxmBBdzeBxyqR6Jm7EECttuDgu1zupBd1SgrwUcWT4a6qO8
|
||||
DCcju4yIHykitdRQQv0Np0m/L9yHkfYV4QAUuHtehycyNtLFIBvjxMsyPXYvZhVF
|
||||
iNrVkmbGrEcBkBtr9/RlXg3xg0F2osAcqlEnBm8xAoIBADGLZkGrfcd3iDeaTnlF
|
||||
Rv0mINH86UDvim3is4j89S7EM9qPZiTyn761xwQg1faARAK/jwfsbXYtfeQnHlD/
|
||||
3vCZ++n44NNy5MbLheIsZ9xVcs2ocZUAuaGb4iner9V7b1bE4P/5HjgRwFw6XIBU
|
||||
MESwUwHPSG034OhjBda8Vr1FH69VgAzEgGNSrjeNlGehSqwcxVOqqtgboWutnp3i
|
||||
V2SNaTb1bhfwKuYdHRfK+Z7NY222kVfeM56Digopw0jf55By7W9m6fcsOTNJjF9D
|
||||
J6Q44MKFM2vH6vspwq9cxtmdTcvUIAunESqwg/wESSTEUeKYAU285m39HZ9lVncu
|
||||
On0CggEAEk6pzS5OX7DSWqrTnYd9T83lr7RzFQpWpbeK7OOidMUYm/MHx7I2UyLN
|
||||
V0K/ChkYowm69VvHJW9mcSHo0RAZiokBegJP8fhU0RJJaWyED+wdw2vOHlwAI7WP
|
||||
hj3xCOT8D+qfx12wVqo6c0jRXnNUsd5V9DPtMkn7YFYuq56gSqwlLvIpuhfU8dJM
|
||||
dCznLvjQqRQhqMk3p0bbcy4+EICR19F8UzgUfqWITwrdIriWQEWzDXIZvsBjxpaE
|
||||
PenJGHMSac7xOU/hdljj6FSpwu03aA0HklCQhwpfNDd+KPR7ntNE1DBEn93/bScb
|
||||
O61K2Igm/AywqweBe9cWRgB7lOXwIA==
|
||||
-----END PRIVATE KEY-----
|
28
localization_startup.sh
Normal file
28
localization_startup.sh
Normal file
@ -0,0 +1,28 @@
|
||||
#!/bin/bash
|
||||
# Basic entrypoint for ROS / Colcon Docker containers
|
||||
|
||||
# Source ROS 2
|
||||
source /opt/ros/${ROS_DISTRO}/setup.bash
|
||||
echo "Sourced ROS 2 ${ROS_DISTRO}"
|
||||
|
||||
# Source the base workspace, if built
|
||||
if [ -f ${UNDERLAY_WS}/install/setup.bash ]
|
||||
then
|
||||
source ${UNDERLAY_WS}/install/setup.bash
|
||||
#export GAZEBO_MODEL_PATH=$GAZEBO_MODEL_PATH:$(ros2 pkg prefix turtlebot3_gazebo)/share/turtlebot3_gazebo/models
|
||||
echo "Sourced Bot Mini base workspace"
|
||||
fi
|
||||
|
||||
# Source the overlay workspace, if built
|
||||
if [ -f /overlay_ws/install/setup.bash ]
|
||||
then
|
||||
source /overlay_ws/install/setup.bash
|
||||
#export GAZEBO_MODEL_PATH=$GAZEBO_MODEL_PATH:$(ros2 pkg prefix tb3_worlds)/share/tb3_worlds/models
|
||||
echo "Sourced Bot Mini overlay workspace"
|
||||
fi
|
||||
|
||||
# Start Robot ROS2 Nodes
|
||||
ros2 launch bot_mini_bringup robot_lidar.launch.py &
|
||||
ros2 launch bot_mini_bringup robot_localization.launch.py
|
||||
|
||||
wait
|
Binary file not shown.
@ -1,7 +0,0 @@
|
||||
image: map_floor_save.pgm
|
||||
mode: trinary
|
||||
resolution: 0.05
|
||||
origin: [-13.7, -5.57, 0]
|
||||
negate: 0
|
||||
occupied_thresh: 0.65
|
||||
free_thresh: 0.25
|
@ -1,7 +0,0 @@
|
||||
image: map_floor_mainb_save_retouched.pgm
|
||||
mode: trinary
|
||||
resolution: 0.05
|
||||
origin: [-66.2, -24.5, 0]
|
||||
negate: 0
|
||||
occupied_thresh: 0.65
|
||||
free_thresh: 0.25
|
@ -1,7 +0,0 @@
|
||||
image: map_floor_mainb_save.pgm
|
||||
mode: trinary
|
||||
resolution: 0.05
|
||||
origin: [-20.9, -7.03, 0]
|
||||
negate: 0
|
||||
occupied_thresh: 0.65
|
||||
free_thresh: 0.25
|
@ -1,7 +0,0 @@
|
||||
image: map_01-26-24.pgm
|
||||
mode: trinary
|
||||
resolution: 0.02
|
||||
origin: [-4, -14.8, 0]
|
||||
negate: 0
|
||||
occupied_thresh: 0.65
|
||||
free_thresh: 0.25
|
Binary file not shown.
@ -1,7 +0,0 @@
|
||||
image: map_floor_03-10-23.sav.pgm
|
||||
mode: trinary
|
||||
resolution: 0.05
|
||||
origin: [-27.2, -0.0189, 0]
|
||||
negate: 0
|
||||
occupied_thresh: 0.65
|
||||
free_thresh: 0.25
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because one or more lines are too long
@ -1,7 +0,0 @@
|
||||
image: map_floor_mainb_save_retouched.pgm
|
||||
mode: trinary
|
||||
resolution: 0.05
|
||||
origin: [-20.9, -7.03, 0]
|
||||
negate: 0
|
||||
occupied_thresh: 0.65
|
||||
free_thresh: 0.25
|
File diff suppressed because one or more lines are too long
Binary file not shown.
@ -1,7 +0,0 @@
|
||||
image: map_floor_save.pgm
|
||||
mode: trinary
|
||||
resolution: 0.05
|
||||
origin: [-13.7, -5.57, 0]
|
||||
negate: 0
|
||||
occupied_thresh: 0.65
|
||||
free_thresh: 0.25
|
File diff suppressed because one or more lines are too long
@ -1,7 +0,0 @@
|
||||
image: map_openlabday.pgm
|
||||
mode: trinary
|
||||
resolution: 0.05
|
||||
origin: [-13.5, -20.9, 0]
|
||||
negate: 0
|
||||
occupied_thresh: 0.65
|
||||
free_thresh: 0.25
|
File diff suppressed because one or more lines are too long
@ -1,7 +0,0 @@
|
||||
image: map_save_16.10..pgm
|
||||
mode: trinary
|
||||
resolution: 0.05
|
||||
origin: [-25.7, -17, 0]
|
||||
negate: 0
|
||||
occupied_thresh: 0.65
|
||||
free_thresh: 0.25
|
Binary file not shown.
Binary file not shown.
BIN
office1_map_save.pgm
Normal file
BIN
office1_map_save.pgm
Normal file
Binary file not shown.
7
office1_map_save.yaml
Normal file
7
office1_map_save.yaml
Normal file
@ -0,0 +1,7 @@
|
||||
image: office1_map_save.pgm
|
||||
mode: trinary
|
||||
resolution: 0.05
|
||||
origin: [1.87, -8.61, 0]
|
||||
negate: 0
|
||||
occupied_thresh: 0.65
|
||||
free_thresh: 0.25
|
@ -5,17 +5,12 @@ repositories:
|
||||
url: https://github.com/bjoernellens1/cps_rmp220_support.git
|
||||
version: main
|
||||
|
||||
rmp220_teleop:
|
||||
type: git
|
||||
url: https://github.com/bjoernellens1/rmp220_teleop.git
|
||||
version: main
|
||||
|
||||
cam_openCV:
|
||||
type: git
|
||||
url: https://github.com/bjoernellens1/ros2_cam_openCV.git
|
||||
version: main
|
||||
|
||||
ros2-exploration:
|
||||
type: git
|
||||
url: https://github.com/robo-friends/m-explore-ros2.git
|
||||
version: feature/slam_toolbox_compat
|
||||
|
||||
oak-d-lite:
|
||||
type: git
|
||||
url: https://github.com/luxonis/depthai-ros
|
||||
version: humble
|
||||
version: main
|
@ -1,71 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import os
|
||||
import subprocess
|
||||
|
||||
# Function to get the path to the docker-compose.yaml file
|
||||
def get_compose_file_path():
|
||||
path = input("Enter the path to the docker-compose.yaml file (press Enter for current directory): ").strip()
|
||||
return path if path else "docker-compose.yaml"
|
||||
|
||||
# Initialize the path to the docker-compose.yaml file
|
||||
compose_file_path = get_compose_file_path()
|
||||
|
||||
# Define a list to keep track of running services
|
||||
running_services = []
|
||||
|
||||
# Function to check if a service is already running
|
||||
def is_service_running(service_name):
|
||||
return service_name in running_services
|
||||
|
||||
# Function to start a service
|
||||
def start_service(service_name):
|
||||
if not is_service_running(service_name):
|
||||
print(f"Starting {service_name}...")
|
||||
subprocess.run(["docker", "compose", "-f", compose_file_path, "up", "-d", service_name])
|
||||
running_services.append(service_name)
|
||||
else:
|
||||
print(f"{service_name} is already running.")
|
||||
|
||||
# Function to stop a service
|
||||
def stop_service(service_name):
|
||||
if is_service_running(service_name):
|
||||
print(f"Stopping {service_name}...")
|
||||
subprocess.run(["docker", "compose", "-f", compose_file_path, "down", "-v", "--remove-orphans", service_name])
|
||||
running_services.remove(service_name)
|
||||
else:
|
||||
print(f"{service_name} is not running.")
|
||||
|
||||
# Main program
|
||||
if __name__ == "__main__":
|
||||
while True:
|
||||
print("Options:")
|
||||
print("1. Start Controller, Teleop, RSP, Lidar")
|
||||
print("2. Start AMCL and Navigation")
|
||||
print("3. Start Mapping and Navigation")
|
||||
print("4. Stop AMCL and Mapping")
|
||||
print("5. Change docker-compose.yaml file path")
|
||||
print("6. Quit")
|
||||
|
||||
choice = input("Enter your choice: ")
|
||||
|
||||
if choice == "1":
|
||||
start_service("controller")
|
||||
start_service("teleop")
|
||||
start_service("rsp")
|
||||
start_service("lidar")
|
||||
elif choice == "2":
|
||||
start_service("amcl")
|
||||
start_service("navigation")
|
||||
elif choice == "3":
|
||||
start_service("mapping")
|
||||
start_service("navigation")
|
||||
elif choice == "4":
|
||||
stop_service("amcl")
|
||||
stop_service("mapping")
|
||||
elif choice == "5":
|
||||
compose_file_path = get_compose_file_path()
|
||||
elif choice == "6":
|
||||
break
|
||||
else:
|
||||
print("Invalid choice. Please try again.")
|
70
rviz2.yaml
70
rviz2.yaml
@ -1,70 +0,0 @@
|
||||
networks:
|
||||
pc: # config for this pc. Only required for running the containers locally on the pc. For instance rviz2 or guis with gazebo.
|
||||
driver: macvlan
|
||||
driver_opts:
|
||||
parent: wlx00e04c5513fc # pc network interface: here my wifi card. Can be found with ifconfig.
|
||||
ipam:
|
||||
config:
|
||||
- subnet: 192.168.0.0/24
|
||||
gateway: 192.168.0.1
|
||||
ip_range: 192.168.0.200/25
|
||||
aux_addresses:
|
||||
net-address: 192.168.0.100 #? what is this for --> to exclude addresses from buing used.
|
||||
|
||||
services:
|
||||
# rviz2
|
||||
rviz2:
|
||||
image: ghcr.io/bjoernellens1/ros2_rmp/rmp:guis
|
||||
# command: >
|
||||
# ros2 launch cps_rmp220_support robot_rviz2.launch.py
|
||||
command: >
|
||||
ros2 launch cps_rmp220_support rviz.launch.py
|
||||
# Interactive shell
|
||||
stdin_open: true
|
||||
tty: true
|
||||
# Networking and IPC for ROS 2
|
||||
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
|
||||
volumes:
|
||||
# Allows graphical programs in the container.
|
||||
- /tmp/.X11-unix:/tmp/.X11-unix:rw
|
||||
- ${XAUTHORITY:-$HOME/.Xauthority}:/root/.Xauthority
|
||||
# networks: # not using bridging anymore, instead try using all services on macvlan? let's see... shoudl word for now. Bridging does definitely not work because multicast is not supported here.
|
||||
# pc:
|
||||
# ipv4_address: 192.168.0.201 #here need to set fixed ip to avoid collissions with other containers on robot.
|
||||
|
||||
rviz2-depthai:
|
||||
image: luxonis/depthai-ros:humble-latest
|
||||
command: >
|
||||
ros2 launch cps_rmp220_support rviz.launch.py
|
||||
# Interactive shell
|
||||
stdin_open: true
|
||||
tty: true
|
||||
# Networking and IPC for ROS 2
|
||||
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
|
||||
volumes:
|
||||
# Allows graphical programs in the container.
|
||||
- /tmp/.X11-unix:/tmp/.X11-unix:rw
|
||||
- ${XAUTHORITY:-$HOME/.Xauthority}:/root/.Xauthority
|
||||
# networks: # not using bridging anymore, instead try using all services on macvlan? let's see... shoudl word for now. Bridging does definitely not work because multicast is not supported here.
|
||||
# pc:
|
||||
# ipv4_address: 192.168.0.201 #here need to set fixed ip to avoid collissions with other containers on robot.
|
@ -1,47 +0,0 @@
|
||||
{
|
||||
"version": "1.1",
|
||||
"engine": "linux|Transformer|1.40.6|1.40.6|latest",
|
||||
"containerized": false,
|
||||
"host_distro": {
|
||||
"name": "NixOS",
|
||||
"version": "23.11",
|
||||
"display_name": "NixOS 23.11 (Tapir)"
|
||||
},
|
||||
"type": "build",
|
||||
"state": "error",
|
||||
"target_reference": "ubuntu",
|
||||
"system": {
|
||||
"type": "",
|
||||
"release": "",
|
||||
"distro": {
|
||||
"name": "",
|
||||
"version": "",
|
||||
"display_name": ""
|
||||
}
|
||||
},
|
||||
"source_image": {
|
||||
"identity": {
|
||||
"id": ""
|
||||
},
|
||||
"size": 0,
|
||||
"size_human": "",
|
||||
"create_time": "",
|
||||
"docker_version": "",
|
||||
"architecture": "",
|
||||
"container_entry": {
|
||||
"exe_path": ""
|
||||
}
|
||||
},
|
||||
"minified_image_size": 0,
|
||||
"minified_image_size_human": "",
|
||||
"minified_image": "",
|
||||
"minified_image_has_data": false,
|
||||
"minified_by": 0,
|
||||
"artifact_location": "",
|
||||
"container_report_name": "",
|
||||
"seccomp_profile_name": "",
|
||||
"apparmor_profile_name": "",
|
||||
"image_stack": null,
|
||||
"image_created": false,
|
||||
"image_build_engine": ""
|
||||
}
|
@ -1,52 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import subprocess
|
||||
|
||||
# Define the stacks
|
||||
stack1 = ["controller", "teleop", "rsp", "lidar"]
|
||||
stack2 = stack1 + ["mapping", "navigation"]
|
||||
stack3 = stack1 + ["amcl", "navigation"]
|
||||
|
||||
# Function to start a stack
|
||||
def start_stack(stack):
|
||||
print(f"Starting {', '.join(stack)}...")
|
||||
subprocess.run(["docker", "compose", "up", "-d"] + stack)
|
||||
|
||||
# Function to stop a stack
|
||||
def stop_stack(stack):
|
||||
print(f"Stopping {', '.join(stack)}...")
|
||||
subprocess.run(["docker", "compose", "down", "-v", "--remove-orphans"] + stack)
|
||||
|
||||
# Main program
|
||||
if __name__ == "__main__":
|
||||
while True:
|
||||
print("Options:")
|
||||
print("1. Start Stack 1")
|
||||
print("2. Start Stack 2")
|
||||
print("3. Start Stack 3")
|
||||
print("4. Stop Stack 1")
|
||||
print("5. Stop Stack 2")
|
||||
print("6. Stop Stack 3")
|
||||
print("7. Quit")
|
||||
|
||||
choice = input("Enter your choice: ")
|
||||
|
||||
if choice == "1":
|
||||
stop_stack(stack2 + stack3) # Stop stack2 and stack3 to avoid interference
|
||||
start_stack(stack1)
|
||||
elif choice == "2":
|
||||
stop_stack(stack1 + stack3) # Stop stack1 and stack3 to avoid interference
|
||||
start_stack(stack2)
|
||||
elif choice == "3":
|
||||
stop_stack(stack1 + stack2) # Stop stack1 and stack2 to avoid interference
|
||||
start_stack(stack3)
|
||||
elif choice == "4":
|
||||
stop_stack(stack1)
|
||||
elif choice == "5":
|
||||
stop_stack(stack2)
|
||||
elif choice == "6":
|
||||
stop_stack(stack3)
|
||||
elif choice == "7":
|
||||
break
|
||||
else:
|
||||
print("Invalid choice. Please try again.")
|
@ -1 +0,0 @@
|
||||
docker compose up -d controller teleop rsp lidar mapping navigation
|
@ -1 +0,0 @@
|
||||
docker compose up -d controller teleop rsp lidar amcl navigation
|
@ -1 +0,0 @@
|
||||
docker compose up -d controller teleop rsp lidar
|
Loading…
Reference in New Issue
Block a user