Compare commits

...

140 Commits

Author SHA1 Message Date
9b9f26c145 update 2024-03-28 09:58:05 +01:00
90639412ef Merge branch 'main' of https://github.com/bjoernellens1/ros2_rmp 2024-01-25 10:13:50 +01:00
bjoernellens1
d069b05a48
Merge pull request #2 from bjoernellens1/tailscale
Tailscale
2024-01-25 10:12:24 +01:00
ac3a63963d update 2024-01-25 10:11:39 +01:00
aa88f66cb7 update: tuned slam and nav2 params for better resolution 2024-01-22 17:48:42 +01:00
d730e71915 update 2024-01-22 11:55:36 +01:00
82ceda82bd Merge branch 'main' of https://github.com/bjoernellens1/ros2_rmp 2024-01-22 10:33:46 +01:00
15302c1bec update 2024-01-22 10:33:34 +01:00
e3aaae124c cleanup 2023-12-24 11:59:29 +01:00
bjoernellens1
cc9e84479c
Update README.md 2023-12-18 11:28:26 +01:00
a34849f92a update 2023-11-14 15:29:24 +01:00
fa9c96aa3e update 2023-11-14 15:27:35 +01:00
8002eaa69d update: tailscale 2023-11-14 15:22:26 +01:00
9c629d890d update 2023-11-14 15:08:19 +01:00
75f62baf79 update 2023-11-14 15:03:55 +01:00
8eed831ce1 save 2023-11-14 14:55:16 +01:00
6d5f14919d update 2023-11-13 16:52:16 +01:00
b01dd378c5 update 2023-11-13 16:51:31 +01:00
b014d836a7 some cleanup 2023-11-13 16:48:59 +01:00
48b267bb54 added zerotier container in routing mode 2023-11-13 16:28:59 +01:00
61e01c61fe update 2023-11-13 16:24:55 +01:00
bjoernellens1
09929f9160
Update docker-compose.yaml 2023-10-20 14:22:13 +02:00
bjoernellens1
4bc8864916
Update docker-compose.yaml 2023-10-20 13:40:40 +02:00
12bf4006d5 update 2023-10-20 13:35:46 +02:00
3ad2925891 update 2023-10-16 08:50:52 +02:00
edc50933f1 Merge branch 'main' of https://github.com/bjoernellens1/ros2_rmp 2023-10-16 08:50:31 +02:00
731b1fd42b update 2023-10-16 08:50:29 +02:00
bjoernellens1
96e3ad0971
Update docker-buildx-bake-build.yml
update
2023-10-16 08:32:01 +02:00
bjoernellens1
09889b9168
Update docker-buildx-bake-build.yml
new login method for ghcr
2023-10-16 08:23:43 +02:00
896a83c056 update 2023-10-13 09:56:31 +02:00
16496b67e4 update 2023-10-13 09:18:00 +02:00
14ea0a37b1 update 2023-10-05 09:08:23 +02:00
b81b997178 update 2023-10-05 09:06:41 +02:00
8600cee687 update 2023-10-05 09:05:57 +02:00
0bd48d6ca7 update networking 2023-10-05 09:00:00 +02:00
a96856e91e update 2023-10-04 14:11:22 +02:00
db6e7154f7 update 2023-10-04 11:05:21 +02:00
59d8af4c70 Merge branch 'main' of https://github.com/bjoernellens1/ros2_rmp 2023-10-04 10:10:56 +02:00
da9889a2b9 update 2023-10-04 10:10:13 +02:00
bjoernellens1
d073520fc9
update 2023-09-26 12:26:35 +02:00
bjoernellens1
52b2a50782
update 2023-09-26 12:18:18 +02:00
bjoernellens1
1bbbb9ac79
update 2023-09-26 12:17:02 +02:00
bjoernellens1
e2a3bd00cc
Create docker-buildx-bake-build.yml 2023-09-26 12:15:09 +02:00
f56471122a update 2023-09-26 12:04:20 +02:00
c67e67e627 update 2023-09-26 11:56:20 +02:00
d910fd91bd update 2023-09-26 11:23:47 +02:00
e785e90e3e update 2023-09-22 09:16:34 +02:00
fa7f2dec68 update 2023-09-21 09:51:45 +02:00
dcdcd37e87 update 2023-09-21 09:50:04 +02:00
20d2fe92f0 update 2023-09-21 09:49:05 +02:00
e967570668 update 2023-09-21 09:38:21 +02:00
828cbd761d update 2023-09-21 09:37:57 +02:00
08ec65aae2 update 2023-09-19 10:18:54 +02:00
d46f08fa09 update 2023-09-19 10:07:09 +02:00
843e715f5b update 2023-09-19 10:06:41 +02:00
7562b1e0e1 update 2023-09-18 12:29:01 +02:00
ab39acf4fd update 2023-09-18 12:09:05 +02:00
e3b6e32489 update: oakd 2023-09-18 12:02:15 +02:00
ecb1cc0b76 update 2023-09-14 11:48:39 +02:00
88b723efe8 update 2023-09-14 11:08:37 +02:00
200138438e update 2023-09-14 11:08:13 +02:00
5ac229c175 update 2023-09-14 08:36:30 +02:00
18212fcd0c update 2023-09-13 13:59:17 +02:00
4c882718e5 update 2023-09-13 12:22:52 +02:00
fa2f0450e4 update 2023-09-13 12:17:00 +02:00
affb578337 update 2023-09-13 12:16:10 +02:00
d631026529 update 2023-09-13 11:57:55 +02:00
303ba6828d update 2023-09-13 11:57:16 +02:00
c2e1f61489 update 2023-09-13 11:56:52 +02:00
bcf726f425 update 2023-09-13 11:54:58 +02:00
742e91b4dc update 2023-09-13 11:51:50 +02:00
1d671386ed update 2023-09-13 11:51:10 +02:00
b5aa18b72f update 2023-09-13 11:49:17 +02:00
6b1cffd062 update 2023-09-13 11:48:45 +02:00
606e941afd update 2023-09-13 11:47:15 +02:00
7a02589a44 update 2023-09-13 11:46:43 +02:00
9b2ef84002 update: trying to do some networking stuff 2023-09-13 11:45:32 +02:00
d966e1e84f update 2023-09-13 10:58:32 +02:00
624360c89f update 2023-09-13 10:57:03 +02:00
312c5f5985 update 2023-09-13 10:49:01 +02:00
d42093e992 update 2023-09-13 10:48:45 +02:00
8ac3c46136 update 2023-09-13 10:40:23 +02:00
01f5076d0c update 2023-09-13 10:38:42 +02:00
8fc4491513 update 2023-09-13 10:31:23 +02:00
2041a7f0bc update: added start files 2023-09-13 10:30:41 +02:00
9b62c8b0ef update 2023-09-07 11:03:07 +02:00
7ffda1b15c update 2023-09-07 10:53:45 +02:00
12a9161f0e update 2023-09-06 08:37:24 +02:00
47d80e562d update 2023-09-05 08:52:37 +02:00
93e9cf8edc update 2023-08-31 11:46:21 +02:00
52f25956dc update 2023-08-31 11:30:00 +02:00
65406f281d update 2023-08-30 11:30:45 +02:00
3b14eec33d added foxglove layout file 2023-08-30 08:36:05 +02:00
6b80a4857e added profiles to docker compose 2023-08-30 08:26:46 +02:00
bed9ad3cc4 update 2023-08-29 11:17:44 +02:00
bc58e20172 update 2023-08-29 10:04:00 +02:00
12c91fab3e added foxglove studio webserver 2023-08-29 09:35:01 +02:00
805e9cf72c added foxglove websocket bridge 2023-08-29 09:07:28 +02:00
201b5cc580 update 2023-08-28 12:21:03 +02:00
b6856a346a update 2023-08-28 12:19:24 +02:00
de13a7da68 update 2023-08-28 12:16:09 +02:00
09ffd31be4 update 2023-08-28 11:56:46 +02:00
3d8191214b update 2023-08-28 11:55:28 +02:00
c861afc6eb update 2023-08-28 11:47:00 +02:00
2eb15941e9 changed lidar usb id 2023-08-28 11:35:54 +02:00
db0b0429a2 changed controller usb id 2023-08-28 11:33:32 +02:00
7a3fdb7af9 changed lidar usb id 2023-08-28 11:31:22 +02:00
6531f607fa added amcl 2023-08-23 08:32:04 +02:00
2eb1abb81c added amcl 2023-08-23 08:16:20 +02:00
b094d84b14 update 2023-08-22 12:06:18 +02:00
305f8c0df9 ekf 2023-08-22 09:05:48 +02:00
45d89c6de8 update rviz configuration 2023-08-22 08:34:05 +02:00
daee5e3d05 update Dockerfile 2023-08-21 09:28:33 +02:00
a768efe59c update 2023-08-18 10:03:42 +02:00
06b7aa9924 update 2023-08-18 10:02:02 +02:00
1ddcc6531d update 2023-08-18 09:57:35 +02:00
a0f9fe9ace update 2023-08-17 12:26:45 +02:00
7ff8e9ee4f trying to have a small functional base image 2023-08-17 10:51:15 +02:00
bc04a8d580 update: bring rmp_middleware into base image 2023-08-17 09:49:03 +02:00
3e8b14cac3 update 2023-08-17 09:22:30 +02:00
600c0c09b7 update 2023-08-10 11:04:14 +02:00
f9b0fc54b3 update 2023-08-10 11:02:16 +02:00
bc6e932ba8 Merge branch 'main' of https://github.com/bjoernellens1/ros2_rmp 2023-08-10 09:05:25 +02:00
4d93fd6a8f update 2023-08-10 09:04:23 +02:00
7c3f7066d4 update layers 2023-08-09 16:33:46 +02:00
8a8d1187bb update lidar 2023-08-09 12:04:46 +02:00
5ed0b456e7 update lidar 2023-08-09 12:03:10 +02:00
720c29e661 update lidar 2023-08-09 12:00:50 +02:00
e3ce07b4ba update lidar 2023-08-09 11:58:24 +02:00
1a57f2e644 update lidar 2023-08-09 11:57:41 +02:00
d2c7924087 commented out namespace --> test with domain id 2023-08-09 10:36:40 +02:00
cd5ba23b8c update 2023-08-09 09:59:49 +02:00
94bff880ff update dependencies 2023-08-09 09:45:03 +02:00
264f25d085 update dependencies 2023-08-09 09:32:43 +02:00
b6e5fb5d8d update: controller starts from base image 2023-08-09 09:21:27 +02:00
2957a5ad23 update: controller starts from base image 2023-08-09 09:20:23 +02:00
efe6614635 update: controller starts from base image 2023-08-09 09:18:23 +02:00
b0af0db47c update: controller starts from base image 2023-08-09 09:17:57 +02:00
75fce17d9e update: controller starts from base image 2023-08-09 09:13:26 +02:00
bdfc5ed243 update: controller starts from base image 2023-08-09 09:06:03 +02:00
55 changed files with 3275 additions and 316 deletions

View File

@ -0,0 +1,45 @@
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

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
*.pgm

View File

@ -3,15 +3,24 @@
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
```

View File

@ -1,26 +0,0 @@
# 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 Normal file
View File

@ -0,0 +1,29 @@
-----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-----

21
config/cyclonedds.xml Normal file
View File

@ -0,0 +1,21 @@
<?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>

50
config/entrypoint.sh Executable file
View File

@ -0,0 +1,50 @@
#!/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 "$@"

633
config/nav2_params.yaml Normal file
View File

@ -0,0 +1,633 @@
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

View File

@ -1,29 +0,0 @@
#!/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_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
wait

View File

@ -16,3 +16,13 @@ repositories:
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

View File

@ -16,3 +16,13 @@ repositories:
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

View File

@ -1,5 +1,28 @@
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:
@ -7,6 +30,8 @@ services:
build:
context: .
dockerfile: docker/Dockerfile
tags:
- ghcr.io/bjoernellens1/ros2_rmp/rmp:base
args:
ROS_DISTRO: humble
target: base
@ -14,7 +39,6 @@ services:
platforms:
- linux/arm64
- linux/amd64
# Interactive shell
stdin_open: true
tty: true
@ -22,16 +46,26 @@ 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:
@ -66,144 +100,289 @@ services:
platforms:
- linux/arm64
- linux/amd64
#entrypoint: /bin/bash
command: >
/bin/bash
devices:
- /dev/dri:/dev/dri
# Robot State Publisher
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
# Controller
controller:
extends: overlay
extends: base
command: >
ros2 launch cps_rmp220_support robot_controller.launch.py
ros2 run segwayrmp SmartCar --ros-args -r cmd_vel:=cmd_vel_out -p serial_full_name:=/dev/segway
devices:
- /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
- /dev/segway:/dev/ttyUSB0
#- /dev/ttyUSB0:/dev/ttyUSB0
privileged: true
# depends_on:
# - robot_state_publisher
environment:
- ROS_DOMAIN_ID=5
restart: unless-stopped
# teleop
teleop:
extends: overlay
extends: base
depends_on:
- controller
command: >
ros2 launch cps_rmp220_support robot_joystick.launch.py
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
#- /dev/input/by-id/usb-Logitech_Wireless_Gamepad_F710_56679674-joystick:/dev/input/by-id/usb-Logitech_Wireless_Gamepad_F710_56679674-joystick
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:
- robot_state_publisher
environment:
- ROS_DOMAIN_ID=5
- 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
# 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
# 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
# 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
stdin_open: true
tty: true
# Networking and IPC for ROS 2
network_mode: host
ipc: host
environment:
- ROS_DOMAIN_ID=5
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
# 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
# command: >
# ros2 launch cps_rmp220_support robot_rviz2.launch.py
#extends: guis
image: ghcr.io/bjoernellens1/ros2_rmp/rmp:guis
command: >
rviz2
# Interactive shell
stdin_open: true
tty: true
# Networking and IPC for ROS 2
network_mode: host
ipc: host
ros2 launch cps_rmp220_support rviz.launch.py
# Needed to display graphical applications
privileged: true
privileged: true # really necessary?
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?

460
docker-compose.yaml.bak Normal file
View File

@ -0,0 +1,460 @@
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

View File

@ -8,7 +8,7 @@ ARG TARGETPLATFORM
# Variable TARGETPLATFORM should be auomatically created during build process by docker.
########################################
# Base Image for Bot Mini Control #
# Base Image for RMP Control #
########################################
FROM ros:${ROS_DISTRO} as base
ENV ROS_DISTRO=${ROS_DISTRO}
@ -17,6 +17,8 @@ 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 .
@ -29,41 +31,56 @@ 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 \
&& rosdep install --from-paths src --ignore-src --rosdistro ${ROS_DISTRO} -y \
&& colcon build --symlink-install \
&& rm -rf /var/lib/apt/lists/*
&& 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
# 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/*
RUN source /opt/ros/${ROS_DISTRO}/setup.bash \
&& 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/*
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 .
@ -71,21 +88,27 @@ RUN vcs import < overlay.repos
WORKDIR /overlay_ws
ENV DEBIAN_FRONTEND noninteractive
RUN source /rmp_ws/install/setup.bash \
&& colcon build --symlink-install \
&& apt-get update \
&& rosdep install --from-paths src --ignore-src --rosdistro ${ROS_DISTRO} -y \
&& rm -rf /var/lib/apt/lists/*
&& 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
# 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
# Update repository at the end of this build stage
RUN vcs pull src
ENTRYPOINT [ "/entrypoint.sh" ]
@ -96,13 +119,149 @@ FROM overlay AS guis
# Install additional GUI tools
RUN source /rmp_ws/install/setup.bash \
&& colcon build --symlink-install \
&& 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/*
&& apt-get update \
&& apt-get install -y --no-install-recommends ros-${ROS_DISTRO}-rviz2 \
&& rm -rf /var/lib/apt/lists/*
# Update repository at the end of this build stage
RUN vcs pull src
# 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" ]

View File

@ -1,61 +0,0 @@
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" ]

View File

@ -1,62 +0,0 @@
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" ]

View File

@ -1,6 +1,8 @@
#!/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}"
@ -10,19 +12,28 @@ 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"
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
#export GAZEBO_MODEL_PATH=$GAZEBO_MODEL_PATH:$(ros2 pkg prefix tb3_worlds)/share/tb3_worlds/models
echo "Sourced Bot Mini overlay workspace"
echo "Sourced CPS RMP 220 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
# 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
wait
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 "$@"

View File

@ -1,6 +1,8 @@
#!/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}"
@ -9,7 +11,7 @@ echo "Sourced ROS 2 ${ROS_DISTRO}"
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
vcs pull ${UNDERLAY_WS}/src
echo "Sourced CPS RMP 220 base workspace"
fi
@ -17,9 +19,32 @@ fi
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
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 "$@"

408
foxglove/default.json Normal file
View File

@ -0,0 +1,408 @@
{
"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
}
}
}

220
foxglove/default.json.bak Normal file
View File

@ -0,0 +1,220 @@
{
"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
}
}

402
foxglove/default.json.bak2 Normal file
View File

@ -0,0 +1,402 @@
{
"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
}
}
}

62
husarnet.yaml Normal file
View File

@ -0,0 +1,62 @@
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 Executable file
View File

@ -0,0 +1,19 @@
#!/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

3
install_portainer.sh Normal file
View File

@ -0,0 +1,3 @@
#!/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 Normal file
View File

@ -0,0 +1,52 @@
-----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-----

BIN
map_floor_save.pgm Normal file

Binary file not shown.

7
map_floor_save.yaml Normal file
View File

@ -0,0 +1,7 @@
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

7
maps/map.yaml Normal file
View File

@ -0,0 +1,7 @@
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

7
maps/map.yaml.bak Normal file
View File

@ -0,0 +1,7 @@
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

7
maps/map_01-26-24.yaml Normal file
View File

@ -0,0 +1,7 @@
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.

View File

@ -0,0 +1,7 @@
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

View File

@ -0,0 +1,7 @@
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

BIN
maps/map_floor_save.pgm Normal file

Binary file not shown.

7
maps/map_floor_save.yaml Normal file
View File

@ -0,0 +1,7 @@
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

4
maps/map_openlabday.pgm Normal file

File diff suppressed because one or more lines are too long

7
maps/map_openlabday.yaml Normal file
View File

@ -0,0 +1,7 @@
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

4
maps/map_save_16.10..pgm Normal file

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,7 @@
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

BIN
maps/map_ser_16.10..data Normal file

Binary file not shown.

Binary file not shown.

View File

@ -5,12 +5,17 @@ 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

71
robot_config.py Normal file
View File

@ -0,0 +1,71 @@
#!/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 Normal file
View File

@ -0,0 +1,70 @@
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.

47
slim.report.json Normal file
View File

@ -0,0 +1,47 @@
{
"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": ""
}

52
stack_manager.py Normal file
View File

@ -0,0 +1,52 @@
#!/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
start_mapping.sh Normal file
View File

@ -0,0 +1 @@
docker compose up -d controller teleop rsp lidar mapping navigation

1
start_navigation.sh Normal file
View File

@ -0,0 +1 @@
docker compose up -d controller teleop rsp lidar amcl navigation

1
start_robot.sh Normal file
View File

@ -0,0 +1 @@
docker compose up -d controller teleop rsp lidar

0
update_20.10.2023 Normal file
View File