• 기존 포스팅에서 armbian build를 이용해서 쉽게 6.12 커널을 사용 (이미 preempt_rt 패치가 적용되어 있음) 해서 이미지를 만들고 사용까지 했었습니다. 하지만, armbian의 6.12 커널의 경우, Orange Pi 5 Plus에서 가지고 있는 다양한 주변회로 (i2c, can, spi 등)을 사용하기 위한 dtb가 존재하지 않습니다. 따라서 일반적인 사용은 가능하되, 최적화되어 있다고는 보기 어렵습니다. armbian build에서는 이 경우를 대비해 커널의 BRANCH를 선택할 수 있도록 해놨는데, vendor에서 제공한 커널을 사용하려면 BRANCH 옵션에 vendor를 적어주면 됩니다. Orangi Pi 5 Plus의 vendor 커널은 6.1 버전으로 preempt_rt 커널을 사용하기 위해선 수동을 rt 패치를 진행해줘야 합니다.

    이를 위해서 userpatches/kernel/rk35xx-vendor-6.1 디렉토리에 아래와 같이 패치 파일을 복사해 줍니다. 이 패치 파일은 kernel-config 명령을 이용해서 기존 https://mirrors.edge.kernel.org/pub/linux/kernel/projects/rt/6.1 에서 받아온 rt 패치 파일을 적용한 것으로, vendor 커널에 맞게끔 몇가지를 수정하였습니다. 기존 커널에서 몇가지 수정한게 있어서 rt 패치를 그냥 적용하면 에러가 발생합니다.

    https://gist.github.com/byeongkyu/7d9b999c310c3ef3852c6844b11e3191#file-patch-6-1-112-rt43-patch

    이 패치 파일을 받아서 위 디렉토리에 복사해 넣으면 됩니다.

    또, 커널 빌드 후 패키징 과정에서 커널 파일명과의 차이가 발생하여 에러가 발생하는데, 이를 해결하기 위해서 lib/functions/compilation/kernel-debs.sh 파일을 열어서,

    declare kernel_version_family="${kernel_version}-rt43-${BRANCH}-${LINUXFAMILY}"

    와 같이 rt43 플래그를 추가해 줍니다.

    이제 빌드를 시작하고,

    $ ./compile.sh BOARD=orangepi5-plus BRANCH=vendor RELEASE=noble BUILD_DESKTOP=no BUILD_MINIMAL=no VENDOR=armbian-kft REVISION=25.8.2 CPUTHREADS=12 PACKAGE_LIST_BOARD="net-tools wireless-tools vim" build

    다음으로, kernel 옵션을 설정해주고,

    General setup  --->
        Preemption Model (Fully Preemptible Kernel (Real-Time))  --->
            (X) Fully Preemptible Kernel (Real-Time)
    
        -*- Control Group support  --->
            -*-   CPU controller  --->
                [ ]   Group scheduling for SCHED_RR/FIFO
    
    Kernel Features  ---> 
        Timer frequency (1000 HZ)  --->
            (X) 1000 HZ
    
    CPU Power Management  --->
        CPU Frequency scaling  --->
            Default CPUFreq governor (performance)  --->
                 (X) performance

    빌드가 정상적으로 완료되어 output/images 디렉토리에

    armbian-kft_25.8.2_Orangepi5-plus_noble_vendor_6.1.115.img

    와 같이 이미지가 정상적으로 생성되어 있음을 확인할 수 있습니다.

    이제 이 이미지를 SD카드에 Write 하고, 부팅을 진행하면.. 끝!.

  • 기본 Repository에 있는 패키지 중 필요한 것들 먼저 설치할 때는 PACKAGE_LIST_BOARD 옵션 사용.

    $ ./compile.sh BOARD=orangepi5-plus BRANCH=current RELEASE=noble BUILD_DESKTOP=no BUILD_MINIMAL=no VENDOR=armbian-kft REVISION=25.8.2 CPUTHREADS=12 PACKAGE_LIST_BOARD="net-tools wireless-tools vim" build 

    임의의 repository 추가, 패키지 설치, 스크립트 실행 시, userpatches/customize-image.sh 파일을 수정

    ain() {
            case $RELEASE in
                    stretch)
                            # your code here
                            # InstallOpenMediaVault # uncomment to get an OMV 4 image
                            ;;
                    buster)
                            # your code here
                            ;;
                    bullseye)
                            # your code here
                            ;;
                    bionic)
                            # your code here
                            ;;
                    focal)
                            # your code here
                            ;;
                    noble)
                            export ROS_APT_SOURCE_VERSION=$(curl -s https://api.github.com/repos/ros-infrastructure/ros-apt-source/releases/latest | grep -F "tag_name" | awk -F\" '{print $4}')
                            curl -L -o /tmp/ros2-apt-source.deb "https://github.com/ros-infrastructure/ros-apt-source/releases/download/${ROS_APT_SOURCE_VERSION}/ros2-apt-source_${ROS_APT_SOURCE_VERSION}.$(. /etc/os-release && echo ${UBUNTU_CODENAME:-${VERSION_CODENAME}})_all.deb"
                            dpkg -i /tmp/ros2-apt-source.deb
                            apt update
                            apt install -y ros-dev-tools
                            apt install -y ros-jazzy-ros-base
                            apt install -y ros-jazzy-rmw-cyclonedds-cpp
                            ;;
            esac
    } # Main
    

    사용자 계정을 만들고, 처음 로그인 시 작업 수행하는 경우, packages/bsp/common/usr/lib/armbian/armbian-firstlogin 파일 수정

    add_user() 함수 내에서 다음의 구문 아래에 적절한 곳에 추가.

    add_user() {
    ...
             while [ -f "/root/.not_logged_in_yet" ]; do
    ...
                  if [[ "$first_input" == "$second_input" ]]; then
    ...
                            echo "source /opt/ros/jazzy/setup.bash" >> /home/"$RealUserName"/.bashrc
                            echo "export ROS_DOMAIN_ID=1" >> /home/"$RealUserName"/.bashrc
                            echo "export ROS_AUTOMATIC_DISCOVERY_RANGE=SYSTEM_DEFAULT" >> /home/"$RealUserName"/.bashrc
                            echo "source /usr/share/colcon_cd/function/colcon_cd.sh" >> /home/"$RealUserName"/.bashrc
                            echo "export _colcon_cd_root=/opt/ros/jazzy/" >> /home/"$RealUserName"/.bashrc
                            echo "source /usr/share/colcon_argcomplete/hook/colcon-argcomplete.bash" >> /home/"$RealUserName"/.bashrc
                            echo "export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp" >> /home/"$RealUserName"/.bashrc
    ...

  • Orange Pi 5를 로봇의 메인 제어기로 사용할 경우, preempt_rt 패치가 필요한 상황이 있습니다. 이를 위해서 제일 편리한 방법은 Armbian build 프레임웍을 사용하는 것입니다. Armbian은 싱글보드 컴퓨터의 시스템 이미지를 생성하기 위한 소프트웨어 프레임웍으로, 아주 간단하게 이미지를 생성하여, SD카드 등에 쉽게 적용이 가능합니다.

    자세한 설명은 https://www.armbian.com/https://docs.armbian.com/Developer-Guide_Overview/ 이곳을 참고하시면 됩니다.

    Armbian 개발 환경을 위해서는 Ubuntu (Docker 사용이 가능한), WSL2 환경이 필요합니다.

    먼저 Ubuntu에서 다음과 같이 armbian build software framework를 다운로드합니다.

    $ git clone https://github.com/armbian/build
    $ cd build  

    preempt_rt 커널 빌드를 위해서는 커널 설정 변경이 필요합니다. 특히 6.x 커널 이후에는 RT 패치가 이미 포함되어 있으므로, 따로 patch 명령을 이용해서 작업할 필요가 없습니다.

    커널 설정 및 빌드를 한꺼번에 수행하기 위해서 다음과 같이 입력합니다.

    $ ./compile.sh BOARD=orangepi5-plus BRANCH=current RELEASE=noble BUILD_DESKTOP=no BUILD_MINIMAL=no VENDOR=armbian-kft REVISION=25.8.2 CPUTHREADS=12 build 

    몇가지 옵션에 대해 설명을 붙이면

    BRANCH: 커널 및 U-Boot의 사용 버전을 결정합니다. current를 추천. (vendor, legacy, edge 옵션 선택 가능)
    RELEASE: Ubuntu 버전 선택 가능 noble = 24.04
    BUILD_DESKTOP: gnome 등 GUI Desktop 엔진 선택 가능. no = CLI (Server)
    BUILD_MINIMAL: 아주 최소한의 CLI 환경만 구성. no
    VENDOR: 생성되는 이미지의 이름 구성
    REVISION: Armbian 리비전 버전 사용
    CPUTHREADS: 커널 빌드시 사용되는 CPU 코어 수 (사용자 환경에 따라 변경

    이렇게 하면, 해당되는 커널 및 필요한 패키지들을 다운로드 하고, 다음과 같이 선택화면이 나옵니다.

    커널 설정을 변경하려면 (Show a kernel configuration menu before compliation)을 선택

    기존 preempt_rt 설정할 때와 마찬가지로 옵션을 조정해줍니다.

    General setup  --->
        Preemption Model (Fully Preemptible Kernel (Real-Time))  --->
            (X) Fully Preemptible Kernel (Real-Time)
    
    Kernel Features  ---> 
        Timer frequency (1000 HZ)  --->
            (X) 1000 HZ
    
    CPU Power Management  --->
        CPU Frequency scaling  --->
            Default CPUFreq governor (performance)  --->
                 (X) performance

    저장하고 종료하면, 커널빌드부터 이미지 생성까지 한번에 수행합니다.

    최종 빌드가 완료되면, output/images 디렉토리 아래에 armbian-kft_25.8.2_Orangepi5-plus_noble_current_6.12.58.img 와 같이 이미지 파일이 생성됩니다. 이제 이 이미지 파일을 SD Card에 Write하고 부팅하면 됩니다.

  • ROS2의 ros2_control에서 control_manager를 사용할 경우, preempt_rt 커널 (soft realtime)을 사용할 것을 권장하고 있다. 커널 빌드는 매번 하고 있긴 한데, 일단은 방법을 정리해두면 나중에도 찾기 쉬울듯 하여 정리함. 커널 버전은 그냥 rt 패치가 존재하는 가장 최신 버전을 사용하면 될듯.

    필요한 패키지 설치

    $ sudo apt install build-essential libncurses-dev flex bison libssl-dev debhelper libelf-dev gawk

    다음으로 커널 소스 및 RT 패치 파일을 받아옴.

    $ wget https://www.kernel.org/pub/linux/kernel/v6.x/linux-6.16.1.tar.gz
    $ wget https://www.kernel.org/pub/linux/kernel/projects/rt/6.16/patch-6.16-rt3.patch.xz

    압축을 풀고, 패치 적용

    $ tar zxf linux-6.16.1.tar.gz
    $ xz -d patch-6.16-rt3.patch.xz
    $ cd linux-6.16.1
    $ patch -p1 < ../patch-6.16-rt3.patch

    기존 config 파일 가져오기

    $ cp /boot/config-`uname -r` .config

    커널 설정하기

    $ make menuconfig

    커널 설정

        General setup  --->
            Preemption Model (Scheduler controlled preemption model)  --->
                (X) Scheduler controlled preemption model
            [*] Fully Preemptible Kernel (Real-Time) 
    
            Timers subsystem  --->
                Timer tick handling (Full dynticks system (tickless))  --->
                    (X) Full dynticks system (tickless)
                [*] High Resolution Timer Support
    
        Processor type and features  --->
            Timer frequency (1000 HZ)  --->
                (X) 1000 HZ
    
        Power management and ACPI options  --->
            CPU Frequency scaling  --->
                Default CPUFreq governor (performance)  --->
                    (X) performance          

    저장하고 나와서,

    $ scripts/config --disable SYSTEM_TRUSTED_KEYS
    $ scripts/config --set-str CONFIG_SYSTEM_TRUSTED_KEYS ""
    $ scripts/config --disable SYSTEM_REVOCATION_KEYS
    $ scripts/config --set-str CONFIG_SYSTEM_REVOCATION_KEYS ""
    $ scripts/config --disable CONFIG_DEBUG_INFO_BTF
    
    $ scripts/config --disable GDB_SCRIPTS
    $ scripts/config --disable DEBUG_INFO
    $ scripts/config --disable DEBUG_INFO_SPLIT
    $ scripts/config --disable DEBUG_INFO_REDUCED
    $ scripts/config --disable DEBUG_INFO_COMPRESSED
    $ scripts/config --set-val DEBUG_INFO_NONE       y
    $ scripts/config --set-val DEBUG_INFO_DWARF5     n
    $ scripts/config --disable DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT

    빌드 시작 (-j 다음 숫자는 컴파일에 사용될 코어의 수로, 각자의 CPU 갯수에 따라 조정해서 사용)

    $ make -j12 bindeb-pkg

    대략 25~30분 정도 걸리는 듯.

    커널 설치

    $ cd ..
    $ sudo dpkg -i linux-headers-6.16.1-rt3_6.16.1-5_amd64.deb linux-libc-dev_6.16.1-5_amd64.deb linux-image-6.16.1-rt3_6.16.1-5_amd64.deb

    설치가 완료되면, 재부팅해서 uname -a 로 커널 버전 확인.

    $ uname -a
    Linux byeongkyu-workpc 6.16.1-rt3 #5 SMP PREEMPT_RT Wed Aug 20 15:05:48 KST 2025 x86_64 x86_64 x86_64 GNU/Linux

    주의사항!! preempt_rt 커널의 경우 nvidia 그래픽 드라이버가 기본적으로 지원하지 않음.

    해결방법 (에러난 이후에)

    $ export IGNORE_PREEMPT_RT_PRESENCE=1
    $ sudo -E dkms install nvidia/580.65.06 -k 6.16.1-rt3
    $ sudo dpkg -i linux-headers-6.16.1-rt3_6.16.1-5_amd64.deb linux-libc-dev_6.16.1-5_amd64.deb linux-image-6.16.1-rt3_6.16.1-5_amd64.deb

    재부팅 이후 cyclictest로 성능 측정

    대충 stress가 없는 경우, 최대 latency가 154us 정도로 나오는듯.

    사용자 계정을 realtime 그룹에 추가해서 sudo 명령없이 실행할 수 있도록 등록

    $ sudo addgroup realtime
    $ sudo usermod -a -G realtime $(whoami)

    추가 설정

    $ sudo vi /etc/security/limits.conf
    
    @realtime soft rtprio 99
    @realtime soft priority 99
    @realtime soft memlock unlimited
    @realtime hard rtprio 99
    @realtime hard priority 99
    @realtime hard memlock unlimited
    

    끝!

  • 간단한 로봇이나 구조물을 출력한 이후 볼트 등을 이용해서 조립할 경우, 나사산을 만들어야 할 경우가 발생합니다. 몇가지 방법이 사용되고 있고, 각각의 장단점이 있습니다.

    1. 나사산 출력

    프린팅을 할때, 구멍에 나사산을 출력하는 방법입니다. 이 방법은 피치가 큰 나사들은 쉽게 프린팅이 가능하고, 나사산이 잘 살아있습니다. 하지만 피치가 작은 나사들은 프린팅 자체가 잘 되지 않으므로 사용이 불가능합니다. (SLA 프린터의 경우엔 가능할 수 도 있습니다.)

    2. 탭퍼 사용

    구멍을 출력하고, 해당 구멍에 탭퍼를 이용하여 나사산을 만드는 방법입니다. 전동공구 or 핸드탭퍼를 이용해서 나사산을 만들어줄 수 있습니다. 전동 공구 사용의 경우엔 마찰에 의해서, 츨력물이 탭에 엉겨 붙는 경우가 발생합니다만, 주의를 하면 쉽게 나사산을 만들 수 있습니다. 꽤나 안정적인 나사 조립은 가능하지만, 여러번 사용하면 나사산이 망가질 염려가 있습니다.

    2. 헬리코일

    원래의 구멍보다 크기 뚫고, 헬리코일을 삽입하는 방법입니다. 드릴 작업이 필요하고, 헬리코일이 삽입될 수 있는 나사산을 만들어야 한다는 점에선, 위 나사산을 출력하거나 탭을 이용해서 나사산을 만들어줘야 합니다. 전동 공구 사용도 가능하고, 잘 삽입된 헬리코일의 경우, 기계적인 안정성도 좋습니다.

    3. Threaded Insert

    흔히 볼 수 있는 인서트입니다. 주로 열 or 초음파을 이용해서 프린팅 출력물을 살짝 녹여서 고정하는 방법입니다. 구멍 주위에 구조가 튼튼한 경우엔 큰 무리없이 삽입이 가능합니다만, 얅은 봉 형태나 얇은 판재의 경우, 인서트 삽입 시 출력물이 변형되는 문제가 발생합니다. 인두기 등으로 누르게 되는데, 이때 누르는 압력과 열에 의해서 출력물 자체가 휘거나 더 녹게 됩니다. 한번 삽입되면 수정은 불가능하고, 열에 의해 출력물에 고정되므로, 상당히 튼튼합니다.

    4. Self Tapping Insert

    나사를 삽입하거나, 특수 공구등을 이용해서 강제로 나사산을 만들어 삽입하는 방법입니다. 열에 의한 변형은 없고, 또 나사 크기별로 필요한 구멍만 만들어 삽입하는 방법입니다. 전동 공구등을 이용해서 쉽게 삽입이 가능합니다. 단, 구조뮬이 약한 경우엔 터질 가능성은 있습니다. 삽입된 이후에 여러번 나사를 풀고 조이게 되면, 해당 인서트가 분리될 수 도 있습니다.

  • 기존 사용하던 Prusa Mk3가 아주~~~ 오랜만에 전원을 켜보니, 온도센서 에러가 발생하였습니다. 센서가 불량이거나, 센서에 연결된 선이 단선일 가능성이 있습니다만, 워낙에 오래된 녀석이고 상당기간 관리없이 방치된 상태라서 과감히 소생을 포기하고….

    안녕~ 푸루사야~~ 그동안 고생 많았다….

    새로 구입했습니다.!!

    회사에서 이미 Bambu Lab X1C를 사용하고 있었는데, 만족감이 상당하였기에 제조사 선정은 큰 고민이 없었는데… X1C와 P1S간에 살짝 고민이 들다가 굳이 개인이 사용할 목적에 X1C는 좀 오버인듯하여, P1S Combo로 결정하였습니다.

    예전 Prusa Mk3를 구매했을 때, 자가 조립하는 방법으로 했을때 구매 가격이 100만원 초반이었던 것으로 기억을 하는데, Bambu Lab 기기 가격이 AMS 포함해서 120만원인건… 흠… 좋네요… 마침 Bambu Lab Korea가 생기고, 국내에서 발송하는지라 도착은 주문 후 한 2일 걸렸던듯 하고…

    주로 사용하는 필라멘트가 PLA-CF인지라 추가로 경화강 핫엔드를 구매해서 교체하였습니다. 카본이 포함된 녀석이라서, 애초에 핫엔드를 바꾸지 않으면 아예 프린트도 불가능합니다.

    처음 프린트 시 베드 레벨링을 안한 채로 (급한 마음에) 프린트를 시도했다가 베드 시트에 살짝 스크레치를 낸 것 외엔… 사용감은 아주 만족스럽니다. 최신 펌웨어 업데이트 하고, 진동 감쇄 기능을 위해 튜닝을 하니, 방문을 잠가놓으면 아예 소리도 들리지 않습니다. 굳!!

  • IsaacSim 5.0이 릴리즈 되었습니다. https://github.com/isaac-sim/IsaacSim 아직 Preview Release 버전이긴 하지만, Ubuntu 24.04에서 실행이 된다는 점과 무엇보다도 ROS2 Jazzy 버전을 지원한다는게 저에겐 가장 큰 업데이트입니다.

    기존 전체 릴리즈된 압축 파일을 받아서 실행하는 방법에서, github에서 소스를 받아 직접 빌드해야 하는 방법으로 설치 과정이 변경되었습니다. 오픈소스 버전으로 사용자가 소스를 변경할 수 있도록 되어 있고, 차후 생태계를 구축해서 다양한 방법으로 활용이 가능할 듯 합니다.


    아직까진 공식 문서는 없지만, 설치 과정 중 CUDA 버전과 GCC 버전간의 호환성으로 인해 빌드가 되지 않는 현상이 발생합니다. 아래와 같은 에러 문구들이 쭈욱 나옵니다.

    /usr/include/stdlib.h(141): error: identifier "_Float32" is undefined

    해결방법은 GCC 버전을 낮추면 됩니다. 현재 GCC 13.x 버전이 NVCC와 호환이 되지 않아 발생하는 문제로, Ubuntu 24.04에서는 GCC 13.3.0이 Default로 설치됩니다. NVCC와 호환되는 GCC 버전을 설치해야 합니다. 이를 GCC 12.3.0 버전으로 변경합니다. Github의 이슈에서 논의된 대로, GCC 11 버전이 가장 호환성이 좋은것으로 논의되고 있습니다.

    초기 버전은 다음과 같습니다.

    $ gcc --version
    gcc-13 (Ubuntu 13.3.0-6ubuntu2~24.04) 13.3.0
    Copyright (C) 2023 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.

    GCC-11 버전을 설치합니다.

    $ sudo apt install gcc-11 g++-11
    
    $ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 30
    $ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-13 30
    
    $ sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-12 30
    $ sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-13 30
    
    $ sudo update-alternatives --install /usr/bin/cc cc /usr/bin/gcc 30
    $ sudo update-alternatives --set cc /usr/bin/gcc
    
    $ sudo update-alternatives --install /usr/bin/c++ c++ /usr/bin/g++ 30
    $ sudo update-alternatives --set c++ /usr/bin/g++

    위와 같이 설치가 완료된 다음, 기본 버전을 GCC 11으로 설정합니다.

    $ sudo update-alternatives --config gcc
    There are 2 choices for the alternative gcc (providing /usr/bin/gcc).
    
      Selection    Path             Priority   Status
    ------------------------------------------------------------
      0            /usr/bin/gcc-12   30        auto mode
    * 1            /usr/bin/gcc-12   30        manual mode
      2            /usr/bin/gcc-13   30        manual mode
    
    Press <enter> to keep the current choice[*], or type selection number: 1
    $ sudo update-alternatives --config g++
    There are 2 choices for the alternative g++ (providing /usr/bin/g++).
    
      Selection    Path             Priority   Status
    ------------------------------------------------------------
      0            /usr/bin/g++-12   30        auto mode
    * 1            /usr/bin/g++-12   30        manual mode
      2            /usr/bin/g++-13   30        manual mode
    
    Press <enter> to keep the current choice[*], or type selection number: 1

    이제 터미널에서 gcc 버전을 확인해봅니다.

    $ gcc --version
    Using built-in specs.
    COLLECT_GCC=gcc-11
    COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/11/lto-wrapper
    OFFLOAD_TARGET_NAMES=nvptx-none:amdgcn-amdhsa
    OFFLOAD_TARGET_DEFAULT=1
    Target: x86_64-linux-gnu
    Configured with: ../src/configure -v --with-pkgversion='Ubuntu 11.4.0-9ubuntu1' --with-bugurl=file:///usr/share/doc/gcc-11/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++,m2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-11 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-bootstrap --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-plugin --enable-default-pie --with-system-zlib --enable-libphobos-checking=release --with-target-system-zlib=auto --enable-objc-gc=auto --enable-multiarch --disable-werror --enable-cet --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none=/build/gcc-11-ZcnBzW/gcc-11-11.4.0/debian/tmp-nvptx/usr,amdgcn-amdhsa=/build/gcc-11-ZcnBzW/gcc-11-11.4.0/debian/tmp-gcn/usr --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu --with-build-config=bootstrap-lto-lean --enable-link-serialization=2
    Thread model: posix
    Supported LTO compression algorithms: zlib zstd
    gcc version 11.4.0 (Ubuntu 11.4.0-9ubuntu1) 

    이제 isaacsim을 git repository에서 clone 하고 빌드를 진행합니다.

    위와 같이 영구적으로 버전을 바꾸는 것보다는, 빌드할때만 임시로 버전을 전환하는것을 추천하고 있습니다.

    $ export NVCC_PREPEND_FLAGS="-ccbin $(which gcc-11)"; export CC=gcc-11; export CXX=g++-11
    $ ./build.sh -x

    빌드가 정상적으로 완료되는 것을 확인할 수 있습니다.

    ...
    
    
    IsaacRobotAPI, IsaacLinkAPI, IsaacReferencePointAPI, IsaacJointAPI, IsaacSurfaceGripper, IsaacAttachmentPointAPI
    Loading Templates from /home/byeongkyu/.cache/packman/chk/usd.py311.manylinux_2_35_x86_64.stock.release/0.24.05.kit.6-gl.14415+d9efdd65/lib/usd/usd/resources/codegenTemplates
            unchanged /home/byeongkyu/isaacsim/source/extensions/isaacsim.robot.schema/robot_schema/plugInfo.json
    Generating Schematics:
                wrote /home/byeongkyu/isaacsim/source/extensions/isaacsim.robot.schema/robot_schema/generatedSchema.usda
    BUILD (RELEASE) SUCCEEDED (Took 216.14 seconds)
    

    끝.!!

  • 어제 갑자기 Pocket 서비스가 종료된다는 내용의 메일이 왔습니다. 대표적인 Read-it-later 서비스인데, 간단히 웹링크를 저장해놓고 분류하고 필요할때 찾아 읽어볼 수 있는 서비스입니다. Bookmark (즐겨찾기)나 Notion 등에도 링크들을 정리할 수 있는 방법도 있지만, 모바일기기, macOS, 윈도우, Linux 등 다양한 OS를 지원하고, 앱도 지원하는 서비스여서 나름 유용하게 사용하고 있었습니다만… 모질라재단에 인수된 이후에 돈이 안되서 그런지… 서비스가 종료된다니 아쉽네요.

    유료로도 사용하던 서비스라서, 환불이야 뭐 알아서 해준다니 냅두고.. 대안 서비스를 찾아봤습니다.

    Reddit 등에서 Raindrop.io 서비스를 추천하고 있습니다.

    살펴보니, Pocket과 마찬가지로 다양한 OS를 지원하고 있습니다. 또 Pocket의 데이터를 백업 받아 Import 해줄 수 있는 서비스도 지원하고 있네요.

    일단 Pocket 데이터를 옮겨놓고 보고 있는데, 말 그대로 북마크만 관리하는 툴입니다. 리더 기능은 포함되어 있지 않아, 매번 해당 사이트로 이동해야 합니다. Pocket에서 기능이 후퇴했네요.


    두번째로 Readwise 입니다.

    Pocket과 마찬가지로 웹페이지를 클리핑해서 보여주긴 합니다만, 폐쇄적인 사이트들의 글은 불러오지 못합니다. (특히 국내 뉴스 사이트들) 그래도 가장 Pocket과 근접한 기능을 보여주긴 합니다만… 무조건 유료 서비스를 사용해야 하는 단점도 있네요. (30일 무료)


    일단은 Readwise로 사용해볼 예정입니다.

  • 스크립트를 이용하여 Docker 설치

    $ curl -fsSL https://get.docker.com -o get-docker.sh
    $ sudo sh get-docker.sh

    설치 완료 후

    $ sudo groupadd docker
    $ sudo usermod -aG docker $USER
    $ newgrp docker

    설치 확인

    $ docker run hello-world

    NVIDIA Container Toolkit 설치

    $ curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
        && curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
        sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
        sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list \
        && \
        sudo apt-get update

    Toolkit 설치

    $ sudo apt-get install -y nvidia-container-toolkit
    $ sudo systemctl restart docker

    Container Runtime 설정

    $ sudo nvidia-ctk runtime configure --runtime=docker
    $sudo systemctl restart docker

    설치 확인

    $ docker run --rm --runtime=nvidia --gpus all ubuntu nvidia-smi

  • 로컬 네트워트에 여러 PC들이 연결되어 있고, 이 PC들 간에 데이터를 주고 받을 때, Time Stamp가 동기화 될 필요가 있습니다. 특히 ROS2와 같은 경우, Topic 등의 데이터들이 수집되는 상황에서 각 메시지들의 시간 값이 틀리게 되면, 에러를 발생하는 주요 원인이 됩니다.

    이를 위해서 시간 동기화를 하여야 되는데, 각 PC들이 인터넷 망에 연결된 상황이라면, 주기적으로 외부 NTP 서버를 통해 인터넷 시각을 기준으로 각 PC의 시간이 맞춰지게 됩니다. 하지만, 로컬 네트워크 (폐쇠망)의 경우 이렇게 외부 NTP 서버에 접속이 불가능하므로, 특정PC 하나를 기준으로 시간을 동기화할 수 있도록 하여, 연결된 PC의 시간을 동기화 시킬 수 있습니다.

    chrony는 기존 사용되었던 ntp의 개선버전(?)입니다.


    먼저 기준이 될 PC에서 작업을 시작합니다.

    chrony를 설치합니다.

    $ sudo apt install chrony

    다음으로 chrony.conf 파일을 수정합니다.

    $ sudo vi /etc/chrony/chrony.conf

    설정 파일 내에 다음의 구문을 추가합니다.

    pool ntp.ubuntu.com        iburst maxsources 4
    pool <기준-PC-IP-주소>      iburst maxsources 1
    pool 0.ubuntu.pool.ntp.org iburst maxsources 1
    pool 1.ubuntu.pool.ntp.org iburst maxsources 1
    pool 2.ubuntu.pool.ntp.org iburst maxsources 2
    
    ...
    
    local stratum 10
    allow 10.0.0.0/24   # 10.0.0.xx IP들에게만 동기화 기능 허용

    저장하고 나와서, chronyd, chrony 서비스를 재시작 해줍니다.

    $ sudo systemctl restart chronyd
    $ sudo systemctl restart chrony

    기준 PC에서 작업은 끝났습니다.


    다음으로 동기화 대상 PC들에서 다음과 같이 작업을 수행합니다.

    먼저 chrony 설치

    $ sudo apt install chrony

    설정파일 수정

    $ sudo vi /etc/chrony/chrony.conf

    다음과 같이 레퍼런스 주소에 기준 PC의 주소를 입력해 줍니다.

    #pool ntp.ubuntu.com        iburst maxsources 4
    #pool 0.ubuntu.pool.ntp.org iburst maxsources 1
    #pool 1.ubuntu.pool.ntp.org iburst maxsources 1
    #pool 2.ubuntu.pool.ntp.org iburst maxsources 2
    pool  10.0.0.10             iburst maxsources 1

    저장하고, chrony를 재시작해줍니다.

    $ sudo systemctl restart chrony

    강제로 동기화 명령 수행 – 보통은 기준 PC와 시간을 체크해서 특정 범위만큼 차이가 벌어지면 동기화 작업을 수행하게 됩니다만, 일단은 강제로 한번 동기화 작업을 진행해봅니다.

    $ sudo chronyc -a makestep
    200 OK

    레퍼런스를 확인해봅니다.

    $ chronyc sources
    MS Name/IP address         Stratum Poll Reach LastRx Last sample
    ===============================================================================
    ^* _gateway                      4   6    77    32    -27us[ -384us] +/-   11ms

    저의 경우엔, 기준PC의 주소가 gateway로 사용되고 있어 저렇게 IP 주소대신 gateway라고 표시되고 있습니다.

    동기화 상태로 확인 가능합니다.

    $ watch -n 0.5 chronyc tracking
    
    Reference ID    : 0A00000A (_gateway)
    Stratum         : 5
    Ref time (UTC)  : Fri Feb 14 00:26:30 2025
    System time     : 0.000031521 seconds slow of NTP time
    Last offset     : -0.000079722 seconds
    RMS offset      : 0.000119501 seconds
    Frequency       : 23.396 ppm slow
    Residual freq   : -0.139 ppm
    Skew            : 3.385 ppm
    Root delay      : 0.013619509 seconds
    Root dispersion : 0.004857286 seconds
    Update interval : 64.5 seconds
    Leap status     : Normal

    System time을 확인해보면 약 0.000031521 느린것을 확인할 수 있습니다.

    끝.