pcl armv8 porting

Cute_Security15·2025년 3월 11일
0

linux dev

목록 보기
10/13

상황

ubuntu24 qt 에서 돌리던 체적 알고리즘을 NT98692 (armv8) 보드에서 돌릴수 있는지
확인이 필요하다.

체적 알고리즘은 pcl 라이브러리가 필요하므로, armv8 보드에서 사용할수 있는
방법이 필요하다.

체적 알고리즘 요약

ply file 에서 바닥면 noise 를 날리고, largest cluster (cup) 획득 후, 가로 세로 길이를 계산

계산한 가로 세로 길이로 box 를 그린다.

목적

armv8 보드용으로 pcl 라이브러리를 크로스 컴파일하여 체적 알고리즘 동작을 확인한다.

  • cli 환경이므로 가로 세로 길이만 획득하고, box 는 그리지 않는다.

확인한 내용

주어진 정보에 대해

ubuntu 에선 libpcl-dev 를 설치하면 pcl 라이브러리 사용이 가능하다.

하지만, armv8 보드에서 사용하려면 직접 pcl 라이브러리를 빌드해야 하는데,
다른 라이브러리 의존성이 많이 걸려있어 바로 빌드하는 것은 적절하지 않다.

조사하던 중 conan 이라는걸 발견
c++ package manager 로서, apt 처럼 의존성을 resolve 해주는 역활을 수행한다고 한다.

--> 3일정도 사용해보고, 괜찮다는 느낌이 들어서 conan 으로 결정

conan 사용법에 대해

conan 은 profile 에 컴파일/실행 환경 정보를 적을수 있고,
conanfile.py 를 통해 conan source / install / build 동작을 제어할수 있다.

크로스 컴파일을 할 것이므로, profile 은 2개를 준비하고,
cmake (CMakeLists.txt) 를 통해 빌드과정을 제어할 것이므로, source / install 만 작성한다.

## vi conanfile.py
...
## conan source
    def source(self):
        git = Git(self)
        git.clone(url="https://github.com/PointCloudLibrary/pcl.git", target="src")

        # https://docs.conan.io/2/reference/tools/scm/git.html#git
        git.folder = "src"
        git.checkout("-".join([self.name, self.version]))

## conan install

다른 architecture 용 패키지를 설치하는 법에 대해

ubuntu22 에선 conan install 시 libudev-dev:arm64 를 설치해야 하는 걸 확인
amd64 에서 arm64 라이브러리를 설치하려면 다음 스탭을 따르면 된다.

## arm 용 source list 파일을 생성
vi /etc/apt/sources.list.d/arm.list

deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports/ jammy main universe restricted multiverse
deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports/ jammy-updates main universe restricted multiverse
deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports/ jammy-backports main universe restricted multiverse

## 기존 source list 파일에 architecture 정보를 추가
deb [arch=amd64] ...

dpkg --add-architecture arm64
apt-get update

apt-get install libudev-dev:arm64

cf. 그럼 ubuntu24 multi-arch 는 어떨까 확인해보았다.

ubuntu24 에서는 명세가 좀더 섬세해져서, 다음과 같이 작성하면
arm 패키지 다운로드가 되는걸 확인하였다.

## 3군데를 수정
vi /etc/apt/sources.list.d/ubuntu.sources

URIs: http://kr.archive.ubuntu.com/ubuntu/
Suites: noble noble-updates noble-backports
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
+ Architectures: amd64

Types: deb
URIs: http://security.ubuntu.com/ubuntu/
Suites: noble-security
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
+ Architectures: amd64

+ types: deb
+ URIs: http://ports.ubuntu.com/ubuntu-ports/
+ Suites: noble noble-updates noble-backports
+ Components: main universe restricted multiverse
+ Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
+ Architectures: arm64

dpkg --add-architecture arm64
apt-get update

apt-get install libudev-dev:arm64

제공받은 크로스 컴파일러에 대해

보드사에서 제공받은 크로스 컴파일러를 연결하고 빌드를 계속 진행하였다.

bzip2/1.0.8 이 컴파일러 check 테스트 중 실패

  • 크로스 컴파일러는 -m64 옵션을 지원하지 않아 빌드 실패
  • 컴파일러 check 를 끄는 방법도 시도 해보았으나, 당시엔 conan 환경에 대한 이해가 부족하여 중지

크로스 컴파일러를 쓸수 없으니, armv8 docker 로 환경을 옮겨서 네이티브 빌드 시도

armv8 docker 를 쓰려면 qemu-user-static 이 필요

apt-get install qemu-user-static

docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
docker run --platform linux/arm64 -it arm64v8/ubuntu:24.04 /bin/bash

armv8 docker 에 대해

docker 내에서 빌드할 경우, 불특정 라인에서 반복적인 segmentation fault 에러를 확인

  • 웹 검색시, armv8 docker 환경이 불안정하다는 얘기가 있었음

ubuntu24 에서 apt 로 크로스 컴파일러를 설치해서 빌드 수행

glibc 버전에 대해

빌드 되었으나 glibc 버전이 일치하지 않아 실행불가

ubuntu22 가 NT98692 환경과 glibc 버전이 동일하여, ubuntu22 로 변경

## ubuntu22 vm
root@user-virtual-machine:~# /lib/x86_64-linux-gnu/libc.so.6
GNU C Library (Ubuntu GLIBC 2.35-0ubuntu3.9) stable release version 2.35.
Copyright (C) 2022 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
Compiled by GNU CC version 11.4.0.
libc ABIs: UNIQUE IFUNC ABSOLUTE
For bug reporting instructions, please see:
<https://bugs.launchpad.net/ubuntu/+source/glibc/+bugs>.
root@user-virtual-machine:~#

## NT98692
root@NVTEVM:/root$ /lib/libc.so.6
GNU C Library (Buildroot) stable release version 2.35.
Copyright (C) 2022 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
Compiled by GNU CC version 10.4.0.
libc ABIs: UNIQUE ABSOLUTE
For bug reporting instructions, please see:
<https://www.gnu.org/software/libc/bugs.html>.
root@NVTEVM:/root$

ubuntu22 에서 빌드시 고려한 사항들에 대해

apt 로 크로스 컴파일러를 설치하여 빌드 수행

apt-get gcc-aarch64-linux-gnu g++-aarch64-linux-gnu

빌드시 사용하지 않는 기능들에 대해선 off

## vi conanfile.py
...
	def generate(self):
        tc = CMakeToolchain(self)

		tc.variables["PCL_SHARED_LIBS"] = True
		tc.variables["CMAKE_POSITION_INDEPENDENT_CODE"] = True
        tc.variables["BUILD_common"] = True
        tc.variables["BUILD_kdtree"] = True
...
        tc.variables["BUILD_registration"] = False
        tc.variables["BUILD_surface"] = False
...

크로스 컴파일러를 사용하고 있으므로, cmake try_run() 기능을 disable 한다

        tc.variables["HAVE_POSIX_MEMALIGN"] = 1
        tc.variables["HAVE_POSIX_MEMALIGN_EXITCODE"] = 0

cli 환경이므로, OpenMP 기능을 끈다

  • 기능을 끌땐, 해당 기능을 사용하고 있는 다른 subsystem 이 모두 off(0) 여야 한다.
		tc.variables["WITH_OPENMP"] = 0

마찬가지로 cli 환경이므로, QT / VTK / OpenGL 기능을 끈다

		tc.variables["WITH_VTK"] = False
		tc.variables["WITH_QT"] = False
        tc.variables["WITH_OPENGL"] = False

LZ4_xxx symbol 링크 에러가 있어서 tools 도 끈다 (pcl_compute_hausdorff)

		tc.variables["BUILD_tools"] = False

빌드시 FLANN:FLANN 타깃을 찾을수 있게 CMAKE_PREFIX_PATH 를 추가하고,
lz4.h 헤더를 쓸수 있게 경로를 추가해준다

## vi CMakeLists.txt
...
set(CMAKE_PREFIX_PATH
    /root/.conan2/p/b/flann7eec29150bd43/b/build/Release
)

include_directories(
    /root/.conan2/p/b/lz421182dc493182/p/include
)
...

이제 libpcl 라이브러리들은 빌드가 된다.


체적 알고리즘을 NT98692 용으로 빌드할때,
pcl 라이브러리에서 LZ4_xxx symbol 링크 에러가 발생할수 있다.

해당 심볼을 사용하는건 flann 이므로, flann 라이브러리를 link 해서 수정

...
## vi CMakeLists.txt

link_directories(
    /root/build/src/lib
+    /root/.conan2/p/b/flann7eec29150bd43/b/build/Release/lib
)
...

ubuntu22 빌드 요약

pcl 은 conan source 로 clone

conan install 은 requirement 충족 + cmake 에 전달할 PCL cmake variable 지정용도로 사용

  • variable 을 통해 PCL subsystem 선택 및 cmake 제어가 가능

build 폴더로 이동

source Release/generators/conanbuild.sh 수행

  • profile 에 적어두었던 build_env 내용들이 적용된다.
##
## Release/generators/conanbuild.sh
. "/root/build/Release/generators/conanbuildenv-release-armv8.sh"

## Release/generators/conanbuildenv-release-armv8.sh
script_folder="/root/build/Release/generators"
echo "echo Restoring environment" > "$script_folder/deactivate_conanbuildenv-release-armv8.sh"
for v in LD CXX CC
do
    is_defined="true"
    value=$(printenv $v) || is_defined="" || true
    if [ -n "$value" ] || [ -n "$is_defined" ]
    then
        echo export "$v='$value'" >> "$script_folder/deactivate_conanbuildenv-release-armv8.sh"
    else
        echo unset $v >> "$script_folder/deactivate_conanbuildenv-release-armv8.sh"
    fi
done


export LD="aarch64-linux-gnu-ld"
export CXX="aarch64-linux-gnu-g++"
export CC="aarch64-linux-gnu-gcc"

cmake .. -DCMAKE_TOOLCHAIN_FILE=Release/generators/conan_toolchain.cmake -DCMAKE_BUILD_TYPE=Release 로 Makefile 생성

  • conanfile.py 에서 CMakeToolchain variables 로 넘긴 값들을 사용해 pcl 소스를 세팅한다.
## Release/generators/conan_toolchain.cmake

...
########## 'variables' block #############
# Definition of CMake variables from CMakeToolchain.variables values

# Variables
set(PCL_SHARED_LIBS ON CACHE BOOL "Variable PCL_SHARED_LIBS conan-toolchain defined")
set(CMAKE_POSITION_INDEPENDENT_CODE ON CACHE BOOL "Variable CMAKE_POSITION_INDEPENDENT_CODE conan-toolchain defined")
set(BUILD_common ON CACHE BOOL "Variable BUILD_common conan-toolchain defined")
set(BUILD_kdtree ON CACHE BOOL "Variable BUILD_kdtree conan-toolchain defined")
set(BUILD_ml ON CACHE BOOL "Variable BUILD_ml conan-toolchain defined")
set(BUILD_octree ON CACHE BOOL "Variable BUILD_octree conan-toolchain defined")
set(BUILD_search ON CACHE BOOL "Variable BUILD_search conan-toolchain defined")
set(BUILD_tracking OFF CACHE BOOL "Variable BUILD_tracking conan-toolchain defined")
set(BUILD_keypoints OFF CACHE BOOL "Variable BUILD_keypoints conan-toolchain defined")
set(BUILD_recognition OFF CACHE BOOL "Variable BUILD_recognition conan-toolchain defined")
set(BUILD_segmentation ON CACHE BOOL "Variable BUILD_segmentation conan-toolchain defined")
set(BUILD_features ON CACHE BOOL "Variable BUILD_features conan-toolchain defined")
set(BUILD_filters ON CACHE BOOL "Variable BUILD_filters conan-toolchain defined")
set(BUILD_sample_consensus ON CACHE BOOL "Variable BUILD_sample_consensus conan-toolchain defined")
set(BUILD_stereo OFF CACHE BOOL "Variable BUILD_stereo conan-toolchain defined")
set(BUILD_registration OFF CACHE BOOL "Variable BUILD_registration conan-toolchain defined")
set(BUILD_surface OFF CACHE BOOL "Variable BUILD_surface conan-toolchain defined")
set(BUILD_io ON CACHE BOOL "Variable BUILD_io conan-toolchain defined")
set(BUILD_visualization OFF CACHE BOOL "Variable BUILD_visualization conan-toolchain defined")
set(BUILD_2d ON CACHE BOOL "Variable BUILD_2d conan-toolchain defined")
set(BUILD_geometry ON CACHE BOOL "Variable BUILD_geometry conan-toolchain defined")
set(BUILD_examples OFF CACHE BOOL "Variable BUILD_examples conan-toolchain defined")
set(BUILD_apps OFF CACHE BOOL "Variable BUILD_apps conan-toolchain defined")
set(WITH_VTK OFF CACHE BOOL "Variable WITH_VTK conan-toolchain defined")
set(WITH_QT OFF CACHE BOOL "Variable WITH_QT conan-toolchain defined")
set(WITH_OPENGL OFF CACHE BOOL "Variable WITH_OPENGL conan-toolchain defined")
set(HAVE_POSIX_MEMALIGN "1" CACHE STRING "Variable HAVE_POSIX_MEMALIGN conan-toolchain defined")
set(HAVE_POSIX_MEMALIGN_EXITCODE "0" CACHE STRING "Variable HAVE_POSIX_MEMALIGN_EXITCODE conan-toolchain defined")
set(WITH_OPENMP "0" CACHE STRING "Variable WITH_OPENMP conan-toolchain defined")
set(BUILD_tools OFF CACHE BOOL "Variable BUILD_tools conan-toolchain defined")
set(CMAKE_PREFIX_PATH "/root/.conan2/p/b/lz421182dc493182/b/build/Release" CACHE STRING "Variable CMAKE_PREFIX_PATH conan-toolchain defined")
...

cmake --build . 로 빌드

빌드정보

pcl/1.13.1

  • eigen/3.3.7
  • flann/1.9.1
  • boost/1.82.0

git

README 를 참고하여 ubuntu22 에서 빌드
https://gitlab.com/feather973/pcl_armv8_porting

동작확인

NT98692 보드에서 체적 알고리즘 동작확인 (가로 126mm, 세로 92mm)

profile
관심분야 : Filesystem, Data structure, user/kernel IPC

0개의 댓글

관련 채용 정보