Limo ROS2 packages 설치

1. 기본 개발 패키지 설치

libuvc-dev, GeographicLib, glog 등의 일부 패키지는 Ubuntu universe 저장소를 사용합니다.

sudo add-apt-repository universe
sudo apt update
sudo apt full-upgrade -y

빌드 도구를 설치합니다.

sudo apt install -y \
    build-essential \
    ninja-build \
    pkg-config \
    python3-pip \
    python3-setuptools \
    python3-dev \
    python3-numpy \
    python3-opencv \
    python3-colcon-common-extensions \
    python3-rosdep \
    python3-vcstool

ROS 2 Desktop이 설치되지 않았다면 설치합니다.

sudo apt install -y ros-humble-desktop

2. 저장소에서 빠진 시스템 라이브러리 설치

Astra 카메라 CMake는 Eigen3, glog, libuvc, magic_enum, OpenCV 및 OpenNI2를 직접 찾습니다. 그러나 해당 항목 중 일부는 astra_camera/package.xml에 선언되지 않았습니다. 따라서 rosdep이 자동 설치하지 못할 수 있습니다.

다음 패키지를 직접 설치하십시오.

sudo apt install -y \
    libboost-all-dev \
    libeigen3-dev \
    libgeographic-dev \
    geographiclib-tools \
    libgflags-dev \
    libgoogle-glog-dev \
    libusb-1.0-0-dev \
    libudev-dev \
    libuvc-dev \
    libopencv-dev \
    libopenni2-dev

Ubuntu 22.04에는 libuvc-dev, libgeographic-dev, libgoogle-glog-dev, libgflags-dev 패키지가 제공됩니다.

설치 상태를 확인합니다.

dpkg -l | grep -E \
'libeigen3-dev|libgeographic-dev|libgoogle-glog-dev|libuvc-dev|libopenni2-dev'

3. 누락된 ROS 2 패키지 설치

다음 패키지는 LIMO 베이스, Astra 카메라, robot_localization, Nav2, Cartographer에서 사용합니다.

sudo apt install -y \
    ros-humble-ament-cmake \
    ros-humble-ament-index-cpp \
    ros-humble-rosidl-default-generators \
    ros-humble-rosidl-default-runtime \
    ros-humble-rclcpp \
    ros-humble-rclcpp-components \
    ros-humble-rcutils \
    ros-humble-class-loader \
    ros-humble-builtin-interfaces \
    ros-humble-geometry-msgs \
    ros-humble-nav-msgs \
    ros-humble-sensor-msgs \
    ros-humble-std-msgs \
    ros-humble-std-srvs \
    ros-humble-visualization-msgs \
    ros-humble-tf2 \
    ros-humble-tf2-ros \
    ros-humble-tf2-eigen \
    ros-humble-tf2-geometry-msgs \
    ros-humble-tf2-sensor-msgs \
    ros-humble-cv-bridge \
    ros-humble-camera-info-manager \
    ros-humble-image-geometry \
    ros-humble-image-publisher \
    ros-humble-image-transport \
    ros-humble-magic-enum \
    ros-humble-angles \
    ros-humble-diagnostic-msgs \
    ros-humble-diagnostic-updater \
    ros-humble-geographic-msgs \
    ros-humble-message-filters \
    ros-humble-yaml-cpp-vendor \
    ros-humble-xacro \
    ros-humble-joint-state-publisher \
    ros-humble-joint-state-publisher-gui \
    ros-humble-rviz2

Astra CMake는 camera_info_manager, tf2_eigen, magic_enum, libuvc, glog 등을 직접 요구합니다.

Nav2 설치

wego_2d_nav/package.xml에는 거의 ros2launch만 선언되어 있지만, 실제 Launch 파일에서는 다음 Nav2 컴포넌트를 실행합니다.

  • nav2_map_server
  • nav2_amcl
  • nav2_controller
  • nav2_smoother
  • nav2_planner
  • nav2_behaviors
  • nav2_bt_navigator
  • nav2_waypoint_follower
  • nav2_velocity_smoother
  • nav2_lifecycle_manager

따라서 Nav2 전체를 설치하는 편이 안전합니다.

sudo apt install -y \
    ros-humble-navigation2 \
    ros-humble-nav2-bringup

Cartographer 설치

wego/launch/cartographer_launch.py는 cartographer_ros의 cartographer_node와 cartographer_occupancy_grid_node를 직접 실행합니다.

sudo apt install -y \
    ros-humble-cartographer \
    ros-humble-cartographer-ros

Cartographer ROS 패키지는 Humble용으로 릴리스되어 있습니다.

4. YDLidar SDK 별도 설치

이 부분이 가장 흔한 컴파일 실패 원인입니다.

ydlidar_ros2_driver/CMakeLists.txt에는 다음 명령이 있습니다.

find_package(ydlidar_sdk REQUIRED)

하지만 YDLidar SDK는 ROS 패키지가 아니며 저장소에도 포함되어 있지 않습니다. YDLidar 공식 문서와 LIMO 저장소 README 모두 ROS 드라이버를 컴파일하기 전에 SDK를 별도로 설치하도록 안내합니다.

SDK 설치

mkdir -p ~/third_party
cd ~/third_party

git clone --depth 1 https://github.com/YDLIDAR/YDLidar-SDK.git
cd YDLidar-SDK

cmake -S . -B build \
    -DCMAKE_BUILD_TYPE=Release \
    -DBUILD_SHARED_LIBS=ON

cmake --build build -j"$(nproc)"
sudo cmake --install build
sudo ldconfig

공식 설치 절차도 CMake 구성 후 make와 sudo make install을 실행하는 구조입니다.

설치 결과를 확인합니다.

find /usr/local -iname '*ydlidar*Config.cmake' -o \
                 -iname '*ydlidar*config.cmake'

ldconfig -p | grep -i ydlidar

다음과 유사한 파일이 검색되어야 합니다.

/usr/local/lib/cmake/ydlidar_sdk/ydlidar_sdkConfig.cmake

CMake가 계속 SDK를 찾지 못하면 다음 환경 변수를 설정합니다.

export CMAKE_PREFIX_PATH="/usr/local:${CMAKE_PREFIX_PATH}"
export LD_LIBRARY_PATH="/usr/local/lib:${LD_LIBRARY_PATH}"
sudo ldconfig

자동 적용이 필요하면 다음을 추가합니다.

grep -qxF 'export CMAKE_PREFIX_PATH="/usr/local:${CMAKE_PREFIX_PATH}"' ~/.bashrc || \
echo 'export CMAKE_PREFIX_PATH="/usr/local:${CMAKE_PREFIX_PATH}"' >> ~/.bashrc

grep -qxF 'export LD_LIBRARY_PATH="/usr/local/lib:${LD_LIBRARY_PATH}"' ~/.bashrc || \
echo 'export LD_LIBRARY_PATH="/usr/local/lib:${LD_LIBRARY_PATH}"' >> ~/.bashrc

5. Astra 카메라 의존성 확인

Astra 카메라 CMake는 다음 패키지를 직접 검색합니다.

camera_info_manager
Eigen3
glog
image_geometry
image_publisher
image_transport
libuvc
magic_enum
OpenCV
tf2_eigen
tf2_sensor_msgs
OpenNI2

다음 명령으로 주요 CMake 설정 파일을 확인합니다.

find /usr /usr/local \
    \( -iname 'glogConfig.cmake' \
    -o -iname 'libuvcConfig.cmake' \
    -o -iname 'magic_enumConfig.cmake' \
    -o -iname 'OpenCVConfig.cmake' \) \
    2>/dev/null

libuvc를 찾지 못하는 경우

Ubuntu 패키지 설치를 먼저 사용합니다.

sudo apt install --reinstall -y libuvc-dev
sudo ldconfig

그래도 아래 오류가 발생한다면 소스 설치를 사용합니다.

Could not find a package configuration file provided by "libuvc"
Target "LibUVC::UVCShared" not found
mkdir -p ~/third_party
cd ~/third_party

git clone --depth 1 https://github.com/libuvc/libuvc.git

cmake -S libuvc -B libuvc/build \
    -DCMAKE_BUILD_TYPE=Release \
    -DBUILD_SHARED_LIBS=ON

cmake --build libuvc/build -j"$(nproc)"
sudo cmake --install libuvc/build
sudo ldconfig

Orbbec의 Astra 설치 문서도 glog, Eigen, USB 라이브러리 설치와 libuvc 소스 빌드를 별도로 안내합니다.

OpenNI2 링커 오류가 발생하는 경우

/usr/bin/ld: cannot find -lOpenNI2

먼저 다음을 실행합니다.

sudo apt install --reinstall -y libopenni2-dev
sudo ldconfig

저장소 자체에도 x64, arm, arm64용 OpenNI2 라이브러리가 포함되어 있으며 CMake가 uname -m 결과에 따라 플랫폼을 선택합니다.

설치된 라이브러리를 확인합니다.

ldconfig -p | grep OpenNI2
find /usr /usr/local -name 'libOpenNI2.so*' 2>/dev/null

6. 워크스페이스 구성

기존 빌드 파일이 있다면 깨끗한 새 워크스페이스를 사용하는 것이 좋습니다.

mkdir -p ~/limo_ws/src
cd ~/limo_ws/src

git clone https://github.com/WeGo-Robotics/limo_pro.git

구조는 다음과 같아야 합니다.

~/limo_ws/
└── src/
    └── limo_pro/
        ├── limo_ros2/
        ├── limo_ros2_application/
        ├── robot_localization/
        ├── ros2_astra_camera/
        ├── wego/
        ├── wego_2d_nav/
        ├── wego_msgs/
        └── ydlidar_ros2_driver/

저장소에는 차체, 메시지, 카메라, 라이다, 위치추정, 내비게이션 패키지가 함께 들어 있습니다.

7. rosdep 초기화와 의존성 설치

rosdep은 package.xml에 선언된 의존성을 운영체제 패키지로 변환해 설치합니다. 따라서 먼저 실행해야 하지만, 이 저장소처럼 선언이 빠진 경우에는 앞에서 설명한 수동 설치도 필요합니다.

최초 한 번만 실행합니다.

sudo rosdep init
rosdep update

다음 메시지는 이미 초기화된 것이므로 오류가 아닙니다.

ERROR: default sources list file already exists

그 경우에는 다음만 실행합니다.

rosdep update

워크스페이스 의존성을 설치합니다.

cd ~/limo_ws
source /opt/ros/humble/setup.bash

rosdep install \
    --from-paths src \
    --ignore-src \
    --rosdistro humble \
    -y \
    -r

-r 옵션은 일부 키를 해결하지 못해도 나머지 의존성 설치를 계속 진행하도록 합니다. 다만 마지막 출력에서 실제로 해결되지 않은 키가 무엇인지 확인해야 합니다.

8. 패키지 인식 확인

cd ~/limo_ws
source /opt/ros/humble/setup.bash

colcon list

다음 패키지들이 보여야 합니다.

astra_camera
astra_camera_msgs
limo_base
limo_description
limo_msgs
limo_ros2_application
robot_localization
wego
wego_2d_nav
wego_msgs
ydlidar_ros2_driver

패키지가 보이지 않으면 저장소를 ~/limo_ws/src가 아닌 다른 위치에 복제했거나, 중간 디렉터리에 COLCON_IGNORE 파일이 있는지 확인합니다.

find ~/limo_ws/src -name COLCON_IGNORE -print
find ~/limo_ws/src -name package.xml -print

9. 첫 번째 클린 빌드

기존 빌드 캐시를 제거합니다.

cd ~/limo_ws
rm -rf build install log

처음에는 병렬 빌드보다 순차 빌드가 좋습니다. 최초 오류가 명확하게 표시되고 Jetson에서 메모리 부족도 줄어듭니다.

또한 정상 실행용 빌드에서는 테스트 의존성을 끄십시오. 저장소의 robot_localization은 테스트가 활성화되면 ament_cmake_cppcheck, ament_cmake_cpplint, ament_cmake_uncrustify 등 추가 패키지를 요구합니다.

source /opt/ros/humble/setup.bash

colcon build \
    --symlink-install \
    --executor sequential \
    --event-handlers console_direct+ \
    --cmake-args \
        -DBUILD_TESTING=OFF \
        -DCMAKE_BUILD_TYPE=Release

성공하면 다음을 실행합니다.

source ~/limo_ws/install/setup.bash

ros2 pkg list | grep -E \
'astra_camera|limo_base|limo_msgs|robot_localization|wego|ydlidar'

자동 적용합니다.

grep -qxF 'source ~/limo_ws/install/setup.bash' ~/.bashrc || \
echo 'source ~/limo_ws/install/setup.bash' >> ~/.bashrc

10. 오류 발생

find_package(libuvc REQUIRED)는 성공했지만, 현재 설치된 Ubuntu 22.04용 libuvc-dev 0.0.6은 CMake 타깃을 uvc라는 이름으로 내보냅니다. 반면 limo_pro의 astra_camera/CMakeLists.txt는 더 최신 libuvc에서 사용하는 LibUVC::UVCShared 타깃을 요구합니다. 저장소에서는 이 타깃을 두 곳에서 직접 링크하고 있습니다.

가장 안전한 해결 방법은 CMakeLists.txt가 구형·신형 libuvc 타깃을 모두 지원하도록 수정하는 것입니다.

1) 현재 설치 상태 확인

dpkg -l | grep libuvc
dpkg-query -W -f='${Version}\n' libuvc-dev

Ubuntu 22.04 기본 패키지라면 보통 다음 버전입니다.

0.0.6-1.1

설치된 CMake 설정 파일도 확인합니다.

find /usr /usr/local \
    \( -name 'libuvcConfig.cmake' -o -name 'libuvcTargets.cmake' \) \
    2>/dev/null

실제 타깃 이름을 확인합니다.

grep -R "add_library" \
    /usr/lib/*/cmake/libuvc \
    /usr/lib/cmake/libuvc \
    /usr/local/lib/cmake/libuvc \
    2>/dev/null

Ubuntu 22.04 기본 libuvc에서는 다음과 비슷하게 나올 가능성이 큽니다.

add_library(uvc SHARED IMPORTED)

2) Astra Camera 디렉터리로 이동

워크스페이스가 ~/limo_ws라는 기준입니다.

cd ~/limo_ws/src/limo_pro/ros2_astra_camera/astra_camera

원본을 백업합니다.

cp CMakeLists.txt CMakeLists.txt.backup

3) 자동 호환 패치 적용

다음 명령을 그대로 실행하십시오.

python3 - <<'PY'
from pathlib import Path

path = Path("CMakeLists.txt")
text = path.read_text()

find_line = "find_package(libuvc REQUIRED)\n"

compatibility_block = """
# Support both Ubuntu 22.04 libuvc 0.0.6 and newer libuvc releases.
if(TARGET LibUVC::UVCShared)
  set(LIBUVC_TARGET LibUVC::UVCShared)
elseif(TARGET LibUVC::UVC)
  set(LIBUVC_TARGET LibUVC::UVC)
elseif(TARGET uvc)
  set(LIBUVC_TARGET uvc)
else()
  message(FATAL_ERROR
    "libuvc was found, but no supported CMake target exists. "
    "Expected LibUVC::UVCShared, LibUVC::UVC, or uvc.")
endif()
"""

if compatibility_block.strip() not in text:
    if find_line not in text:
        raise RuntimeError("find_package(libuvc REQUIRED) line was not found.")
    text = text.replace(
        find_line,
        find_line + compatibility_block,
        1
    )

text = text.replace(
    "  LibUVC::UVCShared\n",
    "  ${LIBUVC_TARGET}\n"
)

path.write_text(text)
print("CMakeLists.txt libuvc compatibility patch applied.")
PY

4) 패치 결과 확인

grep -n -A17 -B2 "find_package(libuvc" CMakeLists.txt
grep -n "LIBUVC_TARGET" CMakeLists.txt

다음 형태가 나와야 합니다.

find_package(libuvc REQUIRED)

if(TARGET LibUVC::UVCShared)
  set(LIBUVC_TARGET LibUVC::UVCShared)
elseif(TARGET LibUVC::UVC)
  set(LIBUVC_TARGET LibUVC::UVC)
elseif(TARGET uvc)
  set(LIBUVC_TARGET uvc)
else()
  message(FATAL_ERROR
    "libuvc was found, but no supported CMake target exists. "
    "Expected LibUVC::UVCShared, LibUVC::UVC, or uvc.")
endif()

기존 두 곳의 다음 코드:

LibUVC::UVCShared

가 다음으로 변경되어야 합니다.

${LIBUVC_TARGET}

5) Astra Camera 빌드 캐시 제거

CMake 캐시에는 기존 LibUVC::UVCShared 설정이 남아 있으므로 반드시 삭제해야 합니다.

cd ~/limo_ws

rm -rf build/astra_camera
rm -rf install/astra_camera

전체 워크스페이스를 깨끗하게 다시 빌드해도 됩니다.

rm -rf build install log

다만 다른 8개 패키지가 이미 빌드됐으므로 우선 astra_camera만 다시 빌드하는 편이 빠릅니다.

6) Astra Camera만 다시 빌드

cd ~/limo_ws

source /opt/ros/humble/setup.bash
source install/setup.bash 2>/dev/null || true

colcon build \
    --symlink-install \
    --packages-select astra_camera \
    --cmake-clean-cache \
    --event-handlers console_direct+ \
    --cmake-args \
        -DBUILD_TESTING=OFF

정상이라면 다음 단계까지 진행됩니다.

Finished <<< astra_camera

수정하고 재 컴파일해도 다시 에러가 발생할 수 있습니다.

현재 libuvc 설정을 확인합니다.

cat /usr/lib/x86_64-linux-gnu/cmake/libuvc/libuvcConfig.cmake 2>/dev/null
cat /usr/lib/cmake/libuvc/libuvcConfig.cmake 2>/dev/null

보통 다음 내용이 나옵니다.

set(libuvc_INCLUDE_DIRS "/usr/include")
set(libuvc_LIBRARIES "/usr/lib/x86_64-linux-gnu/libuvc.so")

실제 변수값은 다음으로도 확인할 수 있습니다.

grep -R "libuvc_LIBRARIES\|libuvc_INCLUDE_DIRS" \
    /usr/lib/x86_64-linux-gnu/cmake/libuvc \
    /usr/lib/cmake/libuvc \
    /usr/local/lib/cmake/libuvc \
    2>/dev/null

CMakeLists.txt를 다시 패치합니다.

아래 명령을 그대로 실행하십시오.

cd /home/sjyong/limo_ws/src/limo_pro/ros2_astra_camera/astra_camera

cp CMakeLists.txt CMakeLists.txt.before_libuvc_fix

이제 Python 스크립트로 기존의 잘못된 호환 코드를 제거하고 올바른 코드를 넣습니다.

python3 - <<'PY'
from pathlib import Path
import re

path = Path("CMakeLists.txt")
text = path.read_text()

# 이전에 추가했던 libuvc 호환 블록 제거
patterns = [
    r'''
# Support both Ubuntu 22\.04 libuvc 0\.0\.6 and newer libuvc releases\.
if\(TARGET LibUVC::UVCShared\).*?
endif\(\)
''',
    r'''
# libuvc target compatibility
if\(TARGET LibUVC::UVCShared\).*?
endif\(\)
'''
]

for pattern in patterns:
    text = re.sub(pattern, "\n", text, flags=re.DOTALL | re.VERBOSE)

# 현재 find_package 줄 뒤에 새 호환 블록 추가
marker = "find_package(libuvc REQUIRED)\n"

compat_block = r'''
# libuvc compatibility:
# Ubuntu 22.04 libuvc 0.0.6 exports variables but no imported CMake target.
set(ASTRA_LIBUVC_LIBRARIES "")
set(ASTRA_LIBUVC_INCLUDE_DIRS "")

if(TARGET LibUVC::UVCShared)
  set(ASTRA_LIBUVC_LIBRARIES LibUVC::UVCShared)
elseif(TARGET LibUVC::UVC)
  set(ASTRA_LIBUVC_LIBRARIES LibUVC::UVC)
elseif(TARGET uvc)
  set(ASTRA_LIBUVC_LIBRARIES uvc)
elseif(DEFINED libuvc_LIBRARIES AND libuvc_LIBRARIES)
  set(ASTRA_LIBUVC_LIBRARIES ${libuvc_LIBRARIES})
  set(ASTRA_LIBUVC_INCLUDE_DIRS ${libuvc_INCLUDE_DIRS})
else()
  find_package(PkgConfig REQUIRED)
  pkg_check_modules(LIBUVC REQUIRED libuvc)

  set(ASTRA_LIBUVC_LIBRARIES ${LIBUVC_LINK_LIBRARIES})

  if(NOT ASTRA_LIBUVC_LIBRARIES)
    set(ASTRA_LIBUVC_LIBRARIES ${LIBUVC_LIBRARIES})
  endif()

  set(ASTRA_LIBUVC_INCLUDE_DIRS ${LIBUVC_INCLUDE_DIRS})
endif()

message(STATUS "Astra libuvc libraries: ${ASTRA_LIBUVC_LIBRARIES}")
message(STATUS "Astra libuvc include dirs: ${ASTRA_LIBUVC_INCLUDE_DIRS}")
'''

if marker not in text:
    raise RuntimeError("find_package(libuvc REQUIRED) was not found")

if "set(ASTRA_LIBUVC_LIBRARIES" not in text:
    text = text.replace(marker, marker + compat_block, 1)

# 이전 패치에서 ${LIBUVC_TARGET}로 변경되었을 수도 있으므로 모두 교체
text = text.replace("LibUVC::UVCShared", "${ASTRA_LIBUVC_LIBRARIES}")
text = text.replace("${LIBUVC_TARGET}", "${ASTRA_LIBUVC_LIBRARIES}")

# 위 replace가 조건문의 target 이름까지 건드릴 수 있으므로 복구
text = text.replace(
    "if(TARGET ${ASTRA_LIBUVC_LIBRARIES})",
    "if(TARGET LibUVC::UVCShared)"
)
text = text.replace(
    "set(ASTRA_LIBUVC_LIBRARIES ${ASTRA_LIBUVC_LIBRARIES})",
    "set(ASTRA_LIBUVC_LIBRARIES LibUVC::UVCShared)",
    1
)

# target include directories에 libuvc include 추가
include_marker = "  ${OpenCV_INCLUDED_DIRS}\n"

if "  ${ASTRA_LIBUVC_INCLUDE_DIRS}\n" not in text:
    text = text.replace(
        include_marker,
        include_marker + "  ${ASTRA_LIBUVC_INCLUDE_DIRS}\n"
    )

path.write_text(text)
print("Updated:", path)
PY

다음 명령을 실행하여 패치 내용을 확인합니다.

grep -n -A45 -B3 "find_package(libuvc" CMakeLists.txt

중요한 부분은 다음과 같아야 합니다.

find_package(libuvc REQUIRED)

set(ASTRA_LIBUVC_LIBRARIES "")
set(ASTRA_LIBUVC_INCLUDE_DIRS "")

if(TARGET LibUVC::UVCShared)
  set(ASTRA_LIBUVC_LIBRARIES LibUVC::UVCShared)
elseif(TARGET LibUVC::UVC)
  set(ASTRA_LIBUVC_LIBRARIES LibUVC::UVC)
elseif(TARGET uvc)
  set(ASTRA_LIBUVC_LIBRARIES uvc)
elseif(DEFINED libuvc_LIBRARIES AND libuvc_LIBRARIES)
  set(ASTRA_LIBUVC_LIBRARIES ${libuvc_LIBRARIES})
  set(ASTRA_LIBUVC_INCLUDE_DIRS ${libuvc_INCLUDE_DIRS})
else()
  find_package(PkgConfig REQUIRED)
  pkg_check_modules(LIBUVC REQUIRED libuvc)
  ...
endif()

링크 부분도 확인합니다.

grep -n -A12 "target_link_libraries" CMakeLists.txt

두 개의 target_link_libraries()에서 다음 항목이 보여야 합니다.

${ASTRA_LIBUVC_LIBRARIES}

다음 항목이 남아 있으면 안 됩니다.

LibUVC::UVCShared
${LIBUVC_TARGET}

검사합니다.

grep -n "LibUVC::UVCShared\|LIBUVC_TARGET" CMakeLists.txt

조건문의 다음 한 줄만 나오는 것은 정상입니다.

if(TARGET LibUVC::UVCShared)

링크 부분에서 나온다면 직접 교체하십시오.

sed -i \
's/^[[:space:]]*LibUVC::UVCShared[[:space:]]*$/  ${ASTRA_LIBUVC_LIBRARIES}/' \
CMakeLists.txt

libuvc 라이브러리 파일을 확인합니다.

ls -l /usr/lib/x86_64-linux-gnu/libuvc.so*

정상적인 예:

/usr/lib/x86_64-linux-gnu/libuvc.so
/usr/lib/x86_64-linux-gnu/libuvc.so.0

없다면 다시 설치합니다.

sudo apt update

sudo apt install --reinstall -y \
    libuvc-dev \
    libuvc0 \
    libusb-1.0-0-dev \
    libjpeg-dev \
    pkg-config

sudo ldconfig

확인:

ldconfig -p | grep libuvc
pkg-config --modversion libuvc
pkg-config --cflags --libs libuvc

정상 출력 예:

0.0.6
-I/usr/include
-luvc

기존 실패 정보가 캐시에 남아 있으므로 해당 패키지 캐시를 완전히 삭제해야 합니다.

cd /home/sjyong/limo_ws

rm -rf build/astra_camera
rm -rf install/astra_camera

필요하면 colcon 로그도 삭제합니다.

rm -rf log

astra_camera를 다시 빌드합니다.

cd /home/sjyong/limo_ws

source /opt/ros/humble/setup.bash
source install/setup.bash 2>/dev/null || true

colcon build \
    --symlink-install \
    --packages-select astra_camera \
    --executor sequential \
    --event-handlers console_direct+ \
    --cmake-args \
        -DBUILD_TESTING=OFF

CMake 출력에 다음과 비슷한 메시지가 표시되어야 합니다.

-- Astra libuvc libraries: /usr/lib/x86_64-linux-gnu/libuvc.so
-- Astra libuvc include dirs: /usr/include

그리고 최종적으로 다음 결과가 나와야 합니다.

Finished <<< astra_camera

다시 컴파일 했는데 다시 에러가 발생할 수 있습니다.

잘못 수정된 CMakeLists.txt 백업

cd /home/sjyong/limo_ws/src/limo_pro

cp ros2_astra_camera/astra_camera/CMakeLists.txt \
   ros2_astra_camera/astra_camera/CMakeLists.txt.failed_backup

CMakeLists.txt를 Git 원본으로 복구

git restore ros2_astra_camera/astra_camera/CMakeLists.txt

구형 Git에서 git restore가 안 되면 다음을 사용합니다.

git checkout -- ros2_astra_camera/astra_camera/CMakeLists.txt

복구 확인:

grep -n "FATAL_ERROR\|ASTRA_LIBUVC\|LIBUVC_TARGET" \
    ros2_astra_camera/astra_camera/CMakeLists.txt

아무것도 출력되지 않아야 정상입니다.

필요한 부분만 다시 수정

다음 명령을 그대로 실행하십시오.

cd /home/sjyong/limo_ws/src/limo_pro/ros2_astra_camera/astra_camera

python3 - <<'PY'
from pathlib import Path

path = Path("CMakeLists.txt")
text = path.read_text()

old_link = "  LibUVC::UVCShared\n"
new_link = "  ${libuvc_LIBRARIES}\n"

link_count = text.count(old_link)

if link_count != 2:
    raise RuntimeError(
        f"Expected exactly 2 LibUVC::UVCShared entries, found {link_count}"
    )

text = text.replace(old_link, new_link)

old_include = "  ${OpenCV_INCLUDED_DIRS}\n"
new_include = (
    "  ${OpenCV_INCLUDED_DIRS}\n"
    "  ${libuvc_INCLUDE_DIRS}\n"
)

include_count = text.count(old_include)

if include_count != 2:
    raise RuntimeError(
        f"Expected exactly 2 OpenCV include entries, found {include_count}"
    )

text = text.replace(old_include, new_include)

path.write_text(text)

print("Patched successfully.")
print("libuvc links replaced:", link_count)
print("libuvc include paths added:", include_count)
PY

수정 결과 확인

grep -n \
    "find_package(libuvc\|libuvc_LIBRARIES\|libuvc_INCLUDE_DIRS\|FATAL_ERROR" \
    CMakeLists.txt

다음과 비슷하게 나와야 합니다.

25:find_package(libuvc REQUIRED)
97:  ${libuvc_INCLUDE_DIRS}
108:  ${libuvc_LIBRARIES}
120:  ${libuvc_INCLUDE_DIRS}
130:  ${libuvc_LIBRARIES}

FATAL_ERROR는 출력되면 안 됩니다.

다음도 확인하십시오.

grep -n "LibUVC::UVCShared\|ASTRA_LIBUVC\|LIBUVC_TARGET" CMakeLists.txt

아무것도 출력되지 않아야 합니다.

최종 CMake 구조

첫 번째 라이브러리는 다음 형태가 됩니다.

target_include_directories(${PROJECT_NAME} PUBLIC
  $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include>
  $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
  $<INSTALL_INTERFACE:include>
  ${OpenCV_INCLUDED_DIRS}
  ${libuvc_INCLUDE_DIRS}
)

target_link_libraries(${PROJECT_NAME}
  ${OpenCV_LIBS}
  Eigen3::Eigen
  glog::glog
  magic_enum::magic_enum
  ${libuvc_LIBRARIES}
  -lOpenNI2
  -L${ORBBEC_OPENNI2_REDIST}
)

list_devices_node도 같은 방식이어야 합니다.

target_include_directories(list_devices_node PUBLIC
  $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include>
  $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
  $<INSTALL_INTERFACE:include>
  ${OpenCV_INCLUDED_DIRS}
  ${libuvc_INCLUDE_DIRS}
)

target_link_libraries(list_devices_node
  ${OpenCV_LIBS}
  Eigen3::Eigen
  glog::glog
  magic_enum::magic_enum
  ${libuvc_LIBRARIES}
  -lOpenNI2
  -L${ORBBEC_OPENNI2_REDIST}
  ${PROJECT_NAME}
)

기존 CMake 캐시 삭제

반드시 이전 캐시를 삭제하십시오.

cd /home/sjyong/limo_ws

rm -rf build/astra_camera
rm -rf install/astra_camera
rm -rf log/latest_build

astra_camera만 다시 빌드

cd /home/sjyong/limo_ws

source /opt/ros/humble/setup.bash
source install/setup.bash 2>/dev/null || true

colcon build \
    --symlink-install \
    --packages-select astra_camera \
    --executor sequential \
    --event-handlers console_direct+ \
    --cmake-args \
        -DBUILD_TESTING=OFF

이제 기존의 다음 메시지는 나오지 않아야 합니다.

libuvc was found, but no supported CMake target exists

전체 워크스페이스 빌드

Astra 패키지가 성공하면 전체 빌드를 실행합니다.

cd /home/sjyong/limo_ws

source /opt/ros/humble/setup.bash
source install/setup.bash

colcon build \
    --symlink-install \
    --executor sequential \
    --event-handlers console_direct+ \
    --cmake-args \
        -DBUILD_TESTING=OFF

Leave a Comment