Stavět ROS2 prostoru v docker kontejner-nemůže najít ament_cmake

0

Otázka

Mám ROS2 pracovní prostor projektu, jako je tento:

├── build-in-docker
├── docker
│   ├── build
│   ├── Dockerfile
│   └── env
└── src

docker/env má proměnné prostředí:

#!/bin/bash

NOC='\033[0m'
GRN='\033[0;32m'
YLW='\033[0;33m'

image_name="docker-build-ros2"
container_name="ros2-ws"
target_path="/ros2-ws"

a docker/Dockerfile má obsah:

# syntax=docker/dockerfile:experimental

# prepare the docker   -----------------
FROM ubuntu:20.04
ARG DEBIAN_FRONTEND=noninteractive
# By default, ubuntu docker images include code to remove downloaded packages.
# Use the invocation from examples to avoid this and make the apt cache effective.
RUN rm -f /etc/apt/apt.conf.d/docker-clean \
    && echo 'Binary::apt::APT::Keep-Downloaded-Packages "true";' \
    > /etc/apt/apt.conf.d/keep-cache

ENV ROS_PYTHON_VERSION 3
RUN apt-get update && apt-get install -y locales
RUN locale-gen en_US.UTF-8
ENV LANG en_US.UTF-8

# run export DOCKER_BUILDKIT=1 to enable BuildKit
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
    --mount=type=cache,target=/var/lib/apt,sharing=locked \
    apt-get update && apt-get --no-install-recommends install -y \
    autoconf bash-completion build-essential cmake curl \
    dirmngr gcc git gnupg2 g++ libtool lsb-release \
    pkg-config python3-pip libccd-dev \
    libflann-dev libpcl-dev libyaml-cpp-dev \
    && pip3 install cython \
    && rm -rf /var/lib/apt/lists/*

RUN export LANG=en_US.UTF-8

RUN curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | apt-key add -
RUN sh -c 'echo "deb [arch=$(dpkg --print-architecture)] http://packages.ros.org/ros2/ubuntu $(lsb_release -cs) main" > /etc/apt/sources.list.d/ros2-latest.list'

RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
    --mount=type=cache,target=/var/lib/apt,sharing=locked \
    apt-get update && apt-get --no-install-recommends install -y \
    ros-foxy-desktop \
    python3-argcomplete \
    python3-colcon-common-extensions \
    python3-colcon-mixin \
    python3-rosdep \
    python3-vcstool \
    && rm -rf /var/lib/apt/lists/*

RUN rosdep init || true \
    && rosdep update

RUN echo "source /opt/ros/foxy/setup.bash" >> /etc/bash.bashrc
RUN echo "source /opt/ros/foxy/local_setup.bash" >> /etc/bash.bashrc

Pak, budu používat build-in-docker skript stavět ROS2 prostoru, build-in-docker má obsah:

#!/bin/bash
set -eu -o pipefail

script_dir="$(dirname "$0")"
pushd "$script_dir" &>/dev/null

source "$script_dir/docker/env"

# stop the container if it is running ------------------------
if [[ $(docker ps --filter "name=^/${container_name}$" --format '{{.Names}}') == "${container_name}" &&
"$(docker container inspect -f '{{.State.Running}}' ${container_name})" == "true" ]]; then
    echo -e "${YLW}Stop container \"${container_name}\"${NOC} ..."
    docker stop ${container_name}
fi

# remove the container if it exists but not running ------------------------
if [[ $(docker ps --filter "name=^/${container_name}$" --format '{{.Names}}') == "${container_name}" ]]; then
    echo -e "${YLW}Remove container \"${container_name}\"${NOC} ..."
    docker rm ${container_name} &>/dev/null
fi

# build an image from Dockerfile ------------------------
echo -e "${GRN}Build the image \"${image_name}\"${NOC} ..."
DOCKER_BUILDKIT=1 docker build \
    -t ${image_name} \
    -f docker/Dockerfile docker

# create a container and run it ------------------------
echo -e "${GRN}Run container \"${container_name}\" from image \"${image_name}\"${NOC} ..."
docker run -d -it --rm \
    --name ${container_name} \
    --mount type=bind,source="$(pwd)",target=${target_path} \
    ${image_name}

# build the project in the container ------------------------
# ${target_path} ${build_dir}: arguments passed into ./docker/build
echo -e "${GRN}Build the project${NOC} ..."
docker exec ${container_name} ${target_path}/docker/build \
    ${target_path}

# finish
echo -e "${GRN}Project is build successfully.${NOC}"
popd &>/dev/null

hovory, které docker/build skript:

#!/bin/bash
set -eu -o pipefail

# project root directory, passed from ../build-in-docker
cd "$1"

/bin/bash -c "source /opt/ros/foxy/setup.bash"

colcon build

Nicméně, dává mi to chybu:

Stop container "ros2-ws" ...
ros2-ws
Build the image "docker-build-ros2" ...
[+] Building 0.7s (18/18) FINISHED                                                     
 => [internal] load build definition from Dockerfile                              0.0s
 => => transferring dockerfile: 38B                                               0.0s
 => [internal] load .dockerignore                                                 0.0s
 => => transferring context: 2B                                                   0.0s
 => resolve image config for docker.io/docker/dockerfile:experimental             0.1s
 => CACHED docker-image://docker.io/docker/dockerfile:experimental@sha256:600e5c  0.0s
 => [internal] load metadata for docker.io/library/ubuntu:20.04                   0.1s
 => [stage-0  1/12] FROM docker.io/library/ubuntu:20.04@sha256:626ffe58f6e7566e0  0.0s
 => CACHED [stage-0  2/12] RUN rm -f /etc/apt/apt.conf.d/docker-clean     && ech  0.0s
 => CACHED [stage-0  3/12] RUN apt-get update && apt-get install -y locales       0.0s
 => CACHED [stage-0  4/12] RUN locale-gen en_US.UTF-8                             0.0s
 => CACHED [stage-0  5/12] RUN --mount=type=cache,target=/var/cache/apt,sharing=  0.0s
 => CACHED [stage-0  6/12] RUN export LANG=en_US.UTF-8                            0.0s
 => CACHED [stage-0  7/12] RUN curl -s https://raw.githubusercontent.com/ros/ros  0.0s
 => CACHED [stage-0  8/12] RUN sh -c 'echo "deb [arch=$(dpkg --print-architectur  0.0s
 => CACHED [stage-0  9/12] RUN --mount=type=cache,target=/var/cache/apt,sharing=  0.0s
 => CACHED [stage-0 10/12] RUN rosdep init || true     && rosdep update           0.0s
 => CACHED [stage-0 11/12] RUN echo "source /opt/ros/foxy/setup.bash" >> /etc/ba  0.0s
 => CACHED [stage-0 12/12] RUN echo "source /opt/ros/foxy/local_setup.bash" >> /  0.0s
 => exporting to image                                                            0.0s
 => => exporting layers                                                           0.0s
 => => writing image sha256:9af6dcfcf4fa94cec435a91fd48218c6b83c730aada6de85cc86  0.0s
 => => naming to docker.io/library/docker-build-ros2                              0.0s
Run container "ros2-ws" from image "docker-build-ros2" ...
ff1545051e411035142315215ab385d74627d7de65e79a22ec12b0c59f656790
Build the project ...
Starting >>> agv_interfaces
--- stderr: agv_interfaces
CMake Error at CMakeLists.txt:19 (find_package):
  By not providing "Findament_cmake.cmake" in CMAKE_MODULE_PATH this project
  has asked CMake to find a package configuration file provided by
  "ament_cmake", but CMake did not find one.

  Could not find a package configuration file provided by "ament_cmake" with
  any of the following names:

    ament_cmakeConfig.cmake
    ament_cmake-config.cmake

  Add the installation prefix of "ament_cmake" to CMAKE_PREFIX_PATH or set
  "ament_cmake_DIR" to a directory containing one of the above files.  If
  "ament_cmake" provides a separate development package or SDK, be sure it
  has been installed.


---
Failed   <<< agv_interfaces [0.07s, exited with code 1]

Summary: 0 packages finished [0.26s]
  1 package failed: agv_interfaces
  1 package had stderr output: agv_interfaces
  1 package not processed

Nicméně, když jsem ručně zadat pomocí kontejneru docker attach příkaz, a ručně zadejte adresář a potom vytvořit pracovní prostor pomocí colcon buildsestavení je úspěšný. Po tom, když jsem znovu spustit ./build-in-docker nativně, worspace může být postaven úspěšně.

Moje otázka je, jaké nastavení jsem udělal špatně, že se nemohu postavit na pracovní prostor z první běh ./build-in-docker velení?

bash docker ros2 shell
2021-11-24 04:30:28
2

Nejlepší odpověď

1

Jak je uvedeno v další odpověď musíte použít source /opt/ros/foxy/setup.bash místo. Nová chyba to produkuje je kvůli linii set -eu -o pipefail ve vašem build-in-docker soubor. Na -u vlajka bude léčit každý nenastavené proměnné za chybu. Můžete buď odstranit vlajku nebo nastavit AMENT_TRACE_SETUP_FILES na nějakou hodnotu.

2021-12-01 18:06:31

To řeší můj problém. AMENT_TRACE_SETUP_FILES není pre-set v prostředí, proto set -eu -o pipefail dáme výstupní skript.
zhoudingjiang
0

Ve vašem buildscript jsi provedení:

/bin/bash -c "source /opt/ros/foxy/setup.bash"

Uvedení /bin/bash v přední části vašeho příkaz otevře novou příkazovou řádku, provede příkaz, a pak se zavře příkazové řádky. Takže cokoliv, co vás zdroj v příkazu, bude to okamžitě zmizí.

Proto, jen to změnit, aby:

source /opt/ros/foxy/setup.bash
2021-11-30 09:22:47

Zkoušela jsem to. dává mi to jinou chybu: /opt/ros/foxy/setup.bash: linka 8: AMENT_TRACE_SETUP_FILES: unbound variable. Chápu tu část, říkáte, že to "otevře nový příkazový řádek", který je klíčový problém, který musím vyřešit.
zhoudingjiang

To zní jako ROS instalace problém, zkuste odinstalovat ROS Foxy (desktop/ros-základní, nevím, který jste nainstalovali), pak autoremove všechny balíky, pak přeinstalovat. Uvidíme, jestli to řeší problém.
Xander

to není ROS problém, protože můžu vytvořit pracovní prostor tím, že ručně zadat (připojit) do kontejneru, a pak source a pak colcon build.
zhoudingjiang

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................