Install WSL 2 on Windows 10

많이 알려져 있는 사실이긴 한데, (마이크로소프트가 어떤 변덕인지는 몰라도) Windows 10에서 Linux를 손쉽게 사용할 수 있게 되었다. 복잡한 설치가 필요한 것도 아니고, 그냥 Microsoft Store에서 클릭 한번이면 설치가 완료된다. 아직 Native Linux에는 좀 미치진 못하지만, 그래도 쉽게 설치하고 써볼 수 있다는게 어딘가… ㅎㅎ

마이크로소프트의 웹페이지에서 쉽게 설명하곤 있지만, 그래도 설치는 해봤으니 여기에다가 정리

설치

몇번 재부팅 과정이 필요하다. 처음 WSL 기능 활성화 할때 한번, WSL 2로 변환하기 위해 Virtual Machine Platform 기능을 활성화 하기 위해서 한번.

Power Shell을 Administrator 모드로 연다. (왼쪽 하단 돋보기 버튼을 누르고 power shell을 입력한 후, 앱 아이콘이 보이면 오른쪽 버튼을 눌러 Run as Administrator를 선택하면 된다.)

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

y를 누르면, 재부팅하면서 WSL 기능을 활성화 한다.

각종 배포판을 지원하긴 하지만, 무난한 Ubuntu 18.04 LTS를 설치해본다. (다른 배포판들은 https://docs.microsoft.com/en-us/windows/wsl/install-win10 에서 확인 가능)

Get 버튼을 눌러 구입(?)하면, 자동으로 설치까지 완료.

시작메뉴를 확인해보면, 위와 같이 앱이 설치되어 있음을 확인할 수 있다. 이제 저걸 실행해보면,

어설픈 터미널창이긴 한데, 실제 Ubuntu의 터미널 환경을 제공한다. 물론 apt-get으로 패키지들도 설치 가능하다.

이제 잠시 종료하고, WSL 2로 업데이트해보도록 한다. 개선된 버전으로 64bit 실행파일을 지원한다곤 하는데, 자세한 설명은 여기(https://docs.microsoft.com/en-us/windows/wsl/wsl2-about)를 참조하면 될듯.

다시 Power Shell를 위와 마찬가지로 Administrator 모드로 열고,

> Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform

을 실행하고, 재부팅한다.

다시 Power Shell을 열고, 다음과 같이 입력하여, 기설치된 배포판을 WSL 2로 변환한다.

> wsl --set-version Ubuntu-18.04 2

약간 시간이 흐르고, 변환이 완료되었다고 나오면 끝.


Windows 10에선 기존 허접하게 생긴 터미널 창을 대신하여, Windows Terminal (Preview) 버전도 제공된다. 역시 마이크로소프트 스토어를 통해서 설치가 가능하며, 여기를 눌러 설치한다.

실행해보면, 좀더 깔끔하게 생긴 터미널 창이 제공되고, 탭의 아래 꺽쇠 부분을 눌러보면 설정 파일에 접근할 수 있다.

터미널을 실행하면 바로 wsl로 접근할 수 있도록 프로파일을 추가해본다.

파일 중간 쯤, “profile” 섹션에 다음과 같이 추가한다.

{
      "acrylicOpacity": 0.9,
      "closeOnExit": true,
      "colorScheme": "Campbell",
      "commandline": "wsl -d Ubuntu-18.04",
      "cursorColor": "#FFFFFF",
      "cursorShape": "bar",
      "fontFace": "D2Coding",
      "fontSize": 9,
      "guid": "{c909ebdd-6f47-410b-a911-85f601d2cb80}",
      "historySize": 9001,
      "icon": "ms-appx:///ProfileIcons/{0caa0dad-35be-5f56-a8ff-afceeeaa6101}.png",
      "name": "wsl",
      "padding": "0, 0, 0, 0",
      "snapOnInput": true,
      "startingDirectory": "/home/byeongkyu",
      "useAcrylic": true
    }

여기서 guid는 고유한 값이어야 하므로, 터미널을 열고 uuidgen을 실행하면 사용할 수 있는 guid 값이 생성되고 이를 사용하면 된다.

이제 이것저것 설치해보며 사용해보면 될듯하다. 끝!

[ROS] 패키지 소스 빌드 전 의존 패키지 설치하기

ROS를 개발하다보면 여러가지 패키지들을 사용해야 하고, 또한 오픈소스로 공개되어 있는 (주로는 github 등에서 받아오는) 패키지를 받아 빌드하여 사용해야할 경우가 생긴다.

이때 빌드하려는 패키지가 사용하는 의존 패키지들을 설치해줘야 빌드가 제대로 될 수 있는데, 이를 일일이 설치하는 것부터가 일이 되는 경우가 있다. README.md 파일에 이런 패키지들을 설치해야 합니다라고 알려주고 설치방법을 다음과 같이 패키지 리스트와 같이 알려 주는 경우도 있다.

$ sudo apt install package1 package2 ...

ROS에선 이를 쉽게 해결하기 위해서 rosdep 툴을 제공한다. rosdep이 하는 일을 보면, 여러가지 패키지들의 이름을 저장해 놓고, 각 패키지의 이름에 해당하는 시스템 패키지 명을 db로 저장하고 있는 형태이다. 기본적으론 rosdep.yaml 파일을 메인 레포지토리에서 받아와서 사용하고 있으며, 사용자가 이 파일을 수정하여 사용할 수도 있다.

각 패키지의 package.xml 파일엔 이 패키지가 의존하는 패키지들의 리스트가 저장되어 있다 (잘 만들어진 패키지라면…). rosdep은 각 패지키의 package.xml 파일을 읽어와, 의존 패키지 리스트를 만들고, 이를 위에서 설명한 db와 매칭하여 시스템 패키지를 설치하는 과정을 거친다.

따라서 패키지 디렉토리로 이동하여 다음과 같이 입력한다.

$ rosdep install --from-paths . --ignore-src -r -y

이렇게 하면 현재 디렉토리부터 하위 디렉토리를 순환하여 돌아다니며, 의존 패키지들을 자동으로 설치해 준다.

만약 파이썬으로 구성된 패키지이고, 의존 패키지를 requirements.txt 내에 잘 정리해 두었다면, 위와 같은 방법으로 다음과 같이 실행하면 의존 패키지를 pip를 이용하여 설치한다.

$ find -name 'requirements.txt' | xargs -L 1 sudo pip install -U -r

다른 사람이 만들어 놓은 패키지를 잘 이용하는 것도 좋지만, 위와 같은 과정을 잘 익혀두었다가 본인이 만든 패키지를 배포할때도 package.xml, requirements.txt 파일을 잘 정리하여 배포한다면 다른 사람이 별다른 수고없이도 쉽게 사용할 수 있게 된다.

Ubuntu와 Windows 멀티부팅 시 시스템 시간 변경 문제 해결

Ubuntu와 Windows를 듀얼부팅으로 사용하는 경우, Ubuntu를 사용한 다음 윈도우로 부팅하면 현재 시각이 다른 값으로 설정되어 있다. 자동으로 조정 기능을 껐다가 키면 다시 정상 시각으로 설정되지만 매번 그러기엔 아주 귀찮다.

Ubuntu에서 시각을 UTC를 기준으로 삼아 사용해서 생기는 문제인데, 이를 사용하지 않고 로컬타임으로 사용하게끔 하면 문제는 해결된다.

16.04 이후 버전부터는 터미널에서 다음과 같이 입력한다.

$ sudo timedatectl set-local-rtc 1

이렇게 되면, 이제 서로 다른 운영체제로 부팅하더라도 시스템의 시간은 변경되지 않는다.

커스텀 메시지를 이용할 경우 catkin 빌드 에러 해결

ROS 패키지를 개발할 때, Topic, Service, Action을 사용할 경우, 기존 정의되어 있는 여러가지 메시지를 사용할 수도 있지만, 편의상 사용자가의 커스텀 메시지를 이용해야 하는 경우가 있다.

이때 Python으로 개발하면 별다른 문제는 없지만, C++로 만든 노드의 경우 catkin 빌드를 하게 되면 커스텀 메시지의 header 파일을 찾을 수 없다는 에러가 나온다.

Errors     << dynamixel_ros_control:make /home/robot/catkin_ws/logs/dynamixel_ros_control/build.make.000.log                                                                        
In file included from /home/robot/catkin_ws/src/dynamixel_ros_control/include/dynamixel_ros_control/dynamixel_hw_interface.h:9:0,                                                   
                 from /home/robot/catkin_ws/src/dynamixel_ros_control/src/dynamixel_ros_control_node.cpp:3:                                                                         
/home/robot/catkin_ws/src/dynamixel_ros_control/include/dynamixel_ros_control/dynamixel_motor.h:11:48: fatal error: dynamixel_ros_control/HomingAction.h: No such file or directory 
compilation terminated.                                                                                                                                                             
make[2]: *** [CMakeFiles/dynamixel_ros_control_node.dir/src/dynamixel_ros_control_node.cpp.o] Error 1                                                                               
make[1]: *** [CMakeFiles/dynamixel_ros_control_node.dir/all] Error 2                                                                                                                
make: *** [all] Error 2    

몇번 빌드를 반복하다보면 에러 없이 빌드 되는 경우도 있지만 마땅한 해결 방법은 아니다. 몇번 골치를 썩다가 wiki의 투토리얼을 다시금 살펴보니 해결책이 나와있었다. 하지만 패키지를 만들때 생성되는 CMakeList.txt 파일엔 이 내용이 반영되어 있지 않아 혼란이 있는 듯 하다.

Writing a Simple Publisher and Subscriber (C++) 페이지를 보면 중간쯤 다음과 같이 입력하라고 나온다.

노드를 빌드하기 전, 노드에 의존 항목을 추가하여 위와 같은 에러를 방지하려는듯 하다. 따라서 CMakeList.txt 파일에 다음과 같이 입력하면 된다.

add_executable(${PROJECT_NAME}_node
  src/dynamixel_ros_control_node.cpp
  src/dynamixel_hw_interface.cpp
  src/dynamixel_motor.cpp
)

add_dependencies(${PROJECT_NAME}_node ${PROJECT_NAME}_generate_messages_cpp)
target_link_libraries(${PROJECT_NAME}_node
  ${catkin_LIBRARIES}
)

이제 다시 catkin 빌드를 할 때, 관련 에러는 발생하지 않는다.

[여름휴가] 괌

7월 3일 ~ 7월 7일에 괌으로 좀 이른 여름 휴가를 다녀왔습니다. 형 가족까지 포함하여, 총 7명 (어른4, 아이3)이 멤버였고, 이로 인해 호텔도 방 두 개를, 렌트카도 7인승 차를 빌려야 했네요.

아이들 컨디션을 적극적으로 고려하여, 일반적으로 많이 이용하시는 야간 비행보단 주간 비행 (진에어)을 이용하였습니다. 비행기 가격은 큰 차이가 없었고, 오히려 Late Check-in, Late Check-out을 이용하지 않는 아주 깔끔한 시간대였다고 생각합니다.

아침에 출발하는 비행기

7월이면 괌은 우기로 접어드는 때로, 시시때때로 소나기가 오는 기후라고 합니다만, 이번에 저희가 방문했을 때는 물놀이 할 땐 적당히 구름이 있는 날씨, 드라이브 할 땐 아주 파란 하늘을 보여줘서, 날씨 운도 좀 괜찮았습니다. 물론 덥고 습한 날씨였던건 뭐 어쩔수 없었고요.

호텔 베란다에서 보는 풍경
파란 하늘, 푸른 바다

여행 일정은 저희가 처음 괌에 가는 이유로, 많은 분들이 체험하는 코스로, 호텔 (온워드 리조트)도 그냥 무난한 곳으로 정했습니다. 실패는 하지 않는, 오히려 아이들은 충분한 물놀이로 재밌게 즐겼던 것 같습니다.

리조트 바로 옆 워터파크, 리조트 이용객은 공짜

숙소에 커다란 워터파크가 있고, 바로 앞은 맑고 푸른 바다가, 주변도 잠깐만 이동하면 식당이나 마트도 있어 편리했고, 오히려가 시내에서 살짝 거리가 있으니 사람들도 많지 않아 좋았습니다.

특히 셋째날엔 아들녀석을 위해 경비행기 조정 체험도 하였는데, 이륙부터 비행, 착륙까지 아들 녀석이 직접 조종간을 잡아 조종하였습니다. (물론 옆에서 도움주시는 조종사 분이 계시고요.) 처음엔 땀을 흘리면서 긴장하던 녀석도 시간이 지나니 엄청 재미있어하더라고요.

경비행기 타기 전
숙력된 조종사가 옆에서 보조해주면서 비행 조종 체험

총 5일의 일정 중, 하루는 렌트카를 끌고 괌 남쪽을 쭈욱 돌아봤습니다. 물론 인증샷을 위한 사진 포인트들도 이때 쭈욱 들르면 됩니다. 괌이 그리 크지 않은 섬이라서, 약 3~4시간이면 다 돌아볼만 합니다.

아마 무슨 성당?
바다 아래로 내려가는 수족관
드라이브하다가 적당한 곳에서 세운 후 본 풍경
길다가 찾은 식당
사랑의 절벽
리조트 앞 바다, 카누도 무료 대여

전반전으로 느낀 괌은 그냥 제주도 느낌이었습니다. 한국 관광객들도 많고, 한국인 업체들도 많고, 호텔 역시 한국어 서비스가 거의 기본입니다. 영어를 잘 하지 못하더라도 편하게 다녀올수 있는 휴양지라고 생각합니다. 아울렛 등에서 쇼핑도 즐길수 있고, 음식도 괜찮았습니다. 물가도 우려했던 바와는 달리 많이 비싸진 않았고요.

한국에 도착해도 이른 저녁

이번 여름 휴가 중 일단 하나 완료!