• 이번 스타트업으로 이직하면서 업무용 노트북을 고르라고 하길래, 이것저것 사양을 검토해 보고 고른 노트북입니다. 기존엔 회사에서 정책적으로 정한 가격 이내에서 구입을 하던가, 아니면 그냥 개인적으로 구매해서 사용하곤 했었는데, 이럴 경우엔 저가형 or 완전 비싼 녀석으로 양분되어버리곤 했습니다. 사실 ASUS 노트북 자체에 대한 신뢰도는 개인적으로는 별로였는데, 얼마전 일렉트로마트에서 ASUS 제피로스 노트북을 만져본 경험으로는 꽤나 괜찮다는 느낌을 받았습니다.

    최종 선택한 모델은 ASUS ProArt P16 H7606WM-ME027W 입니다. 16인치이고, 해상도는 2880×1800, CPU는 뭐 딱히 중요하진 않지만 AMD Ryzen™ AI 9 HX 370입니다. Radeon™ 890M 그래픽카드와 NVIDIA 5060 그래픽카드가 내장되어 있습니다.

    몸체는 모두 알루미늄 금속으로 되어 있어 쿨링에 유리하고, 키보드 키감도 살짝 깊에 눌리는 면도 있긴하지만 꽤나 괜찮습니다. 우려했던 키패드 역시 손목이 놓이는 공간이 겹쳐 있긴해도 타이핑에는 전혀 문제가 되지 않습니다. 성능을 요구하는 프로그램 사용시 쿨러 소리도 그렇게 크게 들리진 않네요.

    충전포트가 따로 분리되어 있는 것도 개인적으론 좋아보입니다. 타입C로 되어 있을 경우, 보안을 요구하는 회사 출입시에 살짝 곤란했던 경험이 있어서.. 또 양쪽에 USB 타입A, 타입C 포트가 적절히 분배되어 있고, 또 HDMI 포트가 별도로 존재합니다. 무게도 2.1kg으로 무겁게 느껴지진 않습니다. NVME SSD도 내부에 2개를 장착할 수 있어, 제 경우엔 하나는 윈도우, 하나는 Ubuntu를 설치하여 사용 중입니다.

    개인적으로 느낀 단점으론 Windows 11 Home이 기본 설치되어 있다는 점 (WSL2를 사용하지 못함, Pro로 업그레이드 시 추가 비용 발생), 충전기가 살짝 벽돌스럽다는 점.. 정도이고, 그렇게 큰 문제는 없는듯 합니다.

    Ubuntu 24.04를 설치하여 사용중인데, 대부분은 잘 동작하지만 몇가지는 문제점이 있는데, 이 부분은 차후 버전이 올라가면 해결될 것으로 보입니다.

    • 키패드 라이딩 밝기 조정 불가
    • 부팅시 화면 밝기 항상 최소화
    • AMD 그래픽카드가 항상 우선권, NVIDIA의 nvidia-prime이 기본 Ubuntu Driver만 지원함.

    살짝 우려했던 바와는 달리 사용하기엔 꽤 괜찮아보이는듯 합니다.

    갸격은 현재 네이버 공식 쇼핑몰에서 350만원 정도입니다.

  • 기존 포스팅에서 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