diff --git a/.dockerignore b/.dockerignore index 1d25e0a..579805f 100644 --- a/.dockerignore +++ b/.dockerignore @@ -3,7 +3,9 @@ .circleci/ .vscode/ +.github/ .dockerignore .gitignore **Dockerfile **.Dockerfile +Dockerfile.** diff --git a/.github/dependabot.yml b/.github/dependabot.yml index ac63c45..c996bec 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -9,6 +9,12 @@ updates: directory: "/" schedule: interval: "daily" + groups: + baseimage-dependencies: + patterns: + - "tiiuae/fog-ros-sdk" + - "tiiuae/fog-ros-baseimage-builder" + - "tiiuae/fog-ros-baseimage" - package-ecosystem: "github-actions" directory: "/" schedule: diff --git a/.github/workflows/tii-depthai-ctrl.yaml b/.github/workflows/tii-depthai-ctrl.yaml index c283256..5066e59 100644 --- a/.github/workflows/tii-depthai-ctrl.yaml +++ b/.github/workflows/tii-depthai-ctrl.yaml @@ -1,56 +1,162 @@ name: tii-depthai-ctrl on: - repository_dispatch: - types: [fog-ros-baseimage-update] push: + pull_request: workflow_dispatch: + inputs: + build_amd64: + description: 'Build for AMD64' + required: true + default: true + type: boolean + build_arm64: + description: 'Build for ARM64' + required: true + default: false + type: boolean + build_riscv64: + description: 'Build for RISCV64' + required: true + default: false + type: boolean + +permissions: + contents: read + packages: write + +env: + REGISTRY_IMAGE: ghcr.io/tiiuae/tii-depthai-ctrl jobs: + prepare: + runs-on: ubuntu-latest + outputs: + matrix: ${{ steps.set-matrix.outputs.matrix }} + steps: + - id: set-matrix + run: | + default_branch="${{ github.event.repository.default_branch }}" + matrix_list=() + + if [[ "${{ github.event_name }}" == "push" && "${{ github.ref }}" == "refs/heads/$default_branch" ]]; then + matrix_list=("amd64" "arm64" "riscv64") + elif [[ "${{ github.event_name }}" == "pull_request" && "${{ github.base_ref }}" == "$default_branch" ]]; then + matrix_list=("amd64" "arm64" "riscv64") + elif [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then + if [[ "${{ github.event.inputs.build_amd64 }}" == 'true' ]]; then + matrix_list+=("amd64") + fi + if [[ "${{ github.event.inputs.build_arm64 }}" == 'true' ]]; then + matrix_list+=("arm64") + fi + if [[ "${{ github.event.inputs.build_riscv64 }}" == 'true' ]]; then + matrix_list+=("riscv64") + fi + else + # Maybe push or some other trigger + matrix_list=("amd64") + fi + + matrix_json="{\"include\": [" + for platform in "${matrix_list[@]}"; do + matrix_json+="{\"platform\":\"$platform\"}," + done + matrix_json="${matrix_json%,}]}" + echo "::set-output name=matrix::$matrix_json" + echo $matrix_json + build: + needs: prepare runs-on: ubuntu-latest + strategy: + matrix: ${{fromJson(needs.prepare.outputs.matrix)}} + outputs: + short_git_sha: ${{ steps.vars.outputs.SHORT_GIT_SHA }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: submodules: recursive - - uses: docker/setup-buildx-action@v2 + - name: Setup QEMU + uses: docker/setup-qemu-action@v3 + with: + platforms: ${{ matrix.platform }} - - name: Set image tag format without suffix - run: | - echo "IMAGE_TAG_FORMAT=type=sha" >> $GITHUB_ENV - if: github.event_name == 'push' + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 - - name: Set image tag format with suffix - # it is possible that run_number should be used instead run_attempt - # run_attempt is unique number on every run and run_attempt resets to 1 if re-build is not used - # content of image_sha_tag_suffix is defined in fog-ros-baseimage dispatcher workflow. + - name: Set short git commit SHA + id: vars run: | - echo "IMAGE_TAG_FORMAT=type=sha,suffix=-${{ github.event.client_payload.image_sha_tag_suffix }}" >> $GITHUB_ENV - if: github.event_name == 'repository_dispatch' + calculatedSha=$(git rev-parse --short ${{ github.sha }}) + echo "SHORT_GIT_SHA=$calculatedSha" >> $GITHUB_OUTPUT - name: Docker meta id: meta - uses: docker/metadata-action@v4 + uses: docker/metadata-action@v5 with: - images: ghcr.io/tiiuae/tii-depthai-ctrl + images: ${{ env.REGISTRY_IMAGE }} tags: | - type=ref,event=branch - type=semver,pattern={{version}} - type=raw,value=latest - ${{ env.IMAGE_TAG_FORMAT }} + type=ref,event=branch,suffix=-${{ matrix.platform }} + type=ref,event=pr,suffix=-${{ matrix.platform }} + type=semver,pattern={{version}},suffix=-${{ matrix.platform }} + type=sha,suffix=-${{ matrix.platform }} + type=raw,value=latest,enable=${{ endsWith(github.ref, github.event.repository.default_branch) && matrix.platform == 'amd64' }} - name: Login to GitHub Container Registry - uses: docker/login-action@v2 + uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: Build container image and push - uses: docker/build-push-action@v4 + uses: docker/build-push-action@v5 with: context: . + file: Dockerfile + platforms: linux/${{ matrix.platform }} + pull: true push: true + no-cache: false + cache-from: type=gha + cache-to: type=gha,mode=max tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} + provenance: false + + merge: + runs-on: ubuntu-latest + needs: + - prepare + - build + steps: + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Docker meta + id: meta + uses: docker/metadata-action@v4 + with: + images: ${{ env.REGISTRY_IMAGE }} + + - name: Login to Docker Hub + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.repository_owner }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Create combined image + run : | + AMEND_LIST="" + for platform in $(echo '${{ needs.prepare.outputs.matrix }}' | jq -r '.include[].platform'); do + echo "Adding ${{ env.REGISTRY_IMAGE }}:sha-${{ needs.build.outputs.short_git_sha }}-$platform to the amend list" + AMEND_LIST+="--amend ${{ env.REGISTRY_IMAGE }}:sha-${{ needs.build.outputs.short_git_sha }}-$platform " + done + docker manifest create ${{ env.REGISTRY_IMAGE }}:sha-${{ needs.build.outputs.short_git_sha }} $AMEND_LIST + + - name: Push image to the registry + run: | + docker manifest push ${{ env.REGISTRY_IMAGE }}:sha-${{ needs.build.outputs.short_git_sha }} diff --git a/CMakeLists.txt b/CMakeLists.txt index 46caef2..ca80248 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,34 +1,48 @@ cmake_minimum_required(VERSION 3.5) +# Without enabling languages, find_package(depthai) fails when it is found in the system +# It then tries to run find_package(Threads) and that causes an error. +# Can't define the project(..) here as well, because it then makes hunter to fail +enable_language(C) +enable_language(C CXX) +set(CMAKE_BUILD_TYPE Release) + # all these settings are needed to properly compile depthai-core as subdirectory set(BUILD_SHARED_LIBS OFF) set(CMAKE_POSITION_INDEPENDENT_CODE ON) -add_definitions(-DSPDLOG_ACTIVE_LEVEL=6) -add_definitions(-DSPDLOG_HEADER_ONLY=1) -add_definitions(-DFMT_HEADER_ONLY=1) -set(HUNTER_CONFIGURATION_TYPES ${CMAKE_BUILD_TYPE}) # makes possible to compile also Debug build -add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/depthai-core ${CMAKE_CURRENT_BINARY_DIR}/depthai-core EXCLUDE_FROM_ALL) +message(STATUS "-*-*-*- trying to find depthai library -*-*-*-") +find_package(depthai QUIET) +if(depthai_FOUND) + message(STATUS "-*-*-*- depthai found -*-*-*-") +else() + message(STATUS "-*-*-*- depthai not found -*-*-*-") + add_definitions(-DSPDLOG_ACTIVE_LEVEL=6) + add_definitions(-DSPDLOG_HEADER_ONLY=1) + add_definitions(-DFMT_HEADER_ONLY=1) + set(HUNTER_CONFIGURATION_TYPES ${CMAKE_BUILD_TYPE}) # makes possible to compile also Debug build + add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/depthai-core ${CMAKE_CURRENT_BINARY_DIR}/depthai-core EXCLUDE_FROM_ALL) +endif() option(BUILD_GSTREAMER "enable building gstreamer" OFF) if(DEFINED ENV{BUILD_GSTREAMER}) set(BUILD_GSTREAMER "$ENV{BUILD_GSTREAMER}") endif() -project(depthai_ctrl) +project(depthai_ctrl LANGUAGES CXX C) -# pkg-config configurations path. -if(NOT DEFINED ENV{PKG_CONFIG_PATH}) - set(ENV{PKG_CONFIG_PATH} "/usr/lib/x86_64-linux-gnu/pkgconfig/") -else() - string(FIND "/usr/lib/x86_64-linux-gnu/pkgconfig/" $ENV{PKG_CONFIG_PATH} POS_INC_PATH) - if(${POS_INC_PATH} STREQUAL "-1") - set(ENV{PKG_CONFIG_PATH} "$ENV{PKG_CONFIG_PATH}:/usr/lib/x86_64-linux-gnu/pkgconfig/") - endif() -endif() +# # pkg-config configurations path. +# if(NOT DEFINED ENV{PKG_CONFIG_PATH}) +# set(ENV{PKG_CONFIG_PATH} "/usr/lib/x86_64-linux-gnu/pkgconfig/") +# else() +# string(FIND "/usr/lib/x86_64-linux-gnu/pkgconfig/" $ENV{PKG_CONFIG_PATH} POS_INC_PATH) +# if(${POS_INC_PATH} STREQUAL "-1") +# set(ENV{PKG_CONFIG_PATH} "$ENV{PKG_CONFIG_PATH}:/usr/lib/x86_64-linux-gnu/pkgconfig/") +# endif() +# endif() # Default to C++14 if(NOT CMAKE_CXX_STANDARD) - set(CMAKE_CXX_STANDARD 14) + set(CMAKE_CXX_STANDARD 17) endif() if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") @@ -44,7 +58,11 @@ if(NOT OpenCV_FOUND) find_package(OpenCV ${opencv_version} REQUIRED COMPONENTS imgproc highgui) endif() -#find_package(ament_cmake REQUIRED) +find_package(ament_cmake REQUIRED) +# find_package(libyaml_vendor REQUIRED) +find_package(PkgConfig REQUIRED) +pkg_check_modules(yaml REQUIRED) + find_package(rclcpp REQUIRED) find_package(rclcpp_components REQUIRED) find_package(image_transport REQUIRED) @@ -54,8 +72,6 @@ find_package(sensor_msgs REQUIRED) find_package(stereo_msgs REQUIRED) find_package(geometry_msgs REQUIRED) find_package(vision_msgs REQUIRED) -find_package(PkgConfig REQUIRED) - find_package(nlohmann_json REQUIRED) @@ -104,13 +120,13 @@ target_link_libraries(depthai_bridge PUBLIC depthai-core opencv_imgproc opencv_h message(STATUS "--------------------------$ENV{ROS_DISTRO} ---") message(STATUS $ENV{ROS_DISTRO}) -if($ENV{ROS_DISTRO} STREQUAL "galactic" OR ($ENV{ROS_DISTRO} STREQUAL "rolling" AND "${ubuntu_version}" STREQUAL "20.04\n")) - target_compile_definitions(depthai_bridge PRIVATE IS_GALACTIC) -endif() +# if($ENV{ROS_DISTRO} STREQUAL "galactic" OR ($ENV{ROS_DISTRO} STREQUAL "rolling" AND "${ubuntu_version}" STREQUAL "20.04\n")) +# target_compile_definitions(depthai_bridge PRIVATE IS_GALACTIC) +# endif() -if($ENV{ROS_DISTRO} STREQUAL "humble") +# if($ENV{ROS_DISTRO} STREQUAL "humble") target_compile_definitions(depthai_bridge PRIVATE IS_HUMBLE) -endif() +# endif() # DepthAI Camera as Component library add_library(depthai_camera SHARED src/depthai_camera.cpp) diff --git a/Dockerfile b/Dockerfile index bd9d967..c6ba0ed 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,46 +1,57 @@ -FROM ghcr.io/tiiuae/fog-ros-baseimage-builder:v2.1.0 AS builder -ARG BUILD_GSTREAMER -# TODO: not sure how many of these deps are actually needed for building. at least this: -# libusb-1.0-0-dev -# gstreamer-1.0 (<-- but not sure which package brings this) -RUN apt-get update -y && apt-get install -y --no-install-recommends \ - libusb-1.0-0-dev \ - nlohmann-json3-dev \ - libopencv-dev \ - && rm -rf /var/lib/apt/lists/* +FROM --platform=${BUILDPLATFORM:-linux/amd64} ghcr.io/tiiuae/fog-ros-sdk:v3.0.1-${TARGETARCH:-amd64} AS builder + +ARG TARGETARCH -RUN if [ -n "$BUILD_GSTREAMER" ]; then \ - apt-get update -y && apt-get install -y --no-install-recommends \ - libgstreamer1.0-0 \ - libgstreamer-plugins-base1.0-dev \ - libgstreamer-plugins-bad1.0-dev \ - libgstreamer-plugins-good1.0-dev \ - libgstrtspserver-1.0-dev \ - libgstreamer-plugins-base1.0-0 \ - libgstreamer-plugins-good1.0-0 \ - gstreamer1.0-x \ - && rm -rf /var/lib/apt/lists/*; \ - fi +RUN apt update \ + && apt install -y --no-install-recommends \ + curl \ + && rm -rf /var/lib/apt/lists/* RUN curl https://artifacts.luxonis.com/artifactory/luxonis-depthai-data-local/network/yolo-v4-tiny-tf_openvino_2021.4_6shave.blob \ -o /tmp/yolo-v4-tiny-tf_openvino_2021.4_6shave.blob COPY . /main_ws/src/ -RUN if [ -n "$BUILD_GSTREAMER" ]; then \ - mv /main_ws/src/debian/control.em.gstreamer /main_ws/src/debian/control.em; \ - fi +# There is a file at /sdk_install/sysroots/core2-64-oe-linux/usr/include/depthai-shared/common/optional.hpp which has the +# which has the line '#include "tl/optional.hpp"', change it to this with sed: '#include "depthai-shared/3rdparty/tl/optional.hpp"' +RUN YOCTO_TARGET_ARCH=$(/packaging/arch_translation.sh ${TARGETARCH:-amd64}) && \ + sed -i 's/#include "tl\/optional.hpp"/#include "depthai-shared\/3rdparty\/tl\/optional.hpp"/g' /sdk_install/sysroots/${YOCTO_TARGET_ARCH}-oe-linux/usr/include/depthai-shared/common/optional.hpp && \ + sed -i 's/#include "tl\/optional.hpp"/#include "depthai-shared\/3rdparty\/tl\/optional.hpp"/g' /sdk_install/sysroots/${YOCTO_TARGET_ARCH}-oe-linux/usr/include/depthai/pipeline/Node.hpp + +# CV Bridge cmake file has host contamination, which leads to failure in the build. +# This hardcoded path will be different for each of the build. So, the sed command should find the place using OpenCV_CONFIG_PATH and OpenCV_INSTALL_PATH tags +RUN YOCTO_TARGET_ARCH=$(/packaging/arch_translation.sh ${TARGETARCH:-amd64}) && \ + sed -i 's/set(OpenCV_CONFIG_PATH .*)/set(OpenCV_CONFIG_PATH \/sdk_install\/sysroots\/${YOCTO_TARGET_ARCH}-oe-linux\/usr\/lib\/cmake\/opencv4)/g' /sdk_install/sysroots/${YOCTO_TARGET_ARCH}-oe-linux/usr/share/cv_bridge/cmake/cv_bridge-extras.cmake && \ + sed -i 's/set(OpenCV_INSTALL_PATH .*)/set(OpenCV_INSTALL_PATH \/sdk_install\/sysroots\/${YOCTO_TARGET_ARCH}-oe-linux\/usr)/g' /sdk_install/sysroots/${YOCTO_TARGET_ARCH}-oe-linux/usr/share/cv_bridge/cmake/cv_bridge-extras.cmake + +WORKDIR /main_ws -# this: -# 1) builds the application -# 2) packages the application as .deb in /main_ws/ -RUN BUILD_GSTREAMER=$BUILD_GSTREAMER /packaging/build.sh +RUN /packaging/build_colcon_sdk.sh ${TARGETARCH:-amd64} # ▲ runtime ──┐ # └── build ▼ -FROM ghcr.io/tiiuae/fog-ros-baseimage:v2.1.0 -ARG BUILD_GSTREAMER +FROM ghcr.io/tiiuae/fog-ros-baseimage:v3.0.1 + +RUN apt update \ + && apt install -y --no-install-recommends \ + libusb-1.0-0 \ + eudev-staticdev \ + nlohmann-json-dev \ + yaml-cpp-vendor \ + cv-bridge \ + vision-msgs \ + camera-info-manager \ + camera-calibration-parsers \ + xacro \ + image-transport \ + libyaml-cpp0.6 \ + libyaml-0-staticdev \ + libyaml-vendor \ + libopencv-ts \ + opencv-staticdev \ + libdepthai-core20 \ + && rm -rf /var/lib/apt/lists/* RUN mkdir /depthai_configs COPY --from=builder /main_ws/src/params /depthai_configs/. @@ -53,29 +64,4 @@ ENTRYPOINT [ "/entrypoint.sh" ] COPY entrypoint.sh /entrypoint.sh -COPY --from=builder /main_ws/ros-*-depthai-ctrl_*_amd64.deb /depthai.deb -# need update because ROS people have a habit of removing old packages pretty fast -RUN apt-get update -y && apt-get install -y --no-install-recommends \ - libusb-1.0-0-dev \ - libopencv-dev \ - ros-${ROS_DISTRO}-vision-msgs \ - ros-${ROS_DISTRO}-camera-info-manager \ - ros-${ROS_DISTRO}-cv-bridge \ - ros-${ROS_DISTRO}-robot-state-publisher \ - ros-${ROS_DISTRO}-image-transport \ - ros-$ROS_DISTRO-xacro \ - && rm -rf /var/lib/apt/lists/* - -RUN if [ -n "$BUILD_GSTREAMER" ]; then \ - apt-get update -y && apt-get install -y --no-install-recommends \ - gstreamer1.0-plugins-bad \ - gstreamer1.0-plugins-ugly \ - gir1.2-gst-rtsp-server-1.0 \ - gstreamer1.0-libav \ - gstreamer1.0-rtsp \ - && rm -rf /var/lib/apt/lists/*; \ - fi - -RUN ln -s /usr/bin/true /usr/bin/udevadm \ - && dpkg -i /depthai.deb && rm /depthai.deb \ - && rm -f /usr/bin/udevadm +COPY --from=builder $INSTALL_DIR $INSTALL_DIR diff --git a/Dockerfile.ros b/Dockerfile.ros new file mode 100644 index 0000000..2e2655f --- /dev/null +++ b/Dockerfile.ros @@ -0,0 +1,87 @@ +# This is a legacy building format with ros:humble-base and ubuntu as the base. +# Legacy format is not maintained anymore, see /Dockerfile for multiarch building with Yocto and OpenEmbedded. +FROM ghcr.io/tiiuae/fog-ros-baseimage-builder:v2.1.0 AS builder +ARG BUILD_GSTREAMER +# TODO: not sure how many of these deps are actually needed for building. at least this: +# libusb-1.0-0-dev +# gstreamer-1.0 (<-- but not sure which package brings this) +RUN apt-get update -y && apt-get install -y --no-install-recommends \ + libusb-1.0-0-dev \ + nlohmann-json3-dev \ + libopencv-dev \ + && rm -rf /var/lib/apt/lists/* + +RUN if [ -n "$BUILD_GSTREAMER" ]; then \ + apt-get update -y && apt-get install -y --no-install-recommends \ + libgstreamer1.0-0 \ + libgstreamer-plugins-base1.0-dev \ + libgstreamer-plugins-bad1.0-dev \ + libgstreamer-plugins-good1.0-dev \ + libgstrtspserver-1.0-dev \ + libgstreamer-plugins-base1.0-0 \ + libgstreamer-plugins-good1.0-0 \ + gstreamer1.0-x \ + && rm -rf /var/lib/apt/lists/*; \ + fi + +RUN curl https://artifacts.luxonis.com/artifactory/luxonis-depthai-data-local/network/yolo-v4-tiny-tf_openvino_2021.4_6shave.blob \ + -o /tmp/yolo-v4-tiny-tf_openvino_2021.4_6shave.blob + +COPY . /main_ws/src/ + +RUN if [ -n "$BUILD_GSTREAMER" ]; then \ + mv /main_ws/src/debian/control.em.gstreamer /main_ws/src/debian/control.em; \ + fi + +# this: +# 1) builds the application +# 2) packages the application as .deb in /main_ws/ +RUN BUILD_GSTREAMER=$BUILD_GSTREAMER /packaging/build.sh + +# ▲ runtime ──┐ +# └── build ▼ + +FROM ghcr.io/tiiuae/fog-ros-baseimage:v2.1.0 +ARG BUILD_GSTREAMER + +RUN mkdir /depthai_configs +COPY --from=builder /main_ws/src/params /depthai_configs/. +COPY --from=builder /tmp/yolo-v4-tiny-tf_openvino_2021.4_6shave.blob /depthai_configs/. + +VOLUME /depthai_configs +ENV DEPTHAI_PARAM_FILE /depthai_configs/parameters.yaml + +ENTRYPOINT [ "/entrypoint.sh" ] + +COPY entrypoint.sh /entrypoint.sh + +COPY --from=builder /main_ws/ros-*-depthai-ctrl_*_amd64.deb /depthai.deb +# The multi-arch build has the unnecessary line "/etc/init.d/udev start" for udev rules. +# Not needed in ubuntu OS baseimage +RUN sed -i '/\/etc\/init.d\/udev start/d' /entrypoint.sh + +# need update because ROS people have a habit of removing old packages pretty fast +RUN apt-get update -y && apt-get install -y --no-install-recommends \ + libusb-1.0-0-dev \ + libopencv-dev \ + ros-${ROS_DISTRO}-vision-msgs \ + ros-${ROS_DISTRO}-camera-info-manager \ + ros-${ROS_DISTRO}-cv-bridge \ + ros-${ROS_DISTRO}-robot-state-publisher \ + ros-${ROS_DISTRO}-image-transport \ + ros-$ROS_DISTRO-xacro \ + && rm -rf /var/lib/apt/lists/* + +RUN if [ -n "$BUILD_GSTREAMER" ]; then \ + apt-get update -y && apt-get install -y --no-install-recommends \ + gstreamer1.0-plugins-bad \ + gstreamer1.0-plugins-ugly \ + gir1.2-gst-rtsp-server-1.0 \ + gstreamer1.0-libav \ + gstreamer1.0-rtsp \ + && rm -rf /var/lib/apt/lists/*; \ + fi + +RUN ln -s /usr/bin/true /usr/bin/udevadm \ + && dpkg -i /depthai.deb && rm /depthai.deb \ + && rm -f /usr/bin/udevadm diff --git a/depthai-core b/depthai-core index 2ee9ebf..125feb8 160000 --- a/depthai-core +++ b/depthai-core @@ -1 +1 @@ -Subproject commit 2ee9ebf6b1638250c77b0354a12cd1edbafc98dc +Subproject commit 125feb8c2e16ee4bf71b7873a7b990f1c5f17b18 diff --git a/entrypoint.sh b/entrypoint.sh index d945333..fbd7c40 100755 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -8,7 +8,7 @@ _term() { pattern="depthai_ctrl/camera_node" fi - pid_value="$(ps -ax | grep $pattern | grep -v grep | awk '{ print $1 }')" + pid_value="$(ps -e | grep $pattern | grep -v grep | awk '{ print $1 }')" if [ "$pid_value" != "" ]; then pid=$pid_value echo "Send SIGINT to pid $pid" @@ -49,7 +49,11 @@ fi if [ "${USE_AUTO_FOCUS}" = "1" ]; then ROS_FLAGS="${ROS_FLAGS} use_auto_focus:=true" fi - +# This is required for multiarch images. Without this udev start, depthai library fails to find XLink connection to device. +# The reason is that depthai camera switches to onboard processor when initialized, and causing USB device name changed. +# Old version with ubuntu base worked OK for hotplug, but this one does not. +# This could cause problem on the host machine, causing some USB devices to disconnect and require a unplug-replug. +/etc/init.d/udev start mode="${1}" if [ "${mode}" = "gstreamer" ]; then ros-with-env ros2 run depthai_ctrl gstreamer_node \