본문 바로가기

Programming/ROS

Windows WSL2에 ROS2 설치하기

참고 : https://keep-steady.tistory.com/45

 

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

Frenz AI로봇랩에서 ROS2 강의영상 입니다. ROS의 이론과 설치 (Windows WSL2)에 대해 다룹니다. https://youtu.be/AUSOnvOTt2s ROS2는 윈도우에서도 가능하다! ROS2를 윈도우에 설치하기 위한 3가지 방법 그냥 Window

keep-steady.tistory.com

 

위에 블로그 내용을 그대로 가져와 Ubuntu 버전을 22.04로 설치하고  ROS2 버전을 Foxy에서 Humble로 변경 설치하면서 약간 변경 및 error 발생 부분을 처리하는 내용을 추가하였습니다. 

 

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 22.04 설치

     1.5.1) Microsoft Store 열기 (powershell에서 설치하는 방법으로 변경)

     1.5.2) Ubuntu 20.04를 검색해서 설치 (powershell에서 설치하는 방법으로 변경)

 

 

     1.5.3) 아래 명령을 무조건 수행하고 PC를 다시 시작 한다. (에러시 수행, 에러 없을땐 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.5.4) 설치 가능한 Ubuntu 버전 확인하기

>> wsl --list --online

     1.5.5)Ubuntu 설치. 

>> wsl --install -d Ubuntu-22.04

 

 

 

1.6) Ubuntu 22.04 셋팅

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

 

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

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

 

  - Windows Terminal에서 Unbuntu 실행 방법. 

     Windows Terminal을 관리자 권한으로 실행 후 아래 그림과 같이 확장 탭에서 Ubuntu를 선택하면 된다. 
     Windows Terminal 실행 시 기본적으로 관리자 권한으로 실행 되게 하려면 "설정 "에서 관리자 권한으로 실행 선택. 

 

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

     1.8.1) Ubuntu 22.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 22.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 22.04를 관리자권한으로 열기

>> sudo apt install ros-humble-desktop -y  # 엄청 오래 걸림, 25min (ssy : foxy를 humble로 변경)
>> 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/humble/setup.bash" >> ~/.bashrc # ssy : foxy를 humble로 변경
>> 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 22.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/humble/setup.bash  # ssy : foxy를 humble로 변경.
>> 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 22.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
>> 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 22.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/humble/setup.bash 문장 아래 alias 로 시작하는 부분 부터 복사하여 붙여넣기 하면 된다. 

source /opt/ros/humble/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 roshumble='source /opt/ros/humble/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 humble  # 샘플 패키지 설치 (ssy : foxy-devel을 humble로 변경)
>> cd ..
>> rosdep install -i --from-path src --rosdistro humble -y -r  # 성공하면 'All required rosdeps installed successfully'가 뜬다 (ssy : foxy를 humble로 변경)
     
>> colcon build  # colon으로 빌드 (1.5min)

>> source ~/ros2_ws/install/setup.bash # ssy : 경로를 찾지 못할 경우 이 명령으로 작업공간 환경 변수를 설정해 준다.

 

 

 

6.2) AttributeError: module 'em' has no attribute 'BUFFERED_OPT'   에러 발생 처리. 

    - empy 버전을 3.3.4로 다시 설치 했다. 

>> pip uninstall empy   # 현재 버전 제거
>> pip install empy==3.3.4   # 3.3.4 버전 설치

 

6.3) TypeError: canonicalize_version() got an unexpected keyword argument 'strip_trailing_zero' 에러 발생 처리. 

    -  packaging 버전을 업그래이드 했다. 

>> pip install packaging==22

 

6.4) turtlesim 테스트 1

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

      - 테스트 실행하지 전에 XLaunch가 실행되고 있는지 확인 후 꺼져 있을 경우 다시 실행 시킨 상태에서 해야 한다. 

 

     (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

 

 

// ssy : 2024.11.27 (코드 수정 후 다시 build하였는데 전혀 수정 내용이 반영되지 않는 경우.)
turtlesim 페키지에 이미 컵파일된 파일이 있어서 내가 새로 build한 파일이 실행되는 것이 아니라 기존 파일이 실행되는 경우가 있다. 
아래 경로에 이미 컴파일된 실행 파일들을 삭제하거나 이름을 변경한 후에 실행 해야 진짜 내가 build한 파일의 실행 결과를 알 수 있다. 
Sample 중에 draw_square 가 있는데 이를 실행 하면 거북이가 사각형을 그려야하지만 한 번 이동후 더이상 동작을 하지 않는다. 이는 코드상에 버그가 있는데 이를 수정 후 다시 build하여 실행했으나 전혀 적용되지 않아 확인 결과 아래와 같은 경로에 있는 파일이 실행되고 있었다. 이 곳의 파일의 이름을 변경해 두고 다시 실행하니 내가 build한 파일이 실행되어 정상 동작 함을 확인할 수 있었다. 

./opt/ros/humble/lib/turtlesim

draw_square 파일의 이름을 _draw_square로 변경해준 모습

draw_square.cpp 버그 부분

ssy@song:~/ros2_ws/src/ros_tutorials/turtlesim/tutorials$ ls -l
total 24
-rw-r--r-- 1 ssy ssy 4471 Nov 18 18:14 draw_square.cpp
-rw-r--r-- 1 ssy ssy  948 Nov 14 22:28 mimic.cpp
-rw-r--r-- 1 ssy ssy 9262 Nov 14 22:28 teleop_turtle_key.cpp
void timerCallback(rclcpp::Publisher<geometry_msgs::msg::Twist>::SharedPtr twist_pub)
{
    if (!g_first_pose_set) // <<-- 이 부분에 !가 누락되어 있었다. 
    {
      return;
    }

    if (g_first_goal_set != true)
    {
      g_first_goal_set = true;
      g_state = FORWARD;
      g_goal.x = cos(g_pose.theta) * 2 + g_pose.x;
      g_goal.y = sin(g_pose.theta) * 2 + g_pose.y;
      g_goal.theta = g_pose.theta;
      printGoal();
    }

    if (g_state == FORWARD)
    {
      forward(twist_pub);
    }
    else if (g_state == STOP_FORWARD)
    {
      stopForward(twist_pub);
    }
    else if (g_state == TURN)
    {
      turn(twist_pub);
    }
    else if (g_state == STOP_TURN)
    {
      stopTurn(twist_pub);
    }
}


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

 

'Programming > ROS' 카테고리의 다른 글

ROS2 Windows 설치  (0) 2024.12.24
WSL2에서 OpenCV로 웹캠 스트리밍 하는 방법  (0) 2024.12.20
VSCode Font 변경 방법  (0) 2024.11.27
로보틱스 개발자가 되기 위한 학습 경로  (0) 2024.11.19