• ์–ด์ œ ๊ฐ‘์ž๊ธฐ 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 ๋А๋ฆฐ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ๋.

  • ๋กœ๋ด‡ ์‹œ์Šคํ…œ์˜ ๊ฒฝ์šฐ, ๋‚ด๋ถ€๋ง๊ณผ ์™ธ๋ถ€๋กœ ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์ธํ„ฐ๋„ท๋ง์„ ๋ถ„๋ฆฌํ•˜์—ฌ ์„ค๊ณ„ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๋ถ€ ๊ธฐ๊ธฐ๋“ค์€ ๋กœ์ปฌ๋ง์œผ๋กœ, ๋กœ๋ด‡์„ ์›๊ฒฉ์œผ๋กœ ์ ‘์†ํ•˜๊ธฐ ์œ„ํ•œ ์ธํ„ฐ๋„ท๋ง์„ ๋”ฐ๋กœ ๋‘๋Š” ๊ฒฝ์šฐ์ธ๋ฐ, ๋ณดํ†ต 2๊ฐœ ์ด์ƒ์˜ ๋””๋ฐ”์ด์Šค or PC๊ฐ€ ๋“ค์–ด๊ฐ€๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ๋Œ€๋žต ๊ทธ๋ฆผ์œผ๋กœ ์„ค๋ช…ํ•ด๋ณด๋ฉด,

    ์ด๋ ‡๊ฒŒ ๋˜์–ด ์žˆ์„ ๊ฒฝ์šฐ, PC2์—์„œ๋Š” ์ธํ„ฐ๋„ท๋ง์— ์ ‘์†์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ ์™ธ๋ถ€๋ง์œผ๋กœ ์—ฐ๊ฒฐ์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜๊ฑฐ๋‚˜ ํ•  ๊ฒฝ์šฐ์— ์•ฝ๊ฐ„ ๋ถˆํŽธํ•œ ๊ฒฝ์šฐ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”๋ฐ, iptables๋ฅผ ์ด์šฉํ•ด์„œ PC2์—์„œ PC1์„ ํ†ตํ•ด ์ธํ„ฐ๋„ท๋ง์ด ์ ‘์† ๊ฐ€๋Šฅํ•˜๋„๋ก ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ์ผ๋‹จ PC1์—์„œ ํ•„์š”ํ•œ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

    $ sudo apt install iptables iptables-persistent

    ๋˜, IP ํฌ์›Œ๋“œ ๊ธฐ๋Šฅ์ด ํ™œ์„ฑํ™”๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    $ sudo vi /etc/sysctrl.conf
    
    # 28th line uncomment
    net.ipv4.ip_forward=1

    ๋‹ค์Œ์œผ๋กœ iptables๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๋„คํŠธ์›Œํฌ ์ธํ„ฐํŽ˜์ด์Šค ์ด๋ฆ„์€ ์œ„ ๊ทธ๋ฆผ์„ ๊ธฐ์ค€์œผ๋กœ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. (์‚ฌ์šฉ์ž ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ๋ณ€๊ฒฝํ•˜์—ฌ ์“ฐ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค)

    $ sudo iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
    $ sudo iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT
    $ sudo iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT

    ์ด์ œ ์ด๊ฑธ ์˜๊ตฌ์ ์œผ๋กœ ์ €์žฅํ•˜๊ณ , ๋‹ค์Œ ๋ถ€ํŒ… ํ›„์—๋„ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    $ sudo netfilter-persistent save
    $ sudo netfilter-persistent reload

    ์ด์ œ PC1์—์„œ์˜ ์ž‘์—…์€ ๋๋‚ฌ์Šต๋‹ˆ๋‹ค.


    ๋‹ค์Œ์œผ๋กœ PC2์—์„œ๋Š” IP ์„ค์ •๋งŒ ๋‹ค์‹œ ํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋จผ์ € ํ˜„์žฌ ์ €์žฅ๋œ ์„ค์ • ์ด๋ฆ„์„ ํ™•์ธํ•ด๋ด…๋‹ˆ๋‹ค.

    $ nmcli connection show
    NAME                UUID                                  TYPE      DEVICE  
    Wired connection 1  fb960c33-6436-3331-b11b-174bfebacc62  ethernet  eth0    
    docker0             311a9d66-a3fe-4aeb-ac9c-665beb0a7e1f  bridge    docker0 
    

    ์ €์˜ ๊ฒฝ์šฐ์—” “Wired connection 1″์œผ๋กœ ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

    ์ด์ œ IP ์„ค์ •์„ ํ•ด์ค๋‹ˆ๋‹ค.

    $ sudo nmcli con modify "Wired connection 1"  ipv4.addresses 10.0.0.11/24
    $ sudo nmcli con modify "Wired connection 1"  ipv4.gateway 10.0.0.10
    $ sudo nmcli con modify "Wired connection 1"  ipv4.dns 8.8.8.8
    $ sudo nmcli con modify "Wired connection 1"  ipv4.method manual
    $ sudo nmcli con up "Wired connection 1"

    ์ด์ œ ์—ฐ๊ฒฐ์„ ํ…Œ์ŠคํŠธ ํ•ด๋ณด๋ฉด…

    $ ping 8.8.8.8
    PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
    64 bytes from 8.8.8.8: icmp_seq=1 ttl=51 time=43.7 ms
    64 bytes from 8.8.8.8: icmp_seq=2 ttl=51 time=41.3 ms

    ์™ธ๋ถ€๋ง์œผ๋กœ ์—ฐ๊ฒฐ์ด ์ž˜ ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ๋.

  • ํ•˜์—ฌ๊ฐ„ ์ด Jetson ๊ฐœ๋ฐœ์ž ๋†ˆ๋“ค์€ ๋ญํ•˜๋‚˜ ์‰ฝ๊ฒŒ ๋„˜์–ด๊ฐ€๋Š” ๊ผด์„ ๋ชป๋ณด๋Š”๋“ฏ ํ•ฉ๋‹ˆ๋‹ค. Jetpack5์—์„œ Jetpack6์œผ๋กœ ๋„˜์–ด๊ฐ€๋Š”๋ฐ๋„ ์‹œ๊ฐ„์ด ํ•œ์ฐธ์„ ๊ฑธ๋ฆฌ๋”๋งŒ, Jetpack6์— ์˜ฌ๋ผ๊ฐ€์„œ๋Š” Realsense ์นด๋ฉ”๋ผ๋“ค์ด ์ธ์‹ ์ด ์•ˆ๋˜๋Š” ๋ฒ„๊ทธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์›์ธ์€ ํ•ด๋‹น ๋“œ๋ผ์ด๋ฒ„๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š์•„์„œ์ด๊ณ , ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„  ์ปค๋„ ์†Œ์Šค๋ฅผ ๋ฐ›์•„ ํ•ด๋‹น ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์žฌ๋นŒ๋”ฉํ•ด์„œ ๋ณต์‚ฌํ•ด ์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    ํŠนํžˆ D435i์˜ ๊ฒฝ์šฐ IMU๊ฐ€ ๋‚ด์žฅ๋˜์–ด ์žˆ๋Š”๋ฐ, ์ด IMU์˜ ์„ผ์„œ๋ฐ์ดํ„ฐ๋ฅผ USB HID ํ”„๋กœํ† ์ฝœ์„ ์ด์šฉํ•ด์„œ ๋ฐ›๋„๋ก ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ๋””๋ฐ”์ด์Šค ๋“œ๋ผ์ด๋ฒ„๊ฐ€ hidraw๋ผ๋Š” ๋…€์„์ž…๋‹ˆ๋‹ค. (์•„๋งˆ IMU๊ฐ€ ๋‚ด์žฅ๋˜์–ด ์žˆ์ง€ ์•Š๋Š” ์‹œ๋ฆฌ์ฆˆ๋“ค์€ ์ž˜ ์ธ์‹๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ^^)

    ๋‹คํ–‰ํžˆ librealsense ๋ ˆํฌ์ง€ํ† ๋ฆฌ์— ์ปค๋„ ๋ฐ ๋ชจ๋“ˆ์„ ํŽธํ•˜๊ฒŒ ๋นŒ๋“œํ•  ์ˆ˜ ์žˆ๋„๋ก ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž˜ ๋งŒ๋“ค์–ด๋†“์•„์„œ ๋นŒ๋“œ๊นŒ์ง€๋Š” ์‰ฝ๊ฒŒ ํ•ด๊ฒฐ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

    https://github.com/IntelRealSense/realsense_mipi_platform_driver/blob/dev/README_JP6.md

    $ git clone https://github.com/IntelRealSense/realsense_mipi_platform_driver.git -b dev
    $ cd realsense_mipi_platform_driver
    $ ./setup_workspace.sh 6.0
    $ ./apply_patches.sh apply 6.0
    $ ./build_all.sh 6.0

    ์œ ์˜ํ•ด์•ผ ํ•  ์ ์€ ํ˜„์žฌ๊นŒ์ง€๋Š” Jetpack 6.0 (rev2)๋งŒ ์ง€์›ํ•˜๊ณ  ์žˆ์–ด์„œ, ํ˜„์žฌ ์ตœ์‹ ๋ฒ„์ „์ธ 6.2์—์„œ๋Š” ์œ„ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ณ , ์•„์ง๊นŒ์ง€ ์ง€์› ๋ฐฉ์•ˆ์ด ์—†์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Jetson Orin NX ๋ณด๋“œ์— SDK Manager๋ฅผ ์ด์šฉํ•ด ์„ค์น˜ํ•  ๋•Œ, Jetpack ๋ฒ„์ „์„ 6.0 (rev2)๋กœ ์„ ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    ์ด๋ ‡๊ฒŒ ๋นŒ๋“œ๋ฅผ ์™„๋ฃŒํ•˜๊ณ ,


    ๊ทธ ๋‹ค์Œ, ๋นŒ๋“œ๋œ ์ปค๋„ ๋ชจ๋“ˆ์„ Jetson ๋ณด๋“œ์— ๋ณต์‚ฌํ•˜์—ฌ ์ ์šฉํ•ด์•ผ ํ•˜๋Š”๋ฐ, ์œ„ ๋ ˆํฌ์ง€ํ† ๋ฆฌ์˜ ๋ฌธ์„œ๋ฅผ ๋”ฐ๋ผ์„œ ์ง„ํ–‰ํ•˜๋ฉด, ๋“œ๋ผ์ด๋ฒ„์˜ ๋ฌธ์ œ์ธ์ง€ ๋ถ€ํŒ…์ด ์ œ๋Œ€๋กœ ๋˜์ง€ ์•Š๊ฑฐ๋‚˜, USB๊ฐ€ ๋จนํ†ต์ด ๋˜์–ด๋ฒ„๋ฆฝ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‹ค์Œ์˜ ๊ณผ์ •๋งŒ ์ง„ํ–‰ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

    $ cd realsense_mipi_platform_driver
    $ scp -r images/6.0/rootfs/lib/modules/5.15.136-tegra/extra <jetson-user-id>@<jetson-board-ip-address>:~/

    ๋‹ค์Œ์œผ๋กœ Jetson ๋ณด๋“œ์—์„œ๋Š”

    $ sudo cp -r ~/extra /lib/modules/$(uname -r)/
    $ cd /lib/modules/$(uname -r)/
    $ sudo rm -rf videodev.ko

    ๋‹ค์Œ์œผ๋กœ depmod ์„ค์ •ํŒŒ์ผ์— ๊ฒฝ๋กœ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    $ sudo vi /etc/depmod.d/ubuntu.conf
    
    search updates boot built-in
    ์ด ๋ถ€๋ถ„์„
    search extra updates boot built-in
    ์œผ๋กœ ์ˆ˜์ •

    ๋‹ค์‹œ ํ„ฐ๋ฏธ๋„์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‹คํ–‰ํ•˜๊ณ 

    $ sudo depmod

    ์žฌ๋ถ€ํŒ…ํ•œ ๋‹ค์Œ, Realsense ์นด๋ฉ”๋ผ๋ฅผ ๊ผฝ์•„์ฃผ๋ฉด ์ œ๋Œ€๋กœ ์ธ์‹์ด ๋˜๊ณ , ์ •์ƒ์ ์œผ๋กœ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

    ๋.

  • 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

    ๊ฐœ๋ฐœํˆด ์„ค์น˜

    $ sudo apt update
    $ sudo apt install ros-dev-tools

    ROS2 ์„ค์น˜

    $ 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" >> ~/.bashrc

    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/$(whoami)/cyclonedds.xml" >> ~/.bashrc

    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์—์„œ๋Š” ๋‹น์—ฐํžˆ ๋˜๋˜ ๊ธฐ๋Šฅ์ธ๋ฐ, ์œˆ๋„์šฐ ํ™˜๊ฒฝ์—์„  ์•ˆ๋˜๊ธธ๋ž˜ ๊ฒ€์ƒ‰ํ•ด๋ณด๋‹ˆ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ๋ฐ”๋กœ ๋ณด์ž„.