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๏ธโฃ Dev Container๋ ์ผ๋ฐ์ ์ธ ์ปจํ ์ด๋์ ๋นํด ์ด๋ค ์ฅ์ ์ด ์๋์?
- 3๏ธโฃ ๋ฐฐํฌ์ฉ ๋์ปค ์ด๋ฏธ์ง๋ ์ด๋ป๊ฒ ๋ง๋ค ์ ์๋์?
- 4๏ธโฃ ์๊ฒฉ์ผ๋ก VSCode๋ฅผ ์ฌ์ฉํ ๋ ์ ์ฉํ ํ์ด ์๋์?
- 5๏ธโฃ ์ค์ ๋ settings.json ์ค์์ ์์๋๋ฉด ์ข์ ๊ฒ๋ค์ ๋ฌด์์ด ์๋์?
- 6๏ธโฃ ์ค์ ๋ devcontainer.json ์ค์์ ์์๋๋ฉด ์ข์ ๊ฒ๋ค์ ๋ฌด์์ด ์๋์?
- 7๏ธโฃ Docker compose๋ฅผ devcontainer๋ก ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ๋์?
- 8๏ธโฃ ์ ๋ณ๊ฒฝ์ ์ด๋ป๊ฒ ํ๋์?
- ๐น ์ค์ ์ผ์ ์ฐ๊ฒฐ
- โจ ๊ธฐ๋ฅ ์ถ๊ฐ
- ๐ ๋ฌธ์ ํด๊ฒฐ
๐ฆ ์ฌ์ ์ค๋น
- Host ์์คํ ์ Docker Engine๊ณผ VSCode ๊ทธ๋ฆฌ๊ณ Dev Containers ํ๋ฌ๊ทธ์ธ์ด ์ค์น๋์ด ์์ด์ผ ํฉ๋๋ค.
- GPU๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด, Host ์์คํ ์ NVIDIA Container Toolkit์ ์ค์นํด์ผ ํฉ๋๋ค.
์ค์น ๋ฐฉ๋ฒ
```bash # 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 ```- ํ์ฌ Dev Container์์ Host ์์คํ
์ ์๊ฐ์ ์ฌ์ฉํ๋๋ก ์ค์ ๋์ด ์์ต๋๋ค. ๋ฐ๋ผ์ ์ปจํ
์ด๋ ๋ด๋ถ์ ์๊ฐ์ NTP๋ก ๋๊ธฐํํ๊ณ ์ถ๋ค๋ฉด, Host ์์คํ
์
chrony
์ค์น๋ฅผ ์ถ์ฒํฉ๋๋ค. (ROS Clock์ ๋ํด ์ฝ์ด๋ณด๊ธฐ: ROS2, ROS1)
bash
sudo apt install chrony
- WSL2๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, ์๋ณธ ์ ์ฅ์์ WSL2 ์น์ ์ ์ฐธ๊ณ ํด์ฃผ์ธ์.
โ๏ธ ์ฌ์ฉ๋ฒ
-
์ํ๋ workspace ์ด๋ฆ์ผ๋ก ์ ์ฅ์๋ฅผ ๋ด๋ ค๋ฐ์ต๋๋ค. ๋ค์ 2๊ฐ์ง ๋ฐฉ๋ฒ ์ค ํ๋๋ฅผ ์ ํํ์ธ์.
-
(๋ฐฉ๋ฒ 1) ๋ณธ ์ ์ฅ์๋ฅผ ๋ฐ๋ก ๋ด๋ ค๋ฐ๊ณ git ์ฐ๊ฒฐ์ ๋๋ ๋ฐฉ๋ฒ.
$YOUR_WORKSPACE_NAME
๋ ์ํ๋ workspace ์ด๋ฆ์ผ๋ก ๋ฐ๊ฟ์ฃผ์ธ์.bash git clone https://github.com/rise-lab-skku/ros2_ws_kr.git $YOUR_WORKSPACE_NAME cd $YOUR_WORKSPACE_NAME git remote remove origin
-
(๋ฐฉ๋ฒ 2) ๋ณธ์ธ์ private ์ ์ฅ์๋ฅผ ๋ง๋ค์ด์ workspace๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ. ์ด๋ ๊ฒ ํ๋ฉด
./src/
ํด๋์ ๋ด์ ROS ํจํค์ง๋ค์ submodule๋ก ๊ด๋ฆฌํ ์ ์์ต๋๋ค.ํผ์น๊ธฐ
ํ ํ๋ฆฟ์ ์ฌ์ฉํ์ฌ ์ ์ ์ฅ์ ๋ง๋ค๊ธฐ๋ฅผ ์ ํํฉ๋๋ค.
์ ์ฅ์ ์ด๋ฆ์ ์ํ๋ workspace ์ด๋ฆ์ผ๋ก ์ค์ ํ๊ณ , private์ผ๋ก ์์ฑํฉ๋๋ค.
์์ฑ๋ ์ ์ฅ์๋ฅผ ๋ด๋ ค๋ฐ์ต๋๋ค.
git clone ${๋ณต์ฌํ ์ ์ฅ์ ์ฃผ์}
-
๋ด๋ ค๋ฐ์ workspace๋ฅผ VSCode๋ก ์ฝ๋๋ค.
- ์ค๋ฅธ์ชฝ ํ๋จ์ ์ปจํ
์ด๋๋ฅผ ์ฌ์ฉํ ๊ฒ์ธ์ง ๋ฌป๋ ํ์
์ด ๋จ๋ฉด,
Reopen in Container
๋ฅผ ์ ํํฉ๋๋ค. - ๋ง์ฝ ํ์
์ ๋ณด์ง ๋ชปํ๋ค๋ฉด,
Ctrl+Shift+P
๋ก ํจ๋์ ์ด์ด์Dev Containers: Reopen in Container
๋ฅผ ์ ํํฉ๋๋ค. - ์์ ๊ณผ์ ์ ๊ฑฐ์น๋ฉด, ์ปจํ ์ด๋๊ฐ ๋น๋๋๊ณ VSCode๊ฐ ์ฌ์์๋ฉ๋๋ค.
-
์ต์ด ์คํ ์, Docker ์ด๋ฏธ์ง๋ฅผ ๋น๋ํ๋ ๊ณผ์ ์ด ์์ด์ ์๊ฐ์ด ๋ช ๋ถ ์ ๋ ๊ฑธ๋ฆด ์ ์์ง๋ง, ๋ ๋ฒ์งธ ์คํ๋ถํฐ๋ ๋น๋๋ ์ด๋ฏธ์ง๊ฐ ์์ผ๋ฏ๋ก ๋ฐ๋ก ์คํ๋ฉ๋๋ค.
-
์ฌ๋ฐ๋ก ์คํ๋์๋ค๋ฉด,
Ctrl+Shift+`(์ญ๋ฐ์ดํ)
๋ก ํฐ๋ฏธ๋์ ์ด์ฌ์ ์ ์ ์ด๋ฆ์ดros
์ธ ๊ฒ์ ํ์ธํ ์ ์๊ณ , ๋ค์๊ณผ ๊ฐ์ด ROS2 ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
zsh
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
ํด๋๋ฅผ ์ง์์ผ ํ ์๋ ์์ต๋๋ค.
sh
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
ํญ๋ชฉ์ ์์ ํ๋ฉด ๋ฉ๋๋ค.
json
{
"dockerFile": "humble_full.Dockerfile",
// "dockerFile": "humble_full_cuda.Dockerfile",
}
- Extension ์ค์์ GitHub ๊ณ์ ์ด ํ์ํ ๊ฒ๋ค์ ์ฃผ์ ์ฒ๋ฆฌ๋์ด ์์ต๋๋ค. ํ์ํ๋ค๋ฉด ์ฃผ์์ ํด์ ํ๊ณ ์ฌ์ฉํ์๋ฉด ๋ฉ๋๋ค. (GitHub Copilot๊ณผ GitHub Actions)
json
"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์ด๋ผ๊ณ ์ ํ์๋๋ผ๋ ์ค์ ๋์ญํญ๊ณผ ์ธ๋ถ ์คํฉ์ด ๋ค๋ฅธ ํฌํธ๊ฐ ์์ฌ ์๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์, ๋ค๋ฅธ ํฌํธ์ ๊ฝ์ผ๋ฉด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋ ์๋ ์์ต๋๋ค.