Merge pull request #1 from bjoernellens1/docker

Docker
This commit is contained in:
bjoernellens1 2023-08-02 17:10:40 +02:00 committed by GitHub
commit 3897815d33
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 374 additions and 2 deletions

View File

@ -1,4 +1,43 @@
# cps_bot_mini_ws
## Now working via Docker!
Follow the instructions: To use this you need the latest Docker installed and for the multiplatform build the binfmt dependencies for your system. Otherwise just use the pre-built Docker containers. I will try to make the images available public.
First let's check if you are able to pull the pre-built images:
```
docker pull ghcr.io/bjoernellens1/bot_mini_ws/bot:overlay
docker pull ghcr.io/bjoernellens1/bot_mini_ws/bot:guis
```
Run:
For instance on your PC:
```
docker compose run guis
```
This will launch the "guis" container where you will find a full ros2 humble installation and all the dependencies this robot needs.
On the robot:
```
docker compose up -d controller teleop
```
So as you can see, you will be working from the same git repository as well on the robot and your dev PC.
For the fact all can run inside Docker makes the project super portable so everyone should be able to tinker around with it. Nice bonus perks: You won't interfere with your computer's local environment. With Docker you are even able to run multiple versions of ROS simultanously, even on unsupported Linux operating systems like Debian or NixOS. Also on MacOS. Windows might be possible but not tested.
### Attention: do not launch docker compose without arguments else you will start all services at once and you won't need them.
For building your own images:
I would advise to fork the repository and start working in your own one.
```
docker buildx bake overlay --load
```
This will allow you to modify the images to your needs. Enjoy!
## Old-fashioned way:
temporary ws for developing ros2 control on robot mini with odrive
needed repos are:
@ -12,7 +51,9 @@ For initialization, just call "python3 initialize.py"
TODO: extend bot_mini_bringup, python scripts for simplyfiyng startup process.
## Useful commands:
```
rosdep install --from-paths src --ignore-src -r -y
```
### Localization using predefined map and navigation
@ -34,9 +75,13 @@ These are the options that allows to configure the process real-time settings:
Example using ros2 launch:
```
ros2 launch pendulum_bringup pendulum_bringup.launch.py priority:=80 cpu-affinity:=4 lock-memory-size:=100 config-child-threads:=True
```
Example using the executable command line arguments:
```
ros2 run pendulum_demo pendulum_demo --priority 80 --cpu-affinity:=4 --lock-memory-size 100 --config-child-threads True
```
Source: https://github.com/ros2-realtime-demo/pendulum/blob/rolling/docs/real_time_tutorial.md

13
dependencies.repos Normal file
View File

@ -0,0 +1,13 @@
repositories:
# CPS Bot Mini Dependencies
odrive_ros2_control:
type: git
url: https://github.com/bjoernellens1/odrive_ros2_control
version: humble-fw-v0.5.1
Lslidar_ROS2_driver:
type: git
url: https://github.com/bjoernellens1/Lslidar_ROS2_driver
version: N10_V1.0

175
docker-compose.yaml Normal file
View File

@ -0,0 +1,175 @@
version: "3.9"
services:
# Base image containing dependencies.
base:
image: ghcr.io/bjoernellens1/ros2-base:humble
build:
context: .
dockerfile: docker/Dockerfile
tags:
- ghcr.io/bjoernellens1/ros2-base:humble
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
# Overlay image containing the project specific source code.
overlay:
extends: base
image: ghcr.io/bjoernellens1/cps_bot_mini_ws/bot:overlay
build:
context: .
dockerfile: docker/Dockerfile
tags:
- ghcr.io/bjoernellens1/cps_bot_mini_ws/bot:overlay
target: overlay
x-bake:
platforms:
- linux/arm64
- linux/amd64
volumes:
- .:/repo
# Additional dependencies for GUI applications
guis:
extends: overlay
image: ghcr.io/bjoernellens1/cps_bot_mini_ws/bot:guis
build:
context: .
dockerfile: docker/Dockerfile
tags:
- ghcr.io/bjoernellens1/cps_bot_mini_ws/bot:guis
target: guis
x-bake:
platforms:
- linux/arm64
- linux/amd64
command: >
/bin/bash
# Robot State Publisher
robot_state_publisher:
extends: overlay
command: >
ros2 launch bot_mini_bringup rsp.launch.py
stdin_open: true
tty: true
# Networking and IPC for ROS 2
network_mode: host
ipc: host
# Controller
controller:
extends: overlay
command: >
ros2 launch bot_mini_bringup robot_controller.launch.py
devices:
- /dev/ttyUSB0:/dev/ttyUSB0
- /dev/ttyACM0:/dev/ttyACM0
# Interactive shell
stdin_open: true
tty: true
# Networking and IPC for ROS 2
network_mode: host
ipc: host
# Needed to display graphical applications
privileged: true
# teleop
teleop:
extends: overlay
command: >
ros2 launch bot_mini_bringup robot_joy_teleop.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
# lidar
lidar:
extends: overlay
command: >
ros2 launch cbot_mini_bringup robot_lidar.launch.py
devices:
- /dev/ttyUSB0:/dev/ttyUSB0
- /dev/ttyUSB1:/dev/ttyUSB1
- /dev/ttyACM0:/dev/ttyACM0
stdin_open: true
tty: true
# Networking and IPC for ROS 2
network_mode: host
ipc: host
# mapping
mapping:
extends: overlay
command: >
ros2 launch bot_mini_bringup robot_mapper.launch.py
# Interactive shell
stdin_open: true
tty: true
# Networking and IPC for ROS 2
network_mode: host
ipc: host
# navigation
navigation:
extends: overlay
command: >
ros2 launch cbot_mini_bringup 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
# rviz2
rviz2:
extends: guis
command: >
rviz2
# Interactive shell
stdin_open: true
tty: true
# Networking and IPC for ROS 2
network_mode: host
ipc: host
# Needed to display graphical applications
privileged: true
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

83
docker/Dockerfile Normal file
View File

@ -0,0 +1,83 @@
ARG ROS_DISTRO=humble
ARG UNDERLAY_WS=/bot_mini_ws
ARG OVERLAY_WS=/bot_mini_ws
# This file should work for both amd64 and arm64 builds.
########################################
# Base Image for Bot Mini Control #
########################################
FROM ros:${ROS_DISTRO} as base
ENV ROS_DISTRO=${ROS_DISTRO}
ENV UNDERLAY_WS=${UNDERLAY_WS}
SHELL ["/bin/bash", "-c"]
# Create Colcon workspace with external dependencies
RUN mkdir -p /${UNDERLAY_WS}/src
WORKDIR /${UNDERLAY_WS}/src
COPY dependencies.repos .
#RUN vcs import < dependencies.repos
RUN vcs import < dependencies.repos;
# Build the base Colcon workspace, installing dependencies first.
WORKDIR /${UNDERLAY_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/*
# Use Cyclone DDS as middleware
RUN apt-get update && apt-get install -y --no-install-recommends \
ros-${ROS_DISTRO}-rmw-cyclonedds-cpp \
ros-${ROS_DISTRO}-xacro \
&& rm -rf /var/lib/apt/lists/*
ENV RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
###########################################
# Overlay Image for Bot Mini Control #
###########################################
FROM base AS overlay
ENV OVERLAY_WS=${OVERLAY_WS}
# Create an overlay Colcon workspace
RUN mkdir -p /${OVERLAY_WS}/src
WORKDIR /${OVERLAY_WS}/src
COPY overlay.repos .
RUN vcs import < overlay.repos
WORKDIR /${OVERLAY_WS}
RUN source /${UNDERLAY_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/*
# Set up the entrypoint
COPY ./docker/entrypoint.sh /
RUN chmod +x /entrypoint.sh
ENTRYPOINT [ "/entrypoint.sh" ]
###########################################
# GUI Additions for Ros2 #
###########################################
FROM overlay AS guis
# Install additional GUI tools
RUN source /${UNDERLAY_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/*
# Set up the entrypoint
ENTRYPOINT [ "/entrypoint.sh" ]
LABEL org.opencontainers.image.source=https://github.com/bjoernellens1/cps_bot_mini_ws

23
docker/entrypoint.sh Normal file
View File

@ -0,0 +1,23 @@
#!/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
echo "Sourced CPS Bot Mini base workspace"
fi
# Source the overlay workspace, if built
if [ -f /overlay_ws/install/setup.bash ]
then
source /overlay_ws/install/setup.bash
echo "Sourced CPS BOt Mini Overlay workspace"
fi
# Execute the command passed into this entrypoint
exec "$@"

33
overlay.repos Normal file
View File

@ -0,0 +1,33 @@
repositories:
cps_rmp220_support:
type: git
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
bot_mini_teleop:
type: git
url: https://github.com/bjoernellens1/rmp220_teleop
version: bot_mini
bot_mini_description:
type: git
url: https://github.com/bjoernellens1/bot_mini_description
cam_openCV:
type: git
url: https://github.com/bjoernellens1/ros2_cam_openCV
bot_mini_bringup:
type: git
url: https://github.com/bjoernellens1/bot_mini_bringup