ubuntu24 qt 에서 돌리던 체적 알고리즘을 NT98692 (armv8) 보드에서 돌릴수 있는지
확인이 필요하다.
체적 알고리즘은 pcl 라이브러리가 필요하므로, armv8 보드에서 사용할수 있는
방법이 필요하다.
ply file 에서 바닥면 noise 를 날리고, largest cluster (cup) 획득 후, 가로 세로 길이를 계산
계산한 가로 세로 길이로 box 를 그린다.
armv8 보드용으로 pcl 라이브러리를 크로스 컴파일하여 체적 알고리즘 동작을 확인한다.
ubuntu 에선 libpcl-dev 를 설치하면 pcl 라이브러리 사용이 가능하다.
하지만, armv8 보드에서 사용하려면 직접 pcl 라이브러리를 빌드해야 하는데,
다른 라이브러리 의존성이 많이 걸려있어 바로 빌드하는 것은 적절하지 않다.
조사하던 중 conan 이라는걸 발견
c++ package manager 로서, apt 처럼 의존성을 resolve 해주는 역활을 수행한다고 한다.
--> 3일정도 사용해보고, 괜찮다는 느낌이 들어서 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
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 테스트 중 실패
크로스 컴파일러를 쓸수 없으니, 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
docker 내에서 빌드할 경우, 불특정 라인에서 반복적인 segmentation fault 에러를 확인
ubuntu24 에서 apt 로 크로스 컴파일러를 설치해서 빌드 수행
빌드 되었으나 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$
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 기능을 끈다
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
)
...
pcl 은 conan source 로 clone
conan install 은 requirement 충족 + cmake 에 전달할 PCL cmake variable 지정용도로 사용
build 폴더로 이동
source Release/generators/conanbuild.sh 수행
##
## 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 생성
## 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
README 를 참고하여 ubuntu22 에서 빌드
https://gitlab.com/feather973/pcl_armv8_porting
NT98692 보드에서 체적 알고리즘 동작확인 (가로 126mm, 세로 92mm)