• Ubuntu 24.04를 설치하면 자동으로 Nvidia 그래픽카드 드라이버가 설치된다. Nvidia에서 직접 제공하는 Repository를 사용하면, 쉽게 최신 버전의 그래픽 카드 드라이버를 설치할 수 있다.

    먼저 현재 설치되어 있는 드라이버를 삭제한다.

    $ sudo apt purge *nvidia*

    다음으로, Nvidia Repository의 키를 등록 및 Repository 추가를 위한 패키지 설치한다.

    $ wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2404/x86_64/cuda-keyring_1.1-1_all.deb
    $ sudo dpkg -i cuda-keyring_1.1-1_all.deb

    이제, apt를 업데이트하고, 드라이버를 설치한다. 이때 cuda를 설치하면 해당 CUDA의 버전에 맞게 안정된 드라이버를 같이 설치해준다.

    $ sudo apt update
    $ sudo apt install cuda

    마지막으로 노트북의 경우, prime-select 기능을 이용해 intel 대신 nvidia 드라이버가 항상 사용할 수 있도록 설정해준다.

    $ sudo prime-select nvidia

    재부팅하면 완료.

  • 어디에선가의 요청에 의해서 JAVA 환경에서 MODBUS를 이용해 디바이스의 레지스터를 읽어오는 예제코드를 작성하였습니다. JAVA는 Hello World 출력 정도 기억만 남아 있어서..^^ 일단 대충 테스트 코드를 작성하여 동작시켜보니.. 역시나 잘 동작합니다.

    검색해보니 jlibmodbus가 유용해보이기도 하고, 실제 MODBUS-RTU over TCP/IP도 지원하고 있길래 사용하였습니다.

    package com.unknown.modbusmonitorexam;
    
    import com.intelligt.modbus.jlibmodbus.exception.ModbusIOException;
    import com.intelligt.modbus.jlibmodbus.exception.ModbusNumberException;
    import com.intelligt.modbus.jlibmodbus.exception.ModbusProtocolException;
    import com.intelligt.modbus.jlibmodbus.master.ModbusMaster;
    import com.intelligt.modbus.jlibmodbus.master.ModbusMasterFactory;
    import com.intelligt.modbus.jlibmodbus.serial.*;
    import com.intelligt.modbus.jlibmodbus.tcp.TcpParameters;
    
    import java.net.InetAddress;
    import java.net.UnknownHostException;
    
    public class ModbusMonitorExam {
        public static void main(String[] args) throws UnknownHostException, ModbusIOException, SerialPortException, ModbusProtocolException, ModbusNumberException {
            TcpParameters tcpParameters = new TcpParameters();
            tcpParameters.setHost(InetAddress.getByName("192.168.10.11"));
            tcpParameters.setPort(9200);
            tcpParameters.setKeepAlive(true);
    
            SerialUtils.setSerialPortFactory(new SerialPortFactoryTcpClient(tcpParameters));
            ModbusMaster master = ModbusMasterFactory.createModbusMasterRTU(new SerialParameters());
    
            master.connect();
    
            int[] registerValues = master.readHoldingRegisters(1, 0, 5);
            for(int values : registerValues)
            {
                System.out.println("Value: " + values);
            }
        }
    }

    여담으로 Intellij IDEA를 이용해서 개발하니… 개발환경이 꽤나 편하네요..^^

  • 설치

    $ sudo curl https://packages.osrfoundation.org/gazebo.gpg --output /usr/share/keyrings/pkgs-osrf-archive-keyring.gpg
    $ echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/pkgs-osrf-archive-keyring.gpg] http://packages.osrfoundation.org/gazebo/ubuntu-stable $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/gazebo-stable.list > /dev/null
    $ sudo apt-get update
    $ sudo apt-get install gz-harmonic

    실행

    $ gz sim

    ROS2 패키지 설치

    $ sudo apt install ros-humble-ros-gzharmonic

    설치 시 ros-humble-desktop-full 패키지 의존성이 깨지기 때문에, 기존 설치된 패키지들이 더이상 필요없다고 뜰텐데, 이건 무시해도 됨. ign-gazebo 관련 패키지들이 전부 지워지고 새버전으로 설치됨.

    패키지 실행

    $ ros2 launch ros_gz_sim gz_sim.launch.py

    설치 완료.

  • 원래는 노션에 적어놓고 매번 반복하던 내용인데, 아예 블로그에 올려 놓으면 귀찮게 로그인 안해도 볼수 있기에 옮겨 놓음.

    설치 환경: Ubuntu 22.04

    Ubuntu 설치 시 영문환경으로 하는 것을 강력히 추천. 한글 입력은 https://ahnbk.dev/?p=368를 참고하면 됨.

    ROS2 Humble 설치에 대한 공식 문서는 https://docs.ros.org/en/humble/Installation.html 를 참고하길 바람.


    Repository 추가 및 Key 등록

    sudo apt install software-properties-common
    sudo add-apt-repository universe
    $ sudo apt update
    $ sudo apt install curl -y
    $ sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg
    $ echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(. /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null

    ROS2 설치

    $ sudo apt update
    $ sudo apt install ros-humble-desktop-full


    개발환경 셋업

    $ echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
    $ echo "export ROS_DOMAIN_ID=<your_domain_id>" >> ~/.bashrc
    $ echo "export ROS_LOCALHOST_ONLY=0" >> ~/.bashrc
    $ source ~/.bashrc

    개발툴 (colcon) 설치

    $ sudo apt install python3-colcon-common-extensions

    워크스페이스 생성 및 빌드

    $ mkdir -p ~/dev_ws/src
    $ cd ~/dev_ws
    $ colcon build --symlink-install

    생성한 워크스페이스 등록

    $ echo "source ~/dev_ws/install/setup.bash" >> ~/.bashrc

    colcon_cd, colcon 매개변수 자동완성 기능 활성화

    $ echo "source /usr/share/colcon_cd/function/colcon_cd.sh" >> ~/.bashrc
    $ echo "export _colcon_cd_root=/opt/ros/humble/" >> ~/.bashrc
    $ echo "source /usr/share/colcon_argcomplete/hook/colcon-argcomplete.bash"

    DDS 설치 (fastRTPS -> CycloneDDS)

    $ sudo apt install ros-humble-rmw-cyclonedds-cpp
    $ echo "export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp" >> ~/.bashrc

    cyclonedds 설정 파일 생성 및 등록

    $ vi ~/cyclonedds.xml
    <?xml version="1.0" encoding="UTF-8" ?>
    <CycloneDDS xmlns="https://cdds.io/config" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://cdds.io/config https://raw.githubusercontent.com/eclipse-cyclonedds/cyclonedds/master/etc/cyclonedds.xsd">
        <Domain id="any">
            <General>
                <Interfaces>
                    <!-- <NetworkInterface autodetermine="false" name="enp2s0`" priority="default" multicast="default" /> -->
                    <NetworkInterface autodetermine="true" priority="default" multicast="default" />
                </Interfaces>
                <AllowMulticast>default</AllowMulticast>
                <MaxMessageSize>65500B</MaxMessageSize>
            </General>
        </Domain>
    </CycloneDDS>
    $ echo "export CYCLONEDDS_URI=file:///home/<user-name>/cyclonedds.xml

    rosdep 및 vcstool 설치

    $ sudo apt install python3-rosdep
    $ sudo rosdep init
    $ rosdep update
    $ sudo apt install python3-vcstool

    이것으로 기본 설치 완료. 대략 20분 정도 소요됨.

  • cmd.exe나 PowerShell에서 Python3를 실행하는 경우, Tab키를 이용한 자동 완성 기능이 안된다. 이를 해결하기 위해선, 간단히 다음의 패키지를 설치하면 됨.

    > pip install -U pyreadline

    pyreadline은 Python3 실행 시 윈도우에서 자동 완성기능을 담당하는 패키지임.

    Ubuntu에서는 당연히 되던 기능인데, 윈도우 환경에선 안되길래 검색해보니 해결 방법이 바로 보임.

  • 설치환경, Ubuntu 24.04

    설치할 때, 언어는 영어(English)로 하는 것을 추천. 한글 입력은 https://ahnbk.dev/?p=368 참고.

    ROS2 설치에 대한 자세한 설명은 공식 문서 페이지를 참조. (https://docs.ros.org/en/jazzy/Installation/Ubuntu-Install-Debians.html)


    Repository 설정

    $ sudo apt install software-properties-common
    $ sudo add-apt-repository universe
    $ sudo apt update && sudo apt install curl -y
    $ sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg
    $ echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(. /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null

    ROS2 개발에 필요한 툴들을 모아놓은 메타 패키지 설치 (옵션)

    $ sudo apt install ros-dev-tools


    ROS2 설치 시작

    $ sudo apt update
    $ sudo apt install ros-jazzy-desktop

    DDS 설치. 기본으론 FastRTPS가 설치되어 있으나, CycloneDDS을 사용하는 것을 권장함

    $ sudo apt install ros-jazzy-rmw-cyclonedds-cpp


    환경설정

    $ echo "source /opt/ros/jazzy/setup.bash" >> ~/.bashrc

    도메인 아이디 설정

    $ echo "export ROS_DOMAIN_ID=<your_domain_id>" >> ~/.bashrc

    Jazzy 버전부터는 DDS를 이용한 자동 연결 기능에 대한 범위를 환경변수로 설정 가능

    $ echo "export ROS_AUTOMATIC_DISCOVERY_RANGE=<discover option>" >> ~/.bashrc

    옵션값은 다음의 한 종류를 선택

    SUBNET : 현재 서브넷 설정 (예: 255.255.255.0)에 따라 Node 발견(Discover) 및 연결 (Default)
    LOCALHOST : 현재 머신 내에서만 Node 발견(Discover) 및 연결 
    OFF : 다른 노드와 연결하지 않음, 단독 실행
    SYSTEM_DEFAULT : 초기값 사용 (SUBNET)

    설정이 끝난 다음, source나 터미널 재실행으로 환경변수 셋업 적용

    $ source ~/.bashrc


    개발툴(colcon) 설치 및 설정

    $ sudo apt install python3-colcon-common-extensions

    colcon_cd 명령 사용을 위한 환경변수 셋업

    $ echo "source /usr/share/colcon_cd/function/colcon_cd.sh" >> ~/.bashrc
    $ echo "export _colcon_cd_root=/opt/ros/jazzy/" >> ~/.bashrc

    workspace 디렉토리 생성

    $ mkdir -p ~/dev_ws/src
    $ cd ~/dev_ws

    빌드

    $ colcon build --symlink-install

    현재 workspace 사용하도록 환경변수 설정

    $ echo "source ~/dev_ws/install/setup.bash" >> ~/.bashrc

    rosdep 설치

    $ sudo apt install python3-rosdep
    $ sudo rosdep init
    $ rosdep update

    vcstool 설치

    $ sudo apt install python3-vcstool

    이것으로 일단 기본 설치 및 환경 셋업 완료.

  • 설치는 간단히 다음과 같이 입력하여 설치

    $ sudo apt install neovim

    다음으로, 기본 vi, vim 커맨드를 입력시 자동으로 nvim으로 연결하도록 설정한다.

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

    여기서 /user/bin/nvim을 선택하면, vim 입력시 nvim이 실행이 됨. 마찬가지로 vi에 대해서도 설정.

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

    마찬가지로 1번 선택.

    alias나 심볼릭 링크를 번거롭게 설정하는 대신, 위와 같이 설정하면 간단히 해결됨.

  • 현재 아이폰을 메인 회선으로 사용하고, 두 개의 아이패드를 데이터 함께쓰기로 사용하고 있습니다. 예전에는 아이패드를 변경하게 되면, 현재 꼽혀있는 유심을 뽑아서, 새로운 아이패드에 꼽으면 별다른 문제없이 사용할 수 있었는데, 올해 9월부터 약간의 정책이 바뀌었다고 합니다.

    결론으론,

    예전 아이패드에서 유심을 뽑기 전, 반드시 해당 기기의 전원을 정상적으로 종료해야 합니다. 전원이 정상적으로 종료된 이후에, 유심을 뽑아 새로운 기기에 꼽게 되면, 잠시 후 바로 통신이 가능하게 됩니다. 또 전원을 끈 이후 24시간이 지나면 안됩니다.

    위 과정을 거치치 않으면, 해당 유심이 락이 걸려서 통신이 안되도록 한다고 합니다. 이때는 예전 기기에 다시 유심을 꼽고, 전원 종료를 해주시면 됩니다. 예전 기기가 없어진 상태거나, 사용하지 못하는 경우라면 어쩔수 없이 대리점에 방문해야 할 듯 하네요.

  • Xenomai는 기존 Linux 시스템의 커널과 병행하여 실행되며, Hard Realtime Task를 지원하는 소프트웨어 프레임웍입니다. 설치 방법도 간단하고, POSIX 인터페이스를 지원하여 개발도 쉽게 할 수 있습니다.

    인터넷에서 Xenomai 설치 방법을 검색해보면, Xenomai2 버전과 예전 Linux 버전을 기준으로 설명해놓는 것들이 많고 (그만큼 인기가 없다는 얘기…) Xenomai3라고 해도 예전 iPipe를 사용하는 방법이 위주라서, 가장 최신 버전으로 Xenomai를 설치하는 방법을 정리해보았습니다.

    물론 Xenoami도 Xenomai4 버전이 출시되어있긴 하지만, 아직까진 성능 검증 및 개발 방법에 대한 친절한 문서를 찾아보기가 힘들었습니다. 이 포스트는 Xenoami3, Ubuntu 22.04 버전을 기준으로 설명합니니다.

    먼저 커널을 빌드하기 위한 툴을 설치합니다.

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

    다음으로 작업할 임시 디렉토리를 하나 만들고, 그곳에 커널 및 Xenomai 라이브러리 소스를 받아옵니다.

    $ mkdir ~/tmp
    $ cd ~/tmp
    $ wget https://source.denx.de/Xenomai/linux-dovetail/-/archive/v6.1.61-dovetail1/linux-dovetail-v6.1.61-dovetail1.tar.gz
    $ wget https://source.denx.de/Xenomai/xenomai/-/archive/v3.2.4/xenomai-v3.2.4.tar.gz
    
    
    $ tar zxf linux-dovetail-v6.1.61-dovetail1.tar.gz
    $ tar zxf xenomai-v3.2.4.tar.gz

    커널 버전은 자유롭게 선택이 가능합니다. 사용하는 디바이스 드라이버 및 소프트웨어 개발환경에 따라 적절히 선택해주면 됩니다. 저는 6.1.61 버전을 선택하였습니다. 이전에는 ipipe 패치를 해줘야 했지만, ipipe는 개발이 종료되었고, dovetail이 그 기능을 이어받아 개발 중입니다. 위 Repository에서는 dovetail이 패치된 커널 소스를 제공하고 있습니다. Xenomai 라이브러리는 가장 최신 버전인 3.2.4를 사용합니다.

    Xenomai는 두 가지 모드로 실행이 가능한데, Cobalt는 기존 커널과 Xenomai 커널을 동시에 존재하고, 두 개의 커널 사이의 통신을 위해 dovetail을 이용합니다.

    커널을 패치하기 위해 패치를 생성하고, 커널 소스에 적용해 줍니다.

    $ cd ~/tmp/xenomai-v3.2.4/scripts
    $ ./prepare-kernel.sh --linux=/home/robot/tmp/linux-dovetail-v6.1.61-dovetail1 --arch=x86_64 --outpatch=/home/robot/tmp/patch-cobalt-3.2.4.patch
    
    $ cd ~/tmp/linux-dovetail-v6.1.61-dovetail1
    $ patch -p1 < ../patch-cobalt-3.2.4.patch

    이제 커널을 설정해줍니다. make menuconfig 를 이용하겠습니다. 현재 설치된 Ubuntu의 커널 설정을 복사하여 기본으로 사용합니다.

    $ cd ~/tmp/linux-dovetail-v6.1.61-dovetail1
    $ cp /boot/config-`uname -r` .config
    $ make menuconfig

    몇가지 필수 설정들이 필요하고, 그 외엔 사용하는 환경에 따라 커널 모듈 및 설정을 추가/삭제하면 됩니다.

    General setup  --->
    	Preemption Model (Preemptible Kernel --->
    		(X) Preemptible Kernel (Low-Latency Desktop)
    
    Processor type and features  --->
    	Processor family (Generic-x86-64)  --->
    		(X) Core 2/newer Xeon
    
    	[*] Multi-core scheduler support
    	[ ]   CPU core priorities scheduler support
    
    Power management and ACPI options  --->
    	CPU Frequency scaling  --->
    		[ ] CPU Frequency scaling
    
    	[*] ACPI (Advanced Configuration and Power Interface) Support  --->
    		< >   Processor
    
    	CPU Idle  --->
    		[ ] CPU idle PM support
    
    Memory Management options  --->
    	[ ] Transparent Hugepage Support
    	[ ] Allow for memory compaction
    	[ ] Page migration
      [ ] Contiguous Memory Allocator
    
    
    [*] Xenomai/cobalt (NEW)  --->
    	Drivers  --->
    		RTnet  --->
    			<M> RTnet, TCP/IP socket interface
    				Drivers  --->
    
        Real-time IPC drivers  --->
          <M> RTIPC protocol family
            [*]   XDDP cross-domain datagram protocol (NEW)
            [*]   IDDP intra-domain datagram protocol (NEW)
            (32)    Number of IDDP communication ports (NEW)
            [*]   Buffer protocol (NEW)
            (32)    Number of BUFP communication ports (NEW)

    저장하고, 다시 터미널로 돌아옵니다.

    빌드하기 전에 시스템 키 설 정 및 디버깅코드 생성을 중지하도록 설정해줍니다. 시스템 키 설정은 따로 키를 생성하지 않는 한 에러가 발생하고, 디버깅 코드의 생성 중지는 빌드를 조금 더 빠르게 해줍니다.

    $ 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

    이제 빌드를 진행해 줍니다. (아주~~~ 좋은 PC가 아니면 대충 1시간 살짝 넘게 걸리는 듯 합니다. )

    $ make -j4 bindeb-pkg

    빌드가 완료되면, 생성된 deb 파일을 이용하여 커널을 설치해줍니다.

    $ cd ..
    $ sudo dpkg -i *.deb

    설치를 완료한 이후, 몇가지 설정을 진행해 줍니다.

    일단 xenomai 관련한 기능을 sudo 명령없이 사용하도록 현재 유저를 xenomai 그룹에 추가해줍니다.

    $ sudo addgroup xenomai
    $ sudo addgroup root xenomai
    $ sudo usermod -aG xenomai $(whoami)

    Group ID (GID)를 찾아봅니다.

    $ cat /etc/group | grep xenomai
    1001

    다음으로 GRUB의 부팅 옵션을 추가해줍니다.

    $ sudo vi /etc/default/grub
    GRUB_DEFAULT=saved
    GRUB_SAVEDEFAULT=true
    #GRUB_TIMEOUT_STYLE=menu
    GRUB_TIMEOUT=10
    GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
    GRUB_CMDLINE_LINUX_DEFAULT="quiet splash nomodeset i915.enable_rc6=0 i915.enable_dc=0 noapic xenomai.allowed_group=1001 isolcpus=0,1 xenomai.supported_cpus=0x3"
    GRUB_CMDLINE_LINUX=""
    
    GRUB_GFXMODE=1280x1024
    GRUB_GFXPAYLOAD_LINUX=1280x1024

    옵션 중 몇 가지를 설명해보면,

    xenomai.allowed_group=1001     % 생성한 그룹의 사용자들이 xenomai를 사용할 수 있도록 권한 부여
    isolcpus=0,1                   % CPU0, CPU1을 일반 커널에서 사용하지 못하도록 Isolation
    xenomai.supported_cpus=0x3     % CPU0, CPU1을 Xenomai에서 사용하도록 설정

    update-grub를 실행하여 변경된 옵션을 적용합니다.

    $ sudo update-grub
    $ sudo reboot

    다음으로 XDDP (비실시간 커널과 실시간 커널과의 통신을 위한 IPC 방법 중 하나)를 사용하기 위해 퍼미션을 설정해줍니다. udev 룰을 이용하여 권한을 부여할 수 있습니다.

    $ sudo vi /etc/udev/rules.d/99-xenomai.rules
    
    KERNEL=="rtp[0-32]*", MODE="0666"
    SUBSYSTEM=="rtdm", MODE="0666"

    다음으로 XDDP 커널 모듈을 부팅 시에 자동으로 로딩하도록 설정합니다.

    $ sudo vi /etc/modules
    
    xeno_rtipc

    이제 재부팅해줍니다. 재부팅시 설치된 실시간 커널 버전을 선택해줍니다.


    커널 버전 확인

    $ uname -a
    Linux former-0030 6.1.61-xenomai #5 SMP PREEMPT_DYNAMIC IRQ_PIPELINE Fri Nov 17 16:46:35 KST 2023 x86_64 x86_64 x86_64 GNU/Linux

    XDDP 커널 모듈 로딩 확인

    $ lsmod | grep xeno
    xeno_rtipc

    Xenomai 라이브러리를 설치해줍니다. 먼저 빌드를 위한 패키지 필요 패키지를 설치합니다.

    $ sudo apt install fuse

    Xenomai 라이브러리를 빌드하고 설치합니다.

    $ cd ~/tmp/xenomai-v3.2.4
    $ ./scripts/bootstrap
    $ ./configure --with-pic --with-core=cobalt --enable-smp --disable-tls --enable-dlopen-libs --disable-clock-monotonic-raw
    $ make -j4
    $ sudo make install

    PATH 환경변수에 Xenomai bin 경로를 추가하고,

    $ echo "export PATH=/usr/xenomai/bin:$PATH" >> ~/.bashrc

    라이브러리를 추가해줍니다.

    $ sudo vi /etc/ld.so.conf.d/xenomai.conf
    
    /usr/xenomai/lib
    
    $ sudo ldconfig

    설치 완료


    테스트용 코드를 하나 만들어서 잘 동작되는지 확인해보겠습니다.

    #include <stdio.h>
    #include <signal.h>
    #include <unistd.h>
    #include <alchemy/task.h>
    
    RT_TASK demo_task;
    
    void demo(void *arg)
    {
      RT_TASK_INFO curtaskinfo;
      rt_task_inquire(&demo_task, &curtaskinfo);
      printf("Task name : %s \n", curtaskinfo.name);
    }
    
    int main(int argc, char* argv[])
    {
      char *str = "demo";
    
      printf("start task\n");
    
      rt_task_create(&demo_task, str, 0, 50, 0);
      rt_task_start(&demo_task, &demo, 0);
    
      sleep(1);
    } 
    $ gcc -o hello_xenomai hello_xenomai.c $(xeno-config --posix --alchemy --cflags) $(xeno-config --posix --alchemy --ldflags)
    $ ./hello_xenomai 
    start task
    Task name : demo

    Latency도 확인해봅니다.

    $ sudo sh -c "echo 0 > /proc/xenomai/latency"
    $ latency
    == Sampling period: 100 us
    == Test mode: periodic user-mode task
    == All results in microseconds
    warming up...
    RTT|  00:00:01  (periodic user-mode task, 100 us period, priority 99)
    RTH|----lat min|----lat avg|----lat max|-overrun|---msw|---lat best|--lat worst
    RTD|      1.919|      1.963|      3.277|       0|     0|      1.919|      3.277
    RTD|      1.922|      1.964|      4.412|       0|     0|      1.919|      4.412
    RTD|      1.914|      1.958|      3.316|       0|     0|      1.914|      4.412

    전체적으로 100us 제어 주기에 약 4us latency가 발생합니다. 이는 User 모드 (dovetail을 통해서 xenomai 커널에 접근)인 경우에 그렇고, 커널 모드 or 커널 IRQ 모드로 실행하면 좀 더 좋은 성능이 나옵니다.

    완료.

  • Ubuntu에서 ifconfig, ip 등의 명령어를 이용하여, 현재 연결된 상태 및 IP 등을 확인할 수 있다. 하지만, 현재 연결된 네트워크 카드의 디바이스명이나 연결된 인터페이스 이름을 확인하려면 다음의 명령으로 가능하다.

    여러 개의 Ethernet 포트가 있고, 서로 다른 디바이스로 구성되어 있는 경우, 특정 디바이스에만 연결해야 하는 경우에 필요하다.

    $ sudo lshw -c network

    위와 같이 입력하면, 현재 시스템에 있는 모든 네트워크 디바이스의 리스트와 상세한 정보를 보여준다. 예를 들자면,

     *-network                                                                                                                                                                                                            
           description: Ethernet interface                                                                                                                                                                                 
           product: I210 Gigabit Network Connection                                                                                                                                                                        
           vendor: Intel Corporation                                                                                                                                                                                       
           physical id: 0                                
           bus info: pci@0000:02:00.0                    
           logical name: enp2s0                          
           version: 03                                   
           serial: c4:00:ad:c4:85:3d                     
           size: 100Mbit/s                               
           capacity: 1Gbit/s                             
           width: 32 bits                                
           clock: 33MHz                                  
           capabilities: pm msi msix pciexpress bus_master cap_list rom ethernet physical tp 10bt 10bt-fd 100bt 100bt-fd 1000bt-fd autonegotiation                                                                         
           configuration: autonegotiation=on broadcast=yes driver=igb driverversion=6.2.0-34-generic duplex=full firmware=3.25, 0x800005d0 latency=0 link=yes multicast=yes port=twisted pair speed=100Mbit/s              
           resources: irq:17 memory:80480000-804fffff ioport:3000(size=32) memory:80500000-80503fff memory:80400000-8047ffff          

    현재 이 네트워크 디바이스는 Intel사의 i210 칩셋을 사용하는 기가빗 네트워크를 지원한다는 것을 알 수 있다. 또 현재 enp2s0라는 인터페이스 이름으로 연결되어 있다.