Skip to content

A ROS2 Workspace in VSCode devcontainer with Ubuntu mirror set to Kakao mirror for the Korean region.

License

Notifications You must be signed in to change notification settings

rise-lab-skku/ros2_ws_kr

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

23 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

VSCode ROS2 Workspace Template for KR

This template provides a fully prepared ROS2 workspace using a VSCode Dev Container, and it employs the Kakao mirror as an Ubuntu APT mirror. Furthermore, it builds upon two other repositories. If you find this template useful, please consider showing your support by giving a star to the repositories mentioned below.


๋ชฉ์ฐจ

  1. ๐Ÿ“ฆ ์‚ฌ์ „ ์ค€๋น„
  2. โœ๏ธ ์‚ฌ์šฉ๋ฒ•
  3. ๐Ÿ“Œ ์ •๋ณด
    1. 1๏ธโƒฃ ์œ ์šฉํ•œ ๊ธฐ๋Šฅ๋“ค์€ ๋ฌด์—‡์ด ์žˆ๋‚˜์š”?
    2. 2๏ธโƒฃ Dev Container๋Š” ์ผ๋ฐ˜์ ์ธ ์ปจํ…Œ์ด๋„ˆ์— ๋น„ํ•ด ์–ด๋–ค ์žฅ์ ์ด ์žˆ๋‚˜์š”?
    3. 3๏ธโƒฃ ๋ฐฐํฌ์šฉ ๋„์ปค ์ด๋ฏธ์ง€๋Š” ์–ด๋–ป๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‚˜์š”?
    4. 4๏ธโƒฃ ์›๊ฒฉ์œผ๋กœ VSCode๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์œ ์šฉํ•œ ํŒ์ด ์žˆ๋‚˜์š”?
    5. 5๏ธโƒฃ ์„ค์ •๋œ settings.json ์ค‘์—์„œ ์•Œ์•„๋‘๋ฉด ์ข‹์€ ๊ฒƒ๋“ค์€ ๋ฌด์—‡์ด ์žˆ๋‚˜์š”?
    6. 6๏ธโƒฃ ์„ค์ •๋œ devcontainer.json ์ค‘์—์„œ ์•Œ์•„๋‘๋ฉด ์ข‹์€ ๊ฒƒ๋“ค์€ ๋ฌด์—‡์ด ์žˆ๋‚˜์š”?
    7. 7๏ธโƒฃ Docker compose๋ฅผ devcontainer๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•˜๋‚˜์š”?
    8. 8๏ธโƒฃ ์‰˜ ๋ณ€๊ฒฝ์€ ์–ด๋–ป๊ฒŒ ํ•˜๋‚˜์š”?
  4. ๐Ÿ“น ์‹ค์ œ ์„ผ์„œ ์—ฐ๊ฒฐ
  5. โœจ ๊ธฐ๋Šฅ ์ถ”๊ฐ€
  6. ๐Ÿ”‘ ๋ฌธ์ œ ํ•ด๊ฒฐ
    1. Q. ์„ผ์„œ๊ฐ€ ์ธ์‹๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    2. Q. Windows์—์„œ GUI ์ฐฝ์ด ๋œจ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๐Ÿ“ฆ ์‚ฌ์ „ ์ค€๋น„

  1. Host ์‹œ์Šคํ…œ์— Docker Engine๊ณผ VSCode ๊ทธ๋ฆฌ๊ณ  Dev Containers ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์„ค์น˜๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  2. GPU๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด, Host ์‹œ์Šคํ…œ์— NVIDIA Container Toolkit์„ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    ์„ค์น˜ ๋ฐฉ๋ฒ•
    # Add the package repositories
    distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
    && 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/$distribution/libnvidia-container.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
    
    # Install the toolkit
    sudo apt-get update
    sudo apt-get install -y nvidia-container-toolkit
    sudo nvidia-ctk runtime configure --runtime=docker
    sudo systemctl restart docker
  3. ํ˜„์žฌ Dev Container์—์„œ Host ์‹œ์Šคํ…œ์˜ ์‹œ๊ฐ„์„ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์˜ ์‹œ๊ฐ„์„ NTP๋กœ ๋™๊ธฐํ™”ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, Host ์‹œ์Šคํ…œ์— chrony ์„ค์น˜๋ฅผ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค. (ROS Clock์— ๋Œ€ํ•ด ์ฝ์–ด๋ณด๊ธฐ: ROS2, ROS1)

    sudo apt install chrony

โœ๏ธ ์‚ฌ์šฉ๋ฒ•

  1. ์›ํ•˜๋Š” ์ด๋ฆ„์œผ๋กœ workspace๋ฅผ ์ƒ์„ฑํ•ฉ์‹œ๋‹ค. ๋‹ค์Œ 2๊ฐ€์ง€ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•˜์„ธ์š”.

    • (๋ฐฉ๋ฒ• 1) Git ์—ฐ๊ฒฐ ์—†์ด workspace ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•. (๊ฐ€์žฅ ๋‹จ์ˆœ, ๊ถŒ์žฅ)

      • Release ํŽ˜์ด์ง€์˜ Assets์—์„œ source code ์••์ถ•ํŒŒ์ผ์„ ๋‹ค์šด๋ฐ›๋Š”๋‹ค.
      • ์••์ถ•์„ ํ’€๋ฉด, ros2_ws_kr-{๋ฒ„์ „} ํด๋”๊ฐ€ ์ƒ๊ธด๋‹ค. ์ด ํด๋”๋ฅผ ์›ํ•˜๋Š” workspace ์ด๋ฆ„์œผ๋กœ ๊ณ ์นฉ๋‹ˆ๋‹ค.
    • (๋ฐฉ๋ฒ• 2) ๋ณธ์ธ์˜ private ์ €์žฅ์†Œ๋ฅผ ๋งŒ๋“ค์–ด์„œ workspace๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ./src/ ํด๋”์— ๋‹ด์„ ROS ํŒจํ‚ค์ง€๋“ค์„ submodule๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

      ํŽผ์น˜๊ธฐ

      ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ ์ €์žฅ์†Œ ๋งŒ๋“ค๊ธฐ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

      image

      ์ €์žฅ์†Œ ์ด๋ฆ„์„ ์›ํ•˜๋Š” workspace ์ด๋ฆ„์œผ๋กœ ์„ค์ •ํ•˜๊ณ , private์œผ๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      image

      ์ƒ์„ฑ๋œ ์ €์žฅ์†Œ๋ฅผ ๋‚ด๋ ค๋ฐ›์Šต๋‹ˆ๋‹ค. git clone ${๋ณต์‚ฌํ•œ ์ €์žฅ์†Œ ์ฃผ์†Œ}

      image

  2. ๋‚ด๋ ค๋ฐ›์€ workspace๋ฅผ VSCode๋กœ ์—ฝ๋‹ˆ๋‹ค.

    • ์˜ค๋ฅธ์ชฝ ํ•˜๋‹จ์— ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ธ์ง€ ๋ฌป๋Š” ํŒ์—…์ด ๋œจ๋ฉด, Reopen in Container๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
    • ๋งŒ์•ฝ ํŒ์—…์„ ๋ณด์ง€ ๋ชปํ–ˆ๋‹ค๋ฉด, Ctrl+Shift+P๋กœ ํŒจ๋„์„ ์—ด์–ด์„œ Dev Containers: Reopen in Container๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
    • ์œ„์˜ ๊ณผ์ •์„ ๊ฑฐ์น˜๋ฉด, ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋นŒ๋“œ๋˜๊ณ  VSCode๊ฐ€ ์žฌ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.
    • ์ตœ์ดˆ ์‹คํ–‰ ์‹œ, Docker ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•˜๋Š” ๊ณผ์ •์ด ์žˆ์–ด์„œ ์‹œ๊ฐ„์ด ๋ช‡ ๋ถ„ ์ •๋„ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์ง€๋งŒ, ๋‘ ๋ฒˆ์งธ ์‹คํ–‰๋ถ€ํ„ฐ๋Š” ๋นŒ๋“œ๋œ ์ด๋ฏธ์ง€๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ๋ฐ”๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
  3. ์˜ฌ๋ฐ”๋กœ ์‹คํ–‰๋˜์—ˆ๋‹ค๋ฉด, Ctrl+Shift+`(์—ญ๋”ฐ์˜ดํ‘œ)๋กœ ํ„ฐ๋ฏธ๋„์„ ์—ด์—ฌ์„œ ์œ ์ €์ด๋ฆ„์ด ros์ธ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ณ , ๋‹ค์Œ๊ณผ ๊ฐ™์ด ROS2 ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (๋‹จ, Windows ํ™˜๊ฒฝ์ด๋ผ๋ฉด Ubuntu์™€ ๋‹ฌ๋ฆฌ X11 ํฌ์›Œ๋”ฉ์„ ์ˆ˜๋™์œผ๋กœ ์„ค์ •ํ•ด์•ผ GUI ์ฐฝ์ด ๋œน๋‹ˆ๋‹ค. ์„ค์ • ๋ฐฉ๋ฒ•์„ ์ฐธ๊ณ ๋ฐ”๋ž๋‹ˆ๋‹ค.)

    ros@...:~$ rviz2

์ฐธ๊ณ ๋กœ,

  • ๊ธฐ๋ณธ ์‰˜์€ zsh์ž…๋‹ˆ๋‹ค. Oh My Zsh์ด ์„ค์น˜๋˜์–ด ์žˆ์œผ๋ฉฐ, agnoster ํ…Œ๋งˆ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. bash๋ฅผ ์›ํ•˜์‹ ๋‹ค๋ฉด, ์—ฌ๊ธฐ ์ ํžŒ ๋ฐฉ๋ฒ•์œผ๋กœ ์–ผ๋งˆ๋“ ์ง€ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • DooD ์„ค์ •์ด ๋˜์–ด ์žˆ์–ด์„œ, Host์˜ Docker๋ฅผ Dev Container ๋‚ด์—์„œ๋„ ๋™์ผํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ, rootless ๋ชจ๋“œ๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ์ง€ ์•Š์•„์„œ sudo๋ฅผ ์ž…๋ ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, sudo docker ps๋ฅผ ์ž…๋ ฅํ•˜๋ฉด, Dev Container ์ž๊ธฐ ์ž์‹ ์ด ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

๐Ÿ“Œ ์ •๋ณด

1๏ธโƒฃ ์œ ์šฉํ•œ ๊ธฐ๋Šฅ๋“ค์€ ๋ฌด์—‡์ด ์žˆ๋‚˜์š”?

  • ์‹ค์ œ Host PC๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฑฐ์˜ ๋™์ผํ•œ ๊ฒฝํ—˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
    • sudo ๋ช…๋ น์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์„œ, sudo apt install๋กœ ํŒจํ‚ค์ง€๋ฅผ ์ถ”๊ฐ€๋กœ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • Host์˜ Docker๋ฅผ Dev Container ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก DooD (Docker-outside-of-Docker) ์„ค์ •์ด ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ docker ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด, sudo๋ฅผ ๋ถ™์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. (์˜ˆ: sudo docker ps)
    • ์‹ค์ œ ์„ผ์„œ๋“ค์„ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก components ํด๋”์— Dockerfile์ด ๋ฏธ๋ฆฌ ์ค€๋น„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
    • GUI ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • tasks.json์—๋Š” ๋‹ค์–‘ํ•œ task๋“ค์ด ๋ฏธ๋ฆฌ ์„ค์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
    • Ctrl+Shift+P๋ฅผ ๋ˆŒ๋Ÿฌ Tasks: Run Task๋ฅผ ์„ ํƒํ•˜๊ณ , ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” task๋“ค์„ ํ™•์ธํ•ด๋ณด์„ธ์š”.
    • Tasks๋ฅผ ํ™œ์šฉํ•˜๋Š” ๋ฉ‹์ง„ ๋ฐฉ๋ฒ•์€ ์›์ž‘์ž์˜ ๋ธ”๋กœ๊ทธ๋ฅผ ํ™•์ธํ•ด์ฃผ์„ธ์š”.
  • ๊ธฐ๋ณธ ์‰˜๋กœ zsh์ด ์„ค์ •๋˜์–ด ์žˆ๊ณ , Oh My Zsh์˜ ์œ ์šฉํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ๋“ค๋„ ๋ฏธ๋ฆฌ ์„ค์น˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์‰˜์„ bash๋กœ ๋˜๋Œ๋ฆฌ๊ณ  ์‹ถ๋‹ค๋ฉด (8๏ธ) ์‰˜ ๋ณ€๊ฒฝ์€ ์–ด๋–ป๊ฒŒ ํ•˜๋‚˜์š”?๋ฅผ ์ฝ์–ด์ฃผ์„ธ์š”.
  • APT mirror ์„œ๋ฒ„๊ฐ€ Kakao ์„œ๋ฒ„๋กœ ์„ค์ •๋˜์–ด ์žˆ์–ด ๊ตญ๋‚ด์—์„œ apt update์™€ apt install์ด ๋น ๋ฆ…๋‹ˆ๋‹ค.
  • ROS2์—์„œ ์ถ”์ฒœํ•˜๋Š” formatter์™€ linter๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. (ROS2 code style)
  • Github CI๋กœ ROS2 linting์ด ์„ค์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. .github/workflows/ros.yaml ํŒŒ์ผ์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.

2๏ธโƒฃ Dev Container๋Š” ์ผ๋ฐ˜์ ์ธ ์ปจํ…Œ์ด๋„ˆ์— ๋น„ํ•ด ์–ด๋–ค ์žฅ์ ์ด ์žˆ๋‚˜์š”?

  • Dev Container๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, ์ปจํ…Œ์ด๋„ˆ ํ™˜๊ฒฝ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ extension ๊ฐ™์€ VSCode์˜ ์„ค์ •๋“ค๋„ ์ผ๊ด€๋˜๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋Š” VSCode์˜ ์„ค์ •๋“ค์—๋Š” tasks.json, launch.json, settings.json ๋“ฑ๋„ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
  • ์›๊ฒฉ์ง€ ์„œ๋ฒ„์˜ Dev Container๋„ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๋กœ์ปฌ PC์˜ ์„ฑ๋Šฅ์— ๊ตฌ์• ๋ฐ›์ง€ ์•Š๊ณ  ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (์ฐธ๊ณ ๊ฐ€ ๋ ๋งŒํ•œ ํŒ)

3๏ธโƒฃ ๋ฐฐํฌ์šฉ ๋„์ปค ์ด๋ฏธ์ง€๋Š” ์–ด๋–ป๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‚˜์š”?

๋ฐฐํฌ์šฉ ๋„์ปค ์ด๋ฏธ์ง€๋Š” ๋‹ค์Œ ๋„์ปคํŒŒ์ผ์„ ์ฐธ๊ณ ํ•˜์—ฌ ์ž‘์„ฑํ•˜์‹œ๊ธธ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์–‘ํ•œ ROS2 ๋„์ปค ์ด๋ฏธ์ง€ ์˜ˆ์‹œ๋กœ๋Š” DominikN/ros2_docker_examples๊ฐ€ ์ข‹์€ ์ฐธ๊ณ  ์ž๋ฃŒ๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋งŒ์•ฝ, ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์˜ ์‹œ๊ฐ„์„ ํ˜ธ์ŠคํŠธ ์‹œ์Šคํ…œ์˜ ์‹œ๊ฐ„๊ณผ ๋™์ผํ•˜๊ฒŒ ๋งž์ถ”๊ณ  ์‹ถ๋‹ค๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™์ด volume์„ ๋งˆ์šดํŠธํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

--volume=/etc/timezone:/etc/timezone:ro \
--volume=/etc/localtime:/etc/localtime:ro

4๏ธโƒฃ ์›๊ฒฉ์œผ๋กœ VSCode๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์œ ์šฉํ•œ ํŒ์ด ์žˆ๋‚˜์š”?

  • ์›๊ฒฉ์ง€ ์„œ๋ฒ„์—์„œ ๊ฐœ๋ฐœํ•  ๋•Œ ์žฆ์€ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ž…๋ ฅ์œผ๋กœ ๋ถˆํŽธํ•˜๋‹ค๋ฉด, ssh-keygen & ssh-copy-id๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋ฐ€๋ฒˆํ˜ธ ์—†์ด ๋กœ๊ทธ์ธํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •ํ•˜๊ฑฐ๋‚˜ ssh-agent๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ํ•œ ๋ฒˆ๋งŒ ์ž…๋ ฅํ•˜๋„๋ก ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์›๊ฒฉ์œผ๋กœ ์ ‘์†ํ•  ๋•Œ๋„ X11 ํฌ์›Œ๋”ฉ์„ ํ†ตํ•ด GUI ์ฐฝ์„ ๋„์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์›๊ฒฉ ์„œ๋ฒ„๊ฐ€ Linux๋ผ๋ฉด, VSCode์—์„œ ssh ์ ‘์† ์‹œ -X ์˜ต์…˜์„ ์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ X11 connection rejected ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๋ฉด, ์„ค์ •์ด ์˜ฌ๋ฐ”๋ฅธ์ง€ ๋˜๋Š” devcontainer.json์—์„œ DISPLAY ๋ณ€์ˆ˜๋Š” ํ˜„์žฌ ํ™˜๊ฒฝ์— ์ ์ ˆํ•œ์ง€ ํ™•์ธํ•ด์ฃผ์„ธ์š”. ํ•„์š”์— ๋”ฐ๋ผ ์„œ๋ฒ„์—์„œ $HOME/.Xauthority ํด๋”๋ฅผ ์ง€์›Œ์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

    ssh user@host -X -A
    # -X Enables X11 forwarding.
    # -A Enable forwarding of the authentication agent connection. (ssh-agent)

5๏ธโƒฃ ์„ค์ •๋œ settings.json ์ค‘์—์„œ ์•Œ์•„๋‘๋ฉด ์ข‹์€ ๊ฒƒ๋“ค์€ ๋ฌด์—‡์ด ์žˆ๋‚˜์š”?

ํ‚ค๋ณด๋“œ ํƒ€์ดํ•‘์ด ๋๋‚˜๊ณ  1์ดˆ ํ›„์— ์ž๋™์œผ๋กœ ์ €์žฅ๋˜๋„๋ก ์„ค์ •๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ €์žฅ ๋‹จ์ถ•ํ‚ค๋ฅผ ๋ˆ„๋ฅด์ง€ ์•Š์•„๋„ ์ž๋™์œผ๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, ํŒŒ์ผ ๋์— ์žˆ๋Š” ๋นˆ ์ค„๊ณผ ๊ณต๋ฐฑ ๋ฌธ์ž๋“ค๋„ ์ž๋™์œผ๋กœ ์ œ๊ฑฐ๋˜๋„๋ก ์„ค์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

"files.autoSave": "afterDelay",
"files.trimTrailingWhitespace": true,
"files.trimFinalNewlines": true,
"editor.formatOnType": false,

6๏ธโƒฃ ์„ค์ •๋œ devcontainer.json ์ค‘์—์„œ ์•Œ์•„๋‘๋ฉด ์ข‹์€ ๊ฒƒ๋“ค์€ ๋ฌด์—‡์ด ์žˆ๋‚˜์š”?

  • runArgs ํ•ญ๋ชฉ์— ์ฃผ์„ ์ฒ˜๋ฆฌ๋œ ์˜ต์…˜๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ์˜ต์…˜์ด ์žˆ๋‹ค๋ฉด ์ฃผ์„์„ ํ•ด์ œํ•˜๊ณ  ์‚ฌ์šฉํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

  • ์‚ฌ์šฉํ•  ๋„์ปค ์ด๋ฏธ์ง€๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, dockerFile ํ•ญ๋ชฉ์„ ์ˆ˜์ •ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

    {
      "dockerFile": "humble_full.Dockerfile",
      // "dockerFile": "humble_full_cuda.Dockerfile",
    }
  • Extension ์ค‘์—์„œ GitHub ๊ณ„์ •์ด ํ•„์š”ํ•œ ๊ฒƒ๋“ค์€ ์ฃผ์„ ์ฒ˜๋ฆฌ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•„์š”ํ•˜๋‹ค๋ฉด ์ฃผ์„์„ ํ•ด์ œํ•˜๊ณ  ์‚ฌ์šฉํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค. (GitHub Copilot๊ณผ GitHub Actions)

    "extensions": [
      // // [Optional] These extensions require GitHub account authentication. Uncomment them to enable.
      // "github.vscode-github-actions",
      // "GitHub.copilot",
    ]

7๏ธโƒฃ Docker compose๋ฅผ devcontainer๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•˜๋‚˜์š”?

VSCode์˜ ๊ณต์‹ ๋ฌธ์„œ์— Docker compose๋ฅผ devcontainer๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์ž˜ ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

8๏ธโƒฃ ์‰˜ ๋ณ€๊ฒฝ์€ ์–ด๋–ป๊ฒŒ ํ•˜๋‚˜์š”?

  • bash์™€ zsh์„ ์ž์œ ๋กญ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. bash๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, ํ„ฐ๋ฏธ๋„์—์„œ bash๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
  • ๊ธฐ๋ณธ ์‰˜์„ ๋ฐ”๊พธ๊ณ  ์‹ถ๋‹ค๋ฉด, devcontainer.json์—์„œ "terminal.integrated.defaultProfile.linux" ํ•ญ๋ชฉ์„ ์ˆ˜์ •ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๐Ÿ“น ์‹ค์ œ ์„ผ์„œ ์—ฐ๊ฒฐ

โœจ ๊ธฐ๋Šฅ ์ถ”๊ฐ€

์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์š”์ฒญ์ด๋‚˜ ์ถ”๊ฐ€๋Š” issue๋‚˜ pull request๋ฅผ ํ†ตํ•ด ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ด€๋ฆฌ์ž๊ฐ€ ์ฃผ๊ธฐ์ ์œผ๋กœ ํ™•์ธํ•˜๊ณ  ์žˆ์œผ๋‚˜, ๋‹ต๋ณ€์€ ๋Šฆ์„ ์ˆ˜ ์žˆ์œผ๋‹ˆ ์–‘ํ•ด ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

๐Ÿ”‘ ๋ฌธ์ œ ํ•ด๊ฒฐ

Q. ์„ผ์„œ๊ฐ€ ์ธ์‹๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ์ ์ ˆํ•œ ๊ถŒํ•œ๊ณผ ์˜ต์…˜์„ ๋ถ€์—ฌํ•˜์˜€๋Š”์ง€ ํ™•์ธํ•ด์ฃผ์„ธ์š”. --privileged ์˜ต์…˜์ด ํ•„์š”ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์—ฐ๊ฒฐ์„ ์ด ์ ์ ˆํ•œ ์‚ฌ์–‘์ธ์ง€ ํ™•์ธํ•ด์ฃผ์„ธ์š”. ์‹ค์ˆ˜๋กœ ๋ฐ์ดํ„ฐ ์„ ์ด ์—†๋Š” ์ผ€์ด๋ธ”์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ฑฐ๋‚˜, ๋‹ค๋ฅธ ์ž‘์—… ๋„์ค‘ ์—ฐ๊ฒฐ์„ ์ด ๋น ์ง€์ง€ ์•Š์•˜๋Š”์ง€ ํ™•์ธํ•ด์ฃผ์„ธ์š”. lsusb ๋ช…๋ น์–ด๋กœ ์—ฐ๊ฒฐ๋œ USB ์žฅ์น˜๋“ค์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ทธ๋Ÿผ์—๋„ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, ๋‹ค๋ฅธ ํฌํŠธ์— ๊ฝ‚์•„๋ณด์„ธ์š”. ๋…ธํŠธ๋ถ์ด๋‚˜ ๋ฐ์ŠคํŠธํƒ‘ PC์— USB ํฌํŠธ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ์žˆ๋‹ค๋ฉด, ๋™์ผํ•˜๊ฒŒ USB 3.0์ด๋ผ๊ณ  ์ ํ˜€์žˆ๋”๋ผ๋„ ์‹ค์ œ ๋Œ€์—ญํญ๊ณผ ์„ธ๋ถ€ ์ŠคํŒฉ์ด ๋‹ค๋ฅธ ํฌํŠธ๊ฐ€ ์„ž์—ฌ ์žˆ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์—, ๋‹ค๋ฅธ ํฌํŠธ์— ๊ฝ‚์œผ๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

Q. Windows์—์„œ GUI ์ฐฝ์ด ๋œจ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Windows์—์„œ๋Š” X11 ํฌ์›Œ๋”ฉ์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ์—†๊ธฐ ๋•Œ๋ฌธ์—, Xming์ด๋‚˜ MobaXterm๊ณผ ๊ฐ™์€ X11 ์„œ๋ฒ„๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ์„ค์ •์ด ๊ฐ„ํŽธํ•œ MobaXterm์„ ์‚ฌ์šฉํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

  1. MobaXterm์„ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

  2. Settings > Configuration > X11์—์„œ OpenGL acceleration์„ Software๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์„ค์ • ํ›„์—๋Š” MobaXterm์„ ๊ทธ๋ƒฅ ์ผœ๋‘๋ฉด ๋ฉ๋‹ˆ๋‹ค. (์ด ์„ค์ •์„ ํ•˜์ง€ ์•Š์œผ๋ฉด, RViz2๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.)

    MobaXterm1 MobaXterm2

  3. ์œˆ๋„์šฐ์—์„œ CMD ๋˜๋Š” PowerShell์„ ์—ด๊ณ  ipconfig๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ WSL ํ•ญ๋ชฉ์— ์ ํžŒ IPv4 Address ์ฃผ์†Œ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ด ์ฃผ์†Œ๊ฐ’ ๋’ค์— :0๋ฅผ ๋ถ™์—ฌ์„œ, .devcontainer ํด๋” > devcontainer.json ํŒŒ์ผ์˜ DISPLAY ํ•ญ๋ชฉ์— ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

    ipconfig DISPLAY variable DISPLAY devcontainer

  4. VSCode์—์„œ Ctrl+Shift+P > Dev Containers: Rebuild Container๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ RViz2 ์ฐฝ์ด ๋œจ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    RViz2 on Windows