본문 바로가기

AI로봇/ROS2+SLAM

AI로봇랩 1강) Windows WSL2에 ROS2 설치하기

Frenz AI로봇랩에서 ROS2 강의영상 입니다.

ROS의 이론과 설치 (Windows WSL2)에 대해 다룹니다.

 

https://youtu.be/AUSOnvOTt2s

 

 

ROS2는 윈도우에서도 가능하다!

 

ROS2를 윈도우에 설치하기 위한 3가지 방법

  • 그냥 Window
  • Window+wsl2 (!!)
  • Window+Docker

 

Window의 wsl2를 이용해서 ROS2를 설치해보자

  • 윈도우에서 리눅스를 사용할 수 있게 해주는 WSL2 버전이 정식으로 출시
  • WSL은 Windows Subsystem for Linux 2의 줄임말
  • 윈도우의 가상화 기능을 활용해서 윈도우 위에서 리눅스를 사용 가능
  • 단순히 가상머신으로 리눅스를 사용할 수 있는 것이 아님
  • 윈도우 시스템과 통합되어 마치 하나의 머신처럼 자연스럽게 리눅스를 활용하는 것이 가능

 

참고

   - RoadBalnce 김수영 대표님, 로보티즈 표윤석 박사님 자료를 많이 활용했습니다 감사합니다.

 

 

설치 시작!!


1) 윈도우 셋팅

1.1) 최신 Windows 업데이트

     - 왼쪽 밑 윈도우 클릭 -> 제어판 클릭 -> 업데이트 및 보안 클릭 -> 윈도우 최신버전으로 업데이트

 

 

1.2) Windows 10에 WSL2 설치

     - WSL2: Windows Subsystem for Linux 2

     - WSL을 설치하려면 Windows 10의 20H1 이상 버전이어야 함
     - 2022년 현재 20H1 이상 버전을 사용해야 설치가 가능
     - 왼쪽 아래 검색 -> 'pc 정보' 입력 -> 시스템 열기, Windows 사양의 버전 확인(20H1보다 높은지 체크)

 

 

1.3) WSL2 활성화

     - 윈도우에선 기본적으로 WSL1이 활성화 되는데, 이를 WSL2가 활성화 되도록 설정

     1.3.1) Window PowerShell을 관리자 권한으로 열어서 아래 명령어를 친다

 

 

>> dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
>> dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

 

 

     1.3.2) WSL2를 기본으로 사용하도록 설정

 

 

>> wsl --set-default-version 2

 

 

 

1.4) CHOCOLATEY 설치

     - 터미널에서 설치를 쉽게할수 있는 설치 도우미

     1.3.1) Powershell을 관리자 권한으로 연다(Windows+X+A)

 

 

>> Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))

 

 

 

     1.3.2) Powershell 종료 관리자 권한으로 재시작

 

 

>> choco  # 아래와 같이 버전이 잘 나오는지 확인

 

 

 

 

     1.3.3) 윈도우 터미널 설치 (3min)

 

 

>> choco install -y microsoft-windows-terminal

 

 

     1.3.4) CMake 설치

     - 운영체제에 상관없이 사용 가능한 빌드 툴, ROS2의 colcon build system을 사용하기 위해 설치

 

 

>> choco install -y cmake

 

 

1.5) Ubuntu 20.04 설치

     1.5.1) Microsoft Store 열기

     1.5.2) Ubuntu 20.04를 검색해서 설치

 

 

     1.5.3) 에러시 수행, 에러 없을땐 1.6으로 점프!

     - 만약 아래와 같은 에러가 나면 Windows PowerShell에서 아래 명령어 입력 후 재부팅

 

"WslRegisterDistribution failed with error: 0x8007019e
The Windows Subsystem for Linux optional component is not enabled. Please enable it and try again."

 

 

 

>> Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux

 

 

 

1.6) Ubuntu 20.04 셋팅

     - 다시 MicroSoft store에서 Ubuntu 20.04 설치 진행

     - 아이디와 비밀번호 입력(우선 최대한 간단하게)
     - 아래 화면이 나오면 성공

 

1.7) Ubuntu 20.04 관리자 권한으로 실행

     - 찾기->Ubuntu 20.04 -> 관리자 권한으로 실행

 

 

1.8) Ubuntu 20.04 업데이트 및 WSL 설치 (10m)

     1.8.1) Ubuntu 20.04 업데이트

 

 

>> sudo apt update
>> sudo apt upgrade
>> sudo apt autoremove

 

 

     1.8.2) WSL 설치

 

 

>> sudo apt install wsl -y
>> wsl  # 설치 확인

 

 

 

 


2) ROS2 설치

2.1) ROS2 설치를 위한 셋팅 (2m)

      - Ubuntu 20.04를 관리자권한으로 열기

 

 

>> sudo apt update && sudo apt install curl gnupg2 lsb-release -y
>> sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key  -o /usr/share/keyrings/ros-archive-keyring.gpg
>> sudo sh -c 'echo "deb [arch=$(dpkg --print-architecture)] http://packages.ros.org/ros2/ubuntu $(lsb_release -cs) main" > /etc/apt/sources.list.d/ros2-latest.list'
>> sudo apt update

>> sudo apt update && sudo apt install locales
>>  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 $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null
>> locale  # check for UTF-8
>> sudo apt update && sudo apt install locales
>> sudo locale-gen en_US en_US.UTF-8
>> sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8
>> export LANG=en_US.UTF-8
>> locale  # verify settings

 

!!! 아래와 같이 PUBEY 에러 발생 시 아래 명령어 입력

 

 

(PUBKEY 에러시, 에러 없으면 패스!) >> sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys F42ED6FBAB17C654

(PUBKEY 에러시, 에러 없으면 패스!) >> sudo apt-get update

 

 

 

2.2) ROS2 설치를 위한 셋팅 (2m)

      - Ubuntu 20.04를 관리자권한으로 열기

>> sudo apt install ros-foxy-desktop -y  # 엄청 오래 걸림, 25min
>> sudo apt install -y python3-pip
>> pip install -U argcomplete
>> sudo apt install python3-colcon-common-extensions -y
>> sudo apt install python3-rosdep2 -y
>> rosdep update
>> sudo apt-get update
>> echo "source /opt/ros/foxy/setup.bash" >> ~/.bashrc
>> source ~/.bashrc

 

 

2.3) 개발툴 설치

 

 

>> sudo apt update && sudo apt install -y build-essential cmake git libbullet-dev python3-colcon-common-extensions python3-flake8 python3-pip python3-pytest-cov python3-rosdep python3-setuptools python3-vcstool wget
>> python3 -m pip install -U argcomplete flake8-blind-except flake8-builtins flake8-class-newline flake8-comprehensions flake8-deprecated flake8-docstrings flake8-import-order flake8-quotes pytest-repeat pytest-rerunfailures pytest
>> sudo apt install --no-install-recommends -y libasio-dev libtinyxml2-dev libcunit1-dev

 

 

2.4) ROS2 동작 확인

      a) Ubuntu 20.04를 관리자권한으로 Terminal을 2개 띄운다

      b) 왼쪽 Terminal 창에

 

>> ros2 run demo_nodes_cpp talker


      c)  오른쪽 터미널창에

 

>> ros2 run demo_nodes_py listener

 

      d) Talker(왼쪽)가 말하는걸 Lister(오른쪽)에서 잘 듣고 있나요?? 듣고있으면 성공!

 

 

 

2.5) ROS2 Build 테스트

 

>> source /opt/ros/foxy/setup.bash
>> mkdir -p ~/robot_ws/src
>> cd ~/robot_ws/
>> colcon build --symlink-install

 

 

- 아래와 같이 4개의 폴더(build, install, log, src)가 보이면 성공!

 

 

 


3) Gazebo 셋팅

Gazebo는 ROS2에 가장 적합한 로봇 시뮬레이터. 로봇 없이도 가상의 로봇을 통해 실습과 확인 가능

3.1) Gazebo 설치

 

 

>> sudo sh -c 'echo "deb http://packages.osrfoundation.org/gazebo/ubuntu-stable `lsb_release -cs` main" > /etc/apt/sources.list.d/gazebo-stable.list'
>> wget https://packages.osrfoundation.org/gazebo.key -O - | sudo apt-key add -
>> sudo apt update
>> sudo apt install gazebo11 libgazebo11-dev -y
>> sudo apt install ros-foxy-gazebo-ros-pkgs -y  # Gazebo ROS 패키지들도 설치

 

 

3.2) Gazebo GUI 인터페이스를 위한 설정
     3.2.1) VcXsrv Windows X Server 설치

        - https://sourceforge.net/projects/vcxsrv/ 접속후 다운로드

 

     3.2.2) XLaunch 실행

 

 

     3.2.3) XLaunch 설정

        - 아래 그림을 보며 따라 설정한다

        - 방화벽은 개인, 공용 네트워크 둘다 꼭 체크한다!

 

 

        - 만약 방화벽 문제로 gazebo가 뜨지 않으면 아래와 같이 '방화벽 및 네트워크 보호' -> '방화벽에서 앱 허용'을 누른 후 VcXsrv(XLaunch)의 방화벽을 개인/공용 모두 허용한다.

 

 

 

3.3) Gazebo & Rviz2 실행
     3.3.1) PyQt5 설치

 

>> sudo apt-get install pyqt5-dev-tools
>> python3 -m pip install --upgrade pip
>> python3 -m pip install -U catkin_pkg cryptography empy ifcfg lark-parser lxml netifaces numpy opencv-python pyparsing pyyaml setuptools rosdistro
>> python3 -m pip install -U pydot PyQt5

 

 

     3.3.2) 아래 명령어를 Ubuntu 20.04 Windows Terminal에 입력

 

 

>> export GAZEBO_IP=127.0.0.1
>> #export DISPLAY=:0  # 수정
>> export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):0 
>> export LIBGL_ALWAYS_INDIRECT=0
>> source ~/.bashrc

 

 

     

     3.3.3) Gazebo 실행!
     - 한참 기다려도 아무것도 안뜬다?? 더 기다려보다가 도저히 아니다 싶으면 잘못된거다ㅠ

 

 

>> gazebo --verbose
>> (libQt5Core.so.5 에러시) sudo strip --remove-section=.note.ABI-tag /usr/./lib/x86_64-linux-gnu/libQt5Core.so.5

 

   

     - 방화벽 창이 뜨면 private/public 모두 꼭 체크해준다

 

    - 만약 'This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem. Available platform plugins are: eglfs, linuxfb, minimal, minimalegl, offscreen, vnc, xcb' 에러가 뜬다면 3.2.3)의 네트워크 방화벽 설정에서 허용해고 다시 실행한다. 그래도 안되면 껐다키고...

 

 

    - gazebo를 강제 종료하고 싶다면 아래 명령어로 종료

 

killall gzserver
killall gzclient

 

 

    - (좀더 깊이 들어가보자) Window에서 WSL로 Ubuntu를 연결하므로 Windows와 Ubuntu의 IP주소가 다르다. 이 때 Ubuntu의 IP를 nameserver라고 하는데 /etc/resolv.conf 를 확인하거나  nameserver를 확인할 수 있다. 'export DISPLAY=172.30.16.1:0.0'를 'export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):0'로 변경하여 자동으로 반영될 수 있도록 한다.

 

 

 


4) Rviz2 실행

로봇의 센서 데이터, 외형, 위치 등 여러 데이터들을 그래픽으로 손쉽게 살필 수 있는  ROS 2의 Rviz 2
아래 명령어를 Ubuntu 20.04 Windows Terminal에 입력

 

>> export GAZEBO_IP=127.0.0.1
>> export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):0 
>> export LIBGL_ALWAYS_INDIRECT=0

>> rviz2  # 실행!

 

아래 창이 뜨면 성공!! 축하해요~!

 

 


5) Bashrc 설정

 

>> sudo apt-get install gedit -y  # gedit 설치
>> gedit ~/.bashrc  # bashrc 설정 파일 수정

 


     5.1) Xterm 부분(66~73째 줄) 삭제

 

 

 

 

 

     5.2) 아래 명령어 밑에 추가 저장(ctrl+s)

 

 

source /opt/ros/foxy/setup.bash


alias eb='gedit ~/.bashrc'
alias sb='source ~/.bashrc'
alias cba='colcon build --symlink-install'
alias cbp='colcon build --symlink-install --packages-select'
alias killg='killall -9 gzserver && killall -9 gzclient && killall -9 rosmaster'

alias rosfoxy='source /opt/ros/foxy/setup.bash && source ./install/setup.bash'

export GAZEBO_IP=127.0.0.1
export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):0
export LIBGL_ALWAYS_INDIRECT=0

 

 

     5.3) 변경사항 반영

 

>> source ~/.bashrc

 


6) TEST

 

6.1) 워크스페이스 디렉토리 만들고 빌드하기

     - 빌드가 성공하면 'All required rosdeps installed successfully'가 뜬다. build, install, log, src 4개의 폴더가 있는지 확인한다.

>> mkdir -p ~/ros2_ws/src
>> cd ~/ros2_ws/src
>> git clone https://github.com/ros/ros_tutorials.git -b foxy-devel  # 샘플 패키지 설치
>> cd ..
>> rosdep install -i --from-path src --rosdistro foxy -y -r  # 성공하면 'All required rosdeps installed successfully'가 뜬다
     
>> colcon build  # colon으로 빌드 (1.5min)

 

 

 

 

6.2) turtlesim 테스트 1

     - Terminal을 2개 띄운 후 아래와 같이 각각 실행한다. 'ros2'는 ROS2를 실행하기 위한 명령어이고, 'run' 뒤의 'turtlesim'은 노드가 있는 패키지 이름, 그 뒤 'turtlesim_node'와 'draw_squre'는 실행할 노드의 이름이다. 

     (terminal 1) >> ros2 run turtlesim turtlesim_node
     (terminal 2) >> ros2 run turtlesim draw_square

 

 

     아래 그림같이 거북이가 사각형을 그리며 움직이나요??

 

 

 

6.3) turtlesim 테스트 2

     - Terminal을 2개 띄운 후 아래와 같이 각각 실행한다. 'ros2'는 ROS2를 실행하기 위한 명령어이고, 'run' 뒤의 'turtlesim'은 노드가 있는 패키지 이름, 그 뒤 'turtlesim_node'와 'turtle_teleop_key'는 실행할 노드의 이름이다. 오른쪽 terminal에서 키보드로 입력을 하면, 왼쪽 terminal의 로봇(거북이)를 제어할 수 있다. ROS는 이런 방식으로 여러개의 terminal을 띄운 후 각각 노드들을 별개로 실행하면 ROS가 통합하여 통신을 연결해준다.

     (terminal 1) >> ros2 run turtlesim turtlesim_node
     (terminal 2) >> ros2 run turtlesim turtle_teleop_key

 

 

 

 

끝~!!! 수고하셨습니다