version: "3.9"
services:
  # Base image containing dependencies.
  base:
    image: ghcr.io/bjoernellens1/cps_bot_mini_ws/bot:base
    build:
      context: .
      dockerfile: docker/Dockerfile
      tags:
        - ghcr.io/bjoernellens1/cps_bot_mini_ws/bot:base
      args:
        ROS_DISTRO: humble
        UNDERLAY_WS: cps_bot_mini_ws
        OVERLAY_WS: overlay_ws
      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
      - 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
  # 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 cps_loki_bringup rsp.launch.py
  # Controller
  controller:
    extends: overlay
    command: |
      ros2 launch cps_loki_bringup robot_controller.launch.py
    devices:
      - /dev/ttyUSB0:/dev/ttyUSB0
      - /dev/ttyACM0:/dev/ttyACM0
    restart: unless-stopped
  # teleop
  teleop:
    extends: overlay
    command: |
      ros2 launch cps_loki_bringup robot_joy_teleop.launch.py
    devices:
      - /dev/input:/dev/input
    restart: unless-stopped
  # scan filter node
  lidar_filter:
    extends: overlay
    command: |
      ros2 launch cps_loki_bringup robot_scan_filter.launch.py
  # lidar
  lidar:
    extends: overlay
    depends_on:
      - lidar_filter
    command: |
      ros2 launch cps_loki_bringup robot_lidar.launch.py
    devices:
      - /dev/ttyUSB0:/dev/ttyUSB0
      - /dev/ttyACM0:/dev/ttyACM0
  # mapping
  mapping:
    extends: overlay
    command: |
      ros2 launch cps_loki_bringup robot_mapper.launch.py
  # navigation
  navigation:
    extends: overlay
    #command: >
    #  ros2 launch cbot_mini_bringup robot_navigation.launch.py
    #  map_subscribe_transient_local:=true
    command: >
      ros2 launch nav2_bringup bringup_launch.py slam:=True map:=/repo/map.yaml
      use_sim_time:=False use_composition:=True
      params_file:=/overlay_ws/src/cps_loki_bringup/config/nav2_params.yaml
    depends_on:
      - lidar
      - controller
      - teleop
  # camera
  cam:
    extends: overlay
    command: >
      ros2 launch ffmpeg_image_transport cam.launch.py
    privileged: true
    devices:
      - /dev/dri:/dev/dri

  ################################################################################################################################
  # This section is mostly for supervision from PC                                                                               #
  ################################################################################################################################
  # rviz2
  rviz2:
    extends: guis
    command: |
      rviz2
    # Needed to display graphical applications
    privileged: true
networks: {}
